MDI
От: Петров Андрей Викторович  
Дата: 13.06.03 21:14
Оценка:
Доброй ночи всем!
Поискал по форуму, посмотрел МСДН, но не увидел четкой картины стандартных вариантов создания MDI приложений используя чистый WinAPI. Ранее работал только с диалоговыми окнами, поэтому хочу разобраться и с этим.
Изложу сведения, которые я почерпнул:

В первую очередь в функции WinMain регистрируются классы Frame и Child, создается главное окно и очередь сообщений, что-то типа:
HWND hWnd,hMDIChild; // глобальные описатели
.........................
// это в WinMain

WNDCLASS WndClass;
memset( &WndClass, 0, sizeof( WNDCLASS ) );

/******* Frame *********************************/

WndClass.style = CS_HREDRAW | CS_VREDRAW;
WndClass.lpfnWndProc = FrameWndProc;
WndClass.hInstance = hInst;
WndClass.hbrBackground = GetStockBrush( GRAY_BRUSH );
WndClass.lpszClassName = pszFrameClass;
WndClass.hIcon = LoadIcon( hInst, MAKEINTRESOURCE( IDI_ICON1 ) );
WndClass.hCursor = LoadCursor( hInst, IDC_ARROW );
RegisterClass( &WndClass );

/******* Child *********************************/

WndClass.lpfnWndProc   = (WNDPROC)ChildWndProc; 
WndClass.hIcon         = LoadIcon( hInst, MAKEINTRESOURCE( IDI_ICON1 ) ); 
WndClass.lpszMenuName  = (LPCTSTR)NULL; 
WndClass.lpszClassName = pszChildClass; 
 
RegisterClass( &WndClass );

/******** Creating Frame Window ****************/

hWnd = CreateWindow( pszFrameClass,"SClient", WS_OVERLAPPEDWINDOW | WS_HSCROLL | WS_VSCROLL,
        10,10,600,480,NULL,NULL,hInst,NULL);

ShowWindow( hWnd, SW_SHOW );
UpdateWindow( hWnd );

/******** Очередь сообщений ********************/

MSG        msg;
bool    bRet;
while ( ( bRet = GetMessage( &msg, (HWND)NULL, 0, 0 ) ) != 0 )
{
        if (bRet == -1)
    {
                //error
    }
    else 
    { 
        TranslateMessage( &msg ); 
        DispatchMessage( &msg ); 
    } 
}

После этого описываются функции FrameWndProc и ChildWndProc:
LRESULT CALLBACK ChildWndProc( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam )
{
    switch( uMsg )
    {
    case WM_CREATE:
        {
                 ..................................
            break;
        }
    default:
        {
            return    DefMDIChildProc( hWnd, uMsg, wParam, lParam );
        }
    }
}

LRESULT CALLBACK FrameWndProc( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam )
{
    switch( uMsg )
    {
    case WM_DESTROY:
        {
            PostQuitMessage( 0 );
            return    0;
        }
    case WM_CREATE:
        {
                 .......................................
            break;
        }
    case WM_SIZE:
        {
                 .......................................
        }
    default:
        return DefFrameProc( hWnd, hMDIClient, uMsg, wParam, lParam );
    }
}

Далее в FrameWndProc в обработчике WM_CREATE создается окно Childa.
CLIENTCREATESTRUCT ccs; 
 
ccs.hWindowMenu = GetSubMenu(GetMenu(hWnd), IDR_MENU1 ); 
ccs.idFirstChild = IDM_FIRSTCHILD; 

hMDIClient = CreateWindow( pszChildClass, NULL, WS_CHILD | WS_CLIPCHILDREN | WS_VISIBLE ,   
                       10, 10, 100, 100, hWnd, (HMENU)NULL, g_hInst,(LPSTR)&ccs) ;
    
ShowWindow( hMDIClient, SW_SHOW);


Теперь собственно вопросы.
1.Каким образом создать окно Childa или несколько окон(после проделанных мной манипуляций визуально ничего не создается).
2.Обработку каких сообщений надо вести и как.
3.Каким образом добавлять в созданные окна контролы(edit, button etc).

Спасибо за внимание.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.