设为首页 加入收藏

TOP

二、Windows非模态对话框—新的COLORS程序
2012-11-05 12:36:40 】 浏览:719
Tags:Windows 模态 对话 COLORS 程序

第九章中所描述的COLORS1程序建立了九个子窗口,以便显示三个滚动条和六个文字项。那时候,这个程序还是我们所写过的程序中相当复杂的一个。如果将COLORS1转换为使用非模态对话框则会使程序-特别是WndProc函数-变得令人难以置信的简单,修正后的COLORS2程序如程序11-4所示。

程序11-4 COLORS2
        COLORS2.C        /*----------------------------------------------------------------------------          COLORS2.C -- Version using Modeless Dialog Box                                                         (c) Charles Petzold, 1998        ----------------------------------------------------------------------------*/        #include <windows.h>        LRESULT     CALLBACK WndProc              (HWND, UINT, WPARAM, LPARAM) ;        BOOL               CALLBACK ColorScrDlg          (HWND, UINT, WPARAM, LPARAM) ;        HWND hDlgModeless ;        int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,                                                        PSTR szCmdLine, int iCmdShow)        {                   static TCHAR          szAppName[] = TEXT ("Colors2") ;                   HWND                                         hwnd ;                   MSG                                          msg ;                   WNDCLASS                             wndclass ;                              wndclass.style                               = CS_HREDRAW | CS_VREDRAW ;                   wndclass.lpfnWndProc                         = WndProc ;                   wndclass.cbClsExtra                          = 0 ;                   wndclass.cbWndExtra                          = 0 ;                   wndclass.hInstance                           = hInstance ;                   wndclass.hIcon                               = LoadIcon (NULL, IDI_APPLICATION) ;                   wndclass.hCursor                            = LoadCursor (NULL, IDC_ARROW) ;                   wndclass.hbrBackground               = CreateSolidBrush (0L) ;                   wndclass.lpszMenuName                = NULL ;                   wndclass.lpszClassName               = szAppName ;                              if (!RegisterClass (&wndclass))                   {                          MessageBox (  NULL, TEXT ("This program requires Windows NT!"),                                                                               szAppName, MB_ICONERROR) ;                          return 0 ;                   }                              hwnd = CreateWindow (szAppName, TEXT ("Color Scroll"),                                 WS_OVERLAPPEDWINDOW | WS_CLIPCHILDREN,                                 CW_USEDEFAULT, CW_USEDEFAULT,                                CW_USEDEFAULT, CW_USEDEFAULT,                                 NULL, NULL, hInstance, NULL) ;                              ShowWindow (hwnd, iCmdShow) ;                   UpdateWindow (hwnd) ;                              hDlgModeless = CreateDialog (hInstance, TEXT ("ColorScrDlg"),                      hwnd, ColorScrDlg) ;                   while (GetMessage (&msg, NULL, 0, 0))                   {                          if (hDlgModeless == 0 || !IsDialogMessage (hDlgModeless, &msg))                          {                                         TranslateMessage (&msg) ;                                          DispatchMessage  (&msg) ;                          }                   }                   return msg.wParam ;        }        LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam,LPARAM lParam)        {                   switch (message)                   {                  case   WM_DESTROY :                          DeleteObject ((HGDIOBJ) SetClassLong (hwnd, GCL_HBRBACKGROUND,                       (LONG) GetStockObject (WHITE_BRUSH))) ;                          PostQuitMessage (0) ;                          return 0 ;                   }                   return DefWindowProc (hwnd, message, wParam, lParam) ;        }        BOOL CALLBACK ColorScrDlg (HWND hDlg, UINT message,WPARAM wParam, LPARAM lParam)        {                   static int            iColor[3] ;                   HWND                                 hwndParent, hCtrl ;                   int                                  iCtrlID, iIndex ;                              switch (message)                   {                   case   WM_INITDIALOG :                          for (iCtrlID = 10 ; iCtrlID < 13 ; iCtrlID++)                          {                                                 hCtrl = GetDlgItem (hDlg, iCtrlID) ;                                                 SetScrollRange (hCtrl, SB_CTL, 0, 255, FALSE) ;                                                 SetScrollPos  (hCtrl, SB_CTL, 0, FALSE) ;                          }                          return TRUE ;                                   case   WM_VSCROLL :                          hCtrl                 = (HWND) lParam ;                          iCtrlID               = GetWindowLong (hCtrl, GWL_ID) ;                          iIndex                = iCtrlID - 10 ;                          hwndParent            = GetParent (hDlg) ;                                          switch (LOWORD (wParam))                                  {                          case   SB_PAGEDOWN :                                               iColor[iIndex] += 15 ;        // fall through                                          case SB_LINEDOWN :                                                iColor[iIndex] = min (255, iColor[iIndex] + 1) ;                                                 break ;                          case   SB_PAGEUP :                                                 iColor[iIndex] -= 15 ;     // fall through                                          case SB_LINEUP :                                                iColor[iIndex] = max (0, iColor[iIndex] - 1) ;                                                break ;                          case   SB_TOP :                                                 iColor[iIndex] = 0 ;                                                 break ;                          case   SB_BOTTOM :                                                 iColor[iIndex] = 255 ;                                                break ;                                  case   SB_THUMBPOSITION :                                 case   SB_THUMBTRACK :                                                         iColor[iIndex] = HIWORD (wParam) ;                                                         break ;                                  default :                                                 return FALSE ;                          }                                  SetScrollPos  (hCtrl, SB_CTL,       iColor[iIndex], TRUE) ;                                  SetDlgItemInt (hDlg,  iCtrlID + 3, iColor[iIndex], FALSE) ;                                                  DeleteObject ((HGDIOBJ) SetClassLong (hwndParent, GCL_HBRBACKGROUND,                                          (LONG) CreateSolidBrush (                                        RGB (iColor[0], iColor[1], iColor[2])))) ;                                          InvalidateRect (hwndParent, NULL, TRUE) ;                          return TRUE ;            }                   return FALSE ;        }        
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇二、Windows非模态对话框—HEXCAL.. 下一篇二、Windows非模态对话框—模态对..

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目