win32汇编环境,对话框程序生成选项卡(属性页\标签)控件及运用

;运行效果

;win32汇编环境,对话框程序生成选项卡(属性页\标签)控件及运用
;主要是生成1个选项卡,同时准备好几个对话框,然后将对话框叠加到选项卡控件里面,在运行时点击哪一项时则显示对应的对话框。
;以下示例显示3个项的选项卡控件
;直接抄进RadAsm可编译运行。重要部分加备注。
;下面为asm文件
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
.386 
.model flat,stdcall 
option casemap:none 
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; Include 文件定义
include    windows.inc 
include    user32.inc 
include    kernel32.inc 
include       Comctl32.inc      ;添加所需的头文件

includelib user32.lib 
includelib kernel32.lib
includelib Comctl32.lib      ;添加所需的库文件
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 自定义函数声明
_ProcDlgMain proto :DWORD,:DWORD,:DWORD,:DWORD   ;对话框窗口函数
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 数据段
.data 
DlgName    db 'myDialog',0 
szA        db '选项卡一',0
szB        db '选项卡二',0
szC        db '选项卡三',0
szCption   db '提示',0
szA01      db '你点击了选项卡1的按钮',0
szB01      db '你点击了选项卡2的按钮',0
szC01      db '你点击了选项卡3的按钮',0
.data? 
hInstance HINSTANCE   ? 
hWinMain  dd          ?
hWinA     dd          ?
hWinB     dd          ?
hWinC     dd          ?
.const 
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; Equ 等值定义
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
ICO_MAIN    equ 1000    ;图标 
DIALOG_MAIN equ 1
IDC_TAB1    equ 2
DIALOG_A    equ 101
IDB01       equ 1011
DIALOG_B    equ 102
IDB02       equ 1021
DIALOG_C    equ 103
IDB03       equ 1031
; 代码段
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
.code 

_ProcDlgMain proc hWnd:HWND, uMsg:UINT, wParam:WPARAM, lParam:LPARAM 
        LOCAL   @Dlgx,@Dlgy
        .if      uMsg == WM_INITDIALOG                 
                        invoke    LoadIcon,hInstance,ICO_MAIN           
                        invoke    SendMessage,hWnd,WM_SETICON,ICON_BIG,eax
        .elseif    uMsg == WM_NOTIFY
            mov eax,dword ptr [lParam]
        mov eax,dword ptr [eax+8]                   ;获取NMHDR消息中的通知码
        .if    eax == TCN_SELCHANGE
            invoke ShowWindow,hWinA,SW_HIDE        ;先把全部对话框隐藏了
            invoke ShowWindow,hWinB,SW_HIDE
            invoke ShowWindow,hWinC,SW_HIDE
            
            invoke SendDlgItemMessage,hWinMain,IDC_TAB1,TCM_GETCURSEL,0,0
            .if    eax == 0                       ;当选择第1项时显示A对话框
                    invoke ShowWindow,hWinA,SW_SHOW
            .elseif    eax == 1                       ;当选择第2项时显示B对话框
                    invoke ShowWindow,hWinB,SW_SHOW
            .elseif    eax == 2                       ;当选择第3项时显示C对话框
                    invoke ShowWindow,hWinC,SW_SHOW                
            .endif
        .endif                                          
        .elseif uMsg == WM_CLOSE                 
                        invoke EndDialog, hWnd,NULL 
                        invoke PostQuitMessage,NULL        
        .else                
                mov eax,FALSE                 
                ret                 
        .endif                 
        mov eax,TRUE         
        ret 
_ProcDlgMain endp 
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
_ProcDlg_A    proc    uses edi esi ebx hWnd,uMsg,wParam,lParam
                    
    .if uMsg == WM_COMMAND                                                                
                mov eax,wParam
                .if eax == IDB01
                        invoke MessageBox,NULL,addr szA01,addr szCption,MB_OK
                .endif
    .else
        mov eax,FALSE
        ret
    .endif
    mov eax,TRUE
    ret
_ProcDlg_A endp
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
_ProcDlg_B    proc    uses edi esi ebx hWnd,uMsg,wParam,lParam

    .if uMsg == WM_COMMAND                                                                
                mov eax,wParam
                .if eax == IDB02
                        invoke MessageBox,NULL,addr szB01,addr szCption,MB_OK
                .endif
    .else
        mov eax,FALSE
        ret
    .endif
    mov eax,TRUE
    ret    
_ProcDlg_B endp
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
_ProcDlg_C    proc    uses edi esi ebx hWnd,uMsg,wParam,lParam

    .if uMsg == WM_COMMAND                                                                
                mov eax,wParam
                .if eax == IDB03
                        invoke MessageBox,NULL,addr szC01,addr szCption,MB_OK
                .endif
    .else
        mov eax,FALSE
        ret
    .endif
    mov eax,TRUE
    ret    
_ProcDlg_C endp    
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 
_WinMain    proc                ;初始化及主循环
    LOCAL    tie:TC_ITEM             ;指定或接收选项卡项的属性的结构
    LOCAL    @stMsg:MSG
    invoke GetModuleHandle,NULL
    mov hInstance,eax        ;获取本模块句柄
        
    invoke InitCommonControls       ;注册并初始化通用控件
    ;创建对话框
        
    invoke CreateDialogParam,hInstance,DIALOG_MAIN,NULL,offset _ProcDlgMain,NULL
    mov hWinMain,eax
    invoke CreateDialogParam,hInstance,DIALOG_A,hWinMain,offset _ProcDlg_A,NULL
    mov hWinA,eax
    invoke CreateDialogParam,hInstance,DIALOG_B,hWinMain,offset _ProcDlg_B,NULL
    mov hWinB,eax
        invoke CreateDialogParam,hInstance,DIALOG_C,hWinMain,offset _ProcDlg_C,NULL
    mov hWinC,eax                
    
    mov tie.imask,1                 ;1为指定其类型是字符串的,即可以写上本选项卡的名字
    lea eax,szA
    mov tie.pszText,eax
    invoke SendDlgItemMessage,hWinMain,IDC_TAB1,TCM_INSERTITEM,0,addr tie     
    lea eax,szB
    mov tie.pszText,eax
    invoke SendDlgItemMessage,hWinMain,IDC_TAB1,TCM_INSERTITEM,1,addr tie
    lea eax,szC
    mov tie.pszText,eax
    invoke SendDlgItemMessage,hWinMain,IDC_TAB1,TCM_INSERTITEM,2,addr tie
            
    ;初始化选中对话框为A对话框
    invoke SendDlgItemMessage,hInstance,IDC_TAB1,TCM_SETCURSEL,0,0
    invoke ShowWindow,hWinA,SW_SHOW
    invoke SetFocus,hWinA
        
    ;消息循环
    invoke ShowWindow,hWinMain,SW_SHOW
    .while    TRUE
        invoke GetMessage,addr @stMsg,NULL,0,0
    .break .if eax == 0
        invoke TranslateMessage,addr @stMsg
        invoke DispatchMessage,addr @stMsg
    .endw
    ret
_WinMain    endp
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>       
start:
    call _WinMain
    invoke ExitProcess,NULL
end start

;下面为rc文件内容
#include   "resource.h"              //提示缺少该文件,可以在资源里下载
#define    ICO_MAIN          1000    //图标  

#define    DIALOG_MAIN       1        //主对话框标识符
#define    IDC_TAB1          2        //选项卡控件标识符
#define    DIALOG_A          101     //对话框A标识符
#define    IDB01             1011    //对话框里的按钮标识符  
#define    DIALOG_B          102 
#define    IDB02             1021     
#define    DIALOG_C          103 
#define    IDB03             1031     

ICO_MAIN    ICON        "Main.ico"
//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
//定义主对话框
DIALOG_MAIN DIALOGEX 15,20,130,100
CAPTION "对话框模版"
FONT 10,"宋体",0,0,0
STYLE WS_POPUP|WS_VISIBLE|WS_CAPTION|WS_SYSMENU|DS_MODALFRAME | WS_MINIMIZEBOX 
BEGIN
CONTROL "",IDC_TAB1,"SysTabControl32",WS_CHILDWINDOW|WS_VISIBLE|WS_CLIPSIBLINGS,0,3,400,30      ;添加选项卡控件
END 
//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
//定义第1个对话框
DIALOG_A DIALOGEX 1,14,130,70
FONT 10,"宋体",0,0,0
STYLE WS_CHILDWINDOW
BEGIN
CONTROL "我在第1个选项卡里面",IDB01,"Button",WS_CHILDWINDOW|WS_VISIBLE,10,30,100,20
END
//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
//定义第2个对话框
DIALOG_B DIALOGEX 1,14,130,70
FONT 10,"宋体",0,0,0
STYLE WS_CHILDWINDOW
BEGIN
CONTROL "我在第2个选项卡里面",IDB02,"Button",WS_CHILDWINDOW|WS_VISIBLE,10,30,100,20
END
//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
//定义第3个对话框
DIALOG_C DIALOGEX 1,14,130,70
FONT 10,"宋体",0,0,0
STYLE WS_CHILDWINDOW
BEGIN
CONTROL "我在第3个选项卡里面",IDB03,"Button",WS_CHILDWINDOW|WS_VISIBLE,10,30,100,20
END
//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

一品人家

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

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

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

打赏作者

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

抵扣说明:

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

余额充值