设为首页 加入收藏

TOP

一、Windows模态对话框—定义自己的控件
2012-11-05 12:36:30 】 浏览:488
Tags:Windows 模态 对话 定义 自己 控件

尽管Windows承揽了许多维护对话框和子窗口控件的工作,它同时也为您提供了各种加入程序代码的方法。前面我们已经看到了在对话框上绘图的方法。您也可以使用第九章中讨论的窗口子类别化来改变子窗口控件的操作。

您还可以定义自己的子窗口控件,并将它们用到对话框中。例如,假定您特别不喜欢普通的矩形按键,而倾向于建立椭圆形按键,那么您可以通过注册一个窗口类别,并使用自己编写的窗口消息处理程序处理来自您所建立窗口的消息,从而建立椭圆形按键。在Developer Studio中,您可以在与自订控件相联系的「Properties」对话框中指定这个窗口类别,这将转换成对话框模板中的CONTROL叙述。程序11-3所示的ABOUT3程序正是这样做的。

程序11-3 ABOUT3
        ABOUT3.C        /*-----------------------------------------------------------------------------          ABOUT3.C -- About Box Demo Program No. 3                                                         (c) Charles Petzold, 1998        ----------------------------------------------------------------------------*/        #include    <windows.h>        #include    "resource.h"        LRESULT     CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM) ;        BOOL               CALLBACK AboutDlgProc (HWND, UINT, WPARAM, LPARAM) ;        LRESULT     CALLBACK EllipPushWndProc (HWND, UINT, WPARAM, LPARAM) ;        int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,                           PSTR szCmdLine, int iCmdShow)        {                   static TCHAR szAppName[] = TEXT ("About3") ;                   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 ;          }                              wndclass.style                               = CS_HREDRAW | CS_VREDRAW ;                   wndclass.lpfnWndProc                         = EllipPushWndProc ;                   wndclass.cbClsExtra                          = 0 ;                   wndclass.cbWndExtra                          = 0 ;                   wndclass.hInstance                          = hInstance ;                   wndclass.hIcon                              = NULL ;                   wndclass.hCursor                             = LoadCursor (NULL, IDC_ARROW) ;                   wndclass.hbrBackground               = (HBRUSH) (COLOR_BTNFACE + 1) ;                   wndclass.lpszMenuName                = NULL ;                   wndclass.lpszClassName               = TEXT ("EllipPush") ;                   RegisterClass (&wndclass) ;                   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 ;        }        LRESULT CALLBACK WndProc ( HWND hwnd, UINT message, WPARAM wParam,LPARAM lParam)        {                   static HINSTANCE hInstance ;                   switch (message)                   {                   case   WM_CREATE :                          hInstance = ((LPCREATESTRUCT) lParam)->hInstance ;                          return 0 ;                          case WM_COMMAND :                          switch (LOWORD (wParam))                 {                          case   IDM_APP_ABOUT :                                                 DialogBox (hInstance, TEXT ("AboutBox"), hwnd, AboutDlgProc) ;                                                 return 0 ;                         }                          break ;                                   case   WM_DESTROY :                          PostQuitMessage (0) ;                          return 0 ;                   }                   return DefWindowProc (hwnd, message, wParam, lParam) ;        }        BOOL CALLBACK AboutDlgProc (HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)        {                  switch (message)                   {                   case   WM_INITDIALOG :                          return TRUE ;                                   case   WM_COMMAND :                          switch (LOWORD (wParam))                          {                          case   IDOK :                                                 EndDialog (hDlg, 0) ;                                                 return TRUE ;                         }                          break ;            }           return FALSE ;        }        LRESULT CALLBACK EllipPushWndProc (HWND hwnd, UINT message,WPARAM wParam, LPARAM lParam)        {                   TCHAR                         szText[40] ;                   HBRUSH                       hBrush ;                   HDC                           hdc ;                   PAINTSTRUCT                   ps ;                   RECT                                         rect ;                              switch (message)                   {                   case   WM_PAINT :                          GetClientRect (hwnd, &rect) ;                          GetWindowText (hwnd, szText, sizeof (szText)) ;                                          hdc = BeginPaint (hwnd, &ps) ;                                          hBrush = CreateSolidBrush (GetSysColor (COLOR_WINDOW)) ;                          hBrush = (HBRUSH) SelectObject (hdc, hBrush) ;                          SetBkColor (hdc, GetSysColor (COLOR_WINDOW)) ;                          SetTextColor (hdc, GetSysColor (COLOR_WINDOWTEXT)) ;                                          Ellipse (hdc, rect.left, rect.top, rect.right, rect.bottom) ;                          DrawText (hdc, szText, -1, &rect,                       DT_SINGLELINE | DT_CENTER | DT_VCENTER) ;                                          DeleteObject (SelectObject (hdc, hBrush)) ;                                          EndPaint (hwnd, &ps) ;                          return 0 ;                   case   WM_KEYUP :                          if (wParam != VK_SPACE)                                                 break ;// fall through                   case   WM_LBUTTONUP :                          SendMessage (GetParent (hwnd), WM_COMMAND,                                          GetWindowLong (hwnd, GWL_ID), (LPARAM) hwnd) ;                          return 0 ;            }                   return DefWindowProc (hwnd, message, wParam, lParam) ;        }        
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇二、Windows非模态对话框 下一篇一、Windows模态对话框—将其它函..

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目