鱼C论坛

 找回密码
 立即注册

罗云彬老师书本第5章

热度 7已有 982 次阅读2012-1-7 17:10

就这么一个对话框,其实一点都不难~当初看了一眼就看电影去了,只是因为太陌生的东东,不敢去接触而已

;*****************************************************

这个对话框包括3部分内容:1.资源文件的定义、2.图片等需要用到的材料、3.程序编写

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

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

第三部分内容: 这里才是主要的~

.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

   ;把自定义输入的edit设置为灰色
   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

 

(这里没有代码编辑器,比较郁闷,格式乱了~~~)

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

 

 

 

 

 

 

 已同步至 BinGu的微博

3

路过

鸡蛋
4

鲜花

握手

雷人

刚表态过的朋友 (7 人)

发表评论 评论 (5 个评论)

回复 小甲鱼 2012-1-7 20:15
做的不错!
回复 BinGu 2012-1-12 18:24
小甲鱼: 做的不错!
  
回复 沧海小虾 2012-1-13 18:34
我刚刚是打葱伴侣来过
回复 BinGu 2012-1-13 18:36
沧海小虾: 我刚刚是打葱伴侣来过
   打惯酱油,居然看不懂打葱伴是啥东东了~~~
回复 沧海小虾 2012-1-16 19:52
BinGu:    打惯酱油,居然看不懂打葱伴是啥东东了~~~
黄豆酱~

facelist

您需要登录后才可以评论 登录 | 立即注册

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

GMT+8, 2024-4-27 13:28

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

返回顶部