switch (message) { case WM_COMMAND: wmId = LOWORD(wParam); wmEvent = HIWORD(wParam); // Parse the menu selections: switch (wmId) { case IDM_EXIT: DestroyWindow(hSWnd); break; default: return DefWindowProc(hSWnd, message, wParam, lParam); } break; case WM_PAINT: hdc = BeginPaint(hSWnd, &ps); // TODO: Add any drawing code here... EndPaint(hSWnd, &ps); break; case WM_DESTROY: PostQuitMessage(0); break; default: return DefWindowProc(hSWnd, message, wParam, lParam); } return 0; }
Дальше нужно сделать, чтобы это окно открывалось после выбора пункта меню в главном окне.
volvo
30.07.2008 4:30
Ну, так сделай что-то вроде:
LRESULT CALLBACK WindowProcedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) { switch (message) { case WM_COMMAND: // получили команду от пользователя switch(wParam) { case IDM_CREATECHILD: // на создание дочернего окна
// переменная hChildWnd описана глобально, как и hwnd - хендл главного окна приложения hChildWnd = CreateWindowEx (0, szWindowClass, "Child Window", // заголовок дочернего окна WS_CHILD|WS_CAPTION|WS_SYSMENU|WS_THICKFRAME|WS_VISIBLE, // его стиль 200, 200, 200, 200, // и размеры hwnd, NULL, ::GetModuleHandle(NULL), NULL );
Добавлено через 3 мин. P.S. Ах, да... Забыл... CSecondWindow вызывается там же, где регистрируется класс основного окна... Ибо просто регистрация класса ни к чему не обязывает - создавать окно этого класса можно потом, когда в этом возникнет необходимость.
guf
31.07.2008 3:04
Сделал почти как ты описал. Теперь окно About вылезает если вызывать окно
volvo
31.07.2008 3:23
Значит, делай не "почти", а точно так, как я описал. Потому что я не придумывал ничего прямо здесь, а проверил, и скопировал кусок из отработавшего проекта. Никакое окно "About" не выскакивает, когда не положено...
guf
31.07.2008 3:36
Переделал работает. Не получается точно также...
case IDM_CREATECHILD: // на создание дочернего окна
// переменная hChildWnd описана глобально, как и hwnd - хендл главного окна приложения hChildWnd = CreateWindowEx (0, szWindowClass, "Child Window", // заголовок дочернего окна WS_CHILD|WS_CAPTION|WS_SYSMENU|WS_THICKFRAME|WS_VISIBLE, // его стиль 200, 200, 200, 200, // и размеры hwnd, NULL, ::GetModuleHandle(NULL), NULL );
"Child Window" не получается заголовок сделать, пишет
Цитата
cannot convert parameter 3 from 'const char [3]' to 'LPCWSTR'
как это описать?
volvo
31.07.2008 4:13
Я изначально тестировал на Code::Blocks, но для Студии надо сделать следующее (пишу по памяти, Студию запустить сейчас не могу, я не под Windows):
1. Добавить
TCHAR szTitle[MAX_LOADSTRING]; // The title bar text TCHAR szChildTitle[MAX_LOADSTRING]; // Вот эту строку - здесь будет храниться заголовок дочерней формы
2. Добавить
// Initialize global strings LoadString(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING); LoadString(hInstance, IDS_CHILD_TITLE, szChildTitle, MAX_LOADSTRING); // <--- Чтение из ресурсов
(естественно, в resource.h надо добавить константу IDS_CHILD_TITLE, а в сам файл ресурсов .RC - добавить к уже существующему STRINGTABLE саму строку:
Убедись, что ты регистрируешь класс основного окна и дочернего с разными именами классов, потому что из того что ты запостил здесь следует как раз, что имена классов одинаковые: у тебя при регистрации класса дочернего окна записано:
wc.lpszClassName = szWindowClass;
, а это то, что студия делает для основного тоже... Если так, то придется тебе еще и описать строку szChildWindowClass (по подобию szWindowClass, опять внести изменения в resource.h и RC-файл, и прочитать строку с именем дочернего класса по аналогии с тем, как читается szWindowClass)...
И самое главное - не забудь поставить тот break, который у меня стоит перед default, очень похоже на то, что ты его упустил, и поэтому у тебя при создании дочернего окна еще и выскакивает About...
guf
31.07.2008 5:09
Да про break ты прав, я поспешил. С заголовкам так и не получилось ничего сделать. Мне вот интересено как сделать оконную процедуру для дочернего окна, типа LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM) у главного окна.