Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

MDI-приложение без MFC

87
02 февраля 2008 года
Kogrom
2.7K / / 02.02.2008
Может кто-нибудь дать ссылку на статью о том как сделать MDI-приложение на чистом WIN32 Api (если я правильно понял - приложение с динамически генерируемыми документами, типа ms word). Или хотя бы краткое описание какие функции, структуры, сообщения используются.
1.9K
03 февраля 2008 года
andriano
474 / / 10.01.2008
Начни с CreateWindow, разберись с параметрами. Этого уже достаточно, чтобы создать родительское окно и в нем несколько дочерних.
87
03 февраля 2008 года
Kogrom
2.7K / / 02.02.2008
Ладно, вижу, я задал вопрос, на который ни у кого нет готового ответа, а что-то сообразить долго. Тогда приведу последовательность действий, которую я составил, порывшись в исходниках и справках (на c++). Может какие-то ошибки есть.

1. В функции WINAPI WinMain создаем главное окно. Никаких особых стилей при создании окна не используется, разве что можно использовать WS_CLIPCHILDREN и WS_EX_APPWINDOW.

2. В той же функции сразу можно зарегистрировать тип дочернего окна, хотя можно сделать это и позже. Тут удобно использовать структуру типа WNDCLASSEX родительского окна, поменяв параметры lpfnWndProc, lpszMenuName, lpszClassName. Надо отметить, что функция обратного вызова, зарегистрированная здесь, будет одна для всех дочерних окон.

3. Тут же применяется фильтрация сообщений акселераторов для дочерних окон:

 
Код:
while(GetMessage(&Msg, NULL, 0, 0))
   {
      if (!TranslateMDISysAccel(hwndMDIClient, &Msg))
      {
         TranslateMessage(&Msg);
         DispatchMessage(&Msg);
      }
   }


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

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

Интересно, что в данном случае у всех документов одна и та же функция обратного вызова. Это пока в моей голове трудно укладывается.

6. Можно создать "документ" и другим способом – с помощью функции CreateWindowEx с расширенным стилем WS_EX_MDICHILD. Вероятно, в данном случае удобнее регистрировать разные типы дочерних окон, например, если надо, чтоб у разных типов документов были разные функции обратного вызова. Это может позволить создать "документы", содержащие разные типы дочерних окон и т.п.
279
07 февраля 2008 года
bave
456 / / 07.03.2004
Цитата:

Может кто-нибудь дать ссылку на статью о том как сделать MDI-приложение на чистом WIN32 Api



Цитата:

Ладно, вижу, я задал вопрос, на который ни у кого нет готового ответа



Да, как же нету... Все просо ждали, когда ты сам к этому ответу придёшь :)

вот от:
http://msdn2.microsoft.com/en-us/library/ms632591.aspx

87
07 февраля 2008 года
Kogrom
2.7K / / 02.02.2008
Цитата: bave
Да, как же нету... Все просо ждали, когда ты сам к этому ответу придёшь :)
вот от:
http://msdn2.microsoft.com/en-us/library/ms632591.aspx


Угу. Подождал немного и пошел туда :)
Надеялся, что мне на русском хорошую статью дадут :)
Потом еще порылся и нашёл на русском, правда немного устаревшую:
http://systemnews.com.ru/?mod=art&part=win3x&id=007

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог