;这个很重要,运行效果
;win32汇编环境,理解BeginPaint函数与GetDC函数的区别
;BeginPaint函数用在WM_PAINT消息里面,用来得到显示设备上下文,即整个程序窗口的区域。
;当最大化时、或被其它窗口挡住后再恢复时、或移动窗口时,系统根据这个BeginPaint函数保存下来的值,把那些挡住的区域重新画出来,自已很难计算挡住了多少面积,所以这些工作就交给系统了。
;GetDC函数就是自已强行把某一块区域重新画出来。但画出来的地方,只能当时看见,当程序窗口最小化后,再恢复原状时,系统不会自动恢复它,就是看不见了。
;直接抄进RadAsm可编译运行。重要部分加解释。
;下面为asm文件
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
.386
.model flat,stdcall
option casemap:none
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; Include 文件定义
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
include windows.inc
include user32.inc
include kernel32.inc
includelib user32.lib
includelib kernel32.lib
include gdi32.inc
includelib gdi32.lib
; 自定义函数声明
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
DlgProc proto :DWORD,:DWORD,:DWORD,:DWORD ;对话框窗口函数
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 数据段
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
.data
DlgName db "MyDialog",0
szText01 db '我是使用GetDC函数,不在WM_PAINT消息里面写出来的文字!',0
szText02 db '我是使用BeginPaint函数,在WM_PAINT消息里面写出来的文字!',0
.data?
hInstance HINSTANCE ?
.const
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; Equ 等值定义
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
ICO_MAIN equ 1000 ;图标
IDC_EXIT equ 3001
; 代码段
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
.code
start:
invoke GetModuleHandle, NULL
mov hInstance,eax
invoke DialogBoxParam, hInstance, ADDR DlgName,NULL, addr DlgProc, NULL
invoke ExitProcess,eax
DlgProc proc hWnd:HWND, uMsg:UINT, wParam:WPARAM, lParam:LPARAM
LOCAL @stPs:PAINTSTRUCT
LOCAL @stRect:RECT
LOCAL @hDc01,@hDc02
.if uMsg == WM_INITDIALOG
invoke LoadIcon,hInstance,ICO_MAIN ;加载图标
invoke SendMessage,hWnd,WM_SETICON,ICON_BIG,eax
.elseif uMsg == WM_PAINT
invoke BeginPaint,hWnd,addr @stPs
mov @hDc02,eax
mov @stRect.left,20 ;左上角X坐标
mov @stRect.top,80 ;左上角Y坐标
mov @stRect.right,450 ;右下角X坐标
mov @stRect.bottom,100 ;右下角Y坐标
invoke DrawText,@hDc02,addr szText02,-1,addr @stRect,DT_SINGLELINE or DT_LEFT or DT_VCENTER ; -1的值,即字符串必须以 null 结尾
invoke EndPaint,hWnd,addr @stPs
.elseif uMsg==WM_COMMAND
mov eax,wParam
.if eax == IDC_EXIT
invoke GetDC,hWnd
mov @hDc01,eax
invoke lstrlen,addr szText01
invoke TextOut,@hDc01,20,40,addr szText01,eax
invoke ReleaseDC,hWnd,@hDc01
.endif
.elseif uMsg == WM_CLOSE
invoke EndDialog, hWnd,NULL
.else
mov eax,FALSE
ret
.endif
mov eax,TRUE
ret
DlgProc endp
end start
;下面为rc文件内容
#include "resource.h" //提示缺少该文件,可以在资源里下载
#define ICO_MAIN 1000 //图标
#define IDC_EXIT 3001
ICO_MAIN ICON "Main.ico"
//定义对话框
MyDialog DIALOG 10, 10, 300, 100
STYLE DS_CENTER | WS_CAPTION | WS_MINIMIZEBOX |
WS_SYSMENU | WS_VISIBLE | WS_OVERLAPPED | DS_MODALFRAME | DS_3DLOOK
CAPTION "理解BeginPaint函数与GetDC函数的区别"
BEGIN
CONTROL "试一下,最小化窗口,再恢复窗口", -1, "Static", WS_CHILD | WS_VISIBLE, 10, 70, 120, 10 //-1值是不定义这个控件的ID,就是后面无法操作这个控件了,纯粹显示这一行文本
PUSHBUTTON "点我显示GetDC函数文本", IDC_EXIT, 170,68,100,13
END