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.
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.
Ş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 derleme safhasında resource.rc dosyası derlenerek elde edilen resource.res dosyası .exe dosyaya eklenir.
Program çalıştığında:
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 çalıştığında karşınıza gelecek ekran görüntüleri aşağıdadır: