• windows程序设计第四章 system2.c 新增滚动条功能


    新添加的滚动条功能,首先就是要在createWindow的时候,修改参数风格模式

         hwnd = CreateWindow (szAppName, TEXT ("Get System Metrics No. 2"),
                              WS_OVERLAPPEDWINDOW | WS_VSCROLL,
                              CW_USEDEFAULT, CW_USEDEFAULT,
                              CW_USEDEFAULT, CW_USEDEFAULT,
                              NULL, NULL, hInstance, NULL) ;

    然后再winproc,窗口过程 中的WM_CREATE消息中设定滚动条的初始位置:

     SetScrollRange (hwnd, SB_VERT, 0, NUMLINES - 1,FALSE) ;
     SetScrollPos   (hwnd, SB_VERT, iVscrollPos, TRUE) ;

    添加WM_SIZE消息,获取客户区大小

         case WM_SIZE:
              cyClient = HIWORD (lParam) ;
              return 0 ;

    添加相应动作的 消息:

         case WM_VSCROLL:
              switch (LOWORD (wParam))
              {
              case SB_LINEUP:
                   iVscrollPos -= 1 ;
                   break ;
         
              case SB_LINEDOWN:
                   iVscrollPos += 1 ;
                   break ;
         
              case SB_PAGEUP:
                   iVscrollPos -= cyClient / cyChar ;
                   break ;
         
              case SB_PAGEDOWN:
                   iVscrollPos += cyClient / cyChar ;
                   break ;
         
              case SB_THUMBPOSITION:
                   iVscrollPos = HIWORD (wParam) ;
                   break ;
         
              default :
                   break ;
              }
    
              iVscrollPos = max (0, min (iVscrollPos, NUMLINES - 1)) ;
    
              if (iVscrollPos != GetScrollPos (hwnd, SB_VERT))
              {
                   SetScrollPos (hwnd, SB_VERT, iVscrollPos, TRUE) ;
                   InvalidateRect (hwnd, NULL, TRUE) ;
              }
              return 0 ;

    完整源代码:system2.c

    /*----------------------------------------------------
       SYSMETS2.C -- System Metrics Display Program No. 2
                     (c) Charles Petzold, 1998
      ----------------------------------------------------*/
    
    #define WINVER 0x0500
    #include <windows.h>
    #include "sysmets.h"
     
    LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM) ;
    
    int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,
                        PSTR szCmdLine, int iCmdShow)
    {
         static TCHAR szAppName[] = TEXT ("SysMets2") ;
         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 = (HBRUSH) GetStockObject (WHITE_BRUSH) ;
         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 ("Get System Metrics No. 2"),
                              WS_OVERLAPPEDWINDOW | WS_VSCROLL,
                              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 int  cxChar, cxCaps, cyChar, cyClient, iVscrollPos ;
         HDC         hdc ;
         int         i, y ;
         PAINTSTRUCT ps ;
         TCHAR       szBuffer[10] ;
         TEXTMETRIC  tm ;
    
         switch (message)
         {
         case WM_CREATE:
              hdc = GetDC (hwnd) ;
    
              GetTextMetrics (hdc, &tm) ;
              cxChar = tm.tmAveCharWidth ;
              cxCaps = (tm.tmPitchAndFamily & 1 ? 3 : 2) * cxChar / 2 ;
              cyChar = tm.tmHeight + tm.tmExternalLeading ;
    
              ReleaseDC (hwnd, hdc) ;
    
              SetScrollRange (hwnd, SB_VERT, 0, NUMLINES - 1, FALSE) ;
              SetScrollPos   (hwnd, SB_VERT, iVscrollPos, TRUE) ;
              return 0 ;
    
         case WM_SIZE:
              cyClient = HIWORD (lParam) ;
              return 0 ;
    
         case WM_VSCROLL:
              switch (LOWORD (wParam))
              {
              case SB_LINEUP:
                   iVscrollPos -= 1 ;
                   break ;
         
              case SB_LINEDOWN:
                   iVscrollPos += 1 ;
                   break ;
         
              case SB_PAGEUP:
                   iVscrollPos -= cyClient / cyChar ;
                   break ;
         
              case SB_PAGEDOWN:
                   iVscrollPos += cyClient / cyChar ;
                   break ;
         
              case SB_THUMBPOSITION:
                   iVscrollPos = HIWORD (wParam) ;
                   break ;
         
              default :
                   break ;
              }
    
              iVscrollPos = max (0, min (iVscrollPos, NUMLINES - 1)) ;
    
              if (iVscrollPos != GetScrollPos (hwnd, SB_VERT))
              {
                   SetScrollPos (hwnd, SB_VERT, iVscrollPos, TRUE) ;
                   InvalidateRect (hwnd, NULL, TRUE) ;
              }
              return 0 ;
    
         case WM_PAINT:
              hdc = BeginPaint (hwnd, &ps) ;
         
              for (i = 0 ; i < NUMLINES ; i++)
              {
                   y = cyChar * (i - iVscrollPos) ;
         
                   TextOut (hdc, 0, y,
                            sysmetrics[i].szLabel,
                            lstrlen (sysmetrics[i].szLabel)) ;
         
                   TextOut (hdc, 22 * cxCaps, y,
                            sysmetrics[i].szDesc,
                            lstrlen (sysmetrics[i].szDesc)) ;
         
                   SetTextAlign (hdc, TA_RIGHT | TA_TOP) ;
         
                   TextOut (hdc, 22 * cxCaps + 40 * cxChar, y, szBuffer,
                            wsprintf (szBuffer, TEXT ("%5d"),
                                 GetSystemMetrics (sysmetrics[i].iIndex))) ;
         
                   SetTextAlign (hdc, TA_LEFT | TA_TOP) ;
              }
              EndPaint (hwnd, &ps) ;
              return 0 ;
    
         case WM_DESTROY:
              PostQuitMessage (0) ;
              return 0 ;
         }
         return DefWindowProc (hwnd, message, wParam, lParam) ;
    }

    运行结果:

  • 相关阅读:
    关于virtual、非virtual继承函数的调用
    关于文件操作的文件格式与打开方式
    C++ 文件读写操作
    C++语法题
    检测java string变量是否含有中文
    常用知识库
    WMS仓储管理系统
    运输管理
    ipconfig/flushdns 清除系统DNS缓存
    cmd查看域名账号相关的命令
  • 原文地址:https://www.cnblogs.com/xing901022/p/2745487.html
Copyright © 2020-2023  润新知