WIN32汇编语言教程:第05章 使用资源 · 5.4 对话框(10)
.386
.model flat, stdcall
option casemap :none
;####################################################################
; Include 文件定义
;####################################################################
include windows.inc
include user32.inc
includelib user32.lib
include kernel32.inc
includelib kernel32.lib
;####################################################################
; Equ 等值定义
;####################################################################
ICO_MAIN equ 1000h
DLG_MAIN equ 1
IDC_LISTBOX1 equ 101
IDC_LISTBOX2 equ 102
IDC_SEL1 equ 103
IDC_RESET equ 104
;####################################################################
; 数据段
;####################################################################
.data?
hInstance dd ?
.const
szText1 db '项目1',0
szText2 db '项目2',0
szText3 db '项目3',0
szPath db '*.*',0
szMessage db '选择结果:%s',0
szTitle db '您的选择',0
szSelect db '您选择了以下的项目:'
szReturn db 0dh,0ah,0
;####################################################################
; 代码段
;####################################################################
.code
;####################################################################
_ProcDlgMain proc uses ebx edi esi hWnd,wMsg,wParam,lParam
local @szBuffer[128]:byte
local @szBuffer1[128]:byte
local @szTextBuff[2048]:byte
local @dwCount
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_LISTBOX1,LB_ADDSTRING,0,addr szText1
invoke SendDlgItemMessage,hWnd,\
IDC_LISTBOX1,LB_ADDSTRING,0,addr szText2
invoke SendDlgItemMessage,hWnd,\
IDC_LISTBOX1,LB_ADDSTRING,0,addr szText3
Invoke SendDlgItemMessage,hWnd,IDC_LISTBOX2,LB_DIR,\
DDL_ARCHIVE or DDL_DRIVES or DDL_DIRECTORY,\
addr szPath
;********************************************************************
.elseif eax == WM_COMMAND
mov eax,wParam
;********************************************************************
;由于印刷宽度有限,WM_COMMAND消息处理代码的缩进格式有所影响,请读者注意
; 取多选的列表框项目
;********************************************************************
.if ax == IDOK
invoke SendDlgItemMessage,hWnd,IDC_LISTBOX2,LB_GETSELCOUNT,0,0
mov @dwCount,eax
invoke SendDlgItemMessage,hWnd,IDC_LISTBOX2,\
LB_GETSELITEMS,128/4,addr @szBuffer
invoke lstrcpy,addr @szTextBuff,addr szSelect
lea esi,@szBuffer
.while @dwCount
lodsd
lea ecx,@szBuffer1
invoke SendDlgItemMessage,hWnd,\
IDC_LISTBOX2,LB_GETTEXT,eax,ecx
invoke lstrcat,addr @szTextBuff,addr szReturn
invoke lstrcat,addr @szTextBuff,addr @szBuffer1
dec @dwCount
.endw
invoke MessageBox,hWnd,addr @szTextBuff,addr szTitle,MB_OK
.elseif ax == IDC_RESET
invoke SendDlgItemMessage,hWnd,IDC_LISTBOX2,LB_SETSEL,FALSE,-1
.elseif ax == IDC_LISTBOX1
shr eax,16
.if ax == LBN_SELCHANGE
;********************************************************************
; 将鼠标点击结果显示在文本框中
;********************************************************************
invoke SendMessage,lParam,LB_GETCURSEL,0,0
lea ecx,@szBuffer
invoke SendMessage,lParam,LB_GETTEXT,eax,ecx
invoke SetDlgItemText,hWnd,IDC_SEL1,addr @szBuffer
;********************************************************************
; 双击项目则弹出对话框
;********************************************************************
.elseif ax == LBN_DBLCLK
invoke SendMessage,lParam,LB_GETCURSEL,0,0
lea ecx,@szBuffer
invoke SendMessage,lParam,LB_GETTEXT,eax,ecx
invoke wsprintf,addr @szBuffer1,addr szMessage,addr @szBuffer
invoke MessageBox,hWnd,addr @szBuffer1,addr szTitle,MB_OK
.endif
;********************************************************************
.elseif ax == IDC_LISTBOX2
shr eax,16
.if ax == LBN_SELCHANGE
invoke SendMessage,lParam,LB_GETSELCOUNT,0,0
mov ebx,eax
invoke GetDlgItem,hWnd,IDOK
invoke EnableWindow,eax,ebx
.endif
.endif
;********************************************************************
;恢复代码缩进格式,请读者注意
;********************************************************************
.else
mov eax,FALSE
ret
.endif0
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
第05章 使用资源
版权所有 © 云南伯恩科技 证书:粤ICP备09170368号