zoukankan      html  css  js  c++  java
  • 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消息),只有当主窗体销毁时才会销毁
    对话框。可以人为销毁。



     

  • 相关阅读:
    10. Regular Expression Matching
    Leetcode:9. Palindrome Number
    MySQL
    MyBatis Plus 自动类型转换之TypeHandler
    深拷贝和浅拷贝
    【强制】不要在程序中写死一年为 365 天,避免在公历闰年时出现日期转换错误或程序逻辑 错误。
    【强制】日期格式化时,传入 pattern 中表示年份统一使用小写的 y。
    【推荐】循环体内,字符串的连接方式,使用 StringBuilder 的 append 方法进行扩展。
    【强制】POJO如果继承了另一个 POJO 类,注意在前面加一下 super.toString。
    【强制】禁止使用构造方法 BigDecimal(double)的方式把 double 值转化为 BigDecimal 对象。
  • 原文地址:https://www.cnblogs.com/ddx-deng/p/3755824.html
Copyright © 2011-2022 走看看