Нужно создать главное окно из шаблона диалога
В vs создаю ресурс диалога
пишу такой код :
#include <windows.h>
#include "resource.h"
HWND mainDlg;
INT_PTR CALLBACK MainDlgProc(HWND hwndDlg,
UINT uMsg,
WPARAM wParam,
LPARAM lParam)
{
switch(uMsg)
{
case WM_INITDIALOG :
ShowWindow(hwndDlg,SW_SHOW);
return TRUE;
break;
default : return FALSE;
}
}
int CALLBACK WinMain(
HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow
)
{
mainDlg=CreateDialog(hInstance,
MAKEINTRESOURCE(ID_MAIN_DLG),
GetDesktopWindow(),
MainDlgProc);
BOOL bRet;
MSG msg;
while((bRet=GetMessage(&msg,NULL,0,0))!=0)
{
if(bRet==-1)
{
}else
if((!IsWindow(mainDlg))||(!IsDialogMessage(mainDlg,&msg)))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
return 0;
}
окно то создается но полноценно
(закрытие, изменение размеров) не отрабатывается
можно ли создавать окна и приименять к ним шаблоны диалога?
зы
чем отличаются диалоги от окон?
зачем Билли разделил диалоги и окна?
А>пишу такой код :
Код твой — ф топку без разбирательств даже. Руки тебе оторвать и к компьютеру не пускать!
Должно быть:
#include <windows.h>
#include "resource.h"
HWND mainDlg = NULL;
INT_PTR
CALLBACK
MainDlgProc (
HWND hwndDlg,
UINT uMsg,
WPARAM wParam,
LPARAM lParam)
{
switch (uMsg)
{
case WM_INITDIALOG:
ShowWindow (hwndDlg, SW_SHOW);
return TRUE;
default:
return DefDlgProc (hwndDlg, uMsg, wParam, lParam);
}
}
int
CALLBACK
WinMain (
HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)
{
mainDlg = CreateDialog (
hInstance,
MAKEINTRESOURCE (ID_MAIN_DLG),
GetDesktopWindow (),
MainDlgProc);
if (! mainDlg) return 1;
BOOL bRet;
MSG msg;
while ((bRet = GetMessage (&msg, NULL, 0, 0)) != 0)
{
if (bRet == -1)
{
}
else
{
if (IsDialogMessage (mainDlg, &msg))
{
TranslateMessage (&msg);
DispatchMessage (&msg);
}
}
}
return 0;
}
А> чем отличаются диалоги от окон?
Это две совершенно разные вещи. Окна — пассивны, являются независимыми от других окон элементами. Диалоги же созданы, чтобы сконцентрировать внимание пользователя на конкретной вещи и/или получить немедленную реакцию от пользователя (см. например,
MessageBox() API).
А> зачем Билли разделил диалоги и окна?
mailto:billgates@microsoft.com =)
Здравствуйте, Аноним, Вы писали:
А>>пишу такой код :
А>Код твой — ф топку без разбирательств даже. Руки тебе оторвать и к компьютеру не пускать!
Какие мы все из себя среднегениальные
в msdn написано :
The DefDlgProc function must not be called by a dialog box procedure; doing so results in recursive execution.
вызов данной функции из диаооговой процедуры приводит к переполнению стэка
как грамотно применить ресурс диалога к главному окну?
Здравствуйте, Аноним, Вы писали:
А>Нужно создать главное окно из шаблона диалога
А>В vs создаю ресурс диалога
А>пишу такой код :
[кусь]
А>окно то создается но полноценно
А>(закрытие, изменение размеров) не отрабатывается
А>можно ли создавать окна и приименять к ним шаблоны диалога?
Первое, что хочестя спросить: "А зачем в данном случае немодальный диалог? Не лучше ли воспользоваться DialogBox(...) завместо CreateDialog(...) ?". Это избавило бы тебя от написания цикла обработки сообщений и беспокойстве о том, послал ли ты WM_QUIT или нет (собственно поэтому у тебя программа и не закрывается — цикл выборки и обработки сообщений завершится только получив WM_QUIT; но ведь этого сообщения в твоем примере никто не посылает!). Посмотри, насколько проще будет выглядеть функция Main в случае DialogBox(...).
int CALLBACK WinMain(
HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow
)
{
::DialogBox(hInstance,MAKEINTRESOURCE(ID_MAIN_DLG) , GetDesktopWindow(), MainDlgProc);
return 0;
}
Не правда ли, это гораздо проще того, что было у тебя.
Теперь по поводу того, как надо поправить MainDlgProc. Начнем с закрытия. В случае модального и немодального диалога это делается по-разному. В любом случае тебе надо добавить секцию в switch на сообщение WM_CLOSE. Только в случае модального диалога она будет выглядеть
case WM_CLOSE:
{
::EndDialog(hwndDlg , IDCANCEL);
break;
}
, что более правильно, а в случае немодального диалога будет выглядеть
case WM_CLOSE:
{
::PostQuitMessage(IDCANCEL);
break;
}
, что, вообще говоря, не совсем есть правильно, но это единственное логичное место, откуда можно послать WM_QUIT, а без этого сообщения твой цикл обработки сообщения не завершится. Это еще одни довод в пользу модального диалога. С ресайзом дела обстоят так. Для того, чтобы размеры твоего диалога изменялись, достаточно в свойсвах диалога (в редакторе ресурсов) поставить свойство Border в Resizing. Тогда при подведении мыши к краю диалога курсор примет соотв. форму и можно будем мышкой изменять размеры диалога. Но вот для того, чтобы размеры диалога изменялись
по-человечески, придется повозиться. Дело в том, что диалог сам не меняет размеров и расположения дочерних контролов. Ты, наверное будешь удивлен, увидев, как изменяются размеры твоего диалога. Но такова жизнь. И правильно располагать дочерние контролы в своем диалоге должен ты. Для этого введи в MainDlgProc секцию свича WM_SIZE. И вызови MoveWindow для каждого контрола, который по твоему мнению нужно передвинуть/пересайзить в изменившем размеры диалоге. Код приводить не буду, потому как во-первых это не так просто, во-вторых, как располагать контролы зависит прежде всего от тебя.
Как правило на чистом API этим никто не занимается, и всевозможные библиотеки предоставляют готовые классы для подобных вещей. Например, "для чайников" есть Borland C++ Builder с его TForm/TCustomForm, для более продвинутых есть WTL с его CSizeDlg (или CSizeDialog), В MFC тоже есть что-то похожее (CFormView не совсем то, но похоже). Сам можешь позаниматься этим токмо ради тренировки и понимания принципов, "как оно там под капотом".
А>зы
А> чем отличаются диалоги от окон?
А> зачем Билли разделил диалоги и окна?
Он не разделил. Диалоги — это один из видов окон. И для этих окон есть функция DialogBox, которая выводит диалог в модальном режиме. Для обычных окон в WINAPI такой функции нету. Но народ (в MFC например) такие функции у себя нагородил, и в принципе (если очень захотеть и постараться) можно вывести и CMainFrame в модальном режиме.
Petzold "Programming Windows" -> Chapter 11 — Dialog Boxes -> Modeless Dialog Boxes -> HEXCALC: Window or Dialog Box?