Вот написал код, которий создает самое просто окно с меню... в меню 4 пункта, три из которых визивает свой диалог. Тоесть грубо говоря, в программе есть 3 диалога со своими функциями: BOOL ForDlgOnInitDialog(HWND,HWND,LPARAM); BOOL HelpDlgOnInitDialog(HWND,HWND,LPARAM); BOOL OptionsDlgOnInitDialog(HWND,HWND,LPARAM);
void ForDlgOnCommand(HWND,int,HWND,UINT); void HelpDlgOnCommand(HWND,int,HWND,UINT); void OptionsDlgOnCommand(HWND,int,HWND,UINT);
... Вот... вообще полний код програми следующий:
| Код | #include "windows.h" #include "windowsx.h" #include "resource.h"
#define XSIZE 500 #define YSIZE 500
LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM); BOOL CALLBACK ForDlgProc(HWND,UINT,WPARAM,LPARAM); BOOL CALLBACK HelpDlgProc(HWND,UINT,WPARAM,LPARAM); BOOL CALLBACK OptionsDlgProc(HWND,UINT,WPARAM,LPARAM); BOOL ForDlgOnInitDialog(HWND,HWND,LPARAM); BOOL HelpDlgOnInitDialog(HWND,HWND,LPARAM); BOOL OptionsDlgOnInitDialog(HWND,HWND,LPARAM);
void onDestroy(HWND); void OnPaint(HWND); void OnCommand(HWND,int,HWND,UINT); void ForDlgOnCommand(HWND,int,HWND,UINT); void HelpDlgOnCommand(HWND,int,HWND,UINT); void OptionsDlgOnCommand(HWND,int,HWND,UINT);
HWND hOptions; HINSTANCE hInst;
int WINAPI WinMain(HINSTANCE hInst,HINSTANCE,LPSTR,int) { char szClassName[] = "MainWindow"; char szTitle[] = "Create by Terrian"; MSG msg; WNDCLASS Moroz; ZeroMemory(&Moroz, sizeof(Moroz));
Moroz.lpfnWndProc = WndProc; Moroz.hInstance = hInst; Moroz.hIcon = LoadIcon(NULL,IDI_APPLICATION); Moroz.hCursor = LoadCursor(NULL,IDC_ARROW); Moroz.hbrBackground = GetStockBrush(LTGRAY_BRUSH); Moroz.lpszClassName = szClassName; Moroz.lpszMenuName = "MainMenu"; RegisterClass(&Moroz);
HWND hwnd = CreateWindow(szClassName,szTitle,WS_OVERLAPPEDWINDOW,500,300,XSIZE,YSIZE,HWND_DESKTOP,NULL,hInst,NULL); ShowWindow(hwnd,SW_SHOWNORMAL);
while (GetMessage(&msg,NULL,0,0)) DispatchMessage(&msg); return 0;
}
LRESULT CALLBACK WndProc (HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) { switch (msg) { HANDLE_MSG(hWnd,WM_DESTROY,onDestroy); HANDLE_MSG(hWnd,WM_COMMAND,OnCommand); HANDLE_MSG(hWnd,WM_PAINT,OnPaint); default:return(DefWindowProc(hWnd,msg,wParam,lParam)); } }
void onDestroy(HWND) { PostQuitMessage(0); }
void OnPaint(HWND hWnd) {
}
void OnCommand(HWND hWnd,int id, HWND, UINT) { switch (id) { case MI_EXIT: DestroyWindow(hWnd); break; case MI_FOR: DialogBox(hInst,"ForProgram",NULL,ForDlgProc); break; case MI_HELP: DialogBox(hInst,"Help",NULL,HelpDlgProc); break; case MI_OPTIONS: if(hOptions == NULL) hOptions = CreateDialog(hInst,"Options",GetParent(hWnd),OptionsDlgProc); //else MessageBox(hWnd,"Dialog is already exist","Info",IDOK); break; } }
BOOL CALLBACK ForDlgProc(HWND hWnd,UINT msg,WPARAM wParam,LPARAM lParam) { switch(msg) { HANDLE_MSG(hWnd,WM_INITDIALOG,ForDlgOnInitDialog); HANDLE_MSG(hWnd,WM_COMMAND,ForDlgOnCommand); default:return FALSE; } return TRUE; }
ForDlgOnInitDialog(HWND hWnd,HWND,LPARAM) { return TRUE; }
void ForDlgOnCommand(HWND hWnd,int id,HWND hWndCtrl,UINT CodeNotify) { switch(id) { case IDOK: DestroyWindow(hWnd); break; } }
BOOL CALLBACK HelpDlgProc(HWND hWnd,UINT msg,WPARAM wParam,LPARAM lParam) { switch(msg) { HANDLE_MSG(hWnd,WM_INITDIALOG,HelpDlgOnInitDialog); HANDLE_MSG(hWnd,WM_COMMAND,HelpDlgOnCommand); default:return FALSE; } return TRUE; }
HelpDlgOnInitDialog(HWND hWnd,HWND,LPARAM) { return TRUE; }
void HelpDlgOnCommand(HWND hWnd,int id,HWND hWndCtrl,UINT CodeNotify) { switch(id) { case IDOK: DestroyWindow(hWnd); break; } }
BOOL CALLBACK OptionsDlgProc(HWND hWnd,UINT msg,WPARAM wParam,LPARAM lParam) { switch(msg) { HANDLE_MSG(hWnd,WM_INITDIALOG,OptionsDlgOnInitDialog); HANDLE_MSG(hWnd,WM_COMMAND,OptionsDlgOnCommand); default:return FALSE; } return TRUE; }
OptionsDlgOnInitDialog(HWND hWnd,HWND,LPARAM) { return TRUE; }
void OptionsDlgOnCommand(HWND hWnd,int id,HWND hWndCtrl,UINT CodeNotify) { switch(id) { case IDOK: DestroyWindow(hWnd); break; } }
|
Проблема состои в том, что все диалоги я создавал с помощю DialogBox, кроме одного...что само по себе означает модальное окно... но оно НЕ стает модальним... я немогу понять почему так... я подозреваю что ето изза дескрипторов окна.. я везде использовал hWnd или же изза параметра HINSTANCE, его я таже использовал одно и тоже.... Кто знает в чом проблема ?.... Вообщем говоря, мне надо сделать ети окна модальними.... а одно не модальним.....( |