首页 > 编程语言 >win32汇编环境,理解BeginPaint函数与GetDC函数的区别

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

时间:2025-01-06 09:05:23浏览次数:8  
标签:函数 invoke WM BeginPaint mov win32 eax 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 


 

标签:函数,invoke,WM,BeginPaint,mov,win32,eax,GetDC
From: https://blog.csdn.net/iltokyo/article/details/144933525

相关文章

  • opencv projectPoints函数
    cv::projectPoints是OpenCV中用于将三维点投影到二维图像平面的函数。它通常用于计算在相机坐标系下的三维点在图像坐标系中的位置,考虑了相机的内参和外参。函数原型voidcv::projectPoints(InputArrayobjectPoints,InputArrayrvec,InputArraytvec,In......
  • FineReport 函数使用
    1、函数概念1.1函数作用为何使用计算?通过计算,可以根据数据源中已存在的数据创建新数据,并对数据执行计算,从而进行更复杂的分析。这不仅增强了数据分析的能力,还提升了报表的灵活性和可视化效果。增强数据分析能力:基于已有数据生成新数据点,支持复杂分析。提升报表灵活性......
  • Eval-Expression.NET:动态执行C#脚本,类似Javascript的Eval函数功能
    我们都知道在JavaScript中,我们可以通过Eval来执行JavaScript字符串代码。下面推荐一个.Net版本的Eval的开源项目。01项目简介Eval-Expression.NET是一个非常强大工具,使得开发人员可以动态编译和执行C#代码和表达式。通过C#反射,还能轻松访问公共和私有方法、字段、属性值......
  • [20250103]distinct的函数实现.txt
    [20250103]distinct的函数实现.txt--//前天使用递归代替类似selectdistinctrtypefromroutine2;--//今天尝试使用函数是否可以实现,首先提一下,写pl/sql代码不是我擅长的工作,我的工作不需要写代码。--//主要目的仅仅为了学习。1.环境:SCOTT@book01p>@ver2=====================......
  • C语言(自定义)函数
    函数概念函数可以分为函数库(预制菜)和自定义函数(自己做的菜)函数库之前的文章讲解过一部分数组的、字符串的、动态内存的,有兴趣可以我的学习专栏看一看,里面都有今天重点讲解的函数是自定义函数先来几道预制菜输入/输出函数(头文件为stdio.h):用于完成输入/输出功能;(最基本的)字......
  • C++26 函数契约(Contract)概览
    文章目录1.什么是契约编程?契约编程的三大核心:2.C++26契约编程的语法语法示例3.契约检查模式3.1.`default`模式3.2.`audit`模式3.3.`axiom`模式检查模式的设置4.契约编程与传统`assert`的区别示例对比5.契约编程的应用场景6.注意事项7.示例:带契约......
  • Win32汇编学习笔记05
    定位关键点3种方法:过程函数api字符串但是不确定用要哪一种方法,可以3种方法都用一下,因为在不同的程序,实用的方法是不一样的窗口程序看控件信息1.通过OD去看还可以用spy++查看还可以用vs2019,打开软件,找到对应控件直接看属性一般拿句柄没用,因为按钮是响应WM_......
  • C++函数的出参
    在C#中,在函数或方法的参数前添加上out或ref时,这个参数就是出参了。在C++中主要是通过指针和引用实现来类似的功能。#include<iostream>//使用指针作为出参//getValues接受两个指向整数的指针,并通过这些指针修改了调用者提供的变量的值voidgetValues(int*a,int*b)......
  • Python函数:编程的基石
    Python是一种非常灵活且强大的编程语言,其功能丰富,应用广泛。在Python的世界里,函数是构建程序的基本单元,它封装了一段代码,使其可以被重复调用和复用。本文将从函数的基本概念、定义、参数传递、返回值、作用域、高级特性等方面,深入探讨Python函数的奥秘,帮助读者掌握这一编程利器......
  • 请说说原型对象、构造函数、实例对象三者之间的关系?
    在JavaScript中,原型对象(prototype)、构造函数(constructor)和实例对象(instance)之间存在着紧密的关系。这种关系构成了JavaScript中面向对象编程(OOP)的基础。下面将详细解释这三者之间的关系:构造函数(Constructor):构造函数是一个特殊的函数,用于创建和初始化由该构造函数构造的一个新......