win32汇编环境,窗口程序中对多行编辑框的操作

devtools/2025/1/15 5:49:55/

;运行效果

;win32汇编环境,窗口程序中对多行编辑框的操作
;比如生成多行编辑框,显示文本、获取文本、设置滚动条、捕获超出文本长度消息等。
;直接抄进RadAsm可编译运行。重点部分加备注。
;下面为asm文件
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
.386 
.model flat,stdcall 
option casemap:none 
include      windows.inc 
include      user32.inc 
include      kernel32.inc
include      gdi32.inc

includelib   user32.lib           
includelib   gdi32.lib 
includelib   kernel32.lib 
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
WinMain proto :DWORD,:DWORD,:DWORD,:DWORD       
                                                
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
.DATA                                   
ClassName   db "SimpleWinClass",0        
AppName     db "窗口程序的模版",0  
      
szButtonClassName   db "button",0              ;按钮类名
szEditClassName     db "edit",0                ;编辑框类名

szTitle             db "提示",0 
szEditTitle01       db "我只能输入数字的",0 

szCheshi_Format01   db "文本的长度是 %d",0
szCheshi_Format02   db "超过允许输入的文本长度了",0

szButtonTitle01     db "得到第1个编辑框的文字",0 
szButtonTitle02     db "得到第1个编辑框的文字长度",0 
.DATA?                                  
hInstance HINSTANCE  ?                
CommandLine LPSTR    ?  

hID_EDIT01  dd ?        ;编辑框控件句柄

hIDB01      dd ?        ;按钮控件句柄
hIDB02      dd ?  
          
.const
; Equ 等值定义;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
ID_EDIT01  equ 11        ;编辑框控件标识符
IDB01      equ 21        ;按钮控件标识符
IDB02      equ 22  
  
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
.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_CAPTION or WS_SYSMENU or WS_MINIMIZEBOX,100,100,300,320, 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   @DEFAULT_GUI_FONT,@OLD_DEFAULT_GUI_FONT
        LOCAL   @szBuffer[1024]:byte
        LOCAL   @szBuffer01[1024]:byte
        
        .if uMsg == WM_CREATE
                 invoke CreateWindowEx,NULL,ADDR szEditClassName,ADDR szEditTitle01, WS_BORDER or WS_CHILDWINDOW or WS_VISIBLE or \
                 ES_MULTILINE or ES_WANTRETURN or ES_AUTOVSCROLL or WS_VSCROLL or WS_HSCROLL ,20,20,250,150,hWnd,ID_EDIT01,NULL,NULL                                              
                 mov hID_EDIT01,eax   
                 
                 invoke CreateWindowEx,NULL,ADDR szButtonClassName,ADDR szButtonTitle01, WS_TABSTOP OR  WS_VISIBLE OR WS_CHILD OR BS_DEFPUSHBUTTON  ,20,200,250,25,hWnd,IDB01,NULL,NULL        ;创建按钮控件                 
                 mov hIDB01,eax                
                 invoke CreateWindowEx,NULL,ADDR szButtonClassName,ADDR szButtonTitle02, WS_TABSTOP OR  WS_VISIBLE OR WS_CHILD OR BS_DEFPUSHBUTTON  ,20,240,250,25,hWnd,IDB02,NULL,NULL                       
                 mov hIDB02,eax  
                 
                 invoke  GetStockObject,DEFAULT_GUI_FONT                                           ;调用GetStockObject函数,得到系统默认字体                
                 mov @DEFAULT_GUI_FONT,eax                              
                 invoke  SendMessage,hID_EDIT01,WM_SETFONT,@DEFAULT_GUI_FONT,TRUE                  ;发送WM_SETFONT消息,设置编辑框控件的字体                             
              
                 invoke  SendMessage,hIDB01,WM_SETFONT,@DEFAULT_GUI_FONT,TRUE                
                 invoke  SendMessage,hIDB02,WM_SETFONT,@DEFAULT_GUI_FONT,TRUE                              
                 invoke  DeleteObject,@DEFAULT_GUI_FONT                                            ;删除本程序新建的字体
                 
                 invoke  SendMessage,hID_EDIT01,EM_SETLIMITTEXT,1024,NULL                          ;设定编辑框最多只能1024个字符            
        .elseif uMsg == WM_COMMAND                                
                 mov eax,wParam                 
                 .if lParam == 0                                                                          
                 .else                         
                          mov edx,wParam                                                                                 
                          shr edx,16                                                                         
                          .if dx == BN_CLICKED                                              
                                   .if ax == IDB01                                        
                                            invoke GetDlgItemText,hWnd,ID_EDIT01,addr @szBuffer,sizeof @szBuffer   ;得到编辑框内的文本                                                                           
                                            invoke MessageBox,hWnd,addr @szBuffer,addr szTitle,MB_OK or MB_ICONINFORMATION                                 
                                   .elseif ax == IDB02                                        
                                            invoke GetDlgItem,hWnd,ID_EDIT01                                        
                                            invoke GetWindowTextLength,eax                                                                                
                                            invoke wsprintf,addr @szBuffer,addr szCheshi_Format01,eax                                                             
                                            invoke MessageBox,hWnd,addr @szBuffer,addr szTitle,MB_OK or MB_ICONINFORMATION                                  
                                   .endif                         
                          .elseif dx == EN_MAXTEXT                                       ;超过可输入的文本长度时,即超过上面设定的1024字符时,则                                
                                   .if ax == ID_EDIT01                                    
                                            invoke MessageBox,hWnd,addr szCheshi_Format02,addr szTitle,MB_OK or MB_ICONINFORMATION                                
                                   .endif                                 
                          .endif                 
                 .endif   

        .elseif uMsg == WM_DESTROY                                           
                invoke PostQuitMessage,NULL                               
        .else 
                invoke DefWindowProc,hWnd,uMsg,wParam,lParam             
        ret 
    .endif 
    xor eax,eax 
    ret 
WndProc endp 
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
end start                                                      


http://www.ppmy.cn/devtools/150596.html

相关文章

【Pandas】pandas Series rtruediv

Pandas2.2 Series Binary operator functions 方法描述Series.add()用于对两个 Series 进行逐元素加法运算Series.sub()用于对两个 Series 进行逐元素减法运算Series.mul()用于对两个 Series 进行逐元素乘法运算Series.div()用于对两个 Series 进行逐元素除法运算Series.true…

Git 的基本概念

Git 是一种分布式版本控制系统,用于跟踪文件的修改历史和协同多人开发。 Git 的基本概念包括: 仓库(Repository):存储项目文件的地方。分支(Branch):用于同时进行多个任务或开发多…

房建工程项目管理软件提升效率的关键工具

在当今快速发展的建筑业中,房建工程项目的管理变得日益复杂。益企工程云作为一款顶级的工程项目管理软件,通过其全面且强大的功能,显著提升了项目管理的效率和质量。本文将探讨益企工程云如何在房建工程项目中发挥关键作用,助力企…

《淘宝买家秀 API 爬虫:Java 实现与数据解析》

在电商领域,买家秀作为商品评价的重要组成部分,对于消费者决策和商家运营都有着不可忽视的价值。淘宝作为国内领先的电商平台,其买家秀数据丰富且具有高度的参考价值。本文将详细介绍如何使用 Java 爬虫技术获取淘宝买家秀 API 的返回值&…

2025网络架构

一、园区网络概述。 园区网络典型层次和区域: 核心层:是园区网骨干,是园区数据交换的核心,联接园区网的各个组成部分,如数据中心、管理中心、园区出口等。汇聚层:处于园区网的中间层次,完成数据…

Pycharm连接远程解释器

这里写目录标题 0 前言1 给项目添加解释器2 通过SSH连接3 找到远程服务器的torch环境所对应的python路径,并设置同步映射(1)配置服务器的系统环境(2)配置服务器的conda环境 4 进入到程序入口(main.py&#…

c++ haru生成pdf输出文本实例

haru是一个开源的生成pdf的库,花时间终于编译成功,以下是一个特别简单的写文本的实例: #include "hpdf.h" void CDemoDlg::OnBnClickedOk() { HPDF_Error_Handler error_handler NULL; HPDF_Doc pdf; pdf HPDF_New(…

代码随想录算法训练营第三十天-贪心算法-763. 划分字母区间

标记字符最远位置,这是人能想到的?定义一个26个字母的数组,下标表示字母的位置,数组值表示当前字母在字符串中遍历过程中所处的位置算法题目无厘头太多,但解法也是太精彩,可是根本记不住,要每日…