鱼C论坛

 找回密码
 立即注册
查看: 1967|回复: 1

大佬 帮我看看这个 垂直 滚动条注释有问题不

[复制链接]
发表于 2017-10-16 10:22:31 | 显示全部楼层 |阅读模式

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

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

x
  1. #include <windows.h>
  2. #include <strsafe.h>
  3. #include "sysmets.h"

  4. LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);

  5. int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstcance, PSTR lpCmdLine, int iCmdShow)
  6. {
  7.         HWND hwnd;
  8.         MSG  msg;
  9.         WNDCLASS wndclass;

  10.         //窗口类名
  11.         WCHAR szClassName[] = TEXT("FristWindow");

  12.         //初始化窗口类
  13.         wndclass.style = CS_HREDRAW | CS_VREDRAW;
  14.         wndclass.lpfnWndProc = WndProc;
  15.         wndclass.cbClsExtra = 0;
  16.         wndclass.cbWndExtra = 0;
  17.         wndclass.hIcon = LoadIcon(NULL, IDI_APPLICATION);
  18.         wndclass.hCursor = LoadCursor(NULL, IDC_ARROW);
  19.         wndclass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
  20.         wndclass.hInstance = hInstance;
  21.         wndclass.lpszClassName = szClassName;
  22.         wndclass.lpszMenuName = NULL;

  23.         //注册窗口类
  24.         if (!RegisterClass(&wndclass))
  25.         {
  26.                 MessageBox(NULL, TEXT("本程序只能在 WINDOWS NT 框架上运行!!!"), TEXT("提示信息:"), MB_OK | MB_ICONERROR);
  27.                 return 0;
  28.         }

  29.         //创建窗口
  30.         hwnd = CreateWindow(szClassName, TEXT("FristWindow"), WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL, hInstance, NULL);


  31.         //显示并更新窗口
  32.         ShowWindow(hwnd, iCmdShow);
  33.         UpdateWindow(hwnd);

  34.         //消息循环
  35.         while (GetMessage(&msg, NULL, 0, 0))
  36.         {
  37.                 TranslateMessage(&msg);
  38.                 DispatchMessage(&msg);
  39.         }

  40.         return msg.wParam;
  41. }

  42. LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
  43. {

  44.         HDC                                hdc;
  45.         RECT            rect;
  46.         PAINTSTRUCT                ps;
  47.         TEXTMETRIC                tm;
  48.         SCROLLINFO                si;

  49.         static int xChar, yChar, xUpper;
  50.         static int xClient, yClient;
  51.         int                        iVertPos;

  52.         int                iBeginPaint, iEndPaint;

  53.         WCHAR szBuffer[128];

  54.         switch (msg)
  55.         {
  56.         case WM_CREATE:
  57.                 //获取设备环境句柄
  58.                 hdc = GetDC(hwnd);
  59.                 //获取字体信息
  60.                 GetTextMetrics(hdc, &tm);
  61.                 //获取字体大小
  62.                 xChar = tm.tmAveCharWidth;
  63.                 yChar = tm.tmHeight + tm.tmExternalLeading;
  64.                 xUpper = (int)(tm.tmPitchAndFamily&1?3:2)*xChar/2;
  65.                 //清楚设备环境句柄
  66.                 ReleaseDC(hwnd, hdc);
  67.                 return 0;

  68.         case WM_SIZE:
  69.                 //获得客户区的大小
  70.                 xClient = LOWORD(lParam);
  71.                 yClient = HIWORD(lParam);
  72.                 //设置 SCROLLINFO 结构信息
  73.                 //滑块的位置就是客户区 首行的需要打印元素的索引值
  74.                 si.cbSize = sizeof(si);
  75.                 si.fMask = SIF_RANGE | SIF_PAGE;
  76.                 si.nMax = NUMLINES - 1;
  77.                 si.nMin = 0;
  78.                 si.nPage = yClient / yChar;
  79.                 SetScrollInfo(hwnd, SB_VERT, &si, TRUE);
  80.         return 0;

  81.         case WM_VSCROLL:
  82.                 //获取 SCROLLINFO 的信息
  83.                 si.cbSize = sizeof(si);
  84.                 si.fMask = SIF_POS | SIF_PAGE|SIF_TRACKPOS;
  85.                 GetScrollInfo(hwnd, SB_VERT, &si);
  86.                 //获得当前滚动条的位置信息
  87.                 iVertPos = si.nPos;
  88.                 //处理垂直滚动条的信息
  89.                 switch (LOWORD(wParam))
  90.                 {
  91.                 case SB_LINEUP:
  92.                         si.nPos -= 1;
  93.                         break;

  94.                 case SB_LINEDOWN:
  95.                         si.nPos += 1;
  96.                         break;

  97.                 case SB_PAGEUP:
  98.                         si.nPos -= si.nPage;
  99.                         break;

  100.                 case SB_PAGEDOWN:
  101.                         si.nPos += si.nPage;
  102.                         break;

  103.                 case SB_THUMBTRACK:
  104.                         si.nPos = si.nTrackPos;
  105.                         break;
  106.                 }
  107.                 //设置 SCROLLINFO 的位置信息
  108.                 SetScrollInfo(hwnd, SB_VERT, &si, TRUE);
  109.                 //矫正 nPos 的值 使其控制在有效范围内
  110.                 GetScrollInfo(hwnd, SB_VERT, &si);
  111.                 //判断iVertPos位置是否改变
  112.                 if (iVertPos != si.nPos)
  113.                 {
  114.                         ScrollWindow(hwnd, 0, (iVertPos-si.nPos)*yChar, 0, 0);
  115.                         UpdateWindow(hwnd);
  116.                 }
  117.                 return 0;

  118.         case WM_PAINT:
  119.                 hdc = BeginPaint(hwnd, &ps);
  120.                 //更新iVertPos使其保持在有效范围内
  121.                 si.cbSize = sizeof(si);
  122.                 si.fMask = SIF_POS;
  123.                 GetScrollInfo(hwnd, SB_VERT, &si);
  124.                 iVertPos = si.nPos;

  125.                 //获得索引值
  126.                 iBeginPaint = max(0, iVertPos+ps.rcPaint.top/yChar);
  127.                 iEndPaint = min(NUMLINES-1, iVertPos + ps.rcPaint.bottom / yChar);
  128.                 /*
  129.                 iVretPos 一直指向 当前客户区 的 首行索引值
  130.                 无效区域的顶部 除以 字体高度  获得 是无效区域到客户区 的行距(偏移)
  131.                 */

  132.                 for (int i = iBeginPaint; i <= iEndPaint; i++)
  133.                 {
  134.                         TextOut(hdc, 20, (i - iVertPos)*yChar, sysmetrics[i].szLabel, lstrlen(sysmetrics[i].szLabel));
  135.                         /*
  136.                         i 表示 当前需要 打印 滑块 的位置信息
  137.                         iVerPost 表示客户区首行的滑块位置信息
  138.                         i - iVertPos 表示 当前需要打印的 偏移行数
  139.                         乘以 行距 就获得 当前距离 客户区 首行的偏移 距离
  140.                         */
  141.                 }

  142.                 EndPaint(hwnd, &ps);
  143.                 break;

  144.         case WM_CLOSE:
  145.                 PostQuitMessage(0);
  146.                 break;
  147.         }

  148.         return DefWindowProc(hwnd, msg, wParam, lParam);

  149. }
复制代码




                               
登录/注册后可看大图


谢谢了!!!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2017-10-27 16:19:25 | 显示全部楼层
正确,课上小甲鱼老师讲的很清楚了
你可以试着在纸上画一下
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-18 19:03

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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