while(GetMessage(&Msg, NULL, 0, 0))
{
if (!TranslateMDISysAccel(hwndMDIClient, &Msg))
{
TranslateMessage(&Msg);
DispatchMessage(&Msg);
}
}
MDI-приложение без MFC
Может кто-нибудь дать ссылку на статью о том как сделать MDI-приложение на чистом WIN32 Api (если я правильно понял - приложение с динамически генерируемыми документами, типа ms word). Или хотя бы краткое описание какие функции, структуры, сообщения используются.
Начни с CreateWindow, разберись с параметрами. Этого уже достаточно, чтобы создать родительское окно и в нем несколько дочерних.
1. В функции WINAPI WinMain создаем главное окно. Никаких особых стилей при создании окна не используется, разве что можно использовать WS_CLIPCHILDREN и WS_EX_APPWINDOW.
2. В той же функции сразу можно зарегистрировать тип дочернего окна, хотя можно сделать это и позже. Тут удобно использовать структуру типа WNDCLASSEX родительского окна, поменяв параметры lpfnWndProc, lpszMenuName, lpszClassName. Надо отметить, что функция обратного вызова, зарегистрированная здесь, будет одна для всех дочерних окон.
3. Тут же применяется фильтрация сообщений акселераторов для дочерних окон:
Код:
4. Переходим к функции обратного вызова для главного окна. Тут при обработке сообщения WM_CREATE создается загадочное окно MDI Client Window. Предварительно заполняется структура типа CLIENTCREATESTRUCT. Например, так:
Код:
ccs.hWindowMenu = GetSubMenu(GetMenu(hwnd), WINDOWMENU);
ccs.idFirstChild = IDM_WINDOWCHILD;
// Create the MDI client window.
hwndMDIClient = CreateWindow( "MDICLIENT", (LPCTSTR) NULL,
WS_CHILD | WS_CLIPCHILDREN | WS_VSCROLL | WS_HSCROLL,
0, 0, 0, 0, hwnd, (HMENU) ID_MDI_CLIENT, hInst, (LPSTR) &ccs);
ccs.idFirstChild = IDM_WINDOWCHILD;
// Create the MDI client window.
hwndMDIClient = CreateWindow( "MDICLIENT", (LPCTSTR) NULL,
WS_CHILD | WS_CLIPCHILDREN | WS_VSCROLL | WS_HSCROLL,
0, 0, 0, 0, hwnd, (HMENU) ID_MDI_CLIENT, hInst, (LPSTR) &ccs);
5. Самое интересное – создание "документа". Его можно создавать по какому-либо событию главного окна. Предварительно создается структура типа MDICREATESTRUCT, затем передается указатель на нее в сообщении WM_MDICREATE окну MDI Client Window (см. пункт 4).
Пример:
Код:
MDICREATESTRUCT mcs;
HWND hChild;
mcs.szTitle = "[Untitled]";
mcs.szClass = "MyMDIChild";
mcs.hOwner = hInst;
mcs.x = mcs.cx = CW_USEDEFAULT;
mcs.y = mcs.cy = CW_USEDEFAULT;
mcs.style = MDIS_ALLCHILDSTYLES;
hChild = (HWND)SendMessage(hwndMDIClient, WM_MDICREATE,
0, (LONG)&mcs);
HWND hChild;
mcs.szTitle = "[Untitled]";
mcs.szClass = "MyMDIChild";
mcs.hOwner = hInst;
mcs.x = mcs.cx = CW_USEDEFAULT;
mcs.y = mcs.cy = CW_USEDEFAULT;
mcs.style = MDIS_ALLCHILDSTYLES;
hChild = (HWND)SendMessage(hwndMDIClient, WM_MDICREATE,
0, (LONG)&mcs);
Интересно, что в данном случае у всех документов одна и та же функция обратного вызова. Это пока в моей голове трудно укладывается.
6. Можно создать "документ" и другим способом – с помощью функции CreateWindowEx с расширенным стилем WS_EX_MDICHILD. Вероятно, в данном случае удобнее регистрировать разные типы дочерних окон, например, если надо, чтоб у разных типов документов были разные функции обратного вызова. Это может позволить создать "документы", содержащие разные типы дочерних окон и т.п.
Цитата:
Может кто-нибудь дать ссылку на статью о том как сделать MDI-приложение на чистом WIN32 Api
Цитата:
Ладно, вижу, я задал вопрос, на который ни у кого нет готового ответа
Да, как же нету... Все просо ждали, когда ты сам к этому ответу придёшь :)
вот от:
http://msdn2.microsoft.com/en-us/library/ms632591.aspx
Цитата: bave
Да, как же нету... Все просо ждали, когда ты сам к этому ответу придёшь :)
вот от:
http://msdn2.microsoft.com/en-us/library/ms632591.aspx
вот от:
http://msdn2.microsoft.com/en-us/library/ms632591.aspx
Угу. Подождал немного и пошел туда :)
Надеялся, что мне на русском хорошую статью дадут :)
Потом еще порылся и нашёл на русском, правда немного устаревшую:
http://systemnews.com.ru/?mod=art&part=win3x&id=007