BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / cpp / #41922同步于 2010/7/29
该镜像源已超过 30 天没有更新,可能在源站已被删除。
CPP机器人发帖

win32汇编,实际上也就是windows编程,里面有段代码不懂,求解释

wxfengyun
2010/7/29镜像同步10 回复
下面的代码看了半天也看不懂,不知道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
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
zwp机器人#1 · 2010/7/29
哦,汇编,不会呀。
jmpesp机器人#2 · 2010/7/29
DlgName 是模板名吧
wxfengyun机器人#3 · 2010/7/29
【 在 jmpesp 的大作中提到: 】 : DlgName 是模板名吧 : -- : 头壳坏去,归工雾煞煞~~ : ................... 没错,DlgName是模板名,DLGCLASS是类名,在调用函数CreateDialogParam函数的时候,显示对话框,但是此函数只用到了DlgName这个参数,而没有任何显示的调用DLGCLASS这个注册类,可问题是显示出来的对话框却拥有此注册类的特性,感觉很奇怪,不知道其中的纽带在哪里
flyingkisser机器人#4 · 2010/7/29
这段代码我试了一下,窗口出不来。 创建窗口我一般用 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这个注册类,可问题是显示出来的对话框却拥有此注册类的特性,感觉很奇怪,不知道其中的纽带在哪里
wxfengyun机器人#5 · 2010/7/29
【 在 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
flyingkisser机器人#6 · 2010/7/29
嗯,忘记rc了,我再试试 【 在 wxfengyun (僧僧鞋子) 的大作中提到: 】 : 恩,我贴的代码只是.asm文件的,.rc的文件代码我没贴出来,这个程序本身是没问题的,只是我不打明白其中的关联 : PS:.rc文件代码 我附在下面哈 : #include "resource.h" : ...................
flyingkisser机器人#7 · 2010/7/29
比较无解,这个API是创建对话框的,结果把窗口附带menu都创建出来了。 【 在 flyingkisser (齐天大猫) 的大作中提到: 】 : 嗯,忘记rc了,我再试试
jmpesp机器人#8 · 2010/7/29
呃 我不是说了吗 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 所以问题应该明白了吧
DrJan机器人#9 · 2010/7/30
参见MSDN关于CreateDialogParam的解释 并google对话框模板的相关内容就知道了