Oluşturma, sıralama ve alt pencereleri boyutlandırma

Alt pencereler kullanarak pencerenin istemci alanının farklı işlevsel alanlara bölebilirsiniz. Alt pencere yaratıyor ana pencere oluşturma gibi — CreateWindowEx işlevini kullanın. Bir uygulama tanımlı pencere sınıfı bir pencere oluşturmak için pencere sınıfı kayıt ve alt pencere oluşturmadan önce bir pencere yordamını sağlar. Alt pencere WS_CHILD stilini vermek ve alt pencere için bir üst pencere oluştururken belirtmeniz gerekir.

Aşağıdaki örnek bir uygulamanın ana penceresinin istemci alanı eşit büyüklükte üç alt pencereleri oluşturarak üç işlevsel alanlara böler. Her alt pencereyi ana pencerenin istemci alanı aynı yükseklikte, ama her üçte biri onun genişliği. Ana pencere ana pencerenin kendi penceresi oluşturma işlemi sırasında aldığı wm_create iletiye yanıt olarak windows çocuk oluşturur. Her alt pencere ws_border stil olmadığından, her ince çizgi kenarlığı vardır. WS_VISIBLE stili belirtilmemiş olduğundan, Ayrıca, her alt pencere başlangıçta gizli. Ayrıca her alt pencere bir alt pencere tanımlayıcısı atanır fark.

Ana pencere boyutları ve alt pencereleri yanıt boyutu değiştiğinde ana penceresinde alır WM_SIZE mesajı olarak konumlandırır. WM_SIZE karşılık, ana penceresinde GetWindowRect işlevini kullanarak, istemci alanının boyutlarını alır ve boyutları EnumChildWindows işlevine geçirir. EnumChildWindows her alt pencere tanıtıcısı, uygulama tanımlı EnumChildProc geri çağrı işlevine geçirir. Bu işlev, boyutları ve MoveWindow işlevini çağırarak her alt pencere konumları; boyutu ve konumu ana pencerenin istemci alanının boyutlarını ve alt pencere tanıtıcısı dayanır. Daha sonra EnumChildProc pencere görünür yapmak 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; 
} 
 

Index