注册 登录
编程论坛 汇编论坛

超类化遇到问题

nzxhust 发布于 2009-08-14 11:26, 1735 次点击
有几个问题
1是我在ASM中RigsterClassEx注册的类,如果用资源文件定义,怎么办呢?我的资源文件是VC编辑的,我按老罗这种做的话:
CONTROL "",-1,"HexEdit",ES_LEFT | WS_BORDER | WS_TABSTOP,5,5,115,12
VC无法编译啊.要怎么把这个新类让VC识别呢?
2.如果不用资源定义直接创建,也有些问题,用CreateWindow怎么undefined头文件应该不少啊,用CreateWindowEx创建出来结果样子不对..
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
;超类化静态文本框注册函数
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
_SupperStatic        proc
            local    @stSC:WNDCLASSEX
            mov    @stSC.cbSize,sizeof @stSC
            invoke    GetClassInfoEx,NULL,addr szStaticClass,addr @stSC
            push    hInstance
            pop    @stSC.hInstance
            mov    @stSC.lpszClassName,offset szNewStaticClass
            invoke    LoadCursor,hInstance,IDC_CURSOR1;就只改下鼠标
            mov    @stSC.hCursor,eax
            invoke    RegisterClassEx,addr @stSC
            ret
_SupperStatic        endp
然后我用这个创建的,但是样子是窗口不是STATIC控件额....
invoke    CreateWindowEx,NULL,addr szNewStaticClass,NULL\
                ,SS_NOTIFY or \
                WS_BORDER or WS_TABSTOP or WS_VISIBLE\
                ,37,88,12,12,hWnd,NULL,hInstance,NULL
如果用这个创建要怎么弄啊?
老大们快来讨论下问题N多.....
23 回复
#2
非虫2009-08-14 13:31
where is WS_CHILD?
#3
nzxhust2009-08-14 16:10
我想问下CreateWindow我用怎么编译不通过啊?
#4
nzxhust2009-08-14 16:15
有个问题怎么我用的原VC种编辑资源的x,y,hight,wide但是显示出来却不是VC中编辑资源时候的位置啊?
有什么方法换算吗?不能可视化不太好弄位置啊
#5
东海一鱼2009-08-14 22:31
巨晕,不知道你到底要问什莫??
#6
nzxhust2009-08-14 22:50
很难理解?我VC编辑的资源,现在我要把中间一个文本框改成自己的类,于是我用CREATEWINDOWEX创建类使用的坐标是原来的资源坐标,
但是画出来位置不是原来文本框在的地方
#7
东海一鱼2009-08-14 23:23
你等于创建了两个控件啊,资源编辑其中的一个。你超类化的一个。我刚玩汇编,还不太会用。不过我想你可以直接用Rc编译一下。
因为我看到Radasm的自定义控件,都可以可视化编辑,而且生成的.rc文件也可以通过rc生成res.
程序代码:
#define IDD_DIALOG1 101
#define IDC_EDT2 1003
#define IDCANCEL 2
#define IDC_CBO1 1002
#define IDC_EDT1 1004
#define IDC_TBR1 1005
#define IDC_REB1 1001
#define IDC_CAD1 1006
IDD_DIALOG1 DIALOGEX 6,6,195,101
CAPTION "Rebar demo"
FONT 8,"MS Sans Serif",0,0
STYLE 0x12CC0880
EXSTYLE 0x00000001
BEGIN
  CONTROL "",IDC_EDT1,"Edit",0x50211044,0,16,194,68,0x00000200
  CONTROL "",IDC_REB1,"ReBarWindow32",0x52000000,0,0,52,13,0x00000000
  CONTROL "",IDC_EDT2,"Edit",0x50010000,0,92,54,11,0x00000200
  CONTROL "Exit",IDCANCEL,"Button",0x50010000,132,88,58,13,0x00000000
  CONTROL "",IDC_CBO1,"ComboBox",0x50010003,56,92,56,52,0x00000000
  CONTROL "",IDC_TBR1,"ToolbarWindow32",0x50000845,54,0,94,13,0x00000000
  CONTROL "",IDC_CAD1,"CADCLASS",0x56300000,67,49,66,61,0x00000200         //这里就是Radasm的自定义控件
END
#8
nzxhust2009-08-14 23:28
是啊但是有个问题我的资源文件时VC编辑的不知道怎么改...直接用RC不能编译,用VC编译也不能识别新类
#9
东海一鱼2009-08-14 23:39
可以的,只是一个资源符号而已。

程序代码:
#define IDD_DIALOG1 101
#define IDC_EDT2 1003
#define IDCANCEL 2
#define IDC_CBO1 1002
#define IDC_EDT1 1004
#define IDC_TBR1 1005
#define IDC_REB1 1001
#define IDC_SUPPEREEDIT 1006                                          //定义资源ID
IDD_DIALOG1 DIALOGEX 6,6,195,101
CAPTION "Rebar demo"
FONT 8,"MS Sans Serif",0,0
STYLE 0x12CC0880
EXSTYLE 0x00000001
BEGIN
  CONTROL "",IDC_EDT1,"Edit",0x50211044,0,16,194,68,0x00000200
  CONTROL "",IDC_REB1,"ReBarWindow32",0x52000000,0,0,52,13,0x00000000
  CONTROL "",IDC_EDT2,"Edit",0x50010000,0,92,54,11,0x00000200
  CONTROL "Exit",IDCANCEL,"Button",0x50010000,132,88,58,13,0x00000000
  CONTROL "",IDC_CBO1,"ComboBox",0x50010003,56,92,56,52,0x00000000
  CONTROL "",IDC_TBR1,"ToolbarWindow32",0x50000845,54,0,94,13,0x00000000
  CONTROL "",IDC_SUPPEREEDIT,"SUPPEREEDIT",0x56300000,67,49,66,61,0x00000200 //我手工改成这样,一样通过编译
END


[ 本帖最后由 东海一鱼 于 2009-8-14 23:51 编辑 ]
#10
nzxhust2009-08-14 23:51
不是这个意思,VC编辑的文件,他#include "afxres.h",RC编译会报这个文件不能打开要怎么弄?
我不知道这个要怎么弄
#11
东海一鱼2009-08-14 23:55
那是RC找不到这个文件,你可以用 /i 把它的路径包含进来。

程序代码:
Usage:  rc [options] .RC input file
Switches:
   /r    Emit .RES file (optional)
   /v    Verbose (print progress messages)
   /d    Define a symbol
   /u    Undefine a symbol
   /fo   Rename .RES file
   /l    Default language ID in hex
   /i    Add a path for INCLUDE searches            //////////这里              
   /x    Ignore INCLUDE environment variable
   /c    Define a code page used by NLS conversion
   /w    Warn on Invalid codepage in .rc (default is an error)
   /n    Append null's to all strings in the string tables.
Flags may be either upper or lower case
#12
nzxhust2009-08-15 00:04
"C:\Program Files\Microsoft Visual Studio\VC98\MFC\Include\AFXRES.H"这是路径,要怎么用?用了下不对...
#13
非虫2009-08-15 11:10
预编译头,去掉
#14
nzxhust2009-08-15 14:21
去掉了也报错...怎么报DS_DS_MODALFRAME无法识别...,我的RC文件在我发的日历程序里面有,谁帮我改下让RC能编译通过
#15
nzxhust2009-08-15 15:02
真笨用SetClassLong 就行了,还是感念不清楚,老是不把控件当窗口,直接随便取个控件的句柄用SetClassLong修改类就好了...不用超类化去修改真尴尬!
不过有个问题怎么其他的都可以修改就是BUTTION类的按钮用SetCLassLong修改样式无效这是为什么?
#16
东海一鱼2009-08-15 15:14
真累啊,感觉你的设计好乱。如果仅仅只是为了修改控件光标的话。只需在主窗体创建的过程中SetClassLong就好了。根本

不用对每一个控件再分别处理(我是指子类化、超类化)。除非你使用了非标控件或自己处理控件的自绘。

.if eax==WM_INITDIALOG
        invoke LoadCursorFromFile,CTEXT("hand.ani")
        mov ebx,eax
        invoke SetClassLong,hWin,GCL_HCURSOR,eax
        mov ecx,IDC_EDT1
        .while ecx < IDC_BTN3 +1
            push ecx
            invoke GetDlgItem,hWin,ecx
            mov ecx,eax
            invoke SetClassLong,ecx,GCL_HCURSOR,ebx
            pop ecx
            inc ecx
        .endw
        invoke CloseHandle,ebx

[ 本帖最后由 东海一鱼 于 2009-8-15 15:54 编辑 ]
#17
nzxhust2009-08-15 18:26
哎初学WIN32嘛总是忘记了WINDOW这个东东,一想SetClassLong是修改窗口类的就以为对控件没用,今天突然想起控件也是系统定义的窗口于是才想到直接用SetClassLong,结果果然可以,郁闷转了我半天真尴尬............被BS了
#18
nzxhust2009-08-15 18:27
不过子类化和超类化都是你说得我才去看的.....我一开始问你直接这样说嘛.......不过也不错又弄懂两个东西
#19
东海一鱼2009-08-15 18:52
我以为你要自定义控件哪?谁知就为了个‘光标’?

另外,我做的测试例子并没有你说得button控件修改光标无效的现象。

#20
nzxhust2009-08-15 19:02
汗一开始我就是说我的光标移动到控件后会变回来也就是控件的光标没设置的问题.....
#21
nzxhust2009-08-15 19:05
OK搞错了点,没问题了。
#22
nzxhust2009-08-15 19:06
不过那个VC编辑的RC,还是不知道怎么改才能用RC编译呢
#23
东海一鱼2009-08-15 19:31
我可以成功编译,一时说不明白。改天我另起一贴专门说VC的资源编译。呵呵。
#24
nzxhust2009-08-15 20:25
哦我对VC加的东西不太懂还有个怎么DS_MODALFRAME风格RC会报undefined也不知道为什么
1