WinAPI'de EDIT kontrolünün arka plan rengini değiştirme

Yazar: Admin

Kategori: Yazılım

WinAPI ile oluşturulan bir program içinde tanımlanan EDIT kontrollerinin arka plan renklerini değiştirmek için EDIT kontrolünün bulunduğu pencerenin mesaj işlem fonksiyonu içinde EDIT kontrolü tarafından gönderilen mesajlara işlem yapmak gerekir.

Bir EDIT kontrolü penceresi çizilirken, eğer EDIT kontrolü sadece okunur durumda veya devre dışı kalmış ise, içinde bulunduğu ana pencereye WM_CTLCOLORSTATIC mesajı, aksi takdirde WM_CTLCOLOREDIT mesajı gönderir. Mesajı alan ana pencere mesaj işlem fonksiyonu gelen mesajın wParam parametresinde bulunan EDIT kontrolüne ait device context handle değerini kullanarak EDIT kontrolü metin ve arka plan rengini ayarlayabilir.

WM_CTLCOLORSTATIC : EDIT kontrolü sadece okunur durumda veya devre dışı kalmış ise gönderilir.

WM_CTLCOLOREDIT : EDIT kontrolü sadece okunur durumda veya devre dışı kalmış değil ise gönderilir.

İş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:


/* EDIT kontrol ID bildirimleri */
#define IDC_EDIT01 101
#define IDC_EDIT02 102

/* EDIT kontrolü pencere Handle bildirimleri */
HWND hwndEdit01, hwndEdit02;

EDIT kontrolünü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 hdcEdit01, hdcEdit02; /* EDIT kontrol HDC bildirimleri */
  static HBRUSH hbrBkgnd01=NULL, hbrBkgnd02=NULL; /* EDIT kontrol BRUSH bildirimleri */

  switch (message)
  {
    case WM_CREATE:

       /* EDIT kontrol pencere oluşturma */       
       hwndEdit01 = CreateWindowEx(0, "EDIT", "Edit01",
                             WS_CHILD | WS_VISIBLE | WS_BORDER, 20, 20, 200, 20,
                             hwnd, (HMENU) IDC_EDIT01, NULL, NULL);

       hwndEdit02 = CreateWindowEx(0, "EDIT", "Edit02",
                             WS_CHILD | WS_VISIBLE | WS_BORDER, 20, 50, 200, 20,
                             hwnd, (HMENU) IDC_EDIT02, NULL, NULL);

       /* IDC_EDIT02 kontrolüne sadece okunur özelliği verilmesi */
       SendMessage(hwndEdit02, EM_SETREADONLY, (WPARAM)TRUE, 0);

       break;

    case WM_CTLCOLOREDIT:

       /*if (GetDlgCtrlID((HWND)lParam) == IDC_EDIT01) { Alternatif yöntem */
       /* Mesaj IDC_EDIT01 kontrolünden geliyorsa */
       if (lParam == (LPARAM)hwndEdit01) {
           hdcEdit01 = (HDC) wParam;
           SetTextColor(hdcEdit01, RGB(0, 0, 0));
           SetBkColor(hdcEdit01, RGB(206, 206, 255));

           if (hbrBkgnd01 == NULL) {
               hbrBkgnd01 = CreateSolidBrush(RGB(206, 206, 255));
           }
           return (INT_PTR)hbrBkgnd01;
       }

    case WM_CTLCOLORSTATIC:

       /*if (GetDlgCtrlID((HWND)lParam) == IDC_EDIT02) { Alternatif yöntem */
       /* Mesaj IDC_EDIT02 kontrolünden geliyorsa */
       if (lParam == (LPARAM)hwndEdit02) {
           hdcEdit02 = (HDC) wParam;
           SetTextColor(hdcEdit02, RGB(0, 0, 0));
           SetBkColor(hdcEdit02, RGB(206, 206, 255));

           if (hbrBkgnd02 == NULL) {
               hbrBkgnd02 = CreateSolidBrush(RGB(206, 206, 255));
           }
           return (INT_PTR)hbrBkgnd02;
       }

       break;

       .
       .
       .

Yukarıdaki satırlarla önce, iki adet EDIT kontrolü oluşturulur. Sonra, SendMessage() fonksiyonu EM_SETREADONLY mesajı gönderilerek IDC_EDIT02 kontrolüne sadece okunur özelliği verilir. WM_CTLCOLOREDIT mesajı geldiğinde IDC_EDIT01 kontrolü ve WM_CTLCOLORSTATIC mesajı geldiğinde ise IDC_EDIT02 kontrolü ile ilgili mesajlar işlem görür.