Öncelikle söyleyeyim de sonradan kafanıza takılmasın; bu konuda herhangi bir hazır kütüphane (MFC, ATL veya .NET) kullanmadan Windows Penceresi nasıl oluşturulur bunu göreceğiz. Dil olarak 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ı 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 {
3
4 }

Bununla birlikte oluşturacağımız Windows penceresinin kullanacağı bir fonksiyon daha gerekiyor bize. Bu fonksiyon da aşağıdakine benzer bir şekilde tanımlanabilir.

LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)

{

}

Şimdi WinMain fonksiyonuna gerekli kodları eklemeye başlayabiliriz. Öncelikle bize oluşturacağımız windows penceresi için WNDCLASS türünden bir değişken gerekiyor. Gerekli yerleri 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 ismi 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 önce unutmamanız gerekli dediğim şey.

TEXT(“Win32 Uygulaması”), // Pencerenin başlığı

WS_OVERLAPPEDWINDOW, // Pencerenin görünüm 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üş değeri

// 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ü olarak 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 önce de belirttiğim gibi 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 biri

hdc = BeginPaint(hWnd, &ps);  // hWnd parametre olarak 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ınmazsa öntanımlı pencere işlem fonksiyonunun değeri 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.

Yazar
Yazar
Bilgisayar Programcısı, Web Tasarımcı, Üniversite Öğrencisi...
Twitter Facebook Google Linkedin Flickr YouTube

Önceki Yazı:Casus Yazılımları Nedir? Korunma Yöntemleri Nelerdir?

Sonraki Yazı:Linux’un Kullanım Amaçları Nerelerdir?

BENZER YAZILAR
YORUMLAR

Bu yazıya 1 yorum yapılmış.

  1. Yazar
    Hatice

    İyi günler,ben visual studio da win32 console application oluşturmak istediğimde Win32 Application Wizard ekranında next gelmiyor.Dolayısıyla projeyi oluşturamıyorum.Ne yapmam gerekir?

SİZ DE CEVAP YAZABİLİRSİNİZ
Bu yazı hakkında görüşünüzü belirtin.

ES Web Tasarım Web Tasarım Blog Teması Emre Supçin Bu tema ES Web Tasarım tarafından düzenlenmiştir. Hiçbir şekilde kopyalanamaz.