Aracılığıyla paylaş


Pencere oluşturma

Bu makalede, pencere oluşturmayı ve göstermeyi öğrenin.

Pencere sınıfları

pencere sınıfı, birkaç pencerenin ortak olabilecek davranış kümesini tanımlar. Örneğin, bir düğme grubunda, kullanıcı düğmeyi seçtiğinde her düğmenin benzer bir davranışı vardır. Elbette düğmeler tamamen aynı değildir. Her düğme kendi metin dizesini görüntüler ve kendi ekran koordinatları vardır. Her pencere için benzersiz olan veriler, örnek verileri olarak adlandırılır.

Programınız bu sınıfın yalnızca bir örneğini oluştursa bile, her pencere bir pencere sınıfıyla ilişkilendirilmelidir. Pencere sınıfı, C++ anlamda bir sınıf değildir. Bunun yerine, işletim sistemi tarafından dahili olarak kullanılan bir veri yapısıdır. Pencere sınıfları çalışma zamanında sisteme kaydedilir. Yeni bir pencere sınıfı kaydetmek için WNDCLASS yapısını doldurun:

// Register the window class.
const wchar_t CLASS_NAME[]  = L"Sample Window Class";

WNDCLASS wc = { };

wc.lpfnWndProc   = WindowProc;
wc.hInstance     = hInstance;
wc.lpszClassName = CLASS_NAME;

Aşağıdaki yapı üyelerini ayarlamanız gerekir:

  • lpfnWndProc , pencere yordamı veya pencere procadlı uygulama tanımlı bir işlevin işaretçisidir. Pencere prosedürü, pencerenin davranışının çoğunu tanımlar. Şimdilik, bu değer bir işlevin ileriye doğru bildirimidir. Daha fazla bilgi için bkz. Pencere yordamını yazma.
  • hInstance, uygulama instansının tanıtıcısıdır. Bu değeri wWinMain'nin hInstance parametresinden alın.
  • lpszClassName, pencere sınıfını tanımlayan bir dizedir.

Sınıf adları geçerli işlem için yereldir, bu nedenle adın yalnızca işlem içinde benzersiz olması gerekir. Ancak standart Windows denetimlerinin de sınıfları vardır. Bu denetimlerden herhangi birini kullanırsanız, denetim sınıfı adlarıyla çakışmayan sınıf adlarını seçmeniz gerekir. Örneğin, düğme denetiminin pencere sınıfı Buttonolarak adlandırılır.

WNDCLASS yapısının burada gösterilmeyen diğer üyeleri vardır. Bu örnekte gösterildiği gibi bunları sıfır olarak ayarlayabilir veya doldurabilirsiniz. Daha fazla bilgi için bkz. WNDCLASS.

Ardından, WNDCLASS yapısının adresini RegisterClass işlevine geçirin. Bu işlev, pencere sınıfını işletim sistemine kaydeder.

RegisterClass(&wc);

Pencereyi oluşturma

Pencerenin yeni bir örneğini oluşturmak için CreateWindowEx işlevini çağırın:

HWND hwnd = CreateWindowEx(
    0,                              // Optional window styles.
    CLASS_NAME,                     // Window class
    L"Learn to Program Windows",    // Window text
    WS_OVERLAPPEDWINDOW,            // Window style

    // Size and position
    CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,

    NULL,       // Parent window    
    NULL,       // Menu
    hInstance,  // Instance handle
    NULL        // Additional application data
    );

if (hwnd == NULL)
{
    return 0;
}

Ayrıntılı parametre açıklamaları için bkz. CreateWindowEx. İşte kısa bir özet:

  • İlk parametre, pencere için saydam pencereler gibi bazı isteğe bağlı davranışlar belirtmenize olanak tanır. Varsayılan davranışlar için bu parametreyi sıfır olarak ayarlayın.
  • CLASS_NAME, pencere sınıfının adıdır. Bu ad, oluşturulacak pencerenin türünü tanımlar.
  • Pencere metni, farklı pencere türleri tarafından farklı şekillerde kullanılır. Pencerenin başlık çubuğu varsa, metin başlık çubuğunda görüntülenir.
  • Pencere stili, bir pencerenin bazı görünüm ve hissini tanımlayan bir bayrak kümesidir. Sabit WS_OVERLAPPEDWINDOW aslında bit düzeyinde ORile birleştirilen birkaç bayraktır. Bu bayraklar birlikte pencereye bir başlık çubuğu, kenarlık, sistem menüsü ve Simge Durumuna Küçült ve Ekranı Kapla düğmelerini verir. Bu bayrak kümesi, en üst düzey uygulama penceresi için en yaygın stildir.
  • Konum ve boyut için sabit CW_USEDEFAULT varsayılan değerleri kullanmak anlamına gelir.
  • Sonraki parametre, yeni pencere için bir üst pencere veya sahip penceresi ayarlar. Alt pencere oluşturulacaksa üst öğeyi ayarlayın. Üst düzey bir pencere için bu değeri NULLolarak ayarlayın.
  • Bir uygulama penceresi için, sonraki parametre pencerenin menüsünü tanımlar. Bu örnekte menü kullanılmadığından değeri NULL.
  • hInstance önceden açıklanan örnek tanıtıcısıdır. Bkz: WinMain : Uygulama Giriş Noktası.
  • Son parametre, void*türündeki rastgele verilere ilişkin bir işaretçidir. Pencere yordamınıza bir veri yapısı geçirmek için bu değeri kullanabilirsiniz. Bu parametreyi kullanmanın olası bir yolu için bkz. Uygulama Durumunu Yönetme.

CreateWindowEx yeni pencereye bir tanıtıcı veya işlev başarısız olursa sıfır döndürür. Pencereyi göstermek için pencerenin görünür olmasını sağlamak için pencere tutamacını ShowWindowişlevinegeçirin:

ShowWindow(hwnd, nCmdShow);

hwnd parametresi, CreateWindowExtarafından döndürülen pencere tutamacıdır. nCmdShow parametresi, bir pencereyi simge durumuna küçültmek veya ekrana genişletmek için kullanılabilir. İşletim sistemi bu değeri wWinMain işlevi aracılığıyla programa geçirir.

Pencereyi oluşturmak için gereken kodun tamamı aşağıdadır. WindowProc'nin hala bir işlevin ileriye dönük bildirimi olduğunu unutmayın.

// Register the window class.
const wchar_t CLASS_NAME[]  = L"Sample Window Class";

WNDCLASS wc = { };

wc.lpfnWndProc   = WindowProc;
wc.hInstance     = hInstance;
wc.lpszClassName = CLASS_NAME;

RegisterClass(&wc);

// Create the window.

HWND hwnd = CreateWindowEx(
    0,                              // Optional window styles.
    CLASS_NAME,                     // Window class
    L"Learn to Program Windows",    // Window text
    WS_OVERLAPPEDWINDOW,            // Window style

    // Size and position
    CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,

    NULL,       // Parent window    
    NULL,       // Menu
    hInstance,  // Instance handle
    NULL        // Additional application data
    );

if (hwnd == NULL)
{
    return 0;
}

ShowWindow(hwnd, nCmdShow);

Tebrikler, bir pencere oluşturdunuz!

Şu anda pencere herhangi bir içerik içermiyor veya kullanıcıyla etkileşim kurmuyor. Gerçek bir GUI uygulamasında, pencere kullanıcıdan ve işletim sisteminden gelen olaylara yanıt verir. Sonraki bölümde, pencere iletilerinin bu tür etkileşimleri nasıl sağladığı açıklanmaktadır.

Ayrıca bkz.

Pencere İletileri bölümüne devam ederek bu modüle devam edin.