C++ Win32 Uygulaması Nasıl Oluşturulur?

C++ Win32 Uygulaması Nasıl Oluşturulur? Öncelikle söyleyeyim de sonradan kafanıza takılmasın; bu konu için herhangi bir hazır kütüphane (MFC, ATL ya da .NET) kullanılmadan Windows Penceresi nasıl oluşturulur bunu göreceğiz. Dil şekilde C++ kullanıyoruz. Öncelikle projemizi oluşturalım. Bunun için Visual Studio’ da File > New > Project’ e tıklıyoruz ve çıkan pencereden Visual C++ altındaki Win32 Project’ i seçiyoruz. Karşımıza Win32 Application Wizard geliyor. Next’ e tıklayıp Application Settings adımına geliyoruz. Burada Windows Application’ un seçili olmasına dikkat edin. Additional Options altında Empty Project’ i işaretleyip Finish diyoruz. Şimdi projeye yeni bir C++ kod dosyası eklememiz lazım.Bunun için Solution Explorer’ da Source Files’ a sağ tıklayıp Add > New Item seçeneğini seçiyoruz ve yeni bir C++ File(.cpp) oluşturuyoruz (İsmi önemli değil). Dosyayı oluşturduktan sonra öncelikle Windows API ve diğer kütüphaneleri kod dosyasına eklememiz lazım. 1 #include <windows.h> 2 #include <tchar.h> Win32 Uygulamaları da Konsol uygulamaları bu gibi bir ana fonksiyona sahiptir. Bu fonksiyonumuz WinMainfonksiyonudur. WinMain 4 adet parametre alır. WinMain fonksiyonu şuna benzer. 1 int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTRlpCmdLine, int nCmdShow) 2 { üç 4 } Bununla yanında oluşturacağımız Windows penceresinin kullanacağı bir fonksiyon daha gerekiyor bize. Bu fonksiyon da aşağıdakine aynı bir biçimde tanımlanabilir. LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { } Şimdi WinMain fonksiyonuna lüzumlu kodları eklemeye başlayabiliriz. Öncelikle bize oluşturacağımız windows penceresi için WNDCLASS türünden bir değişken gerekiyor. Gerekli bölgeleri yorum satırlarıyla açıkladım. WNDCLASS wc; wc.style = CS_HREDRAW | CS_VREDRAW; // Penceremizin özellikleri. wc.lpfnWndProc = WndProc; // Penceremizin kullanacağı fonksiyon ismi. wc.cbClsExtra = 0; wc.cbWndExtra = 0; wc.hInstance = hInstance; // WinMain fonksiyonuna gelen ilk parametre. wc.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_APPLICATION)); // Pencerenin simgesi wc.hCursor = LoadCursor(NULL, IDC_ARROW); // Pencerenin işaretçisi wc.hbrBackground = (HBRUSH)(COLOR_APPWORKSPACE); // Arkaplan rengi wc.lpszMenuName = NULL; // Pencerenin kullanacağı menü. Biz menü kullanmayacağımız için NULL atıyoruz. wc.lpszClassName = TEXT(“Win32App”); // Pencereninin Sınıf Adı. Başka bir yerde kullanılacağından bu adı unutmamanız gerek. Şimdi bu fonksiyonu RegisterClass fonksiyonuyla kayıt ettirmemiz gerek. if (!RegisterClass(&wc)) { MessageBox(NULL, TEXT(“RegisterClass Hatası!”), TEXT(“Win32 Uygulaması”), NULL); return EXIT_FAILURE; } Sonra, pencereyi oluşturmalıyız. Bunu CreateWindow fonksiyonuyla gerçekleştiriyoruz. Aldığı parametreleri yorum satırlarıyla açıkladım. HWND hWnd = CreateWindow(TEXT(“Win32App”), // Pencerenin sınıfının adı. Daha evvela unutmamanız lüzumlu dediğim şey. TEXT(“Win32 Uygulaması”), // Pencerenin başlığı WS_OVERLAPPEDWINDOW, // Pencerenin manzara stili. CW_USEDEFAULT, CW_USEDEFAULT,// Pencerenin açılacağı koordinatlar. Sırasıyla X ve Y 500, 100, // Pencerenin boyutları. Sırasıyla Genişlik ve Yükseklik NULL, NULL, hInstance, // WinMain’ e gelen ilk parametre NULL); if (!hWnd) { MessageBox(NULL, TEXT(“CreateWindow Hatası!”) ,TEXT(“Win32 Uygulaması”), NULL); return EXIT_FAILURE; } Şimdi bu pencereyi gösterelim. // hWnd : CreateWindow fonksiyonunun dönüş kıymeti // nCmdShow : WinMain fonksiyonunun son parametresi ShowWindow(hWnd, nCmdShow); UpdateWindow(hWnd); Ve WinMain fonksiyonunun son görevi, mesaj döngüsü. Bu döngü uygulamanın hayat döngüsü şekilde adlandırılabilir ve siz durdurmadığınız sürece durmaz. MSG msg; while (GetMessage(&msg, NULL, 0, 0)) { TranslateMessage(&msg); DispatchMessage(&msg); } return (int) msg.wParam; // ve WinMain fonksiyonu biter Şimdi bu mesaj döngüsünün ürettiği mesajları işleme koyacak WndProc fonksiyonunu oluşturmalıyız. Bu fonksiyon daha herşeyden önce de belirttiğim benzeri pencerenin işlemlerini gerçekleştirecek olan fonksiyondur. Aşağıdaki kodları WndProc fonksiyonuna yazmalısınız. PAINTSTRUCT ps; HDC hdc; TCHAR Yazi[] = _T(“Merhaba Dünya!”); // Ne yapayım bende bir programcıyım switch (message) // Fonksiyonun ikinci parametresi { case WM_PAINT: // Ön tanımlı mesajlardan birisi hdc = BeginPaint(hWnd, &ps);  // hWnd parametre şekilde geliyor TextOut(hdc, 5, 5, // Yazının konumu. Sırasıyla X ve Y Yazi, _tcslen(Yazi)); // Üstte tanımladığımız yazıyı gösteriyoruz. EndPaint(hWnd, &ps); break; default: return DefWindowProc(hWnd, message, wParam, lParam); // Eğer mesaj işleme alınmaz ise öntanımlı pencere işlem fonksiyonunun kıymeti döndürülüyor. break; } return 0; // ve WndProc fonksiyonunun sonu Ayrıca; programı sonlandırmak için switch bloğuna, case WM_DESTROY: PostQuitMessage(0); break; durumunu da eklersek iyi olur. Daha fazla öntanımlı mesaj için IntelliSense kullanabilirsiniz.


Yapılan Yorumlar
Erdem OFLAZ

Bir mum, diğer mumu tutuşturmakla ışığından bir şey kaybetmez.
 Kategoriler
 Popüler yazılar