BG MVC Model View Controller eğitim serisi yayında...

Ana page > Programlama > Windows API Programlama > Genel

Genel

► Diyalog Kutuları

Genel diyalog kutuları türleri

Windows işletim sisteminde, belirli görevleri gerçekleştirmek üzere programlar tarafından kullanılmak üzere tahsis edilen genel diyalog kutuları aşağıda gösterilmektedir. Her bir genel diyalog kutusu için özel bir fonksiyon ve yapı tahsis edilmiştir.

Renk seçimi: Kullanıcı sistemde tanımlı renkleri ve kendi oluşturduğu rengi seçerek, programın belirli amaçla kullanmasına olanak sağlar. Bu diyalog kutusu ile ChooseColor() fonksiyonu ve CHOOSECOLOR yapısı kullanılır.

Metin bulma: Kullanıcının bulunacak karakter dizisini yazabileceği bir diyalog kutusudur. Bu diyalog kutusu ile FindText() fonksiyonu ve FINDREPLACE yapısı kullanılır.

Metin değiştirme: Kullanıcının bulunacak ve değiştirilecek karakter dizisini yazabileceği bir diyalog kutusudur. Bu diyalog kutusu ile ReplaceText() fonksiyonu ve FINDREPLACE yapısı kullanılır.

Font seçimi: Kullanıcının font tipini ve özelliklerini seçmesini sağlayan bir diyalog kutusudur. Bu diyalog kutusu ile ChooseFont() fonksiyonu ve CHOOSEFONT yapısı kullanılır.

Dosya açma: Kullanıcının açılacak dosyayı seçmesini sağlayan bir diyalog kutusudur. Bu diyalog kutusu ile GetOpenFileName() fonksiyonu ve OPENFILENAME yapısı kullanılır.

Dosya kaydetme: Kullanıcının kaydedilecek dosyayı seçmesini sağlayan bir diyalog kutusudur. Bu diyalog kutusu ile GetSaveFileName() fonksiyonu ve OPENFILENAME yapısı kullanılır.

Sayfa yapısı: Kullanıcının kağıt yönü, boyutu, kaynağı ve marjin gibi değerleri seçmesini sağlayan bir diyalog kutusudur. Bu diyalog kutusu ile PageSetupDlg() fonksiyonu ve PAGESETUPDLG yapısı kullanılır.

Yazdırma: Kullanıcının yazdırma özelliklerini seçmesini sağlayan bir diyalog kutusudur. Bu diyalog kutusu ile PrintDlg() fonksiyonu ve PRINTDLG yapısı kullanılır.

Genel diyalog kutuları kullanımı

Bir diyalog kutusunu kullanmak istediğinizde, diyalog kutusu ile ilgili olarak atanmış yapı elemanlarına erişim için bir değişken tanımlayarak yapı elemanlarına değer atamanız ve diyalog kutusu fonksiyonunu çağırmanız gerekir. Diyalog kutusu oluşturulduktan, program kullanıcı tarafından girişlere işlem yapmak için yapı elemanlarını kullanır.

Metin bulma ve metin değiştirme diyalog kutuları modeless, diğer diyalog kutuları ise modal özelliğe sahiptir.

Genel diyalog kutusu oluşturma

Şimdi, programımıza renk seçimi için bir genel diyalog kutusu eklemeye çalışalım:

resource.rc


#include "resource.h"

IDR_MENU MENU
BEGIN
    POPUP "&İşlemler"
    BEGIN
        MENUITEM "&Renk seç", IDM_RENK_AL
        MENUITEM "&Çıkış", IDM_CIKIS
    END
END

resource.h


#include <windows.h>

#define IDR_MENU 401
#define IDC_STATIC01 101

#define IDM_RENK_AL 11
#define IDM_CIKIS 12

main.c

Aşağıdaki satırlar programın başına global değerler olarak eklenir. İlk satırda, RenkAl() fonlsiyonunun, diğer satırlarda ise grafik çizim ve renk seçimi ile ilgili değişken değerlerin bildirimi yapılır.


COLORREF RenkAl(HWND);

HDC hdc;
HBRUSH hbrush;
COLORREF cref;

WindowProcedure() fonksiyonu içinde renkli olarak gösterilen satırlar ile WM_COMMAND mesajına işlem yapılarak IDM_RENK_AL menü seçeneği altında RenkAl() fonksiyonu ile kullanıcı tarafından seçilen bir renkte arka plana sahip bir kare ekranda oluşturulur.


LRESULT CALLBACK WindowProcedure (HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam)
{
  switch (message)
  { 
    case WM_CREATE:
	
         hwndStatic01 = CreateWindowEx(0, "STATIC", "Statik kontrol",
                                WS_CHILD | WS_VISIBLE | SS_LEFT, 20, 180, 500, 20,
                                hwnd, (HMENU) IDC_STATIC01, NULL, NULL);
	
         break;

    case WM_COMMAND:

         switch(LOWORD(wParam)) {
             case IDM_RENK_AL:
                 /* Kullanıcının seçtiği bir renk elde edilir. */
                 cref = RenkAl(hwnd);
                 /* Ana pencere Device Context değeri elde edilir. */
                 hdc = GetDC(hwnd);
                 /* Brush için bir renk oluşturulur. */
                 hbrush = CreateSolidBrush(cref);
                 /* Brush rengi ana pencere DC'sine atanır. */
                 SelectObject(hdc, hbrush); 
                 Rectangle(hdc, 20, 20, 120, 120); /* Kare çizilir. */
                 DeleteObject(hbrush); /* Brush değeri silinir. */
                 ReleaseDC(hwnd, hdc); /* hdc değeri serbest bırakılır. */
                 SetWindowText(hwndStatic01, "Bir kare çizildi.");
                 break;			 

             case IDM_CIKIS:
                 SendMessage(hwnd, WM_CLOSE, 0, 0);
                 break;
         }
		   
         break;
		 
    case WM_DESTROY:
         PostQuitMessage (0);
         break;
		 
    default:                 
         return DefWindowProc (hwnd, message, wParam, lParam);
  }

  return 0;
}

COLORREF RenkAl(HWND hwnd) {
  CHOOSECOLOR cc;                 /* Renk diyalog kutusu yapı değişken bildirimi */
  static COLORREF acrCustClr[16]; /* Renk dizi bildirimi */
  HBRUSH hbrush;                  /* Brush handle değeri */       
  static DWORD rgbCurrent=0;      /* İlk renk değeri */

  ZeroMemory(&cc, sizeof(cc));
  cc.lStructSize = sizeof(cc);
  cc.hwndOwner = hwnd;
  cc.lpCustColors = (LPDWORD) acrCustClr;
  cc.rgbResult = rgbCurrent;
  cc.Flags = CC_FULLOPEN | CC_RGBINIT;
 
  if (ChooseColor(&cc)==TRUE) {
      hbrush = CreateSolidBrush(cc.rgbResult);
      rgbCurrent = cc.rgbResult; 
  }

  return rgbCurrent;
}

Program çalışma mantığı ve sırası

Program derleme safhasında resource.rc dosyası derlenerek elde edilen resource.res dosyası .exe dosyaya eklenir.

Program çalıştığında:

  • Program ana penceresi oluşturulmadan önce, MAKEINTRESOURCE(IDR_MENU) komutu ile resource dosya içinde bildirimi yapılan menü ana pencereye atanır.
  • Program penceresi oluşturulur oluşturulmaz WM_CREATE mesajı mesaj işlem fonksiyonuna gönderilir. switch yapısının bu seçeneği altında CreateWindowEx() fonksiyonu ile bir adet Static kontrol oluşturulur.
  • IDM_RENK_AL menü seçeneği tıklandığında, menü seçeneği altında RenkAl() fonksiyonu çalıştırılarak kullanıcı tarafından seçilen bir renk elde edilir. RenkAl() fonksiyonu içinde:
    • Önce, CHOOSECOLOR yapı cinsinden bir değişken bildirimi yapılır.
    • Yapı elemanlarına değer atanır.
    • ChooseColor() fonksiyonu çağrılır. Eğer renk diyalog kutusunda bir renk seçilir ve "Tamam" butonuna basılarak diyalog kutusu kapatılırsa seçilen renk, aksi takdirde siyah renk değer olarak geri döndürülür.
  • RenkAl() fonksiyonunun geri döndürdüğü renk değeri kullanılarak, Rectangle() fonksiyonu ile ana program penceresinde bir kare oluşturulur.
  • İşlem ile ilgili bilgi Static kontrol penceresine yazılır.

Program kaynak dosyaları

Programın çalışan en son halinde yer alan dosyalar aşağıdadır:

resource.rc


#include "resource.h"

IDR_MENU MENU
BEGIN
    POPUP "&İşlemler"
    BEGIN
        MENUITEM "&Renk seç", IDM_RENK_AL
        MENUITEM "&Çıkış", IDM_CIKIS
    END
END

resource.h


#include <windows.h>

#define IDR_MENU 401
#define IDC_STATIC01 101

#define IDM_RENK_AL 11
#define IDM_CIKIS 12

main.c


#include <windows.h>
#include "resource.h"

LRESULT CALLBACK WindowProcedure (HWND, UINT, WPARAM, LPARAM);
COLORREF RenkAl(HWND);

char szClassName[ ] = "WinAPIWindowsApp";
HINSTANCE ghInst;
char cdizi[200];

HWND hwndStatic01;
HDC hdc;
HBRUSH hbrush;
COLORREF cref;

int WINAPI WinMain (HINSTANCE hThisInstance, 
                    HINSTANCE hPrevInstance,
                    LPSTR lpszArgument,
                    int nCmdShow)
{
  HWND hwndMain;         
  MSG messages;      
  WNDCLASSEX wincl;  
  
  ghInst = hThisInstance;

  wincl.hInstance = hThisInstance;
  wincl.lpszClassName = szClassName;
  wincl.lpfnWndProc = WindowProcedure;
  wincl.style = CS_DBLCLKS;           
  wincl.cbSize = sizeof (WNDCLASSEX);

  wincl.hIcon = LoadIcon (NULL, IDI_APPLICATION);
  wincl.hIconSm = LoadIcon (NULL, IDI_APPLICATION);
  wincl.hCursor = LoadCursor (NULL, IDC_ARROW);
  wincl.lpszMenuName = MAKEINTRESOURCE(IDR_MENU);
  wincl.cbClsExtra = 0; 
  wincl.cbWndExtra = 0; 
  wincl.hbrBackground = GetSysColorBrush(COLOR_3DFACE);

  if (!RegisterClassEx (&wincl)) return 0;

  hwndMain = CreateWindowEx (0, szClassName, "WinAPI Temel Program", 
                  WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, 
                  544, 375, HWND_DESKTOP, NULL, hThisInstance, NULL);
						 
  if (!hwndMain) return 0;

  ShowWindow (hwndMain, nCmdShow);
  UpdateWindow(hwndMain);

  while (GetMessage (&messages, NULL, 0, 0) > 0) {
     TranslateMessage(&messages);
     DispatchMessage(&messages);
  } 
  
  return messages.wParam;
}

LRESULT CALLBACK WindowProcedure (HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam)
{
  switch (message)
  { 
    case WM_CREATE:
	
         hwndStatic01 = CreateWindowEx(0, "STATIC", "Statik kontrol",
                                WS_CHILD | WS_VISIBLE | SS_LEFT, 20, 180, 500, 20,
                                hwnd, (HMENU) IDC_STATIC01, NULL, NULL);
	
         break;

    case WM_COMMAND:

       switch(LOWORD(wParam)) {
             case IDM_RENK_AL:
                 cref = RenkAl(hwnd);    
                 hdc = GetDC(hwnd);
                 hbrush = CreateSolidBrush(cref); 
                 SelectObject(hdc, hbrush);
                 Rectangle(hdc, 20, 20, 120, 120);
                 DeleteObject(hbrush);
                 ReleaseDC(hwnd, hdc);
                 SetWindowText(hwndStatic01, "Bir kare çizildi.");
                 break;			 

             case IDM_CIKIS:
                 SendMessage(hwnd, WM_CLOSE, 0, 0);
                 break;
       }
		   
         break;
		 
    case WM_DESTROY:
         PostQuitMessage (0);
         break;
		 
    default:                 
         return DefWindowProc (hwnd, message, wParam, lParam);
  }

  return 0;
}

COLORREF RenkAl(HWND hwnd) {
  CHOOSECOLOR cc;
  static COLORREF acrCustClr[16];
  HBRUSH hbrush;        
  static DWORD rgbCurrent=0;

  ZeroMemory(&cc, sizeof(cc));
  cc.lStructSize = sizeof(cc);
  cc.hwndOwner = hwnd;
  cc.lpCustColors = (LPDWORD) acrCustClr;
  cc.rgbResult = rgbCurrent;
  cc.Flags = CC_FULLOPEN | CC_RGBINIT;
 
  if (ChooseColor(&cc)==TRUE) {
      hbrush = CreateSolidBrush(cc.rgbResult);
      rgbCurrent = cc.rgbResult; 
  }

  return rgbCurrent;
}

Program ekran görüntüleri

Program çalıştığında karşınıza gelecek ekran görüntüleri aşağıdadır: