Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
Bu bölümdeki örneklerde aşağıdaki görevlerin nasıl gerçekleştirildiği açıklanmaktadır:
- Ana Pencere Oluşturma
- Alt Pencereler Oluşturma, Numaralandırma ve Boyutlandırma
- Pencere Yıkma
- Katmanlı Pencereler Kullanarak
Ana Pencere Oluşturma
Uygulamanın oluşturduğu ilk pencere genellikle ana penceredir. CreateWindowEx işlevini kullanarak, pencere sınıfı, pencere adı, pencere stilleri, boyut, konum, menü tutamacı, örnek tutamacı ve oluşturma verilerini belirterek ana pencereyi oluşturursunuz. Ana pencere uygulama tanımlı bir pencere sınıfına ait olduğundan, ana pencereyi oluşturmadan önce pencere sınıfını kaydetmeniz ve sınıf için bir pencere yordamı sağlamanız gerekir.
Çoğu uygulama genellikle ana pencereyi oluşturmak için WS_OVERLAPPEDWINDOW stilini kullanır. Bu stil pencereye başlık çubuğu, pencere menüsü, boyutlandırma kenarlığı ve simge durumuna küçült ile büyüt düğmeleri verir. createWindowExişlevi, pencereyi benzersiz olarak tanımlayan bir tanıtıcı döndürür.
Aşağıdaki örnek, uygulama tanımlı bir pencere sınıfına ait bir ana pencere oluşturur. Ana Pencere pencere adı, pencerenin başlık çubuğunda görüntülenir. uygulama, WS_VSCROLL ve WS_HSCROLL stillerini WS_OVERLAPPEDWINDOW stiliyle birleştirerek, WS_OVERLAPPEDWINDOW stili tarafından sağlanan bileşenlere ek olarak yatay ve dikey kaydırma çubukları içeren bir ana pencere oluşturur. CW_USEDEFAULT sabitinin dört oluşumu, pencerenin başlangıç boyutunu ve konumunu sistem tanımlı varsayılan değerlere ayarlar. Menü tutamacı yerine NULL belirterek, pencerede pencere sınıfı için tanımlanmış menü bulunur.
HINSTANCE hinst;
HWND hwndMain;
// Create the main window.
hwndMain = CreateWindowEx(
0, // no extended styles
"MainWClass", // class name
"Main Window", // window name
WS_OVERLAPPEDWINDOW | // overlapped window
WS_HSCROLL | // horizontal scroll bar
WS_VSCROLL, // vertical scroll bar
CW_USEDEFAULT, // default horizontal position
CW_USEDEFAULT, // default vertical position
CW_USEDEFAULT, // default width
CW_USEDEFAULT, // default height
(HWND) NULL, // no parent or owner window
(HMENU) NULL, // class menu used
hinst, // instance handle
NULL); // no window creation data
if (!hwndMain)
return FALSE;
// Show the window using the flag specified by the program
// that started the application, and send the application
// a WM_PAINT message.
ShowWindow(hwndMain, SW_SHOWDEFAULT);
UpdateWindow(hwndMain);
Yukarıdaki örnekte ana pencere oluşturulduktan sonra ShowWindowişlevininçağırıldığını göreceksiniz. Bunun nedeni, sistemin oluşturduktan sonra ana pencereyi otomatik olarak görüntülememesidir. SW_SHOWDEFAULT bayrağını ShowWindow geçirerek, uygulama uygulamayı başlatan programın ana pencerenin ilk gösteri durumunu ayarlamasına izin verir. UpdateWindow işlevi pencereye ilk WM_PAINT iletisini gönderir.
Alt Pencerelerin Oluşturulması, Numaralandırılması ve Boyutlandırılması
Alt pencereleri kullanarak pencerenin istemci alanını farklı işlevsel alanlara bölebilirsiniz. Alt pencere oluşturmak, ana pencere oluşturmaya benzer; CreateWindowExişlevinikullanırsınız. Uygulama tanımlı bir pencere sınıfının penceresini oluşturmak için, pencere sınıfını kaydetmeniz ve alt pencereyi oluşturmadan önce bir pencere yordamı sağlamanız gerekir. Alt pencereye WS_CHILD stilini vermeli ve oluşturduğunuzda alt pencere için bir üst pencere belirtmelisiniz.
Aşağıdaki örnek, eşit boyutta üç alt pencere oluşturarak uygulamanın ana penceresinin istemci alanını üç işlevsel alana böler. Her alt pencere, ana pencerenin istemci alanıyla aynı yükseklikte olup, genişliğinin üçte biri kadardır. Ana pencere, ana pencerenin kendi pencere oluşturma işlemi sırasında aldığı WM_CREATE iletisine yanıt olarak alt pencereleri oluşturur. Her alt pencerenin WS_BORDER stili olduğundan, her birinin ince çizgi kenarlı olması gerekir. Ayrıca, WS_VISIBLE stili belirtilmediğinden, her alt pencere başlangıçta gizlenir. Ayrıca her alt pencereye bir alt pencere tanımlayıcısı atandığını da göreceksiniz.
Ana pencere, kendi boyutu değiştiğinde aldığı WM_SIZE iletisine yanıt olarak alt pencerelerin boyutunu ve konumunu ayarlar. WM_SIZEyanıt olarak, ana pencere GetClientRect işlevini kullanarak istemci alanının boyutlarını alır ve sonra boyutları EnumChildWindows işlevine geçirir. EnumChildWindows her alt pencereye, sırayla, tanıtıcıyı uygulama tanımlı EnumChildProc geri çağırma işlevine geçirir. Bu işlev, MoveWindow işlevini çağırarak her alt pencereyi boyutlandırıp konumlandırabilir; boyut ve konum, ana pencerenin istemci alanının boyutlarına ve alt pencerenin tanımlayıcısını temel alır. Daha sonra EnumChildProc pencereyi görünür hale getirmek için ShowWindow işlevini çağırır.
#define ID_FIRSTCHILD 100
#define ID_SECONDCHILD 101
#define ID_THIRDCHILD 102
LONG APIENTRY MainWndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
RECT rcClient;
int i;
switch(uMsg)
{
case WM_CREATE: // creating main window
// Create three invisible child windows.
for (i = 0; i < 3; i++)
{
CreateWindowEx(0,
"ChildWClass",
(LPCTSTR) NULL,
WS_CHILD | WS_BORDER,
0,0,0,0,
hwnd,
(HMENU) (int) (ID_FIRSTCHILD + i),
hinst,
NULL);
}
return 0;
case WM_SIZE: // main window changed size
// Get the dimensions of the main window's client
// area, and enumerate the child windows. Pass the
// dimensions to the child windows during enumeration.
GetClientRect(hwnd, &rcClient);
EnumChildWindows(hwnd, EnumChildProc, (LPARAM) &rcClient);
return 0;
// Process other messages.
}
return DefWindowProc(hwnd, uMsg, wParam, lParam);
}
BOOL CALLBACK EnumChildProc(HWND hwndChild, LPARAM lParam)
{
LPRECT rcParent;
int i, idChild;
// Retrieve the child-window identifier. Use it to set the
// position of the child window.
idChild = GetWindowLong(hwndChild, GWL_ID);
if (idChild == ID_FIRSTCHILD)
i = 0;
else if (idChild == ID_SECONDCHILD)
i = 1;
else
i = 2;
// Size and position the child window.
rcParent = (LPRECT) lParam;
MoveWindow(hwndChild,
(rcParent->right / 3) * i,
0,
rcParent->right / 3,
rcParent->bottom,
TRUE);
// Make sure the child window is visible.
ShowWindow(hwndChild, SW_SHOW);
return TRUE;
}
Pencereyi Yok Etme
Bir pencereyi yok etmek için DestroyWindow işlevini kullanabilirsiniz. Genellikle, bir uygulama bir pencereyi yok etmeden önce WM_CLOSE iletisini gönderir ve pencere yok edilmeden önce kullanıcıdan onay isteme fırsatı verir. Kullanıcı pencere menüsünden Kapat seçeneğine tıkladığında, içinde pencere menüsü bulunan bir pencere otomatik olarak WM_CLOSE mesajını alır. Kullanıcı pencerenin yok edilmesi gerektiğini onaylarsa, uygulama DestroyWindowçağırır. Sistem, WM_DESTROY iletisini ekrandan kaldırdıktan sonra pencereye gönderir. WM_DESTROYyanıt olarak, pencere verilerini kaydeder ve ayırmış olduğu tüm kaynakları serbest bırakır. Ana pencere, uygulamadan çıkmak için PostQuitMessage işlevini çağırarak WM_DESTROY işlemini tamamlar.
Aşağıdaki örnekte, bir pencereyi yok etmeden önce kullanıcı onayı isteme işlemi gösterilmektedir.
WM_CLOSEyanıt olarak Evet, Hayırve İptal düğmelerini içeren bir iletişim kutusu görüntülenir. Kullanıcı evet tıklarsa DestroyWindow çağrılır; aksi takdirde, pencere yok olmaz. Uygulama WM_CLOSE iletisini işlerken 0 her durumda döndürülür. Yok edilen pencere bir ana pencere olduğundan, kod WM_DESTROYmesajına yanıt olarak PostQuitMessage çağırır.
case WM_CLOSE:
// Create the message box. If the user clicks
// the Yes button, destroy the main window.
if (MessageBox(hwnd, szConfirm, szAppName, MB_YESNOCANCEL) == IDYES)
DestroyWindow(hwndMain);
return 0;
case WM_DESTROY:
// Post the WM_QUIT message to
// quit the application terminate.
PostQuitMessage(0);
return 0;
Katmanlı Windows kullanma
bir iletişim kutusunun yarı saydam bir pencere olarak gelmesini sağlamak için, önce iletişim kutusunu her zamanki gibi oluşturun. Ardından, WM_INITDIALOGüzerinde pencerenin genişletilmiş stilinin katmanlı bitini ayarlayın ve istenen alfa değeriyle SetLayeredWindowAttributesçağırın. Kod şöyle görünebilir:
// Set WS_EX_LAYERED on this window
SetWindowLong(hwnd,
GWL_EXSTYLE,
GetWindowLong(hwnd, GWL_EXSTYLE) | WS_EX_LAYERED);
// Make this window 70% alpha
SetLayeredWindowAttributes(hwnd, 0, (255 * 70) / 100, LWA_ALPHA);
SetLayeredWindowAttributes'nin üçüncü parametresinin 0 ile 255 arasında bir değer olduğunu ve 0'ın pencereyi tamamen saydam ve 255'in ise tamamen donuk hale getirdiğini unutmayın. Bu parametre, AlphaBlend işlevinin daha çok yönlü BLENDFUNCTION taklit eder.
Bu pencereyi yeniden tamamen karartmak için SetWindowLongçağırarak WS_EX_LAYERED bitini kaldırın ve ardından pencerenin yeniden boyanmasını isteyin. Biti kaldırmak, sisteme katmanlama ve yeniden yönlendirme ile ilişkili bazı bellekleri boşaltabileceğini bildirmek için istenir. Kod şöyle görünebilir:
// Remove WS_EX_LAYERED from this window styles
SetWindowLong(hwnd,
GWL_EXSTYLE,
GetWindowLong(hwnd, GWL_EXSTYLE) & ~WS_EX_LAYERED);
// Ask the window and its children to repaint
RedrawWindow(hwnd,
NULL,
NULL,
RDW_ERASE | RDW_INVALIDATE | RDW_FRAME | RDW_ALLCHILDREN);
Katmanlı alt pencereleri kullanmak için uygulamanın bildirimde Windows 8'e duyarlı olduğunu bildirmesi gerekir.
Windows 10/11 için, app.manifest’a Windows 10 uyumluluğu sağlamak amacıyla bu uyumluluk parçacığı eklenebilir:
...
<compatibility xmlns="urn:schemas-microsoft-com:compatibility.v1">
<application>
<!-- Windows 10 GUID -->
<supportedOS Id="{8e0f7a12-bfb3-4fe8-b9a5-48fd50a15a9a}" />
</application>
</compatibility>
...
Uygulama bildirimini değiştirme hakkında daha fazla bilgiyi burada okuyabilirsiniz: Uygulama bildirimleri