;运行效果
;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
//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>