叔叔好,请教一个关于窗口子类化的问题

臭你个臭臭 2008-11-27 03:47:40
.
.
.
WndProc proc hWnd, uMsg, wParam, lParam
mov eax, uMsg
.if eax==WM_CREATE
invoke CreateWindowEx,xx,xx,xx.......
mov hRichEdit, eax

invoke SetWindowLong, hwndRichEdit, GWL_WNDPROC, addr NewRichEditProc
mov OldWndProc, eax
invoke SetWindowLong, hwndRichEdit, GWL_USERDATA, eax
.elseif eax==WM_SIZE
.
.
我在窗口处理函数中对Rich Edit控件进行子类化,程式运行证明子类化是成功的,主要代码如上,但问题也出来了,耗了10个小时也没解决。
一,如果我将子类化函数置于WM_CREATE消息中,程式ml和link都通过,但运行.exe时只会在屏幕上闪现一下就自动关闭,一瞬间。
二,如果我将子类化函数置于WM_SIZE消息中,程式可以运行,子类化成功切.exe档不会消失,但先前关于WM_SIZE消息的处理都不再有用,且当编辑区有鼠标按键动作时,程式关闭(当没有创建子类化时一切正常)。比如说,没有创建子类化时编辑框会随里面资料自动调整大小,但创建子类化后,一旦资料有超过预定义的窗口大小程式就会关闭,且鼠标拖动边界也会导致关闭,实在想不明白。
...全文
112 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
authenticationf 2008-11-28
  • 打赏
  • 举报
回复
友情up
filec75 2008-11-28
  • 打赏
  • 举报
回复
友情up
killbug2004 2008-11-28
  • 打赏
  • 举报
回复
NewRichEditProc proc hWnd:DWORD, uMsg:DWORD, wParam:DWORD, lParam:DWORD
LOCAL hdc:DWORD
LOCAL hOldFont:DWORD
LOCAL FirstChar:DWORD
LOCAL rect:RECT
LOCAL txtrange:TEXTRANGE
LOCAL buffer[1024*10]:BYTE
LOCAL hRgn:DWORD
LOCAL hOldRgn:DWORD
LOCAL RealRect:RECT
LOCAL pString:DWORD
LOCAL BufferSize:DWORD
LOCAL pt:POINT
这个函数里面局部变量占用空间太多
cnzdgs 2008-11-27
  • 打赏
  • 举报
回复
通常是在WM_CREATE消息中子类化,估计是你的NewRichEditProc函数中处理有问题,设断点调试看看。
cnzdgs 2008-11-27
  • 打赏
  • 举报
回复
栈溢出应该减少栈空间的使用量,尽量不要增大栈空间。
检查一下各个函数中分配局部变量的情况,一般情况下,小于1KB的空间可以在栈中直接分配,较大的空间应该在堆中分配,函数返回前释放。如果是递归函数,则更需要注意,应该推测出最大可能递归的次数来计算栈空间的消耗量。
臭你个臭臭 2008-11-27
  • 打赏
  • 举报
回复
子类化过程,由于很长,而且子类化部分应该是没问题的,所以贴头和尾
NewRichEditProc proc hWnd, uMsg, wParam, lParam
local ..
local ..
..
..
mov eax, uMsg
.if eax==WM_PAINT
.elseif eax==WM_CLOSE
invoke SetWindowLong, hwndRichEdit, GWL_WNDPROC, OldWndProc
.else
invoke GetWindowLong, hWnd, GWL_USERDATA
invoke CallWindowProc, OldWndProc, hWnd, uMsg, wParam, lParam
ret
.endif
xor eax, eax
ret
NewRichEditProc endp
臭你个臭臭 2008-11-27
  • 打赏
  • 举报
回复
窗口处理函数
WndProc proc hWnd, uMsg, wParam, lParam
local ofn:OPENFILENAME
local editstream:EDITSTREAM
local chrg:CHARRANGE
local hMem$:DWORD
local hBuf$:DWORD
local len:DWORD
local br:DWORD
local bLen:DWORD

mov eax, uMsg
;*******************************************************
.if eax==WM_CREATE
;*******************************************
;create the rich edit control
invoke CreateWindowEx, WS_EX_CLIENTEDGE, addr RichEditClass, 0, \
WS_CHILD or WS_VISIBLE or ES_MULTILINE or WS_VSCROLL or WS_HSCROLL or ES_NOHIDESEL, \
0, 0, 0, 0, hWnd, RichEditID, hInstance, 0
mov hwndRichEdit, eax
invoke SetFocus, hwndRichEdit
invoke SendMessage, hwndRichEdit, EM_SETEVENTMASK, 0, ENM_SELCHANGE

invoke CreateToolbarEx, hWnd, TBSTYLE_FLAT or WS_CHILD or WS_VISIBLE or TBSTYLE_TOOLTIPS or TBSTYLE_WRAPABLE, \
IDR_TOOLBAR, 0, HINST_COMMCTRL, IDB_STD_SMALL_COLOR, \
offset Button, 12, 0, 0, 0, 0, sizeof TBBUTTON
mov hToolbar, eax
call ResetPosition


invoke SendMessage, hwndRichEdit, EM_SETTYPOGRAPHYOPTIONS, TO_SIMPLELINEBREAK, TO_SIMPLELINEBREAK
invoke SendMessage, hwndRichEdit, EM_GETTYPOGRAPHYOPTIONS, 1, 1
.if eax==0 ;means this message is not processed
mov RichEditVersion, 2
.else
mov RichEditVersion, 3
invoke SendMessage, hwndRichEdit, EM_SETEDITSTYLE, SES_EMULATESYSEDIT, SES_EMULATESYSEDIT
.endif
invoke SetWindowLong, hwndRichEdit, GWL_WNDPROC, addr NewRichEditProc
mov OldWndProc, eax
invoke SetWindowLong, hwndRichEdit, GWL_USERDATA, eax
invoke SendMessage, hwndRichEdit, EM_LIMITTEXT, -1, 0
invoke SendMessage, hwndRichEdit, EM_SETMODIFY, FALSE, 0
invoke SendMessage, hwndRichEdit, EM_SETEVENTMASK, 0, ENM_MOUSEEVENTS
invoke SendMessage, hwndRichEdit, EM_EMPTYUNDOBUFFER, 0, 0
臭你个臭臭 2008-11-27
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 killbug2004 的回复:]
链接的时候一定要指定堆栈
Link /STACK:2000000,2000000 /SUBSYSTEM:WINDOWS edit.obj edit.res

如果使用默认的堆栈的话,链接后生成的程序运行是会一闪而过,无法正常运行,这个可能看就是传说中的堆栈溢出,入栈指令出错,程序异常退出
[/Quote]
非常感谢你,程式不会再一闪而过,我终于可以早点睡了
敬礼!
臭你个臭臭 2008-11-27
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 killbug2004 的回复:]
链接的时候一定要指定堆栈
Link /STACK:2000000,2000000 /SUBSYSTEM:WINDOWS edit.obj edit.res

如果使用默认的堆栈的话,链接后生成的程序运行是会一闪而过,无法正常运行,这个可能看就是传说中的堆栈溢出,入栈指令出错,程序异常退出
[/Quote]
这位大哥,我一直是用命令ml /c /coff /Cp edit.asm rc edit.rc
link /SUBSYSTEM:WINDOWS edit.obj edit.res
可否教教我关于你说的堆栈溢出的知识?
还有就是如果我不通过makefile,直接命令输入的话应该怎么变通呢?我如果用上面命令会一闪而过。
killbug2004 2008-11-27
  • 打赏
  • 举报
回复
多帖点代码,把子类化的那个NewRichEditProc贴出来看看,还要主窗口的wndproc过程消息要处理正确
killbug2004 2008-11-27
  • 打赏
  • 举报
回复
链接的时候一定要指定堆栈
Link /STACK:2000000,2000000 /SUBSYSTEM:WINDOWS edit.obj edit.res

如果使用默认的堆栈的话,链接后生成的程序运行是会一闪而过,无法正常运行,这个可能看就是传说中的堆栈溢出,入栈指令出错,程序异常退出
killbug2004 2008-11-27
  • 打赏
  • 举报
回复
子类化放到WM_CREATE中,提供的代码没有问题
看来是你没有编译好
要修改源码中的包含头文件和库文件路径,要修改资源文件中包含"resource.h"的正确路径
然后
ml /c /coff /Cp edit.asm
rc edit.rc
Link /SUBSYSTEM:WINDOWS edit.obj edit.rc

生成成功自后要让程序对关键字着色,还要在程序路径下包含wordfile.txt,否则不会着色
臭你个臭臭 2008-11-27
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 xiaopoy 的回复:]
滚动条消息怎么处理的?

.if eax==WM_PAINT
.elseif eax==WM_CLOSE

WM_PAINT消息的处理过程code也帖出来吧
[/Quote]
就是Iczelion的32位汇编教程的最后一章,关于用RichEdit实现语法高亮显示:http://211.90.241.130:22366/list.asp?part1=1&part2=4。子类化窗口处理函数名为NewRichEditProc
文章提供了源码下载,ml能通过,也能生成.exe,但不能执行;我自己修改了很久也没有成功,头疼。我觉得子类化窗口中高亮显示区域和父窗口的RECT结构被各自local定义,无法关联。文章中的代码当把子类化函数SetWindowLong的那一小段放在WM_SIZE下的时候可以执行.exe,但不允许鼠标拖动操作且不允许修改窗体大小。
希望有时间能帮我看看,不胜感激
xiaopoy 2008-11-27
  • 打赏
  • 举报
回复
滚动条消息怎么处理的?

.if eax==WM_PAINT
.elseif eax==WM_CLOSE

WM_PAINT消息的处理过程code也帖出来吧

21,459

社区成员

发帖
与我相关
我的任务
社区描述
汇编语言(Assembly Language)是任何一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。
社区管理员
  • 汇编语言
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧