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).

Спасибо за внимание.
Re: MDI
От: SergH Россия  
Дата: 14.06.03 21:48
Оценка:
Здравствуйте, Петров Андрей Викторович, Вы писали:

[skip]

0. Я когда-то из интереса разбирался, но это было давно и я мало чего помню.
1. Там было такое специальное окно — "MDICLIENT" У тебя его, вроде, нет. Это неправильно.
2. Поищи в сети книжку Чарльз Петзольд "Программирование Windows 95". Она есть на русском, там во второй части есть более-менее подробное описание MDI.
Делай что должно, и будь что будет
Re[2]: MDI
От: Петров Андрей Викторович  
Дата: 15.06.03 07:53
Оценка:
Здравствуйте, SergH, Вы писали:

SH>Здравствуйте, Петров Андрей Викторович, Вы писали:


SH>[skip]


SH>0. Я когда-то из интереса разбирался, но это было давно и я мало чего помню.

SH>1. Там было такое специальное окно — "MDICLIENT" У тебя его, вроде, нет. Это неправильно.
SH>2. Поищи в сети книжку Чарльз Петзольд "Программирование Windows 95". Она есть на русском, там во второй части есть более-менее подробное описание MDI.

Спасибо, но с пунктами 1, 3 уже сам разобрался
Насчет пункта 2, интересует в связи с использованием ToolBarов и StatusBarов.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.