一、Windows模态对话框—避免使用整体变量
在ABOUT2中使用整体变量可能会、也可能不会影响您。一些程序写作者(包括我自己)较喜欢少用整体变量。ABOUT2中的整体变量iCurrentColor和iCurrentFigure看来使用得完全合法,因为它们必须同时在窗口消息处理程序和对话框程序中使用。不过,在一个有一大堆对话框的程序中,每个对话框都可能改变一堆变量的值,使整体变量的数量容易用得过多。
您可能更喜欢将程序中的对话框与数据结构相联系,该数据结构含有对话框可以改变的所有变量。您将在typedef叙述中定义这些结构。例如,在ABOUT2中,可以定义与「About」方块相联系的结构:
typedef struct
        
{
        
           int iColor, iFigure ;
        
}
        
ABOUTBOX_DATA ;
        
在WndProc中,您可以依据此结构来定义并初始化一个静态变量:
static ABOUTBOX_DATA ad = { IDC_BLACK, IDC_RECT } ;
        
在WndProc中也是这样,用ad.iColor和ad.iFigure替换了所有的iCurrentColor和iCurrentFigure。呼叫对话框时,使用DialogBoxParam而不用DialogBox。此函数的第五个参数可以是任意的32位值。一般来说,此值设定为指向一个结构的指针,在这里是WndProc中的ABOUTBOX_DATA结构。
case        IDM_ABOUT:
        
           if (DialogBoxParam (hInstance, TEXT ("AboutBox"),
        
                        hwnd, AboutDlgProc, &ad))
        
                  InvalidateRect (hwnd, NULL, TRUE) ;
        
           return 0 ;
        
这是关键:DialogBoxParam的最后一个参数是作为WM_INITDIALOG消息中的lParam传递给对话框程序的。
对话框程序有两个ABOUTBOX_DATA结构型态的静态变量(一个结构和一个指向结构的指针):
static ABOUTBOX_DATA ad, * pad ;
        
在AboutDlgProc中,此定义代替了iColor和iFigure的定义。在WM_INITDIALOG消息的开始部分,对话框程序根据lParam设定了这两个变量的值:
pad = (ABOUTBOX_DATA *) lParam ;
        
ad = * pad ;
        
第一道叙述中,pad设定为lParam的指标。亦即,pad实际是指向在WndProc定义的ABOUTBOX_DATA结构。第二个参数完成了从WndProc中的结构,到DlgProc中的区域结构的字段对字段内容复制。
现在,除了使用者按下「OK」按钮时所用的程序代码以之外,所有的AboutDlgProc都用ad.iColor和ad.iFigure替换了iFigure和iColor。这时,将区域结构的内容复制回WndProc中的结构:
case        IDOK:
        
           * pad = ad ;
        
           EndDialog (hDlg, TRUE) ;
        
           return TRUE ;
