xing59741 发表于 2012-7-17 18:33:05

【学习笔记】子窗口控件学习

;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
    .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_MODALFRAMEequ    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: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       ;退出程序
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
endstart      ;程序从start开始执行


=======================================================================

RC文件


#include    <resource.h>
//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
#define ICO_MAIN0x1000 //图标
#define DLG_MAIN1
#define IDB_1   1
#define IDB_2   2
#define IDC_ONTOP101 //窗口最顶层
#define IDC_SHOWBMP102 //显示图片
#define IDC_ALOW103 //允许更换图片
#define IDC_MODALFRAME 104 //模态边框
#define IDC_THICKFRAME105 //可变边框
#define IDC_TITLETEXT106 //组合框
#define IDC_CUSTOMTEXT107 //自定义字符串输入
#define IDC_BMP   108 //显示图片框
#define IDC_SCROLL109 //滚动条
#define IDC_VALUE110 //
//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
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       //分组框
COMBOBOXIDC_TITLETEXT,190,20,105,70,CBS_DROPDOWNLIST | WS_TABSTOP   //组合框
LTEXT   "自定义文字:",-1,190,40,105,10      //左对齐文本
EDITTEXTIDC_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       //按钮
CONTROLIDB_1,IDC_BMP,"Static",SS_BITMAP | WS_CHILD | WS_VISIBLE,5,5,40,95    //显示BITMAP图片框
SCROLLBARIDC_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 :静态风格,显示位图














丿夏夜灬彬刂 发表于 2012-7-17 19:00:43

当我汇编老师{:5_101:}
页: [1]
查看完整版本: 【学习笔记】子窗口控件学习