⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 11. 对话框.txt

📁 本书介绍了在Microsoft Windows 98、Microsoft Windows NT 4.0和Windows NT 5.0下程序写作的方法
💻 TXT
📖 第 1 页 / 共 5 页
字号:
  return DefWindowProc (hwnd, message, wParam, lParam) ;
        
}
        

BOOL CALLBACK AboutDlgProc (HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
        
{
        
           static HWND   hCtrlBlock ;
        
           static int            iColor, iFigure ;
        
   
        
           switch (message)
        
           {
        
           case   WM_INITDIALOG:
        
                  iColor               = iCurrentColor ;
        
                  iFigure               = iCurrentFigure ;
        

                  CheckRadioButton (hDlg, IDC_BLACK, IDC_WHITE,   iColor) ;
        
                  CheckRadioButton (hDlg, IDC_RECT,  IDC_ELLIPSE, iFigure) ;
        
        
        
                  hCtrlBlock = GetDlgItem (hDlg, IDC_PAINT) ;
        
       
        
                 SetFocus (GetDlgItem (hDlg, iColor)) ;
        
                  return FALSE ;
        
        
        
           case   WM_COMMAND:
        
                  switch (LOWORD (wParam))
        
                  {
        
                  case   IDOK:
        
                                         iCurrentColor         = iColor ;
        
                                       iCurrentFigure        = iFigure ;
        
                                         EndDialog (hDlg, TRUE) ;
        
                                         return TRUE ;
        
             
        
                  case   IDCANCEL:
        
                                         EndDialog (hDlg, FALSE) ;
        
                                         return TRUE ;
        
             
        
                 case   IDC_BLACK:
        
                  case   IDC_RED:
        
                  case   IDC_GREEN:
        
                  case   IDC_YELLOW:
        
                  case   IDC_BLUE:
        
                  case   IDC_MAGENTA:
        
                  case   IDC_CYAN:
        
                  case   IDC_WHITE:
        
                                         iColor = LOWORD (wParam) ;
        
                                         CheckRadioButton (hDlg, IDC_BLACK, IDC_WHITE, LOWORD (wParam)) ;
        
                                         PaintTheBlock (hCtrlBlock, iColor, iFigure) ;
        
                                         return TRUE ;
        
             
        
                  case   IDC_RECT:
        
                  case   IDC_ELLIPSE:
        
                                         iFigure = LOWORD (wParam) ;
        
                                         CheckRadioButton (hDlg, IDC_RECT, IDC_ELLIPSE, LOWORD (wParam)) ;
        
                                         PaintTheBlock (hCtrlBlock, iColor, iFigure) ;
        
                                         return TRUE ;
        
                  }
        
                  break ;
        
        
        
           case   WM_PAINT:
        
                  PaintTheBlock (hCtrlBlock, iColor, iFigure) ;
        
                break ;
        
           }
        
           return FALSE ;
        
}
        
ABOUT2.RC (摘录) 
        
//Microsoft Developer Studio generated resource script.
        
#include "resource.h"
        
#include "afxres.h"
        
/////////////////////////////////////////////////////////////////////////////
        
// Dialog
        
ABOUTBOX DIALOG DISCARDABLE  32, 32, 200, 234
        
STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION
        
FONT 8, "MS Sans Serif"
        
BEGIN
        
    ICON                                                     "ABOUT2",IDC_STATIC,7,7,20,20
        
    CTEXT         "About2",IDC_STATIC,57,12,86,8
        
    CTEXT         "About Box Demo Program",IDC_STATIC,7,40,186,8
        
    LTEXT         "",IDC_PAINT,114,67,74,72
        
    GROUPBOX                                     "&Color",IDC_STATIC,7,60,84,143
        
    RADIOBUTTON                          "&Black",IDC_BLACK,16,76,64,8,WS_GROUP | WS_TABSTOP
        
    RADIOBUTTON           "B&lue",IDC_BLUE,16,92,64,8
        
    RADIOBUTTON           "&Green",IDC_GREEN,16,108,64,8
        
    RADIOBUTTON           "Cya&n",IDC_CYAN,16,124,64,8
        
    RADIOBUTTON           "&Red",IDC_RED,16,140,64,8
        
    RADIOBUTTON           "&Magenta",IDC_MAGENTA,16,156,64,8
        
    RADIOBUTTON           "&Yellow",IDC_YELLOW,16,172,64,8
        
    RADIOBUTTON           "&White",IDC_WHITE,16,188,64,8
        
   GROUPBOX                                "&Figure",IDC_STATIC,109,156,84,46,WS_GROUP
        
    RADIOBUTTON                          "Rec&tangle",IDC_RECT,116,172,65,8,WS_GROUP | WS_TABSTOP
        
    RADIOBUTTON                          "&Ellipse",IDC_ELLIPSE,116,188,64,8
        
    DEFPUSHBUTTON                        "OK",IDOK,35,212,50,14,WS_GROUP
        
    PUSHBUTTON                                   "Cancel",IDCANCEL,113,212,50,14,WS_GROUP
        
END
        

/////////////////////////////////////////////////////////////////////////////
        
// Icon
        
ABOUT2        ICON         DISCARDABLE         "About2.ico"
        

/////////////////////////////////////////////////////////////////////////////
        
// Menu
        
ABOUT2      MENU DISCARDABLE
        
BEGIN
        
   POPUP "&Help"
        
   BEGIN
        
                  MENUITEM "&About",                   IDM_APP_ABOUT
        
   END
        
END
        
RESOURCE.H (摘录) 
        
// Microsoft Developer Studio generated include file.
        
// Used by About2.rc
        
#define IDC_BLACK           1000
        
#define IDC_BLUE            1001
        
#define IDC_GREEN           1002
        
#define IDC_CYAN           1003
        
#define IDC_RED             1004
        
#define IDC_MAGENTA         1005
        
#define IDC_YELLOW          1006
        
#define IDC_WHITE           1007
        
#define IDC_RECT            1008
        
#define IDC_ELLIPSE         1009
        
#define IDC_PAINT           1010
        
#define IDM_APP_ABOUT       40001
        
#define IDC_STATIC          -1
        
ABOUT2.ICO
 


 



ABOUT2中的About框有两组单选按钮。一组用来选择颜色,另一组用来选择是矩形还是椭圆形。所选的矩形或者椭圆显示在对话框内,其内部以目前选择的颜色着色。使用者按下「OK」按钮后,对话框会终止,程序的窗口消息处理程序在它自己的显示区域内绘出所选图形。如果您按下「Cancel」,则主窗口的显示区域会保持原样。对话框如图11-2所示。尽管ABOUT2使用预先定义的标识符IDOK和IDCANCEL作为两个按键,但是每个单选按钮均有自己的标识符,它们以前缀IDC开头(用于控件的ID)。这些标识符在RESOURCE.H中定义。


 



图11-2 ABOUT2程序的对话框
 

当您在ABOUT2对话框中建立单选按钮时,请按显示顺序建立。这能保证Developer Studio依照顺序定义标识符的值,程序将使用这些值。另外,每个单选按钮都不要选中「Auto」选项。「Auto Radio Button」需要的程序代码较少,但基本上处理起来更深奥些。然后请依照ABOUT2.RC中的定义来设定它们的标识符。

选中「Properties」对话框中下列对象的「Group」选项:「OK」和「Cancel」按钮、「Figure」分组方块、每个分组方块中的第一个单选按钮(「Black」和「Rectangle」)。选中这两个单选按钮的「Tab Stop」复选框。

当您有全部控件在对话框中的近似位置和大小时,就可以从「Layout」菜单选择「Tab Order」选项。按ABOUT2.RC资源描述中显示的顺序单击每一个控件。

使用对话框控件


在第九章中,您会发现大多数子窗口控件发送WM_COMMAND消息给其父窗口(唯一例外的是滚动条控件)。您还看到,经由发送消息给子窗口控件,父窗口可以改变子窗口控件的状态(例如,选择或不选择单选按钮、复选框)。您也可以用类似方法在对话框程序中改变控件。例如,如果您设计了一系列单选按钮,就可以发送消息给它们,以选择或者不选择这些按钮。不过,Windows也提供了几种使用对话框控件的简单办法。我们来看一看对话框程序与子窗口控件相互通信的方式。

ABOUT2的对话框模板显示在程序11-2的ABOUT2.RC资源描述档中。GROUPBOX控件只是一个带标题(标题为「Color」或者「Figure」)的分组方块,每组单选按钮都由这样的分组方块包围。前一组的八个单选按钮是互斥的,第二组的两个单选按钮也是如此。

当用鼠标单击其中一个单选按钮时(或者当单选按钮拥有输入焦点时按空格键),子窗口向其父窗口发送一个WM_COMMAND消息,消息的wParam的低字组被设为控件的ID,wParam的高字组是一个通知码,lParam值是控件的窗口句柄。对于单选按钮,这个通知码是BN_CLICKED或者0。然后Windows中的对话框窗口消息处理程序将这个WM_COMMAND消息发送给ABOUT2.C内的对话框程序。当对话框程序收到一个单选按钮的WM_COMMAND消息时,它为此按钮设定选中标记,并为组中其它按钮清除选中标记。

您可能还记得在第九章中已经提过,选中和不选中按钮均需要向子窗口控件发送BM_CHECK消息。要设定一个按钮选中标记,您可以使用:

SendMessage (hwndCtrl, BM_SETCHECK, 1, 0) ;
        
要消除选中标记,您可以使用:

SendMessage (hwndCtrl, BM_SETCHECK, 0, 0) ;
        
其中hwndCtrl参数是子窗口按钮控件的窗口句柄。

但是在对话框程序中使用这种方法是时有点问题的,因为您不知道所有单选按钮的窗口句柄,只是从您获得的消息中知道其中一个句柄。幸运的是,Windows为您提供了一个函数,可以用对话框句柄和控件ID来取得一个对话框控件的窗口句柄:

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -