一个非模态对话框,当作主窗体的创建:(符合窗口创建的步骤)
第一步:补充一个模板,在RC脚本文件文件中,这是和普通窗口不一样的地方。这利益于编译器和链接器的支持呀。
1 #include "windows.h" 2 3 4 121 DIALOG 20, 20, 102, 122 //这里如果用IDD_MYDLG替代121的话,不能用MAKEINTRESOURCE转变成字符串 5 STYLE WS_OVERLAPPEDWINDOW | WS_CAPTION | WS_SYSMENU | WS_MINIMIZEBOX 6 CLASS "DialogCls" //表示本模板所属于的自定义的类名,会在定义窗口类WNDCLASS时使用 7 CAPTION "我的对话框" 8 { 9 } 10 11 MyIcon ICON "1.ico"//这个图标,MyIcon能标识图标,
第二步:使用一个头文件,可以任意命名。如resource.h,加入到工程中,作用是用于上面的图标,MyIcon
1 #include "windows.h" 2 3 #define IDD_MYDLG 121 //注意和RC文件中的对应,这里的IDD_MYDLG能表示对话框资源了 4 #define IDI_ 5 case WM_CREATE: 6 { 7 HWND hBtn= CreateWindow("button","btn",WS_CHILD|WS_VISIBLE,0,0,40,40,hwnd,NULL,g_hInstance,NULL); 8 hDlg = CreateDialog(g_hInstance,MAKEINTRESOURCE(IDD_D1),hwnd,(DLGPROC)GoToProc); 9 if(hDlg==NULL) 10 MessageBox(hwnd,"","",MB_OK); 11 break; 12 } 13 14 15 ICON1 111 //同理,IDI_ICON1能表示 图标资源了 //使用标识的作用是为了比字符串少占用空间,但在代码中要使用MAKEINTRESOURCE宏把资源ID标识转变为字符串标识
第三步:创建和注册窗口类,创建窗口,显示窗口,消息循环
1 #include "windows.h" 2 #include "resource.h" 3 4 LRESULT WINAPI WndProc( 5 HWND hDlg, 6 UINT Msg, 7 WPARAM wParam, 8 LPARAM lParam 9 ); 10 int WINAPI WinMain( HINSTANCE hInstance, // handle to current instance 11 HINSTANCE hPrevInstance, // handle to previous instance 12 LPSTR lpCmdLine, // command line 13 int nCmdShow // show state 14 ) 15 { 16 static char * szClassName="DialogClass"; 17 WNDCLASS wndclass; 18 19 wndclass.style = CS_HREDRAW | CS_VREDRAW; 20 wndclass.lpfnWndProc = WndProc ; 21 wndclass.cbClsExtra = 0 ; 22 wndclass.cbWndExtra = DLGWINDOWEXTRA ; // 这里扩展窗口,指明是对话框窗口 见MSDN 23 wndclass.hInstance = hInstance ; 24 wndclass.hIcon = LoadIcon(hInstance,MAKEINTRESOURCE(IDI_ICON1));//LoadIcon (hInstance, "MyIcon") MyIcon作为图标的字符串标识时可以 25 //这样用 ; //注意使用的是本程序(hInstance)的图标资源,资源名字是MyIcon 26 wndclass.hCursor = LoadCursor (NULL, IDC_ARROW) ; 27 wndclass.hbrBackground = (HBRUSH) (COLOR_BTNFACE + 1) ; 28 wndclass.lpszMenuName = NULL ; 29 wndclass.lpszClassName = "DialogCls"; //类名一个要使用 30 if(!RegisterClass(&wndclass)) 31 { 32 MessageBox(NULL,TEXT("failed"),TEXT("return"),MB_YESNO); 33 return 0; 34 } 35 HWND hwnd = CreateDialog(hInstance,MAKEINTRESOURCE(IDD_MYDLG),NULL,0);//这里模板的名字也可以用 只是用的是字符串 36 37 ShowWindow(hwnd,nCmdShow); 38 MSG msg; 39 while (GetMessage (&msg, NULL, 0, 0)) 40 { 41 TranslateMessage (&msg); 42 DispatchMessage (&msg) ; 43 } 44 return 0; 45 } 46 47 LRESULT WINAPI WndProc( 48 HWND hDlg, 49 UINT Msg, 50 WPARAM wParam, 51 LPARAM lParam 52 ) 53 { 54 switch(Msg) 55 { 56 case WM_SYSCOMMAND: 57 switch(wParam) 58 { 59 case SC_CLOSE: PostQuitMessage(0);return true; 60 case SC_MAXIMIZE:break; 61 default :break; 62 } 63 break; 64 } 65 return false;//DefDlgProc(hDlg,Msg,wParam,lParam);//不可以使用默认的对话框处理过程,如果对某个消息处理了就返回true,否则就返回false. 66 }
模态对话框:
需要知道的知识:DialogBox函数的作用如下--
载入模板资源,省去了对一般资源的LoadResource的操作。
指定窗口过程。显示窗口,活动了ShowWindow的操作,无论在模板中是不是指定了style WS_HIDE风格。用窗口过程来接收消息,但是没有看到GetMessage死循环,难道也由此函数完成了?就当是在DialogBox内部调用了GetMessage循环吧。
“模态”有点你是MessageBox,对话框不消除,主窗体不能接收消息的。
函数EndDialog来销毁窗口,也会让系统来结束与此窗口有关联的窗口过程(一般的窗口过程是PostQuitMessage来结束的)。第二个参数是DialogBox要返回的数值。
BOOL EndDialog( HWND hDlg, // handle to dialog box INT_PTR nResult // value to return); INT_PTR CALLBACK ModalDlgProc( HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam ); DialogBox(g_hInstance,MAKEINTRESOURCE(IDD_MODAL),hDlg,(DLGPROC)ModalDlgProc);//IDD_MODAL模板编号,在.h //中定义 INT_PTR CALLBACK ModalDlgProc( HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam ) { switch(uMsg) { case WM_INITDIALOG: break; case WM_SYSCOMMAND: if(wParam==SC_CLOSE) EndDialog(hwndDlg,wParam);//wParam是DialogBox的返回值。 return true;//不再调用 默认的DefDlgPro()过程了 break; default : break; } return false;//以后消息的处理由DefDlgProc来处理 }
3、模态对话框(不作为主窗体)
脚本代码如下:
121 DIALOG 180, 80, 50, 50 //这里如果用IDD_MYDLG替代121的话,不能用MAKEINTRESOURCE转变成字符串 STYLE WS_OVERLAPPEDWINDOW|WS_SYSMENU //CLASS “aaa” 定义于一个类是不行的,否则界面不能出现,只有当对话框当主窗体时才需要 CAPTION "杨杨" { PUSHBUTTON "dd", 2,60,0,30,30 }
代码如下:
case WM_CREATE: { HWND hBtn= CreateWindow("button","btn",WS_CHILD|WS_VISIBLE,0,0,40,40,hwnd,NULL,g_hInstance,NULL); hDlg = CreateDialog(g_hInstance,MAKEINTRESOURCE(IDD_D1),hwnd,(DLGPROC)GoToProc); if(hDlg==NULL) MessageBox(hwnd,"","",MB_OK); break; } case WM_COMMAND: ShowWindow(hDlg,SW_SHOW); break;
点击按钮时出非模态对话框。
case WM_CLOSE: MessageBox(hwndDlg,"","close",MB_OK); ShowWindow(hwndDlg,SW_HIDE); break; case WM_DESTROY: MessageBox(hwndDlg,"","Destroy",MB_OK); break;
点击对话框的窗体关闭按钮时,能得到WM_CLOSE消息,但不会销毁(得不到WM_DESTROY消息),只有当主窗体销毁时才会销毁
对话框。可以人为销毁。