鱼C论坛

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

[Window SDK]怎么解决这个滚动条的问题

[复制链接]
发表于 2016-12-13 23:30:43 | 显示全部楼层 |阅读模式

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

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

x

程序启动很正常
1.png

但是滚动条向下移动在向上移动就 变成 这样了

2.png

  1. #include <windows.h>
  2. #include <strsafe.h>

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

  4. int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int iCmdShow)
  5. {
  6.         WNDCLASS wndclass;
  7.         MSG msg;
  8.         static WCHAR szClassName[] = TEXT("ClassName");

  9.         wndclass.style = CS_HREDRAW | CS_VREDRAW;
  10.         wndclass.lpszMenuName = NULL;
  11.         wndclass.lpszClassName = szClassName;
  12.         wndclass.lpfnWndProc = WndProc;
  13.         wndclass.hInstance = hInstance;
  14.         wndclass.hIcon = LoadIcon(NULL, IDI_WINLOGO);
  15.         wndclass.hCursor = LoadCursor(NULL, IDC_ARROW);
  16.         wndclass.hbrBackground = (HBRUSH)COLOR_MENU;
  17.         wndclass.cbWndExtra = 0;
  18.         wndclass.cbClsExtra = 0;
  19.         if (!RegisterClass(&wndclass))
  20.         {
  21.                 MessageBox(NULL, TEXT("请在window nt 上使用本程序"), TEXT("提示"), MB_OK);
  22.                 return -1;
  23.         }
  24.         HWND hwnd = CreateWindow(szClassName,
  25.                 TEXT(""),
  26.                 WS_OVERLAPPEDWINDOW | WS_VSCROLL,
  27.                 CW_USEDEFAULT,
  28.                 CW_USEDEFAULT,
  29.                 CW_USEDEFAULT,
  30.                 CW_USEDEFAULT,
  31.                 NULL,
  32.                 NULL,
  33.                 hInstance,
  34.                 NULL);

  35.         ShowWindow(hwnd, SW_SHOW);
  36.         UpdateWindow(hwnd);
  37.         while (GetMessage(&msg, 0, 0, 0))
  38.         {
  39.                 TranslateMessage(&msg);
  40.                 DispatchMessage(&msg);
  41.         }
  42.         return msg.wParam;
  43. }

  44. LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
  45. {
  46.         HDC hdc;
  47.         static int iOldyScrollPos = 0;
  48.         static int cxChar, cyChar;
  49.         static int cxClient, cyClient;
  50.         TEXTMETRICW tm;
  51.         PAINTSTRUCT ps;
  52.         RECT rect;
  53.         SCROLLINFO si;
  54.         TCHAR szWindowText[128];
  55.         int i = 0;
  56.         int len = 0;

  57.         switch (message)
  58.         {
  59.         case WM_CREATE:
  60.                 hdc = GetDC(hwnd);
  61.                 /* 计算出字体的间距 */
  62.                 GetTextMetrics(hdc, &tm);
  63.                 cxChar = tm.tmAveCharWidth;
  64.                 cyChar = tm.tmHeight + tm.tmExternalLeading;
  65.                 ReleaseDC(hwnd, hdc);
  66.                 return 0;
  67.         case WM_SIZE:
  68.                 /* 获取客户端分辨率 */
  69.                 cxClient = LOWORD(lParam);
  70.                 cyClient = HIWORD(lParam);
  71.                 /* 下面这两句的功能是开启 SetScrollInfo 和 GetScrollInfo 的功能 */
  72.                 memset(&si, 0, sizeof(si));
  73.                 si.cbSize = sizeof(si);
  74.                 si.fMask = SIF_ALL;
  75.                 si.nMin = 0;
  76.                 si.nMax = 256 - 1;
  77.                 si.nPos = 0;
  78.                 si.nPage = cyClient / cyChar; //这个就是设置滑块大小的参数
  79.                 SetScrollInfo(hwnd, SB_VERT, &si, TRUE);
  80.                 return 0;
  81.         case WM_VSCROLL:
  82.                 /* 下面这两句的功能是开启 SetScrollInfo 和 GetScrollInfo 的功能 */
  83.                 si.cbSize = sizeof(si);
  84.                 si.fMask = SIF_ALL;
  85.                 GetScrollInfo(hwnd, SB_VERT, &si);
  86.                 iOldyScrollPos = si.nPos;
  87.                 switch (LOWORD(wParam))
  88.                 {
  89.                 case SB_LINEUP:
  90.                         si.nPos -= 1;
  91.                         break;
  92.                 case SB_LINEDOWN:
  93.                         si.nPos += 1;
  94.                         break;
  95.                 case SB_PAGEUP:
  96.                         si.nPos -= si.nPage;
  97.                         break;
  98.                 case SB_PAGEDOWN:
  99.                         si.nPos += si.nPage;
  100.                         break;
  101.                 case SB_THUMBPOSITION:
  102.                         si.nPos = si.nTrackPos;
  103.                         break;
  104.                 }
  105.                 si.fMask = SIF_POS;
  106.                 SetScrollInfo(hwnd, SB_VERT, &si, TRUE);
  107.                 GetScrollInfo(hwnd, SB_VERT, &si);
  108.                 if (iOldyScrollPos != si.nPos)
  109.                 {
  110.                         ScrollWindow(hwnd, 0, cyChar * (iOldyScrollPos - si.nPos), NULL, NULL);
  111.                         UpdateWindow(hwnd);
  112.                         iOldyScrollPos = si.nPos;
  113.                 }
  114.                 return 0;
  115.         case WM_PAINT:
  116.                 hdc = BeginPaint(hwnd, &ps);
  117.                 GetClientRect(hwnd, &rect);

  118.                 /* 这下面便是显示进程的地方 */
  119.                 for (i = 0; i < 256; i++)
  120.                 {
  121.                         StringCchPrintf(szWindowText, 128, TEXT("%d: %s"), i + 1, TEXT("I love you"));
  122.                         StringCchLength(szWindowText, 128, &len);
  123.                         TextOut(hdc, 0, (i - iOldyScrollPos) * cyChar, szWindowText, len);
  124.                 }
  125.                 EndPaint(hwnd, &ps);
  126.                 return 0;
  127.         case WM_CLOSE:
  128.                 if (IDYES == MessageBox(NULL, TEXT("是否退出本程序"), TEXT("提示:"), MB_YESNO))
  129.                 {
  130.                         DestroyWindow(hwnd);
  131.                 }
  132.                 return 0;
  133.         case WM_DESTROY:
  134.                 PostQuitMessage(0);
  135.                 return 0;
  136.         }
  137.         return DefWindowProc(hwnd, message, wParam, lParam);
  138. }
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2016-12-14 12:44:44 | 显示全部楼层
TCHAR szWindowText[128]  你里面有个si.nMax=256-1 , 我也不知道正确不,可能是我看错了 ,我也是个 新手, 128 是不是储蓄文字的空间, 而滑块最大256 是不是超出了空间范围, 要么就是 程序里面的格式有什么不对。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-24 23:07

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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