拈花小仙 发表于 2014-11-16 12:21:24

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

#include <Windows.h>
HINSTANCE g_hInstance;

LRESULT CALLBACK WndProc(HWND hWnd,
                         UINT uMsg,
                         WPARAM wParam,
                         LPARAM lParam)
{
    switch(uMsg)
    {
    case WM_MOUSEWHEEL:
      {
            int n = HIWORD(wParam);//向前滚正值 向后滚负值
            static int i = n;      //i保存上一次n的值

            RECT rc;            
            GetClientRect(hWnd,&rc);

            if(n > i)                //如果n大于上一次n的值,则说明鼠标滚轮向前滚
            {
               
                MoveWindow(hWnd,rc.left--,rc.top--,rc.right++,rc.bottom++,TRUE);
            }
            else
            {
                MoveWindow(hWnd,rc.left++,rc.top++,rc.right--,rc.bottom--,TRUE);
            }
            
      }
      break;
    case WM_DESTROY:
      PostQuitMessage(0);
      return 0;
    }
    return DefWindowProc(hWnd,uMsg,wParam,lParam);
}

void RegisterWnd(LPCTSTR lpClassName)
{
    WNDCLASSEX wce;
    wce.style = CS_HREDRAW|CS_VREDRAW;
    wce.lpfnWndProc = WndProc;
    wce.cbSize = sizeof(WNDCLASSEX);
    wce.cbClsExtra = 0;
    wce.cbWndExtra = 0;
    wce.hInstance = g_hInstance;
    wce.hIcon= 0;
    wce.hCursor = 0;
    wce.hIconSm = 0;
    wce.hbrBackground = HBRUSH(COLOR_BTNFACE);
    wce.lpszClassName = lpClassName;
    wce.lpszMenuName = 0;
    if(!RegisterClassEx(&wce))
    {
      MessageBox(NULL,TEXT("注册失败"),TEXT("提示"),MB_OK);
    }

}

HWND CreateWnd(LPCTSTR lpClassName)
{
    HWND hWnd = CreateWindowEx(0,lpClassName,L"HELLO",
      WS_OVERLAPPEDWINDOW,500,200,
      500,500,NULL,NULL,g_hInstance,NULL);
    return hWnd;
}

void DisplayWnd(HWND hWnd)
{
    ShowWindow(hWnd,SW_SHOW);
    UpdateWindow(hWnd);
}

void Message()
{
    MSG msg;
    while(GetMessage(&msg,NULL,0,0))
    {
      TranslateMessage(&msg);
      DispatchMessage(&msg);
    }
}

int WINAPI WinMain(HINSTANCE hInstance,
                   HINSTANCE hPrevInstance,
                   LPSTR   lpCmdLine,
                   int       nCmdShow)
{
    g_hInstance = hInstance;
    RegisterWnd(L"hello");
    HWND hWnd = CreateWnd(L"hello");
    DisplayWnd(hWnd);
    Message();
    return 0;
}

风之残月 发表于 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),当它为正数时为向上,负数时为向下


大黑鱼 发表于 2014-11-16 12:46:40

支持楼主{:9_241:}

小人 发表于 2014-11-16 12:58:14

我可能是 监视hook
怎么实现我不知道{:9_240:}

拈花小仙 发表于 2014-11-16 20:01:24

小人 发表于 2014-11-16 12:58
我可能是 监视hook
怎么实现我不知道

{:7_138:}不知道就不要回呀

小人 发表于 2014-11-16 20:03:23

拈花小仙 发表于 2014-11-16 12:01
不知道就不要回呀

c语言的具体实现步骤不知道
不过可以通过 鼠标事件的hook 来判断鼠标的动作从而来设置

小人 发表于 2014-11-16 20:04:09

拈花小仙 发表于 2014-11-16 12:01
不知道就不要回呀

百度下应该就有了,鼠标钩子,安装钩子 ,监视钩子,卸载钩子

拈花小仙 发表于 2014-11-16 20:04:39

小人 发表于 2014-11-16 20:04
百度下应该就有了,鼠标钩子,安装钩子 ,监视钩子,卸载钩子

不用这么麻烦吧

小人 发表于 2014-11-16 20:05:58

拈花小仙 发表于 2014-11-16 12:04
不用这么麻烦吧

或许都其他途径吧,但是我想到的就是这个{:9_240:}

风之残月 发表于 2014-11-16 21:11:22

不用这么麻烦,用WM_MOUSEMOVE消息就可以了,使用

xPos = GET_X_LPARAM(lParam);    // 相对于客户区左上角的 X 坐标
yPos = GET_Y_LPARAM(lParam);   //相对于客户区左上角的 Y 坐标

风之残月 发表于 2014-11-16 21:13:11



:sweat:看错了,我看成是获取鼠标位置了
页: [1]
查看完整版本: 怎样能用鼠标滚轮控制窗口缩放?我理解有误,请指向我的错误,必给出代码