VC----对话框Dialog

一个非模态对话框,当作主窗体的创建:(符合窗口创建的步骤)

第一步:补充一个模板,在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消息),只有当主窗体销毁时才会销毁
对话框。可以人为销毁。



 

原文地址:https://www.cnblogs.com/ddx-deng/p/3755824.html