当前位置: 首页 > news >正文

RadASM环境,win32汇编入门教程之七

;运行效果

;RadASM环境,win32汇编入门教程之七
;在上一个教程里面,我们学习如何把数据显示出来。但是感觉太丑了,在这一教程里,我们来学习一下怎样让它们变漂亮点。
;主要的内容是如何创建字体,设置字体的大小,设置背景色及文本色等。
;下列就是上一节教程的代码中加一些内容,可以直接复制下来,然后编译运行看看效果
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
.386 
.model flat,stdcall 
option casemap:none 
include      windows.inc 
include      user32.inc 
include      kernel32.inc 
include      gdi32.inc        

includelib   user32.lib        
includelib   kernel32.lib 
includelib   gdi32.lib         
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
WinMain proto :DWORD,:DWORD,:DWORD,:DWORD       
                                                
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
.DATA                                   
ClassName           db "SimpleWinClass",0        
AppName             db "窗口程序的模版",0
sz_FontName01       db "方正姚体",0
sz_FontName02       db "隶书",0
   
sF db "%d",0
     
hA dd 168 
hD db "世界,你好!",0  
.DATA?                                  
hInstance   HINSTANCE  ?                
CommandLine LPSTR      ?
hB          dd ?
.const;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; Equ 等值定义
hC          equ 16800                                         
.CODE                      

start:                      
invoke GetModuleHandle, NULL                                                    
mov hInstance,eax 
invoke GetCommandLine                                                                                       
mov CommandLine,eax 
invoke WinMain, hInstance,NULL,CommandLine, SW_SHOWDEFAULT        
invoke ExitProcess, eax                                          
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
WinMain proc hInst:HINSTANCE,hPrevInst:HINSTANCE,CmdLine:LPSTR,CmdShow:DWORD 
        LOCAL wc:WNDCLASSEX                                          
        LOCAL msg:MSG 
        LOCAL hwnd:HWND 
        
        mov   wc.cbSize,SIZEOF WNDCLASSEX                            
        mov   wc.style, CS_HREDRAW or CS_VREDRAW                     
        mov   wc.lpfnWndProc, OFFSET WndProc                        
        mov   wc.cbClsExtra,NULL 
        mov   wc.cbWndExtra,NULL 
        push  hInstance 
        pop   wc.hInstance 
        mov   wc.hbrBackground,COLOR_WINDOW + 1
        mov   wc.lpszMenuName,NULL 
        mov   wc.lpszClassName,OFFSET ClassName 
        invoke LoadIcon,NULL,IDI_APPLICATION                          
        mov   wc.hIcon,eax 
        mov   wc.hIconSm,eax 
        invoke LoadCursor,NULL,IDC_ARROW                              
        mov   wc.hCursor,eax 
        invoke RegisterClassEx, addr wc                              
        invoke CreateWindowEx,NULL, ADDR ClassName,ADDR AppName,WS_OVERLAPPEDWINDOW,100,100,400,300, NULL,NULL,hInst, NULL 
        mov   hwnd,eax 
        invoke ShowWindow, hwnd,CmdShow                              
         invoke UpdateWindow, hwnd                                    

        .while TRUE                                                   
                invoke GetMessage, ADDR msg,NULL,0,0 
                .break .if (!eax) 
                invoke TranslateMessage, ADDR msg 
                invoke DispatchMessage, ADDR msg 
        .endw 
        mov     eax,msg.wParam                                         
        ret 
WinMain endp 
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
WndProc proc hWnd:HWND, uMsg:UINT, wParam:WPARAM, lParam:LPARAM 
         LOCAL @stPs:PAINTSTRUCT
         LOCAL @szBuffer[256]:byte 
         LOCAL @hDc         
         LOCAL @hFont01,@hOldFont01                                   ;设置字体变量
         LOCAL @hFont02,@hOldFont02
        
         .if uMsg == WM_CREATE                
   
        .elseif uMsg == WM_PAINT       
                invoke BeginPaint,hWnd,addr @stPs
                mov @hDc,eax 
                
                invoke  CreateFont,23,12,0,0,FW_BLACK,0,0,0,DEFAULT_CHARSET,OUT_DEFAULT_PRECIS,CLIP_CHARACTER_PRECIS,DEFAULT_QUALITY,DEFAULT_PITCH or FF_SWISS,addr sz_FontName01                       ;创建新字体                                               
                mov @hFont01,eax
                invoke SelectObject,@hDc,@hFont01
                mov @hOldFont01,eax
                
                ;设置新字体及各种参数
                invoke  SetTextAlign,@hDc,TA_TOP or TA_LEFT          ;左对齐或顶端对齐
                invoke  SetTextCharacterExtra,@hDc,1                 ;设置字符间距                 
                invoke  SetTextColor,@hDc,663366H                    ;设置文本颜色

                ;下面显示168
                invoke wsprintf,addr @szBuffer,addr sF,hA           
                invoke lstrlen,addr @szBuffer
                invoke TextOut,@hDc,100,30,addr @szBuffer,eax        ;显示函数
                ;下面显示1680
                mov hB,1680
                invoke wsprintf,addr @szBuffer,addr sF,hB
                invoke lstrlen,addr @szBuffer
                invoke TextOut,@hDc,100,80,addr @szBuffer,eax
                
                invoke SelectObject,@hDc,@hOldFont01                 ;恢复原来的字体
                invoke DeleteObject,@hFont01                         ;删除创建的字体
                
                invoke  CreateFont,28,14,0,0,FW_NORMAL,0,0,0,DEFAULT_CHARSET,OUT_DEFAULT_PRECIS,CLIP_CHARACTER_PRECIS,DEFAULT_QUALITY,DEFAULT_PITCH or FF_SWISS,addr sz_FontName01                       ;创建新字体                                               
                mov @hFont02,eax
                invoke SelectObject,@hDc,@hFont02
                mov @hOldFont02,eax
                
                ;设置新字体及各种参数
                invoke  SetTextAlign,@hDc,TA_TOP or TA_LEFT         
                invoke  SetTextCharacterExtra,@hDc,1                               
                invoke  SetTextColor,@hDc,0000CDH                   
                ;下面显示16800
                invoke wsprintf,addr @szBuffer,addr sF,hC
                invoke lstrlen,addr @szBuffer
                invoke TextOut,@hDc,100,130,addr @szBuffer,eax
                ;下面显示"世界,你好!"
                invoke lstrlen,addr hD
                invoke TextOut,@hDc,100,180,addr hD,eax
                
                invoke SelectObject,@hDc,@hOldFont02                 
                invoke DeleteObject,@hFont02
                invoke EndPaint,hWnd,addr @stPs  
        .elseif uMsg == WM_DESTROY                                           
                invoke PostQuitMessage,NULL                               
        .else 
                invoke DefWindowProc,hWnd,uMsg,wParam,lParam             
        ret 
    .endif 
    xor eax,eax 
    ret 
WndProc endp 
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
end start   
;在教程六里面,我们尝试着显示了4样东西,但看起来总是丑,显得很不专业
;在这个教程里,我们添加了一些代码,让它看起来没那么突兀。下面看添加的句子的意思
;sz_FontName         db "方正姚体",0   这一句的意思是,定义一种字体的字符串名称,后面在创建新字体时使用。这种字体必须是电脑里面已经安装的。
;mov   wc.hbrBackground,COLOR_WINDOW + 1 这一句的意思是,把窗口背景色加1,就可以和显示文本的背景色一样。
;当然,也可以另外设置文本的背景色。可以调用SetBkColor函数
;COLOR_WINDOW的值是5,像这种的是系统预定义的符号,它在一某些头文件里定义了,直接用就可以。
;所以,把COLOR_WINDOW + 1改成6,也是一样的意思
;如果编译运行后发现窗口不见了,再次编译运行又说无法删除,则可以在电脑最下面的那一栏,点右键。选启动任务管理器,在进程里找到这个程序,按右键,选结束进程。再重新编译运行。
;这里有个理论要知道。有一种叫显示设备上下文,就是窗口怎么显示,通过BeginPaint得到
;在这里,可以设置显示出来的东西,比如字符串的字体、大小或颜色等。
;如果设置了新的,就要把原来旧的设置保存下来,在离开的时候把旧的恢复回去
;如果不恢复回去,就会所系统的设置搞乱了。
;CreateFont的函数是创建新的字体,这个创建不是从零开始创建,只是使用电脑已经安装有的字体,从新设置字体的各项参数。
;SelectObject函数是把新创建的字体选入设备,就是在显示的时候使用这种字体。同时它的返回值,就是原来旧的字体,所以要保存起来。
;SetTextAlign、SetTextCharacterExtra、SetTextColor这三个函数我们看边上的解释就大概的明白它的意思。
;上面的例子创建了2种字体,产生了不同的效果。
;在新的设置使用完后,记得再次使用SelectObject函数,把原来旧的字体又设置回去。我们可以观察每次参数的不同,参数来自哪里。
;在恢复为原状后,要调用DeleteObject函数把原来创建的字体删除掉。

相关文章:

  • JVM类加载过程详解:从字节码到内存的蜕变之旅
  • 基于Flask的第七次人口普查数据分析系统的设计与实现
  • 国产编辑器EverEdit -告别东找西找!一键打开当前文件所在目录!
  • 字节最新AI 版IDE:用Trae开发网站打包信息追踪插件,国产版Cursor表现如何?
  • Python蓝桥杯刷题-小数第n位详解
  • 怎么使用DeepSeek?DeepSeek使用教程
  • DeepSeek(AI)如何赋能智能漏洞扫描与利用的思考
  • ComfyUI多功能插件安装-Comfy UI Manager
  • Docker 镜像操作笔记
  • 案例-17.文件上传-阿里云OSS-入门
  • git使用指南
  • 网络安全等级保护测评(等保测评):全面指南与准备要点
  • C语言基础18:函数的概述、分类、定义以及形参和实参
  • 【Leetcode 每日一题】624. 数组列表中的最大距离
  • Scrapy分布式爬虫系统
  • docker 镜像迁移到另一个服务器
  • android,flutter 混合开发,通信,传参
  • 【组态PLC】基于西门子s7-200和博图v16组态王16停车厂带烟雾报警【含PLC组态源码 M004期】
  • 一周学会Flask3 Python Web开发-http响应状态码
  • rtcwake - Linux下定时唤醒计算机
  • 深圳南澳码头工程环评将再次举行听证会,项目与珊瑚最近距离仅80米
  • 选址江南制造总局旧址,上海工业博物馆建设有新进展
  • 端午假期购票日历发布,今日可购买5月29日火车票
  • 习近平会见哥伦比亚总统佩特罗
  • 国家林草局原党组成员、副局长李春良接受审查调查
  • 超新星|罚丢点球的那道坎,刘诚宇靠自己迈了过去