2015-01-01 25 views
5

enter image description here salt okunur bir düzenleme denetimi arka plan rengini değiştirmek için mi. Düzenleme denetimi düzenlenebilir olduğunda sahip olduğum kod (sıralama) çalışır, ancak salt okunur bayrağına sahip benim düzenleme denetimimde hiçbir etkisi yoktur.mümkün ben ES_READONLY bayrağı olan bir düzenleme denetimine rengini değiştirmek için basit bir çözüm bulmaya çalışıyorum

case WM_CTLCOLOREDIT: 
{ 
    HDC hdc = (HDC)wParam; 
    //if (GetDlgItem(hwnd, IDC_EDIT_IN) == (HWND)lParam) 
    //{ 
     SetTextColor(hdc, RGB(255, 255, 255)); // Set text color to white 
     SetBkColor(hdc, RGB(255, 255, 255)); // Set background color to black 
    //} 
    return 0; 
} 
break; 

benim kod çalıştı eğer orada comment sadece kontrol etmek zorunda ve sadece okumak yok düzenleme denetimi yapar. Diğer düzenleme denetimimde ES_READONLY çıkarsa, üzerinde çalışır. Bir sohbet programı oluşturuyorum ve kullanıcının sohbet kutusu alanına yazabilmesini istemiyorum. Ve sadece okuduğunda, onu gri renkli bir renk yapar, ama beyaz bir renk istiyorum. Bunu yapmanın başka bir yolu var mı? Ayrıca Renk, yalnızca metnin bulunduğu alanı düzenler, düzenleme denetiminin tüm yüksekliğini değil. Neyi yanlış yapıyorum?

+2

"WM_CTLCOLORSTATIC" dosyasına bakmanızı öneririz –

+2

MSDN makalesini okuyun, bir fırçayı döndürmenizi bildirir. –

cevap

5

Bir fırça oluşturmak ve takip etmek gerekir. Daha sonra, kod snippet'inize return 0 yerine bu fırçayı döndürün. Fırça artık gerekli olmadığında onu silmeniz gerekir. Bu genellikle WM_DESTROY mesajına cevap olarak yapılır. Senin durumunda

ben öneriyoruz budur, stok fırça kullanarak mermi atlatmak olabilir.

salt okunur modda, düzenleme denetimleri yerine WM_CTLCOLOREDIT ait WM_CTLCOLORSTATIC cevap, bu yüzden düzgün bu mesajı işlemek zorundasınız: düzenle/statik kontrol boyarken

case WM_CTLCOLORSTATIC: 
{ 
    if((HWND)lParam == GetDlgItem(hwnd, IDC_EDIT_IN)) 
    { 
     SetBkMode((HDC)wParam, TRANSPARENT); 
     SetTextColor(hdc, RGB(255, 255, 255)); 
     return (LRESULT)((HBRUSH)GetStockObject(BLACK_BRUSH)); 
     // if edit control is in dialog procedure change LRESULT to INT_PTR 
    } 
    else // this is some other static control, do not touch it!! 
     return DefWindowProc(hwnd, message, wParam, lParam); 
} 

, boyama için kullanılabilir 3 bölümden oluşur:

  • metin rengi
  • metin arka plan
  • denetimin ba amacıyla ckground

İstenen renk (pencere prosedürü için return (LRESULT)someBrush veya return (INT_PTR)someBrush iletişim kutusu) ile fırça döndürmelidir arzu edilen renge tam kontrol boya.

SetBkColor için Çağrı farklı denetimin arka plan rengi dan metin arka plan rengini ayarlar. Bu yüzden TRANSPARENT parametresi ile SetBkMode parametresini arayarak, kontrol arka planının eşleşmesi için metin arka planını istediğimizi "söylüyoruz". Ben bunu takip etmek gerekmez, çünkü stok fırça kullanılır, ne de artık gerekli değildir sonra silmeniz gerekir yapmasını istediğinizde durumda

. Eğer başka bir renk isteyeceksiniz zaman

Yine davaları olabilir. Burada Bu durumda yapmanız gereken budur:

  • küresel HBRUSH değişkeni veya pencere/iletişim prosedüründe static HBRUSH değişken oluşturun.
  • eğer pencere prosedüründe WM_CREATE yanıt olarak bu değişkeni başlatın. Diyalog prosedüründe fırçayı WM_INITDIALOG'da başlatın. someBrush = CreateSolidBrush(RGB(255, 0, 255)); gibi bir şey Daha fazla bilgi ve örnek için documentation'a bakın.
  • Bu fırçayı, örneğin yukarıdaki örnekte gösterdiğim gibi (pencere yordamı için return (LRESULT)someBrush veya iletişim kutusu için return (INT_PTR)someBrush) döndürün.
  • Artık gerekmediğinde fırçayı silin. Bu genellikle DeleteObject(someBrush); çağrı ile WM_DESTROY yapılır. WM_CLOSE bazen bu senaryo için örnekler bulmak için internette arama (atlanabilir süre

şiddetle, bu pencere her zaman alacaksınız mesajdır çünkü WM_DESTROY yerine WM_CLOSE cevaben silme yapmak tavsiye).

Başka sorularınız varsa yorum yapmanıza yardımcı olacağımı umuyorum ve yardımcı olmaya çalışacağım. Saygılarımla.

+0

MSDN'ten alıntı: "DeleteObject" ifadesini kullanarak stok nesnelerini silmek gerekli değildir (ancak zararlı değildir). – 0xC0000022L