鱼C论坛

 找回密码
 立即注册
查看: 3311|回复: 3

[技术交流] 罗云彬老师书本第5章中的一个对话框用到的几个函数

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

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

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

x
本帖最后由 BinGu 于 2012-1-7 18:34 编辑
  1. .386
  2. .model flat,stdcall
  3. option casemap:none

  4. include windows.inc
  5. include user32.inc
  6. include kernel32.inc
  7. include gdi32.inc
  8. includelib user32.lib
  9. includelib kernel32.lib
  10. includelib gdi32.lib

  11. ICO_MAIN equ 1000h
  12. DLG_MAIN equ 1
  13. IDB_1 equ 1
  14. IDB_2 equ 2
  15. IDC_ONTOP equ 101
  16. IDC_SHOWBMP equ 102
  17. IDC_ALOW equ 103
  18. IDC_MODALFRAME equ 104
  19. IDC_THICKFRAME equ 105
  20. IDC_TITLETEXT equ 106
  21. IDC_CUSTOMTEXT equ 107
  22. IDC_BMP equ 108
  23. IDC_SCROLL equ 109
  24. IDC_VALUE equ 110

  25. .data?
  26. hInstance dd ?
  27. hBmp1 dd ?
  28. hBmp2 dd ?
  29. dwPos dd ?

  30. .const
  31. szText1 db 'Hello, World!',0
  32. szText2 db '嘿,你看到标题栏变了吗?',0
  33. szText3 db '自定义',0

  34. .code
  35. _ProcDlgMain proc uses ebx edi esi hWnd,wMsg,wParam,lParam
  36. LOCAL @szBuffer[128]: byte

  37. mov eax, wMsg
  38. .if eax == WM_CLOSE
  39. invoke EndDialog, hWnd, NULL
  40. .elseif eax == WM_INITDIALOG
  41. invoke LoadIcon, hInstance, ICO_MAIN
  42. invoke SendMessage, hWnd, WM_SETICON, ICON_BIG, eax
  43. ;初始化组合框
  44. invoke SendDlgItemMessage, hWnd, IDC_TITLETEXT, CB_ADDSTRING, 0, addr szText1
  45. invoke SendDlgItemMessage, hWnd, IDC_TITLETEXT, CB_ADDSTRING, 0, addr szText2
  46. invoke SendDlgItemMessage, hWnd, IDC_TITLETEXT, CB_ADDSTRING, 0, addr szText3
  47. invoke SendDlgItemMessage, hWnd, IDC_TITLETEXT, CB_SETCURSEL, 0, 0
  48. ;设置组合框初始时候选中第一个下拉项
  49. invoke GetDlgItem,hWnd,IDC_CUSTOMTEXT
  50. invoke EnableWindow,eax,FALSE
  51. ;初始化复选框
  52. invoke CheckDlgButton, hWnd, IDC_SHOWBMP, BST_CHECKED
  53. invoke CheckDlgButton, hWnd, IDC_ALOW, BST_CHECKED
  54. ;初始化单选框
  55. invoke CheckDlgButton, hWnd, IDC_THICKFRAME, BST_CHECKED
  56. ;加载图片1和图片2
  57. invoke LoadBitmap, hInstance, IDB_1
  58. mov hBmp1, eax
  59. invoke LoadBitmap, hInstance, IDB_2
  60. mov hBmp2, eax
  61. ;初始化滚动条
  62. invoke SendDlgItemMessage, hWnd, IDC_SCROLL, SBM_SETRANGE, 0, 100
  63. ;--------------------------
  64. ;组合框功能:设置标题
  65. ;--------------------------
  66. .elseif eax == WM_COMMAND
  67. mov eax, wParam
  68. .if ax == IDCANCEL
  69. invoke EndDialog, hWnd, NULL
  70. .elseif ax == IDC_TITLETEXT
  71. shr eax,16
  72. .if ax == CBN_SELENDOK
  73. invoke SendDlgItemMessage, hWnd, IDC_TITLETEXT, CB_GETCURSEL, 0, 0
  74. .if eax == 2
  75. invoke GetDlgItem, hWnd, IDC_CUSTOMTEXT
  76. invoke EnableWindow, eax, TRUE
  77. .else
  78. mov ebx, eax
  79. invoke SendDlgItemMessage, hWnd, IDC_TITLETEXT, CB_GETLBTEXT, ebx, addr @szBuffer
  80. invoke SetWindowText, hWnd, addr @szBuffer
  81. invoke GetDlgItem, hWnd, IDC_CUSTOMTEXT
  82. invoke EnableWindow, eax, FALSE
  83. .endif
  84. .endif
  85. ;--------------------------
  86. ;组合框--自定义设置标题
  87. ;--------------------------
  88. .elseif ax == IDC_CUSTOMTEXT
  89. invoke GetDlgItemText, hWnd, IDC_CUSTOMTEXT, addr @szBuffer, sizeof @szBuffer
  90. invoke SetWindowText, hWnd, addr @szBuffer
  91. ;--------------------------
  92. ;复选框--置顶
  93. ;--------------------------
  94. .elseif ax == IDC_ONTOP
  95. invoke IsDlgButtonChecked, hWnd, IDC_ONTOP
  96. .if eax == BST_CHECKED
  97. invoke SetWindowPos, hWnd, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE or SWP_NOSIZE
  98. .else
  99. invoke SetWindowPos, hWnd, HWND_NOTOPMOST, 0, 0, 0, 0, SWP_NOMOVE or SWP_NOSIZE
  100. .endif
  101. ;--------------------------
  102. ;复选框--显示图片
  103. ;--------------------------
  104. .elseif ax == IDC_SHOWBMP
  105. ;invoke IsDlgButtonChecked, hWnd, IDC_SHOWBMP
  106. ;.if eax == BST_UNCHECKED
  107. ; invoke GetDlgItem, hWnd, IDC_BMP
  108. ; invoke ShowWindow, eax, SW_HIDE
  109. ;.else
  110. ; invoke GetDlgItem, hWnd, IDC_BMP
  111. ; invoke ShowWindow, eax, SW_SHOW
  112. ;.endif

  113. invoke GetDlgItem, hWnd, IDC_BMP ;这种方法不好理解~,我觉得SW_VISIBLE这个属性值在资源文件中就已经给定了,
  114. mov ebx, eax ;那就是说返回值固定了,但是事实上这个函数的返回值却可以变
  115. invoke IsWindowVisible, ebx
  116. .if eax
  117. invoke ShowWindow, ebx, SW_HIDE
  118. .else
  119. invoke ShowWindow, ebx, SW_SHOW
  120. .endif
  121. ;--------------------------
  122. ;复选框--允许更换图片
  123. ;--------------------------
  124. .elseif ax == IDC_ALOW
  125. ;invoke IsDlgButtonChecked, hWnd, IDC_ALOW
  126. ;.if eax == BST_CHECKED
  127. ; invoke GetDlgItem, hWnd, IDOK
  128. ; invoke EnableWindow, eax, TRUE
  129. ;.elseif eax == BST_UNCHECKED
  130. ; invoke GetDlgItem, hWnd, IDOK
  131. ; invoke EnableWindow, eax, FALSE
  132. ;.endif

  133. invoke IsDlgButtonChecked, hWnd, IDC_ALOW ;这个方法好,不过要动一下脑子!上面的方法有点死,也能实现功能
  134. .if eax == BST_CHECKED
  135. mov ebx, TRUE
  136. .else
  137. mov ebx, FALSE
  138. .endif
  139. invoke GetDlgItem, hWnd, IDOK
  140. invoke EnableWindow, eax, ebx

  141. ;--------------------------
  142. ;单选框--模态边框与可变边框
  143. ;--------------------------
  144. ;这个功能不会写~~~例子中的不明白什么意思
  145. ;********************************************************************
  146. .elseif ax == IDC_MODALFRAME
  147. invoke GetWindowLong,hWnd,GWL_STYLE
  148. and eax,not WS_THICKFRAME
  149. invoke SetWindowLong,hWnd,GWL_STYLE,eax
  150. .elseif ax == IDC_THICKFRAME
  151. invoke GetWindowLong,hWnd,GWL_STYLE
  152. or eax,WS_THICKFRAME
  153. invoke SetWindowLong,hWnd,GWL_STYLE,eax
  154. ;********************************************************************



  155. ;--------------------------
  156. ;更换图片
  157. ;--------------------------
  158. .elseif ax == IDOK
  159. mov eax, hBmp1
  160. xchg eax, hBmp2
  161. mov hBmp1, eax
  162. invoke SendDlgItemMessage, hWnd, IDC_BMP, STM_SETIMAGE, IMAGE_BITMAP, eax
  163. .endif
  164. ;--------------------------
  165. ;滚动条
  166. ;--------------------------
  167. .elseif eax == WM_HSCROLL
  168. mov eax,wParam
  169. .if ax == SB_LINERIGHT
  170. inc dwPos
  171. .elseif ax == SB_PAGERIGHT
  172. add dwPos, 10
  173. .elseif ax == SB_LINELEFT
  174. dec dwPos
  175. .elseif ax == SB_PAGELEFT
  176. sub dwPos, 10
  177. .elseif ax == SB_THUMBPOSITION || ax == SB_THUMBTRACK
  178. mov eax, wParam
  179. shr eax, 16
  180. mov dwPos, eax
  181. .endif
  182. cmp dwPos, 0
  183. jge @F
  184. mov dwPos, 0
  185. @@:
  186. cmp dwPos, 100
  187. jle @F
  188. mov dwPos, 100
  189. @@:
  190. invoke SetDlgItemInt, hWnd, IDC_VALUE, dwPos, FALSE
  191. invoke SendDlgItemMessage, hWnd, IDC_SCROLL, SBM_SETPOS, dwPos, TRUE
  192. ;***************************
  193. .else
  194. mov eax, FALSE
  195. ret
  196. .endif
  197. mov eax,TRUE
  198. ret

  199. _ProcDlgMain endp

  200. start:
  201. invoke GetModuleHandle, NULL
  202. mov hInstance, eax
  203. invoke DialogBoxParam, hInstance, DLG_MAIN, NULL, offset _ProcDlgMain, NULL
  204. invoke ExitProcess, NULL
  205. 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

1.jpg
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2012-1-8 17:17:33 | 显示全部楼层
........:dizzy:
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2012-1-9 00:08:33 | 显示全部楼层
谢谢了 ~正在看书 感觉很累
小甲鱼最新课程 -> https://ilovefishc.com
 楼主| 发表于 2012-1-12 18:41:18 | 显示全部楼层
小甲鱼最新课程 -> https://ilovefishc.com
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2025-7-16 06:46

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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