|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
.386
.model flat,stdcall
option casemap:none
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; Include 文件定义
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
include windows.inc
include gdi32.inc
includelib gdi32.lib
include user32.inc
includelib user32.lib
include kernel32.inc
includelib kernel32.lib
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; EQU等值定义
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
ICO_MAIN equ 1000h ;图标资源
DLG_MAIN equ 1 ;对话框资源
IDB_1 equ 1 ;BMP1图片资源
IDB_2 equ 2 ;BMP2图片资源
IDC_ONTOP equ 101 ;命令:总在最前面复选框
IDC_SHOWBMP equ 102 ;命令:显示图片复选框
IDC_ALOW equ 103 ;命令:允许更换图标复选框
IDC_MODALFRAME equ 104 ;命令:模态风格单选钮
IDC_THICKFRAME equ 105 ;命令:可变风格单选钮
IDC_TITLETEXT equ 106 ;组合框:标题文本
IDC_CUSTOMTEXT equ 107
IDC_BMP equ 108
IDC_SCROLL equ 109
IDC_VALUE equ 110
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 数据段
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
.data?
hInstance dd ?
hBmp1 dd ?
hBmp2 dd ?
dwPos dd ?
.const
szText1 db 'Hello,World!',0
szText2 db '嘿,你看到标题栏变了吗?',0
szText3 db '碉堡了!',0
szText4 db '自定义',0
szText5 db '输入标题栏文字',0
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 代码段
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
.code
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 对话框过程
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
_ProcDlgMain proc uses ebx edi esi hWnd,wMsg,wParam,lParam ;对话框过程开始
LOCAL @szBuffer[128]:byte
mov eax,wMsg
;******************************************************************************
.if eax == WM_CLOSE ;处理关闭消息
invoke EndDialog,hWnd,NULL ;该函数清除一个模态对话框,并使系统中止对对话框的任何处理.
invoke DeleteObject,hBmp1 ;释放图像1
;函数功能:该函数删除一个逻辑笔,画笔,字体,位图,区域或者调色板
;释放所有与该对象有关的系统资源,在对象被删除之后,指定的句柄也就失效了
invoke DeleteObject,hBmp2 ;释放图像2
;******************************************************************************
.elseif eax == WM_INITDIALOG ;处理窗口初始化代码
;******************************************************************************
; 设置标题栏图标
;******************************************************************************
invoke LoadIcon,hInstance,ICO_MAIN
invoke SendMessage,hWnd,WM_SETICON,ICON_BIG,eax
;******************************************************************************
; 初始化组合框
;******************************************************************************
invoke SendDlgItemMessage,hWnd,IDC_TITLETEXT,CB_ADDSTRING,0,addr szText1
;发送消息到子窗口控件,CB_ADDSTRING:把一个字符串添加到列表中
invoke SendDlgItemMessage,hWnd,IDC_TITLETEXT,CB_ADDSTRING,0,addr szText2
;wParam:0、lParam:字符串地址
invoke SendDlgItemMessage,hWnd,IDC_TITLETEXT,CB_ADDSTRING,0,addr szText3
invoke SendDlgItemMessage,hWnd,IDC_TITLETEXT,CB_ADDSTRING,0,addr szText4
invoke SendDlgItemMessage,hWnd,IDC_TITLETEXT,CB_ADDSTRING,0,addr szText5
invoke SendDlgItemMessage,hWnd,IDC_TITLETEXT,CB_SETCURSEL,0,0
;设置组合框初始显示第几个文本信息
invoke GetDlgItem,hWnd,IDC_CUSTOMTEXT ;该函数通过对话框句柄和菜单ID获取子窗口句柄
invoke EnableWindow,eax,FALSE ;该函数允许/禁止指定的窗口或控制接受鼠标和键盘的输
;将自定义框禁止
invoke LoadBitmap,hInstance,IDB_1 ;加载bmp格式图片1
mov hBmp1,eax
invoke LoadBitmap,hInstance,IDB_2 ;加载bmp格式图片2
mov hBmp2,eax
invoke SendDlgItemMessage,hWnd,IDC_CUSTOMTEXT,EM_LIMITTEXT,16,0
;******************************************************************************
; 初始化单选钮和复选框
;******************************************************************************
invoke CheckDlgButton,hWnd,IDC_ONTOP,BST_CHECKED
;invoke CheckDlgButton,hWnd,IDC_SHOWBMP,BST_UNCHECKED ;该函数_BM改变按钮控制的选中状态
invoke GetDlgItem,hWnd,IDC_BMP
invoke ShowWindow,eax,SW_HIDE ;方法1:隐藏窗口
;invoke SetWindowLong,eax,GWL_STYLE,WS_DISABLED 测试失败 ;方法2:改变窗口类的属性
;BST_UNCHECKED:设置按钮为未选中状态,BHEST_CCKED:设置按钮状态为己选中
;只有在该按钮具有BS_3STATE或BS_AUTO3STATE样式时才能使用该值
;invoke CheckDlgButton,hWnd,IDC_THICKFRAME,BST_CHECKED ;BST_INDETERMINATE:设置按钮状态变灰,表示不确定状态
invoke CheckDlgButton,hWnd,IDC_MODALFRAME,BST_CHECKED
invoke GetWindowLong,hWnd,GWL_STYLE
and eax,not WS_THICKFRAME
invoke SetWindowLong,hWnd,GWL_STYLE,eax
;******************************************************************************
; 初始化滚动条
;******************************************************************************
invoke SendDlgItemMessage,hWnd,IDC_SCROLL,SBM_SETRANGE,0,30 ;设置滚动条菜单的限度为0~100
invoke SetWindowPos,hWnd,HWND_TOPMOST,0,0,0,0,SWP_NOMOVE or SWP_NOSIZE
;******************************************************************************
.elseif eax == WM_COMMAND ;处理菜单ID命令
mov eax,wParam
.if ax == IDCANCEL
invoke EndDialog,hWnd,NULL ;该函数清除一个模态对话框,并使系统中止对对话框的任何处理.
;--------------------------------------------------------------------------------
invoke DeleteObject,hBmp1 ;释放图像控件
invoke DeleteObject,hBmp2 ;释放图像控件
;******************************************************************************
; 更换图片
;******************************************************************************
.elseif ax == IDOK
mov eax,hBmp1 ;hBmp1和hBmp2中的图片句柄互换
xchg eax,hBmp2 ;数据交换指令:XCHG
mov hBmp1,eax ;修改图片显示
invoke SendDlgItemMessage,hWnd,IDC_BMP,STM_SETIMAGE,IMAGE_BITMAP,eax
;******************************************************************************
; 设置是否“总在最前”
;******************************************************************************
.elseif ax == IDC_ONTOP
invoke IsDlgButtonChecked,hWnd,IDC_ONTOP ;该函数可以确定某个按钮控制是否有选中标志
.if eax == BST_CHECKED ;BST_CHECKED:表示按钮被选中
;SetWindowPos该函数改变一个子窗口,弹出式窗口式顶层窗口的尺寸
;位置和顺序.子窗口,弹出式窗口,及顶层窗口根据它们在屏幕上出现的顺序排序
;顶层窗口设置的级别最高,并且被设置为顺序的第一个窗口
invoke SetWindowPos,hWnd,HWND_TOPMOST,0,0,0,0,SWP_NOMOVE or SWP_NOSIZE
;HWND_TOPMOST:将窗口置于所有非顶层窗口之上,即使窗口未被激活窗口也将保持顶级位置
.elseif
;SWP_NOMOVE:维持当前位置(忽略X和Y参数)
;SWP_NOSIZE:维持当前尺寸(忽略cx和Cy参数)
invoke SetWindowPos,hWnd,HWND_NOTOPMOST,0,0,0,0,SWP_NOMOVE or SWP_NOSIZE
;HWND_NOTOPMOST:不将窗口置于所有非顶层窗口之上
.endif
;******************************************************************************
; 演示隐藏和显示图片
;******************************************************************************
.elseif ax == IDC_SHOWBMP
invoke GetDlgItem,hWnd,IDC_BMP
mov ebx,eax
invoke IsWindowVisible,ebx
;IsWindowVisible函数功能:该函数获得给定窗口的可视状态
;备注:窗口的可视状态由WS_VISIBLE位指示。当设置了WS_VISIBLE位,
;窗口就可显示,而且只要窗口具有WS_VISIBLE风格,任何画在窗口的信息都将被显示
.if eax
;返回值:如果指定的窗口及其父窗口具有WS_VISIBLE风格,返回值为TRUE
;如果指定的窗口及其父窗口不具有WS_VISIBLE风格,返回值为FALSE
;由于返回值表明了窗口是否具有Ws_VISIBLE风格,因此,即使该窗口被其他窗口遮盖,函数返回值也为TRUE
invoke ShowWindow,ebx,SW_HIDE
;函数功能:该函数设置指定窗口的显示状态
.else
invoke ShowWindow,ebx,SW_SHOW
;SW_SHOW:显示该窗口尺寸大小不变、SW_HIDE:隐藏该窗口并使另一个窗口活动
.endif
;******************************************************************************
; 演示允许和灰化“更换图片”按钮
;******************************************************************************
.elseif ax == IDC_ALOW
invoke IsDlgButtonChecked,hWnd,IDC_ALOW ;检测按钮状态
.if eax == BST_CHECKED ;如果按下则是TRUE,未按则是0
mov ebx,TRUE
.else
xor ebx,ebx
.endif
invoke GetDlgItem,hWnd,IDOK ;获取对话框资源IDOC按钮的句柄
invoke EnableWindow,eax,ebx ;该函数激活/禁止指定的窗口或控制接受鼠标和键盘的输
;******************************************************************************
; 演示模态和非模态切换
;******************************************************************************
.elseif ax == IDC_MODALFRAME ;资源文件里面的 模态边框命令ID
invoke GetWindowLong,hWnd,GWL_STYLE ;GWL_STYLE:获得窗口风格
and eax,not WS_THICKFRAME ;去掉WS_THICKFRAME风格标志
;not指令:非、将二进制对调
;当eax里面的值存在WS_THICKFRAME时,结果为假,抵消为NULL,应该还存在别的风格
invoke SetWindowLong,hWnd,GWL_STYLE,eax ;函数功能:设置窗口长整形32位属性
.elseif ax == IDC_THICKFRAME ;资源文件里面的 非模态边框命令ID
invoke GetWindowLong,hWnd,GWL_STYLE
or eax,WS_THICKFRAME ;增加WS_THICKFRAME风格标志
invoke SetWindowLong,hWnd,GWL_STYLE,eax
;******************************************************************************
; 演示处理下拉式组合框
;******************************************************************************
.elseif ax == IDC_TITLETEXT ;处理组合框通知码(高16位)
shr eax,16 ;高16位往下移动到低16位
;******************************************************************************
.if ax == CBN_SELENDOK ;
;CB_GETCURSEL:获取当前完成选中的位置索引,没有选中则返回CB_ERR
invoke SendDlgItemMessage,hWnd,IDC_TITLETEXT,CB_GETCURSEL,0,0
.if eax == 4 ;索引值4为自定义输入
invoke GetDlgItem,hWnd,IDC_CUSTOMTEXT
invoke EnableWindow,eax,TRUE ;允许鼠标键盘输入
.else ;其他索引值则把文本框的字符串设置到窗口标题
mov ebx,eax
;获取指定列表项目的字符串到缓冲区
;wParam:索引值、lParam:字符串缓冲区
invoke SendDlgItemMessage,hWnd,IDC_TITLETEXT,CB_GETLBTEXT,ebx,addr @szBuffer
invoke SetWindowText,hWnd,addr @szBuffer
;SetWindowText:设置窗口标题
invoke GetDlgItem,hWnd,IDC_CUSTOMTEXT ;获取自定义框的句柄
invoke EnableWindow,eax,FALSE ;禁止鼠标键盘输入
.endif
.endif
;******************************************************************************
; 在文本框中输入文字
;******************************************************************************
.elseif ax == IDC_CUSTOMTEXT
invoke GetDlgItemText,hWnd,IDC_CUSTOMTEXT,addr @szBuffer,sizeof @szBuffer
;SetWindowText:获取对话框子窗口控件ID,缓冲区,最大大小
invoke SetWindowText,hWnd,addr @szBuffer
;SetWindowText:提取缓冲区字符串到设置窗口标题
.endif
;******************************************************************************
; 处理滚动消息代码
;******************************************************************************
.elseif eax == WM_HSCROLL ;处理滚动条代码
mov eax,wParam
;lParam :滚动条控件的窗口句柄
;wParam高16位nPos :滚动条当前位置
;wParam低16位nScrollCode :动作吗
.if ax == SB_LINELEFT ;滚动条左移了一格(对于水平滚动条)
dec dwPos ;减1
.elseif ax == SB_LINERIGHT ;滚动条右移了一格(对于水平滚动条)
inc dwPos ;加1
.elseif ax == SB_PAGELEFT ;滚动条左移了一页(对于水平滚动条)
sub dwPos,5 ;减10
.elseif ax == SB_PAGERIGHT ;滚动条右移了一页(对于水平滚动条)
add dwPos,5 ;加10
.elseif ax == SB_THUMBPOSITION || ax == SB_THUMBTRACK ;逻辑或:有一项为真则全为真
;SB_THUMBPOSITION :滚动条被拖动到某处
;SB_THUMBTRACK :滚动条在拖动中
mov eax,wParam ;将滚动条当前位置存储至dePos中
shr eax,16
mov dwPos,eax
.else
mov eax,TRUE
ret
.endif
cmp dwPos,0
;cmp指令:对标志位的影响同SUB指令,完成的操作与SUB指令类似,唯一的区别是不将
;OPRD1-OPRD2的结果送回OPRD1,而只是比较.因而不改变OPRD1和OPRD2的内容
;该指令用于改变标志位
jge @F
;格式: JGE/JNL标号 功能: 大于等于/不小于时转移
mov dwPos,0 ;如果小于0则置为0
@@:
cmp dwPos,30
jle @F
; 格式: JLE/JNG 标号 功能: 小于等于/不大于时转移
mov dwPos,30 ;如果大于30则置为30
@@:
invoke SetDlgItemInt,hWnd,IDC_VALUE,dwPos,FALSE ;IDC_VALUE:滚动条的数字显示
;SetDlgItemInt :函数将uValue的值设为对话框控件的文本
;hDlg :指向对话框窗口的句柄
;nIDDlgItem :要改变其文本的控件ID
;uValue :指向要设置的值
;bSigned :指定uValue是否为一个有符号值
invoke SendDlgItemMessage,hWnd,IDC_SCROLL,SBM_SETPOS,dwPos,TRUE
;SBM_SETPOS :设置滚动条新位置
;TRUE :表示需要重绘滚动条
;******************************************************************************
.else
mov eax,FALSE
ret
.endif
mov eax,TRUE
ret
_ProcDlgMain endp ;对话框过程结束
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
start:
invoke GetModuleHandle,NULL
mov hInstance,eax
invoke DialogBoxParam,hInstance,DLG_MAIN,NULL,offset _ProcDlgMain,NULL ;调用模态对话框
invoke ExitProcess,NULL ;退出程序
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
end start ;程序从start开始执行
=======================================================================
RC文件
#include <resource.h>
//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
#define ICO_MAIN 0x1000 //图标
#define DLG_MAIN 1
#define IDB_1 1
#define IDB_2 2
#define IDC_ONTOP 101 //窗口最顶层
#define IDC_SHOWBMP 102 //显示图片
#define IDC_ALOW 103 //允许更换图片
#define IDC_MODALFRAME 104 //模态边框
#define IDC_THICKFRAME 105 //可变边框
#define IDC_TITLETEXT 106 //组合框
#define IDC_CUSTOMTEXT 107 //自定义字符串输入
#define IDC_BMP 108 //显示图片框
#define IDC_SCROLL 109 //滚动条
#define IDC_VALUE 110 //
//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
ICO_MAIN ICON "Main.ico"
IDB_1 BITMAP "Picture1.bmp"
IDB_2 BITMAP "Picture2.bmp"
//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
DLG_MAIN DIALOG 170,90,310,134 //对话框大小和位置
STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU | WS_THICKFRAME //风格
CAPTION "对话框子窗口控件示例" //对话框标题
FONT 8,"微软雅黑" //字体和字体大小
BEGIN
GROUPBOX "选项",-1,55,5,120,100 //分组框
AUTOCHECKBOX "总在最前面",IDC_ONTOP,65,20,100,12 //自动复选框
AUTOCHECKBOX "显示图片",IDC_SHOWBMP,65,35,100,12 //自动复选框
AUTOCHECKBOX "允许更换图片",IDC_ALOW,65,50,100,12 //自动复选框
CONTROL "",-1,"Static",SS_ETCHEDHORZ | WS_CHILD | WS_VISIBLE,60,65,110,1 //一条横线
AUTORADIOBUTTON "模态边框(&Modal Frame)",IDC_MODALFRAME,65,70,100,12,WS_TABSTOP //自动单选钮
AUTORADIOBUTTON "可变边框(&Thick Frame)",IDC_THICKFRAME,65,85,100,12,WS_TABSTOP //自动单选钮
GROUPBOX "标题栏文字",-1,180,5,125,100,BS_GROUPBOX //分组框
COMBOBOX IDC_TITLETEXT,190,20,105,70,CBS_DROPDOWNLIST | WS_TABSTOP //组合框
LTEXT "自定义文字:",-1,190,40,105,10 //左对齐文本
EDITTEXT IDC_CUSTOMTEXT,190,55,105,12 //文本编辑
LTEXT "请在此选择显示在标题栏上面的文字,或者选择“自定义”后自行输入",-1,191,73,105,26,WS_BORDER //左对齐文本
CONTROL "",-1,"Static",SS_ETCHEDHORZ | WS_CHILD | WS_VISIBLE,5,110,300,1 //一条横线
DEFPUSHBUTTON "更换图片(&C)",IDOK,200,115,50,14 //默认按钮
PUSHBUTTON "退出(&X)",IDCANCEL,115,255,115,50,14 //按钮
CONTROL IDB_1,IDC_BMP,"Static",SS_BITMAP | WS_CHILD | WS_VISIBLE,5,5,40,95 //显示BITMAP图片框
SCROLLBAR IDC_SCROLL,6,119,125,10 //滚动条
LTEXT "0",IDC_VALUE,138,120,50,8 //左对齐文本
END
//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
//WS_TABSTOP :从而使用户可以在组间移动,用户随后可以使用光标在组内的控制间改变键盘焦点
//WS_CHIlD :创建一个子窗口。这个风格不能与WS_POPVP风格合用
//WS_BORDER :创建一个单边框的窗口
//WS_VISIBLE :可视化的窗口
//SS_BITMAP :静态风格,显示位图
|
评分
-
查看全部评分
|