Доброй ночи всем!
Поискал по форуму, посмотрел МСДН, но не увидел четкой картины стандартных вариантов создания 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).
Спасибо за внимание.