网站主机的类型,中国建筑股份有限公司,网站支付功能怎么做,郑州网站建设优化;运行效果 ;win32汇编环境#xff0c;RadAsm入门教程之三 ;在这个教程里#xff0c;我们学一下如何增加控件#xff0c;比如按钮#xff0c;其它的控件类似这样增加 ;以下的代码就是在教程一的窗口模版里增加一个按钮控件#xff0c;可以比较一下#xff0c;增加了什么内…;运行效果 ;win32汇编环境RadAsm入门教程之三 ;在这个教程里我们学一下如何增加控件比如按钮其它的控件类似这样增加 ;以下的代码就是在教程一的窗口模版里增加一个按钮控件可以比较一下增加了什么内容。后面再来理解一下增加的内容。 ; .386 .model flat,stdcall option casemap:none include windows.inc include user32.inc includelib user32.lib include kernel32.inc includelib kernel32.lib ; WinMain proto :DWORD,:DWORD,:DWORD,:DWORD ; .DATA ClassName db SimpleWinClass,0 AppName db 窗口程序的模版,0 szButtonClassName db button,0 ;按钮类名 szButtonTitle db 我是被测试的按钮,0
.DATA? hInstance HINSTANCE ? CommandLine LPSTR ? hButton HWND ? ;按钮控件句柄变量 .const; ; Equ 等值定义 ButtonID equ 10 ;按钮控件标识符 ; .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 hwnd: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,NULL push hInstance pop wc.hInstance mov wc.hbrBackground,COLOR_WINDOW mov wc.lpszMenuName,NULL 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 CreateWindowEx,NULL, ADDR ClassName,ADDR AppName,WS_OVERLAPPEDWINDOW,100,100,400,300, NULL,NULL,hInst, NULL mov hwnd,eax invoke ShowWindow, hwnd,CmdShow invoke UpdateWindow, hwnd .while TRUE invoke GetMessage, ADDR msg,NULL,0,0 .break .if (!eax) invoke TranslateMessage, ADDR msg invoke DispatchMessage, ADDR msg .endw mov eax,msg.wParam ret WinMain endp ; WndProc proc hWnd:HWND, uMsg:UINT, wParam:WPARAM, lParam:LPARAM .if uMsg WM_CREATE invoke CreateWindowEx,NULL,ADDR szButtonClassName,ADDR szButtonTitle, WS_TABSTOP OR WS_VISIBLE OR WS_CHILD OR BS_DEFPUSHBUTTON ,80,100,200,25,hWnd,ButtonID,NULL,NULL ;创建按钮控件 mov hButton,eax .elseif uMsg WM_DESTROY invoke PostQuitMessage,NULL .else invoke DefWindowProc,hWnd,uMsg,wParam,lParam ret .endif xor eax,eax ret WndProc endp ; end start
;拿它与教程一的窗口模版代码比较我们发现多了下面一些内容 .DATA ;因为下面2个新增的内容是初始化的内容所以放在.DATA这个数据区里面。当然在程序运行时也是可以改变的。 szButtonClassName db button,0 ;这个是按钮类的类名按钮也是窗口它是预定义的控件就是电脑原来预先定义好的窗口里面封装了它的内容简单地说就是我们不用再单独写它的窗口过程函数直接引用它就行了。 szButtonTitle db 我是被测试的按钮,0 ;这是准备显示在按钮上的文字 .DATA? ;这是未初始化的数据区也叫变量区就是先给定空间在后面塞内容。 hButton HWND ? ;按钮控件句柄变量hButton现在还不知道这个控件是怎么样的所以放在未初始化的数据区。HWND指的是窗口它也是dd类型即4字节32位的类型HWND只不过是个别名。句柄的意思是代表着按钮在其它的地方要用这个按钮时就可以用这个句柄。 .const ;.const的是常量区就是里面的数据值是固定的不能改变的。 ; Equ 等值定义 equ的意思是等同于。 ButtonID equ 10 ;按钮控件标识符ButtonID它等于同10在代码里引用的时候把ButtonID换成10效果是一样的。标识符的意思是当有几个同类的按钮时需要区分出哪一个所以用ButtonID时即得到10时就是指这个按钮而不是另外的按钮。10这个数值是随便设的你设成1也可以但不能在有同类时有相同的值。比如有3个按钮你每个都等同于1就认不出来了。你可以设成Button1 euq 1,Button2 equ 2,Button equ 3的值,在后面引用时就分的出是哪个按钮了。 .if uMsg WM_CREATE ;这里有个WM_CREATE这是窗口初始化消息就是当主窗口创建后马上要先做什么。这里创建了一个按钮控件也就是一个为按扭类型的窗口。一般程序运行时需要初始化的数据都放在这个消息里面。 invoke CreateWindowEx,NULL,ADDR szButtonClassName,ADDR szButtonTitle, WS_TABSTOP OR WS_VISIBLE OR WS_CHILD OR BS_DEFPUSHBUTTON ,80,100,200,25,hWnd,ButtonID,NULL,NULL ;创建按钮控件用的函数和创建主窗口的是一样的都是CreateWindowEx但在参数里有WS_CHILD指的是子窗口的意思,主窗口里面没有这个参数。后面跟着的4个数字是这个子窗口即按钮的坐标。这个坐标默认的是最左上角是X坐标是0Y坐标也是0 X坐标向下递增Y坐标向右递增。80是指按钮的X坐标起始点是80Y坐标起始点是100长度是200宽度是25。hWnd是父窗口即主窗口的句柄。里面有个OR它的意思是并列前后的风格。WS_TABSTOP、WS_VISIBLE这些都是窗口的风格。上网搜一搜可以看到不同的风格。 mov hButton,eax ;上面CreateWindowEx函数的返回值在eax里面所以在调用了函数后马上把eax的值给前面定义的变量就是保存返回值。CreateWindowEx函数的返回值是创建的窗口的句柄。把它赋值给hButtonhButton的值就是按钮句柄后面要使用按钮的时候就可以使用它了。