| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2064 人关注过本帖
标题:控件中的鼠标样子怎么改?
只看楼主 加入收藏
东海一鱼
Rank: 13Rank: 13Rank: 13Rank: 13
等 级:贵宾
威 望:48
帖 子:757
专家分:4760
注 册:2009-8-10
收藏
得分:0 
把你的代码贴上来,让俺也学习学习呗。以前玩儿 C 的,刚学WIN32ASM。说的不对的地方,你多指正啊。

举世而誉之而不加劝,举世而非之而不加沮,定乎内外之分,辩乎荣辱之境,斯已矣。彼其于世未数数然也。
2009-08-13 09:47
nzxhust
Rank: 2
等 级:论坛游民
威 望:1
帖 子:99
专家分:28
注 册:2008-2-14
收藏
得分:0 
子类化我出现了点问题....,就是子类化后我发现我的静态文本控件在创建的时候没有发送WM_CREATE之类的消息,只发送了WM_PAINT后85 87这两个这两个没查是什么(我用OD跟踪得到的)
还有我吧我的一个静态控件子类化后,发现只要是向这个控件SetDlgItemText就会出内存读写错误,跟踪了下野没发现什么问题,但肯定是这个过程地址改了后出现的问题!我发下部分代码吧
这个事我创建新地址的
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
invoke    GetDlgItem,hWnd,1012 ;1012是我静态文本框的ID
invoke    SetWindowLong,eax,GWL_WNDPROC,addr _ProcControl ;_ProcControl是我的新地址
mov    lpOldProcStatic,eax;这是旧地址保存

这是过程
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
_ProcControl        proc    uses ebx edi esi hWnd,wMsg,wParam,lParam
                    mov     eax,wMsg
                    .if     eax==WM_CREATE
                             invoke    SetClassLong,hWnd,GCL_HCURSOR,hCur
                    .else         
                    invoke    CallWindowProc,lpOldProcStatic,hWnd,wMsg,\
                                wParam,lParam
                    ret
                    .endif
                    xor    eax,eax
                    ret
_ProcControl        endp
2009-08-13 10:21
东海一鱼
Rank: 13Rank: 13Rank: 13Rank: 13
等 级:贵宾
威 望:48
帖 子:757
专家分:4760
注 册:2009-8-10
收藏
得分:0 
1、从你的代码形式上来看,你不可能捕获静态控件的WM_CREATE。因为在主窗口创建时,控件窗口也许已经创建完毕了。控件窗口创建的时机是系统掌握的。

2、我试了一下,没有发现你说的‘向这个控件SetDlgItemText就会出内存读写错误’。

ContolProc proc hWin:HWND,uMsg:UINT,wParam:WPARAM,lParam:LPARAM
     
    mov eax,uMsg
     
    .if eax == WM_LBUTTONDOWN  
        invoke MessageBox,0,NULL,CTEXT("Test"),MB_OK         
         
    .else
        push lParam
        push wParam
        push uMsg
        push hWin
        call  pOldProc
        ret
    .endif
        xor eax,eax
        ret
    ret
 
ContolProc endp
 
DlgProc proc hWin:HWND,uMsg:UINT,wParam:WPARAM,lParam:LPARAM
 
    mov        eax,uMsg
    .if eax==WM_INITDIALOG
        invoke GetDlgItem,hWin,IDC_STC1
        .if eax
            mov ecx,eax
            invoke SetWindowLong,ecx,GWL_WNDPROC,addr ContolProc
            mov pOldProc,eax
        .endif
    .elseif eax==WM_COMMAND
        mov eax,wParam         
        .if eax == IDC_BTN1
            invoke SetDlgItemText,hWin,IDC_STC1,offset TitleTxt  //这里,没有问题
        .endif
    .elseif eax==WM_CLOSE
        invoke EndDialog,hWin,0
    .else
        mov        eax,FALSE
        ret
    .endif
    mov        eax,TRUE
    ret
 
DlgProc endp


举世而誉之而不加劝,举世而非之而不加沮,定乎内外之分,辩乎荣辱之境,斯已矣。彼其于世未数数然也。
2009-08-13 13:41
东海一鱼
Rank: 13Rank: 13Rank: 13Rank: 13
等 级:贵宾
威 望:48
帖 子:757
专家分:4760
注 册:2009-8-10
收藏
得分:0 
如果你要完全自定义控件包括控件的外形控制,你可以这样做:

EditClass  db "EDIT",0    //假如是编辑框控件
EdClassEx    WNDCLASSEX <?>

invoke GetClassInfoEx,hInstance,offset EditClass,offset EdClassEx
lea eax,MyProc
push eax
pop EdClassEx.lpfnWndProc                                         //把默认处理函数指向自己的
invoke lstrcpy,addr EdClassEx.lpszClassName,CTEXT("MyEdit")       //我的EDIT
。。。。。。。。。。                                             //你想修改的其他项
invoke RegisterClassEx,addr EdClassEx                             //重新注册这个类

invoke CreateWindowEx,WS_EX_CLIENTEDGE,ADDR EdClassEx.lpszClassName,NULL,\        //在对话框中创建自己的控件
            WS_CHILD+WS_VISIBLE+WS_BORDER,20,\  
            20,300,25,hWnd,NULL,\  
            hInstance,NULL  

//因为是自己控制创建,所以你可以处理任何消息。


举世而誉之而不加劝,举世而非之而不加沮,定乎内外之分,辩乎荣辱之境,斯已矣。彼其于世未数数然也。
2009-08-13 14:04
nzxhust
Rank: 2
等 级:论坛游民
威 望:1
帖 子:99
专家分:28
注 册:2008-2-14
收藏
得分:0 
自己用窗口方式创建控件的确不错,但我有个问题我有42个STATIC文本框需要修改框内的鼠标样式,如果一个个都这样创建就太麻烦了,
子类化能不能所有控件都用一个过程函数来处理我要处理得消息?比如组合框和静态文本框我都在子类化的时候用同一个过程函数不知道可以不?
2009-08-13 19:20
nzxhust
Rank: 2
等 级:论坛游民
威 望:1
帖 子:99
专家分:28
注 册:2008-2-14
收藏
得分:0 
等下我吧我写了一个月的日历程序发上来......
希望大家能多多支持看看有什么问题和BUG我好修正下
2009-08-13 19:30
东海一鱼
Rank: 13Rank: 13Rank: 13Rank: 13
等 级:贵宾
威 望:48
帖 子:757
专家分:4760
注 册:2009-8-10
收藏
得分:0 
实际上我上面已经告诉你了。它叫‘超类化’

你需要一系列的控件,但它们之间却只有一点点的不同。例如,你可能需要10个只接受数字的 Edit 控件,当然你可以通过多种方法来达到这个目的。
 
1、创建自己的类并用它实例化为那些控件  
2、创建那些 Edit 控件并把它们全部子类化  
3、超类化Edit 控件  
第一种方法太乏味了,因为你必须自己实现Edit 控件的每个功能,但这项工作不是轻松就能完成的。第二种方法好于第一种,但仍然要做许多工作,子类化几个Edit 控件还可以接受,但若要子类化十几二十个,这项工作简直就是一场恶梦。在这种情况下就应该使用超类化这个技巧,它是用于控制某一个特定窗口类的特殊方法。通过这种控制就可以修改窗口类的特性使之符合你的要求,然后再创建那一堆控件就可以了。
 
超类化有如下几个步骤:
 
1、通过调用 GetClassInfoEx 来获得想要进行超类化操作的窗口类的信息。函数GetClassInfoEx 需要一个指向 WNDCLASSEX 结构的指针,用于当成功返回时填入窗口类的信息。  
2、按需要修改 WNDCLASSEX 结构的成员,其中有两个成员必须修改:
   hInstance 存放程序的实例句柄
   lpszClassName 指向一个新类名的指针
3、不必修改成员 lpfnWndProc,但大多数情况下还是需要的。但要记住如果要使用函数 CallWindowProc 调用老窗口的过程,那就必须保存成员 lpfnWndProc 的原值。  
4、注册修改完的 WNDCLASSEX 结构,得到一个具有旧窗口类某些特性的新窗口类。  
5、用新窗口类创建窗口  
如果要创建具有相同特性的多个控件,超类化就比子类化要好


举世而誉之而不加劝,举世而非之而不加沮,定乎内外之分,辩乎荣辱之境,斯已矣。彼其于世未数数然也。
2009-08-13 22:10
nzxhust
Rank: 2
等 级:论坛游民
威 望:1
帖 子:99
专家分:28
注 册:2008-2-14
收藏
得分:0 
哦超类化啊书上是有不过还没看去看看
2009-08-13 22:16
快速回复:控件中的鼠标样子怎么改?
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.012485 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved