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

📄 11. 对话框.txt

📁 本书介绍了在Microsoft Windows 98、Microsoft Windows NT 4.0和Windows NT 5.0下程序写作的方法
💻 TXT
📖 第 1 页 / 共 5 页
字号:

control-type id, xPos, yPos, xWidth, yHeight, iStyle
        
其中没有文字字段。在这两种叙述中,iStyle参数都是选择性的。

在第九章,我讨论了确定预先定义子窗口的宽度和高度的规则。您可能需要回到第九章去参考这些规则,这时请记住:对话框模板中指定大小的单位为平均字符宽度的1/4,及平均字符高度的1/8。

控件叙述的style字段是可选的。它允许您包含其它窗口样式标识符。例如,如果您想建立在正方形框左边包含文字的复选框,那么可以使用:

CHECKBOX "text", id, xPos, yPos, xWidth, yHeight, BS_LEFTTEXT
        
注意,控件型态EDITTEXT会自动添加一个边框。如果您想建立一个没有边框的子窗口编辑控件,您可以使用:

EDITTEXT id, xPos, yPos, xWidth, yHeight, NOT WS_BORDER
        
资源编译器也承认与下面叙述类似的专用控件叙述:

CONTROL "text", id, "class", iStyle, xPos, yPos, xWidth, yHeight
        
此叙述允许您通过指定窗口类别和完整的窗口样式,来建立任意型态的子窗口控件。例如,要取代:

PUSHBUTTON "OK", IDOK, 10, 20, 32, 14
        
您可以使用:

CONTROL  "OK", IDOK, "button", WS_CHILD | WS_VISIBLE |
        
                  BS_PUSHBUTTON | WS_TABSTOP, 10, 20, 32, 14
        
当编译资源描述档时,这两条叙述在.RES和.EXE文件中的编码是相同的。在Developer Studio中,您可以使用Controls工具列中的Custom Control选项来建立此叙述。在ABOUT3程序中,我向您展示了如何用此选项建立一个控件,且在您的程序中已定义了该控件的窗口类别。

当您在对话框模板中使用CONTROL叙述时,不必包含WS_CHILD和WS_VISIBLE样式。在建立子窗口时,Windows已经包含了这些窗口样式。CONTROL叙述的格式也说明Windows对话框管理器在建立对话框时就完成了此项操作。首先,就像我前面所讨论的,它建立一个弹出式窗口,其父窗口句柄在DialogBox函数中提供。然后,对话框管理器为对话框模板中的每个控件建立一个子窗口。所有这些控件的父窗口均是这个弹出式对话框。上面给出的CONTROL叙述被转换成一个CreateWindow呼叫,形式如下所示:

hCtrl       =CreateWindow (TEXT ("button"), TEXT ("OK"),
        
                                         WS_CHILD | WS_VISIBLE | WS_TABSTOP | BS_PUSHBUTTON,
        
                                                        10 * cxChar / 4, 20 * cyChar / 8,
        
                                                        32 * cxChar / 4, 14 * cyChar / 8,
        
                                                         hDlg, IDOK, hInstance, NULL) ;
        
其中,cxChar和cyChar是系统字体字符的宽度和高度,以图素为单位。hDlg参数是从建立该对话框窗口的CreateWindow呼叫传回的值;hInstance参数是从DialogBox呼叫获得的。

更复杂的对话框


ABOUT1中的简单对话框展示了设计和执行一个对话框的要点,现在让我们来看一个稍微复杂的例子。程序11-2给出的ABOUT2程序展示了如何在对话框程序中管理控件(这里用单选按钮)以及如何在对话框的显示区域中绘图。

程序11-2 ABOUT2 
        
ABOUT2.C
        
/*--------------------------------------------------------------------------
        
  ABOUT2.C --     About Box Demo Program No. 2
        
                                        (c) Charles Petzold, 1998
        
---------------------------------------------------------------------------*/
        
#include <windows.h>
        
#include "resource.h"
        

LRESULT     CALLBACK WndProc                     (HWND, UINT, WPARAM, LPARAM) ;
        
BOOL               CALLBACK AboutDlgProc         (HWND, UINT, WPARAM, LPARAM) ;
        
   
        
int iCurrentColor         = IDC_BLACK,
        
   iCurrentFigure        = IDC_RECT ;
        

int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,
        
                                                 PSTR szCmdLine, int iCmdShow)
        
{
        
           static TCHAR          szAppName[] = TEXT ("About2") ;
        
           MSG                                          msg ;
        
           HWND                                         hwnd ;
        
           WNDCLASS                             wndclass ;
        
   
        
           wndclass.style                                      = CS_HREDRAW | CS_VREDRAW ;
        
           wndclass.lpfnWndProc                                 = WndProc ;
        
           wndclass.cbClsExtra                                  = 0 ;
        
           wndclass.cbWndExtra                                  = 0 ;
        
           wndclass.hInstance                                   = hInstance ;
        
           wndclass.hIcon                                       = LoadIcon (hInstance, szAppName) ;
        
           wndclass.hCursor                                     = LoadCursor (NULL, IDC_ARROW) ;
        
           wndclass.hbrBackground                       = (HBRUSH) GetStockObject (WHITE_BRUSH) ;
        
           wndclass.lpszMenuName                        = szAppName ;
        
           wndclass.lpszClassName                       = szAppName ;
        
   
        
           if (!RegisterClass (&wndclass))
        
           {
        
                  MessageBox (  NULL, TEXT ("This program requires Windows NT!"),
        
                                         szAppName, MB_ICONERROR) ;
        
            return 0 ;
        
    }
        
   
        
           hwnd = CreateWindow ( szAppName, TEXT ("About Box Demo Program"),
        
                                 WS_OVERLAPPEDWINDOW,
        
                                  CW_USEDEFAULT, CW_USEDEFAULT,
        
                                  CW_USEDEFAULT, CW_USEDEFAULT,
        
                                  NULL, NULL, hInstance, NULL) ;   
        

           ShowWindow (hwnd, iCmdShow) ;
        
           UpdateWindow (hwnd) ;
        
   
        
           while (GetMessage (&msg, NULL, 0, 0))
        
           {
        
                          TranslateMessage (&msg) ;
        
                          DispatchMessage (&msg) ;
        
    }
        
  return msg.wParam ;
        
}
        

void PaintWindow (HWND hwnd, int iColor, int iFigure)
        
{
        
           static COLORREF crColor[8] = { RGB ( 0, 0, 0), RGB ( 0, 0, 255),
        
                       RGB ( 0, 255, 0), RGB ( 0, 255, 255),
        
                                         RGB (255,   0, 0), RGB (255,   0, 255),
        
                       RGB (255, 255, 0), RGB (255, 255, 255)} ;
        

           HBRUSH                                       hBrush ;
        
           HDC                                          hdc ;
        
           RECT                                         rect ;
        
   
        
           hdc = GetDC (hwnd) ;
        
           GetClientRect (hwnd, &rect) ;
        
           hBrush = CreateSolidBrush (crColor[iColor - IDC_BLACK]) ;
        
           hBrush = (HBRUSH) SelectObject (hdc, hBrush) ;
        
   
        
           if (iFigure == IDC_RECT)
        
                  Rectangle (hdc, rect.left, rect.top, rect.right, rect.bottom) ;
        
           else
        
            Ellipse   (hdc, rect.left, rect.top, rect.right, rect.bottom) ;
        
           DeleteObject (SelectObject (hdc, hBrush)) ;
        
           ReleaseDC (hwnd, hdc) ;
        
}
        

void PaintTheBlock (HWND hCtrl, int iColor, int iFigure)
        
{
        
           InvalidateRect (hCtrl, NULL, TRUE) ;
        
           UpdateWindow (hCtrl) ;
        
           PaintWindow (hCtrl, iColor, iFigure) ;
        
}
        
LRESULT CALLBACK WndProc ( HWND hwnd, UINT message, WPARAM wParam,LPARAM lParam)
        
{
        
           static HINSTANCE              hInstance ;
        
           PAINTSTRUCT                          ps ;
        
   
        
           switch (message)
        
    {
        
           case   WM_CREATE:
        
                  hInstance = ((LPCREATESTRUCT) lParam)->hInstance ;
        
                  return 0 ;
        
        
        
           case   WM_COMMAND:
        
                  switch (LOWORD (wParam))
        
                  {
        
                  case IDM_APP_ABOUT:
        
                                         if (DialogBox (hInstance, TEXT ("AboutBox"), hwnd, AboutDlgProc))
        
                                                 InvalidateRect (hwnd, NULL, TRUE) ;
        
                                         return 0 ;
        
                  }
        
                  break ;
        
        
        
           case   WM_PAINT:
        
                  BeginPaint (hwnd, &ps) ;
        
                  EndPaint (hwnd, &ps) ;
        
             
        
                  PaintWindow (hwnd, iCurrentColor, iCurrentFigure) ;
        
                  return 0 ;
        
             
        
           case   WM_DESTROY:
        
                  PostQuitMessage (0) ;
        
                  return 0 ;
        
           }
        

⌨️ 快捷键说明

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