|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
本帖最后由 BinGu 于 2012-1-7 18:34 编辑
- .386
- .model flat,stdcall
- option casemap:none
- include windows.inc
- include user32.inc
- include kernel32.inc
- include gdi32.inc
- includelib user32.lib
- includelib kernel32.lib
- includelib gdi32.lib
- ICO_MAIN equ 1000h
- DLG_MAIN equ 1
- IDB_1 equ 1
- IDB_2 equ 2
- 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
- .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
- .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
- invoke SendDlgItemMessage, hWnd, IDC_TITLETEXT, CB_ADDSTRING, 0, addr szText2
- invoke SendDlgItemMessage, hWnd, IDC_TITLETEXT, CB_ADDSTRING, 0, addr szText3
- invoke SendDlgItemMessage, hWnd, IDC_TITLETEXT, CB_SETCURSEL, 0, 0
- ;设置组合框初始时候选中第一个下拉项
- invoke GetDlgItem,hWnd,IDC_CUSTOMTEXT
- invoke EnableWindow,eax,FALSE
- ;初始化复选框
- invoke CheckDlgButton, hWnd, IDC_SHOWBMP, BST_CHECKED
- invoke CheckDlgButton, hWnd, IDC_ALOW, BST_CHECKED
- ;初始化单选框
- invoke CheckDlgButton, hWnd, IDC_THICKFRAME, BST_CHECKED
- ;加载图片1和图片2
- invoke LoadBitmap, hInstance, IDB_1
- mov hBmp1, eax
- invoke LoadBitmap, hInstance, IDB_2
- mov hBmp2, eax
- ;初始化滚动条
- invoke SendDlgItemMessage, hWnd, IDC_SCROLL, SBM_SETRANGE, 0, 100
- ;--------------------------
- ;组合框功能:设置标题
- ;--------------------------
- .elseif eax == WM_COMMAND
- mov eax, wParam
- .if ax == IDCANCEL
- invoke EndDialog, hWnd, NULL
- .elseif ax == IDC_TITLETEXT
- shr eax,16
- .if ax == CBN_SELENDOK
- invoke SendDlgItemMessage, hWnd, IDC_TITLETEXT, CB_GETCURSEL, 0, 0
- .if eax == 2
- invoke GetDlgItem, hWnd, IDC_CUSTOMTEXT
- invoke EnableWindow, eax, TRUE
- .else
- mov ebx, eax
- invoke SendDlgItemMessage, hWnd, IDC_TITLETEXT, CB_GETLBTEXT, ebx, addr @szBuffer
- invoke SetWindowText, hWnd, addr @szBuffer
- invoke GetDlgItem, hWnd, IDC_CUSTOMTEXT
- invoke EnableWindow, eax, FALSE
- .endif
- .endif
- ;--------------------------
- ;组合框--自定义设置标题
- ;--------------------------
- .elseif ax == IDC_CUSTOMTEXT
- invoke GetDlgItemText, hWnd, IDC_CUSTOMTEXT, addr @szBuffer, sizeof @szBuffer
- invoke SetWindowText, hWnd, addr @szBuffer
- ;--------------------------
- ;复选框--置顶
- ;--------------------------
- .elseif ax == IDC_ONTOP
- invoke IsDlgButtonChecked, hWnd, IDC_ONTOP
- .if eax == BST_CHECKED
- invoke SetWindowPos, hWnd, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE or SWP_NOSIZE
- .else
- invoke SetWindowPos, hWnd, HWND_NOTOPMOST, 0, 0, 0, 0, SWP_NOMOVE or SWP_NOSIZE
- .endif
- ;--------------------------
- ;复选框--显示图片
- ;--------------------------
- .elseif ax == IDC_SHOWBMP
- ;invoke IsDlgButtonChecked, hWnd, IDC_SHOWBMP
- ;.if eax == BST_UNCHECKED
- ; invoke GetDlgItem, hWnd, IDC_BMP
- ; invoke ShowWindow, eax, SW_HIDE
- ;.else
- ; invoke GetDlgItem, hWnd, IDC_BMP
- ; invoke ShowWindow, eax, SW_SHOW
- ;.endif
- invoke GetDlgItem, hWnd, IDC_BMP ;这种方法不好理解~,我觉得SW_VISIBLE这个属性值在资源文件中就已经给定了,
- mov ebx, eax ;那就是说返回值固定了,但是事实上这个函数的返回值却可以变
- invoke IsWindowVisible, ebx
- .if eax
- invoke ShowWindow, ebx, SW_HIDE
- .else
- invoke ShowWindow, ebx, SW_SHOW
- .endif
- ;--------------------------
- ;复选框--允许更换图片
- ;--------------------------
- .elseif ax == IDC_ALOW
- ;invoke IsDlgButtonChecked, hWnd, IDC_ALOW
- ;.if eax == BST_CHECKED
- ; invoke GetDlgItem, hWnd, IDOK
- ; invoke EnableWindow, eax, TRUE
- ;.elseif eax == BST_UNCHECKED
- ; invoke GetDlgItem, hWnd, IDOK
- ; invoke EnableWindow, eax, FALSE
- ;.endif
- invoke IsDlgButtonChecked, hWnd, IDC_ALOW ;这个方法好,不过要动一下脑子!上面的方法有点死,也能实现功能
- .if eax == BST_CHECKED
- mov ebx, TRUE
- .else
- mov ebx, FALSE
- .endif
- invoke GetDlgItem, hWnd, IDOK
- invoke EnableWindow, eax, ebx
- ;--------------------------
- ;单选框--模态边框与可变边框
- ;--------------------------
- ;这个功能不会写~~~例子中的不明白什么意思
- ;********************************************************************
- .elseif ax == IDC_MODALFRAME
- invoke GetWindowLong,hWnd,GWL_STYLE
- and eax,not WS_THICKFRAME
- invoke SetWindowLong,hWnd,GWL_STYLE,eax
- .elseif ax == IDC_THICKFRAME
- invoke GetWindowLong,hWnd,GWL_STYLE
- or eax,WS_THICKFRAME
- invoke SetWindowLong,hWnd,GWL_STYLE,eax
- ;********************************************************************
- ;--------------------------
- ;更换图片
- ;--------------------------
- .elseif ax == IDOK
- mov eax, hBmp1
- xchg eax, hBmp2
- mov hBmp1, eax
- invoke SendDlgItemMessage, hWnd, IDC_BMP, STM_SETIMAGE, IMAGE_BITMAP, eax
- .endif
- ;--------------------------
- ;滚动条
- ;--------------------------
- .elseif eax == WM_HSCROLL
- mov eax,wParam
- .if ax == SB_LINERIGHT
- inc dwPos
- .elseif ax == SB_PAGERIGHT
- add dwPos, 10
- .elseif ax == SB_LINELEFT
- dec dwPos
- .elseif ax == SB_PAGELEFT
- sub dwPos, 10
- .elseif ax == SB_THUMBPOSITION || ax == SB_THUMBTRACK
- mov eax, wParam
- shr eax, 16
- mov dwPos, eax
- .endif
- cmp dwPos, 0
- jge @F
- mov dwPos, 0
- @@:
- cmp dwPos, 100
- jle @F
- mov dwPos, 100
- @@:
- invoke SetDlgItemInt, hWnd, IDC_VALUE, dwPos, FALSE
- invoke SendDlgItemMessage, hWnd, IDC_SCROLL, SBM_SETPOS, dwPos, 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
复制代码
这个对话框包括3部分内容:1.资源文件的定义、2.图片等需要用到的材料、3.程序编写
第一部分内容: (不解释,资源定义想必看过前面内容的人都知道是怎么回事了)
第二部分内容: (不解释,自己需要什么要的图片等,是自己的个人喜好问题了)
第三部分内容: 这里才是主要的~
这个程序写起来,就想是小孩子玩叠积木一样,整个程序是由每一块有各自功能的小积木拼起来的!程序就不一句一句的解释了,每部分功能都已经注释上了!下面就介绍一下程序中用到的几个函数!函数的具体定义和参数,请查看MSDN或者网上去搜吧~~~
1:
程序中在给组合框的下拉菜单中添加选项时候用的是SendDlgItemMessage这个函数,该函数功能:该函数把一个消息发送给指定的对话框中的控件。我想要是大家知道了这个函数的功能,自然能够想到,这个函数的用处不仅仅只是专为组合框添加选项而设定的吧,不错,这个函数很有用,是我们人和某控件沟通的一个重要的函数!这个函数对组合框的更多功能,请参照课本中"表5.5 组合框的消息"进行学习~
2:
EnableWindow这个函数呢,也是非常常用的一个函数,上过几天网的人,都应该碰到过这个函数的发挥的作用。这个函数的作用就是允许/禁止指定的窗口或控件接受鼠标和键盘的输入,我们程序中用他来"灰化自定义文字"下面的edittext控件。可以理解这个函数的第二个参数自然就带两个状态属性了,一个是表示允许状态就是TRUE,另外一个就是禁止状态的FALSE~~~~
3:
CheckDlgButton这个函数是个好东东啊!!!我们程序中在复选框中用他来改变按钮控制的选中状态~~它可以把按钮设置为BST_CHECKED(选中)、BST_INDETERMINATE(不确定)、BST_UNCHECKED(未选中) 这三种状态,第二种状态要注意了,他的使用情况只有在按钮具有BS_3STATE或BS_AUTO3STATE样式时才能使用。
4:
在控件编程中,我们使用控件的时候,往往需要使用控件的句柄,我们可以用GetDlgItem函数来获得某控件的句柄。这个函数很简单,第一个参数是包含这个控件的窗口的句柄,第二个参数就是这个控件的ID号。这个方法是从控件ID号获得控件句柄!当然,书上还介绍了通过控件句柄来获得控件ID号的两个方法,GetDlgCtrlID和GetWindowLong两个函数。这几个函数都简单,没什么深奥的东东,不做介绍了~
5:
在设置这个对话框的标题的时候,用GetDlgItemText来获得我们在“自定义文字:”那输入的字符,再用SetWindowText来改变标题。这两个函数,我们就光光从函数的名称就能大概的猜到他的功能了,不是吗。比如GetDlgItemText这个函数,GET是取得,DLG就是Dialog的缩写,Item是项目,Text内容,连接起来就是获得对话框项的内容。后面的也一起,当然,几乎所有的函数都不是乱取名字的,这也是某某人在定义函数时候,给函数取名的一个规律吧!
6:
这这个程序中,我们对控件的状态查询时候用到的函数是IsDlgButtonChecked,这个函数可以确定某个按钮控制是否有选中。这个函数和CheckDlgButton是对应的,前者IsDlgButtonChecked是用来查询的,而CheckDlgButton则是用来设置按钮的状态的!
7:
SetWindowPos这个函数的功能是,设置窗口的位置,我们在程序中用这个函数来实现对话框置顶的功能!
8:
值得注意的是,在对话框模态与非模态时候的切换的时候,我们显示用GetWindowLog函数来取得属性,再对取回来的属性做修改,然后用SetWindowLong把改好的属性设置回去。之所以可以这样做,是因为,Windows系统是通过定义控件的属性来实现控件的样式啊、大小啊,可视性啊等等的显示。还有一点,就是我之前一直没想过的问题,那就是我们在资源文件中定义的属性,其实也是可以在程序中用某些函数进行修改!
这个程序用到的主要函数就这几个了,这几个函数我们要是知道了的话,不用课本,相信很多童鞋都可以自己写出来了~不是吗?----是吗?------不是吗???好像是哦~~~~
鱼C工作室 BinGu
|
-
|