Win32 汇编在对话框上画线

参阅前文,首先要有一个基本的对话框;

把对话框资源文件里的控件定义都删除,得到的一个rc文件,test.rc;

#include 
 
#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

构建运行如下;

Win32 汇编在对话框上画线_第1张图片

 

你可能感兴趣的:(汇编语言,汇编,GetDC,MoveToEx)