鱼C论坛

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

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

[复制链接]
发表于 2014-11-16 12:21:24 | 显示全部楼层 |阅读模式
100鱼币
#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;
}

最佳答案

查看完整内容

问题看错了,再看了下标题,这是我改的 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 ...
想知道小甲鱼最近在做啥?请访问 -> 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),当它为正数时为向上,负数时为向下


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

使用道具 举报

发表于 2014-11-16 12:46:40 | 显示全部楼层
支持楼主
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2014-11-16 12:58:14 | 显示全部楼层
我  可能是 监视hook  
怎么实现我不知道
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

不知道就不要回呀
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

c语言的具体实现步骤不知道  
不过可以通过 鼠标事件的hook 来判断鼠标的动作从而来设置
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

百度下应该就有了  ,鼠标钩子  ,安装钩子 ,监视钩子  ,卸载钩子
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

不用这么麻烦吧
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

或许都其他途径吧,但是我想到的就是这个
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

xPos = GET_X_LPARAM(lParam);    // 相对于客户区左上角的 X 坐标
yPos = GET_Y_LPARAM(lParam);   //  相对于客户区左上角的 Y 坐标
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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


:sweat:看错了,我看成是获取鼠标位置了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-25 07:32

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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