win32汇编环境,对话框中使用IP地址控件示例

;运行效果

;win32汇编环境,对话框中使用IP地址控件示例
;演示了如何设置IP控件的IP地址,取得IP控件的地址值的操作,并解释了其原理
;也可以使用编辑框控件代替,但是需要写更多的东西,比如需要输入数值是否超255,但IP地址控件不用,它已经封装了这些自检功能
;直接抄进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 
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 自定义函数声明
DlgProc proto :DWORD,:DWORD,:DWORD,:DWORD   ;对话框窗口函数
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

;Equ 等值定义

ICO_MAIN       equ 1000    ;图标 
IDC_IPA1       equ 1001

ID_BUTTON01    equ 41

;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 数据段
.data 
DlgName    db "MyDialog",0 
szMsg      db "提示",0
szFMR      db "取得的IP地址是 %d.%d.%d.%d",0

.data? 
hInstance HINSTANCE  ? 
hW_IP     HWND       ?        ;IP地址控件的句柄
nGetIP    dd         ?        ;存放从IP地址控件取得的值的指针   
.const 
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
 
; 代码段
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
.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 @szBuffer[256]:byte
        LOCAL @IP_addr1,@IP_addr2,@IP_addr3,@IP_addr4
       
        .if      uMsg == WM_INITDIALOG                 
                        invoke    LoadIcon,hInstance,ICO_MAIN           
                        invoke    SendMessage,hWnd,WM_SETICON,ICON_BIG,eax 

                        invoke GetDlgItem,hWnd,IDC_IPA1              ;得到IP地址控件的句柄
                        mov hW_IP,eax
                        
                        ;IP地址控件内的值,是1个32位的数。其中每8位占一个值,最高的字节为IP地址的开头值,最低的字节为结束值。以下面的IP地址:192.168.1.1为例。
                        ;先把低2个字节的值即192和168赋值,然后用 shl 指令往左移位16位,就是占了高2位字节的位置,再把IP地址的后面两个值给它加上
                        mov ah,192
                        mov al,168
                        shl eax,16
                        mov ah,1
                        mov al,1
                        invoke SendMessage,hW_IP,IPM_SETADDRESS,0,eax    ;初始化设置控件里的IP地址值

        .elseif uMsg==WM_COMMAND                         
                mov eax,wParam                         
                .if eax == ID_BUTTON01   
                        ;以下是如何取得IP控件的地址值,IPM_GETADDRESS消息是取得地址值,但是它会放在一个所指向的DOWRD值的指针里。下面的 nGetIP 得到的值是一个指针,是一个指向某个DWORD的值的指针,并不是IP地址值,这个DWORD的值才是IP地址值
                        ;所以要通过这个指针得到IP地址值的每个字段的数值
                        ;就是说,这个nGetIP指向的内存地址里,有一个4字节的值,这个值就是IP控件的地址值
                        ;然后,我们按字节取出值,比如这里的示例192.168.1.1,左边的是高字节,右边的是低字节
                        
                        invoke SendMessage,hW_IP,IPM_GETADDRESS,0,offset nGetIP    ;取出IP地址控件里的值的指针,并把这个指针值放在nGetIP里
                        mov bl,byte ptr [nGetIP+3]         ;取出192这个值
                        movzx ebx,bl                       ;把ebx里面除了bl的值外都置0,因为不清楚bl前面的值是什么
                        mov @IP_addr1,ebx
                        
                        mov bl,byte ptr [nGetIP+2]         ;取出168这个值,后面以此类推
                        movzx ebx,bl
                        mov @IP_addr2,ebx
                        
                        mov bl,byte ptr [nGetIP+1]
                        movzx ebx,bl
                        mov @IP_addr3,ebx
                        
                        mov bl,byte ptr [nGetIP]
                        movzx ebx,bl
                        mov @IP_addr4,ebx
                                                
                        invoke wsprintf,addr @szBuffer,addr szFMR, @IP_addr1,@IP_addr2,@IP_addr3,@IP_addr4
                        invoke MessageBox,NULL,addr @szBuffer,addr szMsg,MB_OK                                                           
                .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_IPA1        1001

#define    ID_BUTTON01     41

//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
ICO_MAIN    ICON        "Main.ico"

//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

//定义对话框
MyDialog DIALOG 10, 10, 180, 100 
STYLE  DS_CENTER | WS_CAPTION | WS_MINIMIZEBOX | WS_SYSMENU | WS_VISIBLE | WS_OVERLAPPED | DS_MODALFRAME | DS_3DLOOK 
CAPTION "对话框程序模版"
FONT 12, "方正姚体"
BEGIN
     CONTROL "IP地址控件示例:", -1, "Static", WS_CHILD | WS_VISIBLE, 20, 25, 100, 20 
     CONTROL "",IDC_IPA1,"SysIPAddress32",WS_CHILDWINDOW|WS_VISIBLE|WS_TABSTOP,85,25,70,10
     
     PUSHBUTTON      "取得IP地址", ID_BUTTON01,  40,50,100,15 
END 

//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一品人家

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值