欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 文旅 > 明星 > win32汇编环境,理解BeginPaint函数与GetDC函数的区别

win32汇编环境,理解BeginPaint函数与GetDC函数的区别

2025/2/22 17:30:25 来源:https://blog.csdn.net/iltokyo/article/details/144933525  浏览:    关键词:win32汇编环境,理解BeginPaint函数与GetDC函数的区别

;这个很重要,运行效果

;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 


 

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词