| 
          【案例】给Win32程序的“关于”对话框添加一个按钮 | 
        
                
          
            
                         一派掌門 二十級              | 
          
            
            
            
              首先,在Visual Studio(我用的版本是Premium 2012)中创建一个Win32项目工程,也就是:  然后编译运行,运行结果是如下窗口:               
                       | 
        
                
          
            
                         一派掌門 二十級              | 
          
            
            
            
              在左边的Solution Explorer中找到Win32Project1.rc文件,双击打开。               
             | 
|
        
                
          
            
                         一派掌門 二十級              | 
          
            
            
            
               双击IDD_ABOUTBOX打开。并在窗口中拖入一个按钮,上面显示的文字(Caption)随便写,这里我写的是Check。              
             | 
|
        
                
          
            
                         一派掌門 二十級              | 
          
            
            
            
             | 
|
        
                
          
            
                         一派掌門 二十級              | 
          
            
            
            
              默认分配给这个按钮的ID是IDC_BUTTON1,这个会在之后的程序中用到:  打开Resource.h后就可以看到,其实这个ID是一个宏定义。               
             | 
|
        
                
          
            
                         一派掌門 二十級              | 
          
            
            
            
              最后,打开主程序文件Win32Project1.cpp,在函数About里添加如下内容:  其中IDC_BUTTON1就是用于标示刚才所创建的按钮,鼠标点击按钮后执行的内容就是调用MessageBox这个对话框函数。              
             | 
|
        
                
          
            
                         一派掌門 二十級              | 
          
            
            
            
              然后就可以运行程序了。  点击刚才添加的Check按钮后弹出MessageBox对话框:  其中的图标i是由MB_ICONINFORMATION决定的。 可以选用其他值: MB_ICONWARNING 三角形的黄色惊叹号 MB_ICONQUESTION 问号 MB_ICONERROR 红叉              
             | 
|
        
                
          
            
                         一派掌門 二十級              | 
          
            
            
            
              下面我来解释一下这句话: if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL) 其中IDOK就是点击OK按钮,IDCANCEL则是手动点击About窗口右上角的关闭按钮,或者在标题栏右键菜单中点击了Close命令(如图所示)。               
             | 
|
        
                
          
            
                         一派掌門 二十級              | 
          
            
            
            
               加了About窗口鼠标左键点击次数计数代码。              
             | 
|
        
                
          
            
                         一派掌門 二十級              | 
          
            
            
             
              更改按钮上的文字: SendMessage((HWND)lParam, WM_SETTEXT, (WPARAM)NULL, (LPARAM)L"Checked");              
             | 
|
        
                
          
            
                         一派掌門 二十級              | 
          
            
            
             
              修改OK按钮上的文字: HWND okbtn = GetDlgItem(hDlg, IDOK); // 获取OK按钮 SendMessage(okbtn, WM_SETTEXT, NULL, (LPARAM)L"Click me");
  获取一个复选框是否被选中: HWND checkbox = GetDlgItem(hDlg, IDC_CHECK1); int checked = SendMessage(checkbox, BM_GETCHECK, NULL, NULL); if (checked) {   //选中了 }
  禁用按钮: EnableWindow(okbtn, false);              
             | 
|
        
                
          
            
                         一派掌門 二十級              | 
          
            
            
            
              启用XP风格控件后: (启用方法请参阅:https://zh.arslanbar.net/post.php?t=22016)               
             | 
|
        
                
          
            
                         一派掌門 二十級              | 
          
            
            
             
              回復:12樓 程序: // Message handler for about box. INT_PTR CALLBACK About(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) {     static int counter = 0;     UNREFERENCED_PARAMETER(lParam);     switch (message)     {     case WM_INITDIALOG:         return (INT_PTR)TRUE;
      case WM_COMMAND:         if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL)         {             EndDialog(hDlg, LOWORD(wParam));             return (INT_PTR)TRUE;         }         else if (LOWORD(wParam) == IDC_BUTTON1)         {             wchar_t msg[30];             wsprintf(msg, L"Hello World!\nCounter: %d", counter);             MessageBox(hDlg, msg, L"Hello", MB_ICONINFORMATION);             SendMessage((HWND)lParam, WM_SETTEXT, NULL, (LPARAM)L"Checked");
              HWND okbtn = GetDlgItem(hDlg, IDOK); // get OK button             SendMessage(okbtn, WM_SETTEXT, NULL, (LPARAM)L"Click me");
              HWND checkbox = GetDlgItem(hDlg, IDC_CHECK1);             int checked = SendMessage(checkbox, BM_GETCHECK, NULL, NULL);             EnableWindow(okbtn, !checked);         }         break;     case WM_LBUTTONUP:         counter++;         break;     }     return (INT_PTR)FALSE; }
 
               
             | 
|
        
                
          
            
                         一派掌門 二十級              | 
          
            
            
            
              关于wchar_t宽字符数组的用法,请参阅: https://zh.arslanbar.net/post.php?t=23331(适合已经学过char字符数组和char *字符串指针的读者)              
             | 
|