WinAPI'de metin değerleri sürekli değiştirilen STATIC kontrollerin rengini değiştirme

Yazar: Admin

Kategori: Yazılım

WinAPI ile oluşturulan bir program içinde tanımlanan ve metin değerlerini sürekli değiştirmek istediğimiz STATIC kontrollerin arka plan rengini etkilemeden metin rengini değiştirmek için STATIC kontrolün bulunduğu pencerenin mesaj işlem fonksiyonu içinde STATIC kontrol tarafından gönderilen mesajlara işlem yapmak gerekir.

Bir STATIC kontrol penceresi çizilirken, içinde bulunduğu ana pencereye WM_CTLCOLORSTATIC mesajı gönderir. Mesajı alan ana pencere mesaj işlem fonksiyonu gelen mesajın wParam parametresinde bulunan STATIC kontrolüne ait device context handle değerini kullanarak STATIC kontrolü metin rengini ayarlayabilir.

İşlemleri gerçekleştirmek için öncelikle aşağıdaki kod satırlarını WinAPI ile oluşturduğunuz kaynak dosyanın başına ekleyelim:


/* STATIC kontrol ID bildirimi */
#define IDC_STATIC01 101

/* STATIC kontrol pencere Handle bildirimi */
HWND hwndStatic01;

STATIC kontrolün içinde bulunduğu pencerenin mesaj işlem fonksiyonuna aşağıdaki kodları ekleyelim:


LRESULT CALLBACK WindowProcedure (HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam)
{
  HDC hdcStatic01; /* STATIC kontrol HDC bildirimi */
  RECT r1;

  switch (message)
  {
    case WM_CREATE:

       /* STATIC kontrol pencere oluşturma */       
       hwndStatic01 = CreateWindowEx(0, "STATIC", "Static",
                          WS_CHILD | WS_VISIBLE | SS_LEFT, 20, 20, 200, 20,
                          hwnd, (HMENU) IDC_STATIC01, NULL, NULL);

       break;

    case WM_CTLCOLORSTATIC:

       /* Mesaj IDC_STATIC01 kontrolünden geliyorsa */
       if (lParam == (LPARAM)hwndStatic01) {
           hdcStatic01 = (HDC) wParam;
           SetTextColor(hdcStatic01, RGB(255, 0, 0));
           /* Önceki yazıyı silmek için */
           r1.left=0; r1.top=0; r1.right=200; r1.bottom=20;
           /* Ana pencere rengi ile arka planı doldurarak önceki yazıyı silmek için */
           FillRect(hdcStatic01, &r1, GetSysColorBrush(COLOR_3DFACE));  
           SetBkMode(hdcStatic01, TRANSPARENT);

           return (BOOL)GetStockObject(NULL_BRUSH);		   
       }

       break;

       .
       .
       .

Yukarıdaki satırlarla önce, bir STATIC kontrol oluşturulur. WM_CTLCOLORSTATIC mesajı geldiğinde ise IDC_STATIC01 kontrolü ile ilgili mesajlar işlem görür.