鱼C论坛

 找回密码
 立即注册
查看: 3352|回复: 2

关于WM_CTLCOLORSTATIC 的疑问

[复制链接]
发表于 2015-12-6 22:07:05 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
  1. /*----------------------------------------
  2.    COLORS1.C -- Colors Using Scroll Bars
  3.                 (c) Charles Petzold, 1998
  4.   ----------------------------------------*/

  5. #include <windows.h>

  6. LRESULT CALLBACK WndProc    (HWND, UINT, WPARAM, LPARAM) ;
  7. LRESULT CALLBACK ScrollProc (HWND, UINT, WPARAM, LPARAM) ;

  8. int     idFocus ;
  9. WNDPROC OldScroll[3] ;

  10. int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,
  11.                     PSTR szCmdLine, int iCmdShow)
  12. {
  13.      static TCHAR szAppName[] = TEXT ("Colors1") ;
  14.      HWND         hwnd ;
  15.      MSG          msg ;
  16.      WNDCLASS     wndclass ;
  17.      
  18.      wndclass.style         = CS_HREDRAW | CS_VREDRAW ;
  19.      wndclass.lpfnWndProc   = WndProc ;
  20.      wndclass.cbClsExtra    = 0 ;
  21.      wndclass.cbWndExtra    = 0 ;
  22.      wndclass.hInstance     = hInstance ;
  23.      wndclass.hIcon         = LoadIcon (NULL, IDI_APPLICATION) ;
  24.      wndclass.hCursor       = LoadCursor (NULL, IDC_ARROW) ;
  25.      wndclass.hbrBackground = CreateSolidBrush (0) ;
  26.      wndclass.lpszMenuName  = NULL ;
  27.      wndclass.lpszClassName = szAppName ;
  28.      
  29.      if (!RegisterClass (&wndclass))
  30.      {
  31.           MessageBox (NULL, TEXT ("This program requires Windows NT!"),
  32.                       szAppName, MB_ICONERROR) ;
  33.           return 0 ;
  34.      }
  35.      
  36.      hwnd = CreateWindow (szAppName, TEXT ("Color Scroll"),
  37.                           WS_OVERLAPPEDWINDOW,
  38.                           CW_USEDEFAULT, CW_USEDEFAULT,
  39.                           CW_USEDEFAULT, CW_USEDEFAULT,
  40.                           NULL, NULL, hInstance, NULL) ;
  41.      
  42.      ShowWindow (hwnd, iCmdShow) ;
  43.      UpdateWindow (hwnd) ;
  44.      
  45.      while (GetMessage (&msg, NULL, 0, 0))
  46.      {
  47.           TranslateMessage (&msg) ;
  48.           DispatchMessage  (&msg) ;
  49.      }
  50.      return msg.wParam ;
  51. }

  52. LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
  53. {
  54.      static COLORREF crPrim[3] = { RGB (255, 0, 0), RGB (0, 255, 0),
  55.                                    RGB (0, 0, 255) } ;
  56.      static HBRUSH  hBrush[3], hBrushStatic ;
  57.      static HWND    hwndScroll[3], hwndLabel[3], hwndValue[3], hwndRect ;
  58.      static int     color[3], cyChar ;
  59.      static RECT    rcColor ;
  60.      static TCHAR * szColorLabel[] = { TEXT ("Red"), TEXT ("Green"),
  61.                                        TEXT ("Blue") } ;
  62.      HINSTANCE      hInstance ;
  63.      int            i, cxClient, cyClient ;
  64.      TCHAR          szBuffer[10] ;
  65.      
  66.      switch (message)
  67.      {
  68.      case WM_CREATE :
  69.           hInstance = (HINSTANCE) GetWindowLong (hwnd, GWL_HINSTANCE) ;
  70.          
  71.                // Create the white-rectangle window against which the
  72.                // scroll bars will be positioned. The child window ID is 9.
  73.          
  74.           hwndRect = CreateWindow (TEXT ("static"), NULL,
  75.                                    WS_CHILD | WS_VISIBLE | SS_WHITERECT,
  76.                                    0, 0, 0, 0,
  77.                                    hwnd, (HMENU) 9, hInstance, NULL) ;
  78.          
  79.           for (i = 0 ; i < 3 ; i++)
  80.           {
  81.                     // The three scroll bars have IDs 0, 1, and 2, with
  82.                     // scroll bar ranges from 0 through 255.
  83.                
  84.                hwndScroll[i] = CreateWindow (TEXT ("scrollbar"), NULL,
  85.                                              WS_CHILD | WS_VISIBLE |
  86.                                              WS_TABSTOP | SBS_VERT,
  87.                                              0, 0, 0, 0,
  88.                                              hwnd, (HMENU) i, hInstance, NULL) ;
  89.                
  90.                SetScrollRange (hwndScroll[i], SB_CTL, 0, 255, FALSE) ;
  91.                SetScrollPos   (hwndScroll[i], SB_CTL, 0, FALSE) ;
  92.                
  93.                     // The three color-name labels have IDs 3, 4, and 5,
  94.                     // and text strings "Red", "Green", and "Blue".
  95.                
  96.                hwndLabel [i] = CreateWindow (TEXT ("static"), szColorLabel[i],
  97.                                              WS_CHILD | WS_VISIBLE | SS_CENTER,
  98.                                              0, 0, 0, 0,
  99.                                              hwnd, (HMENU) (i + 3),
  100.                                              hInstance, NULL) ;
  101.                
  102.                     // The three color-value text fields have IDs 6, 7,
  103.                     // and 8, and initial text strings of "0".
  104.                
  105.                hwndValue [i] = CreateWindow (TEXT ("static"), TEXT ("0"),
  106.                                              WS_CHILD | WS_VISIBLE | SS_CENTER,
  107.                                              0, 0, 0, 0,
  108.                                              hwnd, (HMENU) (i + 6),
  109.                                              hInstance, NULL) ;
  110.                
  111.                OldScroll[i] = (WNDPROC) SetWindowLong (hwndScroll[i],
  112.                                              GWL_WNDPROC, (LONG) ScrollProc) ;
  113.                
  114.                hBrush[i] = CreateSolidBrush (crPrim[i]) ;
  115.           }
  116.          
  117.           hBrushStatic = CreateSolidBrush (
  118.                               GetSysColor (COLOR_BTNHIGHLIGHT)) ;
  119.          
  120.           cyChar = HIWORD (GetDialogBaseUnits ()) ;
  121.           return 0 ;
  122.          
  123.      case WM_SIZE :
  124.           cxClient = LOWORD (lParam) ;
  125.           cyClient = HIWORD (lParam) ;
  126.          
  127.           SetRect (&rcColor, cxClient / 2, 0, cxClient, cyClient) ;
  128.          
  129.           MoveWindow (hwndRect, 0, 0, cxClient / 2, cyClient, TRUE) ;
  130.          
  131.           for (i = 0 ; i < 3 ; i++)
  132.           {
  133.                MoveWindow (hwndScroll[i],
  134.                            (2 * i + 1) * cxClient / 14, 2 * cyChar,
  135.                            cxClient / 14, cyClient - 4 * cyChar, TRUE) ;
  136.                
  137.                MoveWindow (hwndLabel[i],
  138.                            (4 * i + 1) * cxClient / 28, cyChar / 2,
  139.                            cxClient / 7, cyChar, TRUE) ;
  140.                
  141.                MoveWindow (hwndValue[i],
  142.                            (4 * i + 1) * cxClient / 28,
  143.                            cyClient - 3 * cyChar / 2,
  144.                            cxClient / 7, cyChar, TRUE) ;
  145.           }
  146.           SetFocus (hwnd) ;
  147.           return 0 ;
  148.          
  149.      case WM_SETFOCUS :
  150.           SetFocus (hwndScroll[idFocus]) ;
  151.           return 0 ;
  152.          
  153.      case WM_VSCROLL :
  154.           i = GetWindowLong ((HWND) lParam, GWL_ID) ;
  155.          
  156.           switch (LOWORD (wParam))
  157.           {
  158.           case SB_PAGEDOWN :
  159.                color[i] += 15 ;
  160.                                              // fall through
  161.           case SB_LINEDOWN :
  162.                color[i] = min (255, color[i] + 1) ;
  163.                break ;
  164.                
  165.           case SB_PAGEUP :
  166.                color[i] -= 15 ;
  167.                                              // fall through
  168.           case SB_LINEUP :
  169.                color[i] = max (0, color[i] - 1) ;
  170.                break ;
  171.                
  172.           case SB_TOP :
  173.                color[i] = 0 ;
  174.                break ;
  175.                
  176.           case SB_BOTTOM :
  177.                color[i] = 255 ;
  178.                break ;
  179.                
  180.           case SB_THUMBPOSITION :
  181.           case SB_THUMBTRACK :
  182.                color[i] = HIWORD (wParam) ;
  183.                break ;
  184.                
  185.           default :
  186.                break ;
  187.           }
  188.           SetScrollPos  (hwndScroll[i], SB_CTL, color[i], TRUE) ;
  189.           wsprintf (szBuffer, TEXT ("%i"), color[i]) ;
  190.           SetWindowText (hwndValue[i], szBuffer) ;
  191.          
  192.           DeleteObject ((HBRUSH)                                               
  193.                SetClassLong (hwnd, GCL_HBRBACKGROUND, (LONG)               
  194.                     CreateSolidBrush (RGB (color[0], color[1], color[2])))) ;
  195.          
  196.           InvalidateRect (hwnd, &rcColor, TRUE) ;
  197.           return 0 ;
  198.          
  199.      case WM_CTLCOLORSCROLLBAR :
  200.           i = GetWindowLong ((HWND) lParam, GWL_ID) ;
  201.           return (LRESULT) hBrush[i] ;
  202.                
  203.      case WM_CTLCOLORSTATIC :
  204.           i = GetWindowLong ((HWND) lParam, GWL_ID) ;
  205.                
  206.           if (i >= 3 && i <= 8)    // static text controls
  207.           {
  208.                SetTextColor ((HDC) wParam, crPrim[i % 3]) ;
  209.                SetBkColor ((HDC) wParam, GetSysColor (COLOR_BTNHIGHLIGHT));                //绘制静态控件背景颜色,这一步是不是和下面的重复了,是不是不必要的
  210.                return (LRESULT) hBrushStatic ;                                        //返回画刷,绘制静态背景颜色
  211.           }
  212.           break ;
  213.                
  214.      case WM_SYSCOLORCHANGE :
  215.           DeleteObject (hBrushStatic) ;
  216.           hBrushStatic = CreateSolidBrush (GetSysColor (COLOR_BTNHIGHLIGHT)) ;
  217.           return 0 ;
  218.                
  219.      case WM_DESTROY :
  220.           DeleteObject ((HBRUSH)
  221.                SetClassLong (hwnd, GCL_HBRBACKGROUND, (LONG)
  222.                     GetStockObject (WHITE_BRUSH))) ;
  223.                
  224.           for (i = 0 ; i < 3 ; i++)
  225.                DeleteObject (hBrush[i]) ;
  226.                
  227.           DeleteObject (hBrushStatic) ;
  228.           PostQuitMessage (0) ;
  229.           return 0 ;
  230.      }
  231.      return DefWindowProc (hwnd, message, wParam, lParam) ;
  232. }
  233.      
  234. LRESULT CALLBACK ScrollProc (HWND hwnd, UINT message,
  235.                              WPARAM wParam, LPARAM lParam)
  236. {
  237.      int id = GetWindowLong (hwnd, GWL_ID) ;
  238.          
  239.      switch (message)
  240.      {
  241.      case WM_KEYDOWN :
  242.           if (wParam == VK_TAB)
  243.                SetFocus (GetDlgItem (GetParent (hwnd),
  244.                     (id + (GetKeyState (VK_SHIFT) < 0 ? 2 : 1)) % 3)) ;
  245.           break ;
  246.                
  247.      case WM_SETFOCUS :
  248.           idFocus = id ;
  249.           break ;
  250.      }
  251.      return CallWindowProc (OldScroll[id], hwnd, message, wParam, lParam) ;
  252. }
复制代码


这是《windows程序设计》原书的代码,上面标记的两行是否重复了,SetBkColor函数是否是多余的?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2015-12-6 23:41:51 | 显示全部楼层
亲,这种帖子应该发到“Windows程序设计”板块哦~
我给你移动一下吧~
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-12-9 07:35:35 | 显示全部楼层
~风介~ 发表于 2015-12-6 23:41
亲,这种帖子应该发到“Windows程序设计”板块哦~
我给你移动一下吧~

好的,真是不好意思
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-5-3 01:17

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表