返回信息流下面的代码看了半天也看不懂,不知道wc的作用,他还像是可有可无,甚至是多余的,可是去掉它,程序有不正常。wc和CreateDialogParam怎么也联系不上呀,怪!我主要是不明白,为什么注册了一个对话框类,但是实际创建对话框的函数CreateDialogParam的函数中并未用到这个对话框类,但最终显示出来的对话框却拥有刚注册对话框类的各项属性,不理解啊
.386
.model flat,stdcall
option casemap:none
WinMain proto :DWORD,:DWORD,:DWORD,:DWORD
include d:\masm32\include\windows.inc
include d:\masm32\include\user32.inc
include d:\masm32\include\kernel32.inc
includelib d:\masm32\lib\user32.lib
includelib d:\masm32\lib\kernel32.lib
.data
ClassName db "DLGCLASS",0
MenuName db "MyMenu",0
DlgName db "MyDialog",0
AppName db "Our First Dialog Box",0
TestString db "Wow! I'm in an edit box now",0
.data?
hInstance HINSTANCE ?
CommandLine LPSTR ?
buffer db 512 dup(?)
.const
IDC_EDIT equ 3000
IDC_BUTTON equ 3001
IDC_EXIT equ 3002
IDM_GETTEXT equ 32000
IDM_CLEAR equ 32001
IDM_EXIT equ 32002
.code
start:
invoke GetModuleHandle, NULL
mov hInstance,eax
invoke GetCommandLine
mov CommandLine,eax
invoke WinMain, hInstance,NULL,CommandLine, SW_SHOWDEFAULT
invoke ExitProcess,eax
WinMain proc hInst:HINSTANCE,hPrevInst:HINSTANCE,CmdLine:LPSTR,CmdShow:DWORD
LOCAL wc:WNDCLASSEX
LOCAL msg:MSG
LOCAL hDlg:HWND
mov wc.cbSize,SIZEOF WNDCLASSEX
mov wc.style, CS_HREDRAW or CS_VREDRAW
mov wc.lpfnWndProc, OFFSET WndProc
mov wc.cbClsExtra,NULL
mov wc.cbWndExtra,DLGWINDOWEXTRA
push hInst
pop wc.hInstance
mov wc.hbrBackground,COLOR_BTNFACE+1
mov wc.lpszMenuName,OFFSET MenuName
mov wc.lpszClassName,OFFSET ClassName
invoke LoadIcon,NULL,IDI_APPLICATION
mov wc.hIcon,eax
mov wc.hIconSm,eax
invoke LoadCursor,NULL,IDC_ARROW
mov wc.hCursor,eax
invoke RegisterClassEx, addr wc
invoke CreateDialogParam,hInstance,ADDR DlgName,NULL,NULL,NULL
mov hDlg,eax
invoke ShowWindow, hDlg,SW_SHOWNORMAL
invoke UpdateWindow, hDlg
invoke GetDlgItem,hDlg,IDC_EDIT
invoke SetFocus,eax
.WHILE TRUE
invoke GetMessage, ADDR msg,NULL,0,0
.BREAK .IF (!eax)
invoke IsDialogMessage, hDlg, ADDR msg
.IF eax ==FALSE
invoke TranslateMessage, ADDR msg
invoke DispatchMessage, ADDR msg
.ENDIF
.ENDW
mov eax,msg.wParam
ret
WinMain endp
WndProc proc hWnd:HWND, uMsg:UINT, wParam:WPARAM, lParam:LPARAM
.IF uMsg==WM_DESTROY
invoke PostQuitMessage,NULL
.ELSEIF uMsg==WM_COMMAND
mov eax,wParam
.IF lParam==0
.IF ax==IDM_GETTEXT
invoke GetDlgItemText,hWnd,IDC_EDIT,ADDR buffer,512
invoke MessageBox,NULL,ADDR buffer,ADDR AppName,MB_OK
.ELSEIF ax==IDM_CLEAR
invoke SetDlgItemText,hWnd,IDC_EDIT,NULL
.ELSE
invoke DestroyWindow,hWnd
.ENDIF
.ELSE
mov edx,wParam
shr edx,16
.IF dx==BN_CLICKED
.IF ax==IDC_BUTTON
invoke SetDlgItemText,hWnd,IDC_EDIT,ADDR TestString
.ELSEIF ax==IDC_EXIT
invoke SendMessage,hWnd,WM_COMMAND,IDM_EXIT,0
.ENDIF
.ENDIF
.ENDIF
.ELSE
invoke DefWindowProc,hWnd,uMsg,wParam,lParam
ret
.ENDIF
xor eax,eax
ret
WndProc endp
end start
这是一条镜像帖。来源:北邮人论坛 / cpp / #41922同步于 2010/7/29
该镜像源已超过 30 天没有更新,可能在源站已被删除。
CPP机器人发帖
win32汇编,实际上也就是windows编程,里面有段代码不懂,求解释
wxfengyun
2010/7/29镜像同步10 回复
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
【 在 jmpesp 的大作中提到: 】
: DlgName 是模板名吧
: --
: 头壳坏去,归工雾煞煞~~
: ...................
没错,DlgName是模板名,DLGCLASS是类名,在调用函数CreateDialogParam函数的时候,显示对话框,但是此函数只用到了DlgName这个参数,而没有任何显示的调用DLGCLASS这个注册类,可问题是显示出来的对话框却拥有此注册类的特性,感觉很奇怪,不知道其中的纽带在哪里
这段代码我试了一下,窗口出不来。
创建窗口我一般用
invoke CreateWindowEx,WS_EX_CLIENTEDGE,addr ClassName,addr DlgName,\
WS_OVERLAPPEDWINDOW,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,\
0,0,hInstance,0
【 在 wxfengyun (僧僧鞋子) 的大作中提到: 】
: 没错,DlgName是模板名,DLGCLASS是类名,在调用函数CreateDialogParam函数的时候,显示对话框,但是此函数只用到了DlgName这个参数,而没有任何显示的调用DLGCLASS这个注册类,可问题是显示出来的对话框却拥有此注册类的特性,感觉很奇怪,不知道其中的纽带在哪里
【 在 flyingkisser 的大作中提到: 】
: 这段代码我试了一下,窗口出不来。
: 创建窗口我一般用
: invoke CreateWindowEx,WS_EX_CLIENTEDGE,addr ClassName,addr DlgName,\
: ...................
恩,我贴的代码只是.asm文件的,.rc的文件代码我没贴出来,这个程序本身是没问题的,只是我不打明白其中的关联
PS:.rc文件代码 我附在下面哈
#include "resource.h"
#define IDC_EDIT 3000
#define IDC_BUTTON 3001
#define IDC_EXIT 3002
#define IDM_GETTEXT 32000
#define IDM_CLEAR 32001
#define IDM_EXIT 32003
MyDialog DIALOG 10, 10, 205, 60
STYLE 0x0004 | DS_CENTER | WS_CAPTION | WS_MINIMIZEBOX |
WS_SYSMENU | WS_VISIBLE | WS_OVERLAPPED | DS_MODALFRAME | DS_3DLOOK
CAPTION "Our First Dialog Box"
CLASS "DLGCLASS"
BEGIN
EDITTEXT IDC_EDIT, 15,17,111,13, ES_AUTOHSCROLL | ES_LEFT
DEFPUSHBUTTON "Say Hello", IDC_BUTTON, 141,10,52,13
PUSHBUTTON "E&xit", IDC_EXIT, 141,26,52,13, WS_GROUP
END
MyMenu MENU
BEGIN
POPUP "Test Controls"
BEGIN
MENUITEM "Get Text", IDM_GETTEXT
MENUITEM "Clear Text", IDM_CLEAR
MENUITEM "", , 0x0800 /*MFT_SEPARATOR*/
MENUITEM "E&xit", IDM_EXIT
END
END
嗯,忘记rc了,我再试试
【 在 wxfengyun (僧僧鞋子) 的大作中提到: 】
: 恩,我贴的代码只是.asm文件的,.rc的文件代码我没贴出来,这个程序本身是没问题的,只是我不打明白其中的关联
: PS:.rc文件代码 我附在下面哈
: #include "resource.h"
: ...................
比较无解,这个API是创建对话框的,结果把窗口附带menu都创建出来了。
【 在 flyingkisser (齐天大猫) 的大作中提到: 】
: 嗯,忘记rc了,我再试试
呃 我不是说了吗 invoke CreateDialogParam,hInstance,ADDR DlgName,NULL,NULL,NULL 第二个参数是模板名 这个是问题的关键!
看下注册的wc类,这个wc类取名为DLGCLASS:
mov wc.lpszClassName,OFFSET ClassName
那再看下rc文件中的对话框模板:
MyDialog DIALOG 10, 10, 205, 60
STYLE 0x0004 | DS_CENTER | WS_CAPTION | WS_MINIMIZEBOX |
WS_SYSMENU | WS_VISIBLE | WS_OVERLAPPED | DS_MODALFRAME | DS_3DLOOK
CAPTION "Our First Dialog Box"
CLASS "DLGCLASS" //看到这个没有,模板里面嵌入类的名称了,这就是关键
过程也就是这样:
CreateDialogParam传入对话框模板名——>资源菜单中填入对话框类名称
于是就结合起来了 这样就ok
所以问题应该明白了吧