参阅前文,首先要有一个基本的对话框;
把对话框资源文件里的控件定义都删除,得到的一个rc文件,test.rc;
#include <resource.h>
#define DLG_MAIN 1
DLG_MAIN DIALOG 193, 180, 130, 150
STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU | WS_THICKFRAME
CAPTION "对话框子窗口控制示例"
FONT 9, "宋体"
{
}
然后从老罗的书里面拷一个画线过程过来,_DrawLine proc;
之前的ASM对话框程序在 .data? 段定义了一个hInstance,类型为dd;调用_DrawLine过程需要有设备描述表句柄这个参数,再在此段定义一个myhdc,类型也为 dd ;
.const 段给它空着;
代码段一开始,先是_DrawLine 过程;
然后是对话框过程;
对话框过程的处理分支包括WM_CLOSE;WM_COMMAND 分支现在空着;之前初始化对话框的子控件是在WM_INITDIALOG分支,在此也空着;为了画图,增加WM_PAINT消息处理分支,也就是
.elseif eax == WM_PAINT
这句;
在此分支调用GetDC获取到设备描述表句柄,存入myhdc;然后调用_DrawLine过程画2条线;
那么目前的ASM代码如下;
.386
.model flat, stdcall
option casemap :none
include D:\masm32\include\windows.inc
include D:\masm32\include\user32.inc
include D:\masm32\include\kernel32.inc
include D:\masm32\include\gdi32.inc
includelib D:\masm32\lib\user32.lib
includelib D:\masm32\lib\kernel32.lib
includelib D:\masm32\lib\gdi32.lib
DLG_MAIN equ 1
.data?
hInstance dd ?
myhdc dd ?
.const
.code
_DrawLine proc _hDC,_dwPen,_dwPenWidth,_dwColor,_dwStartX,_dwEndX,_dwY
invoke CreatePen,_dwPen,_dwPenWidth,_dwColor
invoke SelectObject,_hDC,eax
invoke DeleteObject,eax
invoke MoveToEx,_hDC,_dwStartX,_dwY,NULL
invoke LineTo,_hDC,_dwEndX,_dwY
ret
_DrawLine endp
_ProcDlgMain proc uses ebx edi esi hWnd,wMsg,wParam,lParam
mov eax,wMsg
.if eax == WM_CLOSE
invoke EndDialog,hWnd,NULL
.elseif eax == WM_INITDIALOG
.elseif eax == WM_PAINT
invoke GetDC, hWnd
mov myhdc, eax
invoke _DrawLine,myhdc,PS_SOLID,1,0,10,420,10
invoke _DrawLine,myhdc,PS_SOLID,1,0,10,420,100
.elseif eax == WM_COMMAND
.else
mov eax,FALSE
ret
.endif
mov eax,TRUE
ret
_ProcDlgMain endp
start:
invoke GetModuleHandle,NULL
mov hInstance,eax
invoke DialogBoxParam,hInstance,DLG_MAIN,NULL,offset _ProcDlgMain,NULL
invoke ExitProcess,NULL
end start
构建运行如下;