鱼C论坛

 找回密码
 立即注册
查看: 2917|回复: 10

怎样能用鼠标滚轮控制窗口缩放?我理解有误,请指向我的错误,必给出代码

[复制链接]
发表于 2014-11-16 12:21:24 | 显示全部楼层 |阅读模式
100鱼币
  1. #include <Windows.h>
  2. HINSTANCE g_hInstance;

  3. LRESULT CALLBACK WndProc(HWND hWnd,
  4.                          UINT uMsg,
  5.                          WPARAM wParam,
  6.                          LPARAM lParam)
  7. {
  8.     switch(uMsg)
  9.     {
  10.     case WM_MOUSEWHEEL:
  11.         {
  12.             int n = HIWORD(wParam);  //向前滚正值 向后滚负值
  13.             static int i = n;        //i保存上一次n的值

  14.             RECT rc;            
  15.             GetClientRect(hWnd,&rc);

  16.             if(n > i)                //如果n大于上一次n的值,则说明鼠标滚轮向前滚
  17.             {
  18.                
  19.                 MoveWindow(hWnd,rc.left--,rc.top--,rc.right++,rc.bottom++,TRUE);
  20.             }
  21.             else
  22.             {
  23.                 MoveWindow(hWnd,rc.left++,rc.top++,rc.right--,rc.bottom--,TRUE);
  24.             }
  25.             
  26.         }
  27.         break;
  28.     case WM_DESTROY:
  29.         PostQuitMessage(0);
  30.         return 0;
  31.     }
  32.     return DefWindowProc(hWnd,uMsg,wParam,lParam);
  33. }

  34. void RegisterWnd(LPCTSTR lpClassName)
  35. {
  36.     WNDCLASSEX wce;
  37.     wce.style = CS_HREDRAW|CS_VREDRAW;
  38.     wce.lpfnWndProc = WndProc;
  39.     wce.cbSize = sizeof(WNDCLASSEX);
  40.     wce.cbClsExtra = 0;
  41.     wce.cbWndExtra = 0;
  42.     wce.hInstance = g_hInstance;
  43.     wce.hIcon  = 0;
  44.     wce.hCursor = 0;
  45.     wce.hIconSm = 0;
  46.     wce.hbrBackground = HBRUSH(COLOR_BTNFACE);
  47.     wce.lpszClassName = lpClassName;
  48.     wce.lpszMenuName = 0;
  49.     if(!RegisterClassEx(&wce))
  50.     {
  51.         MessageBox(NULL,TEXT("注册失败"),TEXT("提示"),MB_OK);
  52.     }

  53. }

  54. HWND CreateWnd(LPCTSTR lpClassName)
  55. {
  56.     HWND hWnd = CreateWindowEx(0,lpClassName,L"HELLO",
  57.         WS_OVERLAPPEDWINDOW,500,200,
  58.         500,500,NULL,NULL,g_hInstance,NULL);
  59.     return hWnd;
  60. }

  61. void DisplayWnd(HWND hWnd)
  62. {
  63.     ShowWindow(hWnd,SW_SHOW);
  64.     UpdateWindow(hWnd);
  65. }

  66. void Message()
  67. {
  68.     MSG msg;
  69.     while(GetMessage(&msg,NULL,0,0))
  70.     {
  71.         TranslateMessage(&msg);
  72.         DispatchMessage(&msg);
  73.     }
  74. }

  75. int WINAPI WinMain(HINSTANCE hInstance,
  76.                    HINSTANCE hPrevInstance,
  77.                    LPSTR     lpCmdLine,
  78.                    int       nCmdShow)
  79. {
  80.     g_hInstance = hInstance;
  81.     RegisterWnd(L"hello");
  82.     HWND hWnd = CreateWnd(L"hello");
  83.     DisplayWnd(hWnd);
  84.     Message();
  85.     return 0;
  86. }
复制代码

最佳答案

查看完整内容

问题看错了,再看了下标题,这是我改的 case WM_MOUSEWHEEL: { RECT rc; GetWindowRect(hWnd,&rc); if((short)HIWORD(wParam) > 0) { MoveWindow(hWnd,rc.left--,rc.top--,rc.right-rc.left+1,rc.bottom-rc.top+1,TRUE); } else { MoveWindow(hWnd,rc.left++,rc.top++,rc.right-rc.le ...
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2014-11-16 12:21:25 | 显示全部楼层
本帖最后由 风之残月 于 2014-11-16 23:11 编辑

问题看错了,再看了下标题,这是我改的
case WM_MOUSEWHEEL:
        {
            RECT rc;
            GetWindowRect(hWnd,&rc);

            if((short)HIWORD(wParam) > 0)
            {
                MoveWindow(hWnd,rc.left--,rc.top--,rc.right-rc.left+1,rc.bottom-rc.top+1,TRUE);
            }
            else
            {
                MoveWindow(hWnd,rc.left++,rc.top++,rc.right-rc.left-1,rc.bottom-rc.top-1,TRUE);
            }
        }
        break;


GetClientRect(hWnd,&rc); 这个函数是用来获取窗口工作区域的位置坐标信息,需要用GetWindowRect
获取窗口相对于屏幕的坐标信息,MoveWindow的第三个参数是宽度,第四个是高度,判断是否是向前滚动一般是用(short)HIWORD(wParam),当它为正数时为向上,负数时为向下


小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2014-11-16 12:46:40 | 显示全部楼层
支持楼主
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2014-11-16 12:58:14 | 显示全部楼层
我  可能是 监视hook  
怎么实现我不知道
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2014-11-16 20:01:24 | 显示全部楼层
小人 发表于 2014-11-16 12:58
我  可能是 监视hook  
怎么实现我不知道

不知道就不要回呀
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2014-11-16 20:03:23 | 显示全部楼层

c语言的具体实现步骤不知道  
不过可以通过 鼠标事件的hook 来判断鼠标的动作从而来设置
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2014-11-16 20:04:09 | 显示全部楼层

百度下应该就有了  ,鼠标钩子  ,安装钩子 ,监视钩子  ,卸载钩子
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2014-11-16 20:04:39 | 显示全部楼层
小人 发表于 2014-11-16 20:04
百度下应该就有了  ,鼠标钩子  ,安装钩子 ,监视钩子  ,卸载钩子

不用这么麻烦吧
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2014-11-16 20:05:58 | 显示全部楼层

或许都其他途径吧,但是我想到的就是这个
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2014-11-16 21:11:22 | 显示全部楼层
不用这么麻烦,用WM_MOUSEMOVE消息就可以了,使用

xPos = GET_X_LPARAM(lParam);    // 相对于客户区左上角的 X 坐标
yPos = GET_Y_LPARAM(lParam);   //  相对于客户区左上角的 Y 坐标
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2014-11-16 21:13:11 | 显示全部楼层


:sweat:看错了,我看成是获取鼠标位置了
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-6-18 05:25

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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