Помогите со следующей задачкой, а то что-то непонял как работать с дочерними окнами
Программа создаёт два простых окна и демонстрирует работу функции SetParent,
что делает первое окно дочерним второго
Задание
1)Модифицируйте программу таким образом, что б при создании главного
окна (case WM_CREATE) создавались два дочерних окна (стиль окна
WS_CHILD|WS_CAPTION|WS_VISIBLE|WS_SYSMENU) размера приблизительно 0.25 родительского окна
2)Упорядочте дочерние окна с помощью функции TileWindows:
TileWindows(hWnd, MDITILE_HORIZONTAL, NULL, NULL, NULL);
Закрытие будь-какого дочернего окна не должно приводить к закрытию родительского окна
#include <windows.h>
HINSTANCE hIn;
// Прототип функції вікна:
LRESULT CALLBACK WinProc(HWND, UINT,
WPARAM, LONG);
// Прототип функції реєстрація нового віконного класу:
ATOM winclass();
// Прототип функції cтворення вікна:
HWND makeexamplewin();
// Головна функція:
int WINAPI WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpszCmdLine, int nCmdShow)
{
hIn= hInstance; //Зберегти ідентифікатор прикладної програми;
MSG msg ;// структура для роботи з повідомленнями;
winclass(); //Зареєструвати новий віконний клас;
HWND hWnd1=makeexamplewin(); // Створити перше вікно:
HWND hWnd2=makeexamplewin(); // Створити друге вікно:
ShowWindow(hWnd1, nCmdShow);// відобразити перше вікно;
ShowWindow(hWnd2, nCmdShow);// відобразити друге вікно;
//Зробити перше вікно дочірнім другого:
SetParent( hWnd1, hWnd2);
//Запустити цикл обробки повідомлень:
while(GetMessage(&msg, NULL, 0, 0))
{
//Після одержання повідомлення викликати функцію WindowProc:
DispatchMessage(&msg);
}
return msg.wParam; // Повернути значення wParam;
}
//Функція вікна:
LRESULT CALLBACK WinProc(HWND hWnd, UINT Msg,
WPARAM wParam, LONG lParam)
{
switch (Msg)
{
case WM_DESTROY:
//Виклик функції завершення програми:
PostQuitMessage(0);
break;
//У випадку всіх інших повідомлень їх обробка за замовчуванням:
default:
return DefWindowProc(hWnd, Msg, wParam, lParam);
} //Кінець оператора switch.
return 0; //Повернення в Windows;
}
// Функція реєстрації нового віконного класу:
ATOM winclass()
{
WNDCLASS wc; // структура класу вікна;
memset(&wc,0,sizeof(wc));
// Визначити клас вікна:
wc.lpfnWndProc=WinProc; //Ім'я віконної функції;
wc.hInstance=hIn; //Дескриптор прикладної програми;
wc.hIcon=LoadIcon(NULL, IDI_APPLICATION);
wc.hCursor=LoadCursor(NULL, IDC_ARROW);
//Дескриптор пензля для тла вікна:
wc.hbrBackground= GetStockObject(WHITE_BRUSH);
//Покажчик на рядок з ім'ям класу вікна:
wc.lpszClassName="Examplewinclass";
//Реєструвати клас вікна:
return RegisterClass(&wc);
}
// Функція cтворення вікна:
HWND makeexamplewin()
{
// Створити вікно:
return CreateWindow(
"Examplewinclass", // Довільне ім'я класу вікна;
"First and second windows", // Заголовок вікна;
WS_OVERLAPPEDWINDOW,//стиль вікна;
//Задати розміри й розташування вікна, прийняті за замовчуванням:
CW_USEDEFAULT, // координата x;
CW_USEDEFAULT, // координата y;
CW_USEDEFAULT, // ширина вікна;
CW_USEDEFAULT, // висота вікна;
0, // дескриптор батьківського вікна;
0, // дескриптор меню (меню немає);
hIn, // дескриптор програми;
0); // додаткові дані;
}
Создание дочерних окон
Модераторы: Duncon, Hawk, Romeo, Eugie
- Stealth Legion
- Сообщения: 13
- Зарегистрирован: 21 июл 2007, 15:10
- Откуда: Преисподня
А я вот не могу разобрать с твоим вопросом?setevik писал(а):Помогите со следующей задачкой, а то что-то непонял как работать с дочерними окнами
Программа создаёт два простых окна и демонстрирует работу функции SetParent,
что делает первое окно дочерним второго
Что именно тебе не понятно?
Создается функция-процедура WinProc(...ля-ля-тополя...)
В ней добавляешь обработчик сообщения WM_CREATE
и запускаешь свою НОВУЮ функцию:
__checkReturn BOOL __success(TRUE) fnExCreateChildWinwow(
__in WNDPROC lpfnFunctionForThisWindow, ///адрес функции - процедуры, которая будет обрабатывать сообщения из этого окна (НОВАЯ, свою напиши, а не та что в коде, готовая)
__in RECT rcWindowPos ///координаты положения окна
{
BOOL fSuccess=0;
WNDCLASSEX wndClass;
//начинаешь настравить клсс как необходимо,
//но в WNDPROC поле устанавливаешь адрес процедуры из аргумента
fSuccess=RegisterClassEx(&wndClass);
if (fSuccess=0)
{
//ошибка : не удалось создать окно
return FALSE;
}
HWND hChildWindow=CreateEx(
WS_EX_APPWINDOW | WS_EX_TOOLWINDOWS | WS_EX_TOPMOST,
//касс окна,
//заголовок окна,
WS_VISIBLE | WS_CHILD, //стили дочернего окна
rcWindowPos.left, rcWindowPos.top,
rcWindowPos.right-rcWindowPos.left,
rcWindowPos.bottom-rcWindowPos.top,
//ну и дальше как всегда
);
if (hChildWindow=0)
{
//не удалось создать окно
return FLASE
}
//показываешь окно и все сообщения из этого окна отправляюся в указанную функцю-процедуру...вот и все...
return (TRUE);
}
Вот и все...