BinGu 发表于 2012-1-7 18:21:57

罗云彬老师书本第5章中的一个对话框用到的几个函数

本帖最后由 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: 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.程序编写

第一部分内容: (不解释,资源定义想必看过前面内容的人都知道是怎么回事了)

第二部分内容: (不解释,自己需要什么要的图片等,是自己的个人喜好问题了)

第三部分内容:   {:5_109:}这里才是主要的~


这个程序写起来,就想是小孩子玩叠积木一样,整个程序是由每一块有各自功能的小积木拼起来的!程序就不一句一句的解释了,每部分功能都已经注释上了!下面就介绍一下程序中用到的几个函数!函数的具体定义和参数,请查看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

955 发表于 2012-1-8 17:17:33

........:dizzy:

盲鸟 发表于 2012-1-9 00:08:33

谢谢了 ~正在看书 感觉很累

BinGu 发表于 2012-1-12 18:41:18

盲鸟 发表于 2012-1-9 00:08 static/image/common/back.gif
谢谢了 ~正在看书 感觉很累

如果第一个窗口程序你能看懂的话,剩下的就是API了,WIN32只是调用API而已!和高级语言非常相近
页: [1]
查看完整版本: 罗云彬老师书本第5章中的一个对话框用到的几个函数