首页
社区
课程
招聘
[求助]Scroll Bar 控件无法触发WM_HSCROLL
发表于: 2008-10-1 13:02 5604

[求助]Scroll Bar 控件无法触发WM_HSCROLL

2008-10-1 13:02
5604
#pragma region WM_HSCROLL
case WM_HSCROLL:
{
wmId = LOWORD(wParam);
wmEvent = HIWORD(wParam);//the current position of the scroll box if the low-order word is SB_THUMBPOSITION or SB_THUMBTRACK
switch(wmId)
{
case SB_LINELEFT:
{
dwPos--;
goto set;
}
case SB_LINERIGHT:
{
dwPos++;
goto set;
}
case SB_PAGELEFT:
{
dwPos-=10;
goto set;
}
case SB_PAGERIGHT:
{
dwPos+=10;
goto set;
}
case SB_THUMBPOSITION:
{
dwPos = wmEvent;
goto set;
}
case SB_THUMBTRACK:
{
dwPos = wmEvent;
goto set;
}
set:
if(dwPos>100||dwPos <0)
{
dwPos=0;
}
SetDlgItemInt(hwndDlg,IDC_STATIC_VALUE,dwPos,FALSE);
SetScrollPos(GetDlgItem(hwndDlg,IDC_SCROLLBAR_NO),SB_HORZ,dwPos,TRUE);
return FALSE;
}//switch
return TRUE;
}//WM_HSCROLL结束.
#pragma endregion
dwPos是一个全局变量. 这里鼠标左边点击的时候没有反应.根本不会触发此消息.如果用右键选择的时候.就可以正常移动.
请大家帮忙?
用SPY++.发现可以触发WM_HSCROLL.但是就不会执行里边的语句.
后经反汇编后发现.
int wmId, wmEvent;
switch(uMsg)
004117A0  mov        eax,dword ptr [ebp+0Ch]
004117A3  mov        dword ptr [ebp-248h],eax
004117A9  cmp        dword ptr [ebp-248h],111h
004117B3  ja          CCreateNew::DialogProc+83h (4117E3h)
004117B5  cmp        dword ptr [ebp-248h],111h //WM_COMMAND
004117BF  je          CCreateNew::DialogProc+3A6h (411B06h)
004117C5  cmp        dword ptr [ebp-248h],10h //WM_CLOSE
004117CC  je          set+79h (4120E9h)
004117D2  cmp        dword ptr [ebp-248h],110h //WM_INITDIALOG
004117DC  je          CCreateNew::DialogProc+98h (4117F8h)
004117DE  jmp        set+0BFh (41212Fh) //跑到结束.
004117E3  cmp        dword ptr [ebp-248h],114h //WM_HSCROLL消息
004117ED  je          $LN19+56h (411FE0h)
004117F3  jmp        set+0BFh (41212Fh) //跑到结束.
从反汇编后代码看004117DE  jmp        set+0BFh (41212Fh) //跑到结束.
因为多了这条语句.使WM_HSCROLL不能触发.
再cmp        dword ptr [ebp-248h],114h 之前,多了这个jmp.
不知道为何为多出来这么条语句???

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费
支持
分享
最新回复 (1)
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
解决了.我自己又写了个程序.
#include "dlg.h"

INT_PTR CALLBACK ProcDlgMain(HWND hwndDlg,UINT uMsg,WPARAM wParam,LPARAM lParam)
        {
        int wmId;
                switch(uMsg)
                        {
                        case WM_INITDIALOG:
                sif.cbSize = sizeof(SCROLLINFO);
                sif.fMask =SIF_POS|SIF_RANGE;
                sif.nMin =0;
                sif.nMax =99;
                sif.nPos =0;
                SetScrollInfo(GetDlgItem(hwndDlg,IDC_SCROLLBAR1),SB_CTL,&sif,TRUE);
                return TRUE;
                                case WM_CLOSE://关闭
                {
                        EndDialog(hwndDlg ,NULL);
                        return TRUE;
                }
                        case WM_HSCROLL:
                                {
                                wmId = LOWORD(wParam);
                                        switch(wmId)
                                        {
                                                case SB_LINELEFT:
                                                        pos--;
                                                        SetDlgItemInt(hwndDlg,IDC_STATIC_VALUE,pos,FALSE);
                                                        SendDlgItemMessage(hwndDlg,IDC_SCROLLBAR1,SBM_SETPOS,pos,TRUE);
                                                        return TRUE;
                                                case SB_LINERIGHT:
                                                        pos++;
                                                        SetDlgItemInt(hwndDlg,IDC_STATIC_VALUE,pos,FALSE);
                                                        SetScrollPos(GetDlgItem(hwndDlg,IDC_SCROLLBAR1),SB_CTL,dwPos,TRUE);
                                                        return TRUE;
                                        }
                                }
                               
                        }
                return FALSE;
        }
int _stdcall WinMain(HINSTANCE hInst,HINSTANCE hPrevInst,LPSTR lpCmdLine,int nShowCmd)
        {
        LoadLibrary(_T("Riched20.dll"));
        DialogBoxParamW(hInst,MAKEINTRESOURCEW(IDD_DIALOG1),NULL,ProcDlgMain,NULL);
        return 0;
        }

顺便解释一下:
LoadLibrary(_T("Riched20.dll")); 这行是因为对话框中使用Riched box控件.使用此控件.VS不能保证DLL被加载.所以必须显式加载.
而我这个程序出错的原因是SB_CTL 这个问题. SB_CTL  代表你在对话框中使用的是控件.
SB_HORZ表示标准的scroll控件,打个比方,就是浏览器下面的那个东西.
在Win32中,这个分开的.我都忽视了.
2008-10-1 21:10
0
游客
登录 | 注册 方可回帖
返回

账号登录
验证码登录

忘记密码?
没有账号?立即免费注册