943566987 发表于 2014-6-17 21:37:02

在学习滚动条时遇到一个宏定义不明白

本帖最后由 943566987 于 2014-6-17 21:39 编辑

#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 ("SysMets3") ;
   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 ("Program requires Windows NT!"),
                      szAppName, MB_ICONERROR) ;
          return 0 ;
   }

   hwnd = CreateWindow (szAppName, TEXT ("Get System Metrics No. 3"),
                        WS_OVERLAPPEDWINDOW | WS_VSCROLL | WS_HSCROLL,
                        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 intcxChar, cxCaps, cyChar, cxClient, cyClient, iMaxWidth ;
   HDC         hdc ;
   int         i, x, y, iVertPos, iHorzPos, iPaintBeg, iPaintEnd ;
   PAINTSTRUCT ps ;//窗口绘制
   SCROLLINFOsi ;//滚动条大小
   TCHAR       szBuffer ;
   TEXTMETRICtm ;//定义字体尺寸

   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) ;

               // 以三列的形式保存

          iMaxWidth = 40 * cxChar + 22 * cxCaps ;
          return 0 ;

   case WM_SIZE:
          cxClient = LOWORD (lParam) ;
          cyClient = HIWORD (lParam) ;

               // 滚动条的大小和页面大小

          si.cbSize = sizeof (si) ;
          si.fMask= SIF_RANGE | SIF_PAGE ;
          si.nMin   = 0 ;
          si.nMax   = NUMLINES - 1 ;
          si.nPage= cyClient / cyChar ;
          SetScrollInfo (hwnd, SB_VERT, &si, TRUE) ;//设置滚动条大小

               // 设置水平滚动条的范围和页面大小

          si.cbSize = sizeof (si) ;
          si.fMask= SIF_RANGE | SIF_PAGE ;
          si.nMin   = 0 ;
          si.nMax   = 2 + iMaxWidth / cxChar ;
          si.nPage= cxClient / cxChar ;
          SetScrollInfo (hwnd, SB_HORZ, &si, TRUE) ;//设置滚动条大小
          return 0 ;

   case WM_VSCROLL:
               // 滚动条以垂直的形式显示

          si.cbSize = sizeof (si) ;
          si.fMask= SIF_ALL ;
          GetScrollInfo (hwnd, SB_VERT, &si) ;//指定字体的宽度

               // 将字体保存靠后的位置

          iVertPos = si.nPos ;

          switch (LOWORD (wParam))
          {
          case SB_TOP:
               si.nPos = si.nMin ;
               break ;

          case SB_BOTTOM:
               si.nPos = si.nMax ;
               break ;

          case SB_LINEUP:
               si.nPos -= 1 ;
               break ;

          case SB_LINEDOWN:
               si.nPos += 1 ;
               break ;

          case SB_PAGEUP:
               si.nPos -= si.nPage ;
               break ;

          case SB_PAGEDOWN:
               si.nPos += si.nPage ;
               break ;

          case SB_THUMBTRACK:
               si.nPos = si.nTrackPos ;
               break ;

          default:
               break ;         
          }
               // Set the position and then retrieve it.Due to adjustments
               //   by Windows it may not be the same as the value set.

          si.fMask = SIF_POS ;
          SetScrollInfo (hwnd, SB_VERT, &si, TRUE) ;
          GetScrollInfo (hwnd, SB_VERT, &si) ;

               // 如果位置发生了改变,滚动窗口和更新


          if (si.nPos != iVertPos)
          {                  
               ScrollWindow (hwnd, 0, cyChar * (iVertPos - si.nPos),
                                 NULL, NULL) ;
               UpdateWindow (hwnd) ;
          }
          return 0 ;

   case WM_HSCROLL:
               // 把所有的垂直滚动条信息

          si.cbSize = sizeof (si) ;
          si.fMask= SIF_ALL ;

               // 保存位置后做比较

          GetScrollInfo (hwnd, SB_HORZ, &si) ;
          iHorzPos = si.nPos ;

          switch (LOWORD (wParam))
          {
          case SB_LINELEFT:
               si.nPos -= 1 ;
               break ;

          case SB_LINERIGHT:
               si.nPos += 1 ;
               break ;

          case SB_PAGELEFT:
               si.nPos -= si.nPage ;
               break ;

          case SB_PAGERIGHT:
               si.nPos += si.nPage ;
               break ;

          case SB_THUMBPOSITION:
               si.nPos = si.nTrackPos ;
               break ;

          default :
               break ;
          }
               // 设置位置再找回它。由于 adjustments
               //   Windows不能为设定值相同

          si.fMask = SIF_POS ;
          SetScrollInfo (hwnd, SB_HORZ, &si, TRUE) ;
          GetScrollInfo (hwnd, SB_HORZ, &si) ;

               // 如果窗口发生改变,将滚动窗口

          if (si.nPos != iHorzPos)
          {
               ScrollWindow (hwnd, cxChar * (iHorzPos - si.nPos), 0,
                           NULL, NULL) ;
          }
          return 0 ;

   case WM_PAINT :
          hdc = BeginPaint (hwnd, &ps) ;

               // 得到的垂直滚动条的位置

          si.cbSize = sizeof (si) ;
          si.fMask= SIF_POS ;
          GetScrollInfo (hwnd, SB_VERT, &si) ;
          iVertPos = si.nPos ;

               // 得到的水平滚动条的位置



          GetScrollInfo (hwnd, SB_HORZ, &si) ;
          iHorzPos = si.nPos ;

               // 画面的限制

          iPaintBeg = max (0, iVertPos + ps.rcPaint.top / cyChar) ;
          iPaintEnd = min (NUMLINES - 1,
                           iVertPos + ps.rcPaint.bottom / cyChar) ;

          for (i = iPaintBeg ; i <= iPaintEnd ; i++)
          {
               x = cxChar * (1 - iHorzPos) ;
               y = cyChar * (i - iVertPos) ;

               TextOut (hdc, x, y,
                        sysmetrics.szLabel,
                        lstrlen (sysmetrics.szLabel)) ;

               TextOut (hdc, x + 22 * cxCaps, y,
                        sysmetrics.szDesc,
                        lstrlen (sysmetrics.szDesc)) ;

               SetTextAlign (hdc, TA_RIGHT | TA_TOP) ;

               TextOut (hdc, x + 22 * cxCaps + 40 * cxChar, y, szBuffer,
                        wsprintf (szBuffer, TEXT ("%5d"),
                           GetSystemMetrics (sysmetrics.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) ;
}

我在阅读<windows程序设计编程>这本书的代码时看见这个宏定义我想问问这个宏定义表示什么意思 如果不用这个定义会怎么样,因为这个代码太长所有我只发一部分 我将整个代码打包发给链接不明白的可以下载后查看

小名明SIU 发表于 2014-6-21 18:17:16

那个是代表你的程序所要使用的windows的版本的函数,如果不加可能编译的时候有一些函数会出现undefine的情况

feixiangmenghu 发表于 2014-7-11 08:00:26

那就是一个标识牌,就是那个宏特定的。   就像ID号似的

智商是硬伤 发表于 2015-8-21 16:12:26

{:7_146:}
页: [1]
查看完整版本: 在学习滚动条时遇到一个宏定义不明白