鱼C论坛

 找回密码
 立即注册
查看: 2186|回复: 1

[技术交流] 【学习笔记】子窗口控件学习

[复制链接]
发表于 2012-7-17 18:33:05 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

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 :静态风格,显示位图















评分

参与人数 1鱼币 +5 收起 理由
LLCK910 + 5 很给力!

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2012-7-17 19:00:43 | 显示全部楼层
当我汇编老师
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-10-8 06:27

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表