⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 win32asm可视化编程.txt

📁 会变语言实现的一些程序
💻 TXT
📖 第 1 页 / 共 2 页
字号:

   对比那些高极编程语言,ASM算是比较复杂的,也因此吓跑了不少新手,在我的这篇文章中我将尽量

避开这个,以通俗易懂类VC的编程方法解决这个问题,当然我还是建议大家看一下完全用API建一个窗

口的方法参考一下"汇编全接触"里的Iczelion的Win32汇编教程,里面有详细的资料,我将在这里告诉

大家怎样用资源文件结合RadAsm实现可视化编程,下面让我们来了解下资源文件:

Windows 的资源文件
  
  不管在Dos下编程还是在Windows下编程,我们总是要用到除了可执行文件外的很多其他数据,

如声音数据,图形数据,文本等等,在Dos下编程,我们可以自己定义这些文件的格式,但这样一来

就造成了很多资源共享的问题,大家可能还记的Dos下的很多游戏,它们的图形都是按自己的格式存

放的,你无法用标准的看图软件来看。也无法把它另存为其他格式。虽然在Win32编程中,我们仍然

可以这样做,但Win32编程给了我们一个方案 ---- 就是格式统一的资源文件,把字符串、图形、对

话框包括上面的按钮,文本等定义到一个资源文件中,就可以方便的在不同的文件中使用它,最重

要的是,如果我们用自己的文件格式,使用时就要涉及到这些文件的读写操作,比较复杂,但使用

资源文件时,Windows提供了一系列的API来装入资源。非常方便。

......


在程序中使用资源

    在程序中,要使用资源之前必须先装如内存,Windows定义了一系列的API来装入资源,如 

LoadMenu,LoadString,LoadBitmap 等等,);  这些Load函数的返回值是一个句柄,调用参数中一

般至少为两项: hInstance 和ResouceName,这个 ResouceName(如BitmapName,MenuName)就是在资

源文件中的 #define 指定的值,如果你用 #define MY_ICON 10/ MY_ICON ICON "Main.ico" 定义

了一个图标,那么在程序中要使用 Main.ico 图标就可以用 LoadIcon(hInstance,10) 来装入已经

定义为10号的图标文件。另一个参数 hInstance 是执行文件的句柄,它对应资源所在的文件名,你

可以在程序开始执行时用 invoke GetModuleHandle,NULL 获得 hInstance。另外一些资源并不是显

式地装入的,如对话框资源,它是在建立对话框的函数中由Windows自己装入的,如下面例子中的

 invoke DialogBoxParam,hInstance,DLG_MAIN,NULL,offset _ProcDlgMain,0 ,是在屏幕上显示一

个资源文件中已经定义好了的对话框,就并不存在 LoadDialogBox 之类的API来先装入对话框

介绍了这么多相关的东西,现在让我们来进入正题:


1.打开第一节练习的工程,方法是:文件-打开,选择"D:\RadASM\Masm\Projects\MyBox\MyBox.rap",

 如果已经没有了,请新建一个!

2.再随后出现的右栏中双击*.Asm(MyBox.Asm),把下面的代码覆盖到里面:

代码:
    

;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
;  Programmed by hacker0058, nohacks@nohacks@126.com
;  Website: http://nohacks.ys168.com
;             第一个窗口程序
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
 

.486 
.model flat,stdcall 
option casemap:none 

;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
;        Include 数据
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
include windows.inc 
include kernel32.inc 
include shell32.inc
includelib kernel32.lib 
include user32.inc 
includelib user32.lib 
includelib shell32.lib

;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
;        Equ 数据 RC资源
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>


DLG_MAIN        equ             1000

.data 


.data?
hInstance HINSTANCE ?  

.code 

;********************************************************************
_ProcDlgMain        proc        uses ebx edi esi, \
                hWnd:DWORD,wMsg:DWORD,wParam:DWORD,lParam:DWORD

            mov eax,wMsg
    
        cmp eax,WM_CLOSE         ;对话框关闭时
        je  boxClose
        cmp eax,WM_INITDIALOG    ;对话框初始化时
        je  boxStart
        cmp eax,WM_COMMAND      ;按下对话框上的按钮时
        je commoand
   
   retFalse:
           mov        eax,FALSE
           ret    
                  
   boxClose:
          invoke EndDialog,hWnd,NULL
          jmp retTrue
          
   boxStart:
                       
              jmp retTrue
                   
   commoand:
           mov eax,wParam
        
          ;代码
            
     retTrue:
        
           mov        eax,TRUE
           ret        

_ProcDlgMain        endp

;********************************************************************

start:
  invoke GetModuleHandle,NULL
  mov hInstance,eax
  invoke DialogBoxParam,eax,DLG_MAIN,NULL,offset _ProcDlgMain,0   ;显示对话框
  invoke ExitProcess,NULL

;********************************************************************

end        start

3.在右栏中选择"MyBox.Asm",然后单击右键,新建→对话框,接着会弹出一个"添加新对话框"的对话

  框,随便输入一个文件名(如:dlg),点保存,就到了对话框修改界面,如图:

4.你可以给对话框改个名字,方法是:右下角属性里的"caption"项,如:"我的第一个窗口程序"

  当然改完后别忘了"回车"保存!

最后,构建→构建并运行,是不是看到了一个标题为"我的第一个窗口程序"的窗口程序,如图:


下面我们就重点来讲解一下:


        DLG_MAIN        equ             1000
  
  定以资源文件,其中1000是对话框属性里的ID,前面的"DLG_MAIN"可以随便取个名字,只要不违反

MASM的命名规则就行

   _ProcDlgMain        proc        uses ebx edi esi, \

   proc 的语句应该是不陌生的,要重复讲解一下的是 uses 和 下面的参数,uses 下的寄存器表

示要编译器自动插入保存及恢复这些寄存器的指令,\ 是在 Masm32 中接下一行的符号,表示下一

行是本行的继续内容,以避免一行中的内容过长。下面的 hWnd:DWORD 等语句定义了调用这个子程

序的参数,如果有以下定义 MyProc proc dwPara1:DWORD,dwPara2:DWORD,dwPara3:DWORD,然后你

用 invoke MyProc 1,2,3 来调用它,那么,1,2,3 将分别被赋值给 dwPara1,dwPara2,dwPara3,你

可以在子程序中使用这些传递过来的参数。如果参数的类型是双字,那么:DWORD可以省略 

    最后要讲到的就是 DialogBoxParam 这个API了,在Windows中,所有的窗口都要指定一个子程

序,当Windows检测到鼠标、定时器等和这个窗口有关的动作时,它回调用这个子程序,这就是

Windows基于消息的体系的最基本的概念,换句话说,在Dos下,我们通过INT指令调用系统,而在

Windows 下,有很多时候是你指定子程序地址让Windows来调用你。

    invoke DialogBoxParam,hInstance,DLG_MAIN,NULL,offset 

  _ProcDlgMain,0中的 offset _ProcDlgMain 就指定了如果有消息发生,Windows就来执行这个

子程序,参数中的 DLG_MAIN 就是在资源文件中定义的对话框模板ID。 hInstance 是对话框所在的

资源文件的句柄。
    
  另外,在_ProcDlgMain 子程序中,Windows传给我们4个参数hWnd,wMsg,wParam,lParam,其

中,hWnd是对话框的窗口句柄,wMsg表示现在发生的消息事件,如这个对话框初始化时Windows会以

WM_INITDIALOG为消息调用,关闭时为WM_CLOSE,按下对话框上的按钮时为WM_COMMAND等,wParam和

lParam是附加的参数,对应不同的消息对应不同定义,具体可以参考:

   Win32Programmer'sreference。


课后练习:   


根据下面的提示写一个"QQ任我聊"程序,下次再见时我会仔细讲解:


   >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
;        Equ 数据 RC资源
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>


DLG_MAIN        equ             1000
IDC_EDT         equ             1001         ;编辑框
IDC_IDOK        equ             1002         ;按纽
QQ_N            equ             12           ;设置QQ号的最大位数

;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

.data 

temp db "tencent://message/?uin=",'%s',"&Site=im.qq.com&Menu=yes",0


.data?
posBuffer  db 50+QQ_N dup (?)
qqtemp db QQ_N dup (?)
hInstance HINSTANCE ?  


 invoke GetDlgItemText,hWnd,IDC_EDT ,addr qqtemp,QQ_N  ;取用户输入到文本
                             
  invoke wsprintf,addr posBuffer,addr temp,addr qqtemp ;连接文本串
                                
  invoke ShellExecute,NULL,NULL,addr posBuffer,NULL,NULL,SW_HIDE  ;执行IE命令


要求:程序有一个编辑框,一个按纽,在编辑框里输入任意QQ号可以打开对应的QQ临时对话框

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -