|
楼主 |
发表于 2012-7-16 08:16:49
|
显示全部楼层
自己理解了。。没事了
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
.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 2000h ;对话框资源
IDC_LISTBOX1 equ 101
IDC_LISTBOX2 equ 102
IDC_SEL1 equ 103
IDC_RESET equ 104
IDC_ALL equ 105
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 数据段
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
.data?
hInstance dd ?
.const
szText1 db '项目1',0
szText2 db '项目2',0
szText3 db '项目3',0
szPath db 'C:\windows\*.exe',0
szMessage db '选择结果:%s',0
szTitle db '您的选择',0
szSelect db '您选择了以下的项目:'
szReturn db 0dh,0ah,0
szErr db '错误:选则项目不存在!',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 ;添加字符串,返回值eax为索引值
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,addr szPath
;将文件排列出来放置列表框供选择!
;LB_DIR :将指定目录中的文件名自动列出并加入列表框中
;DDL_ARCHIVE :加入归档属性
;DDL_drives :加入驱动器名
;DDL_DIRECTORY :加入目录
;lParam :文件名通配符
;******************************************************************************************************************************
; 取多选的列表框项目
;******************************************************************************************************************************
.elseif eax == WM_COMMAND
mov eax,wParam ;wParam存储了菜单命令
.if eax == IDOK ;如果按下了OK按钮
invoke SendDlgItemMessage,hWnd,IDC_LISTBOX2,LB_GETSELCOUNT,0,0
;LB_GETSELCOUNT :返回多选列表框中选中的项目总数
;lParam和wParam为NULL
.if eax==0
invoke MessageBox,hWnd,offset szErr,offset szTitle,MB_OK
ret
.endif
mov @dwCount,eax ;存储了列表框2选中的项目总数
invoke SendDlgItemMessage,hWnd,IDC_LISTBOX2,LB_GETSELITEMS,32,addr @szBuffer
;LB_GETSELITEMS :返回多选框选中列表索引到缓冲区
;lParam :缓冲区地址
;wParam :最大项数
invoke lstrcpy,addr @szTextBuff,addr szSelect ;szSelect 字符串:您选择了以下的项目:
;lstrcpy :该函数复制一个字符串到缓冲区
;参数1 :指向接收由参数2指向字符串内容的缓冲区,缓冲区必须足够大来容纳字符串,还包括最后的NULL终止符
;参数2 :指向待复制的以NULL为终止符的字符串
lea esi,@szBuffer
;@szBuffer :多选框选中列表索引
.while @dwCount
;@dwCount :列表框2选中项目总数
lodsd
; :传送双字
;lodsd :把esi寄存器数值按双字装入eax中
lea ecx,@szBuffer1
invoke SendDlgItemMessage,hWnd,IDC_LISTBOX2,LB_GETTEXT,eax,ecx
;LB_GETTEXT :返回某个项目的字符串
;lParam :缓冲区地址
;wParam :位置索引
invoke lstrcat,addr @szTextBuff,addr szReturn
;lstrcat :该函数将一个字符串附加在另外一个字符串后面
;lpString1 :一个以NULL为终止符字符串指针,这个缓冲区必须足够大能包含两个字符串
;lpString2 :一个以NULL为终止符字符串指针,它将追加在由lpString1中指定,这个缓冲区必须足够大能包含两个字符串
;返回值 :若函数运行成功返回值指向缓冲区、若失败,则返回值为NULL
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
;LB_SETSEL :在多选框中将一个项目选中或清除
;wParam :选择状态
;lParam :位置索引
.elseif ax == IDC_ALL
invoke SendDlgItemMessage,hWnd,IDC_LISTBOX2,LB_GETCOUNT,0,0
invoke SendDlgItemMessage,hWnd,IDC_LISTBOX2,LB_SELITEMRANGE,TRUE,eax
.elseif ax == IDC_LISTBOX1
shr eax,16
.if ax == LBN_SELCHANGE ;选定状态改变
;******************************************************************************************************************************
; 将鼠标点击结果显示在文本框中
;******************************************************************************************************************************
invoke SendDlgItemMessage,hWnd,IDC_LISTBOX1,LB_GETCURSEL,0,0
;获取单选框中选定状态的项目索引
lea ecx,@szBuffer
invoke SendDlgItemMessage,hWnd,IDC_LISTBOX1,LB_GETTEXT,eax,ecx
;获取文本信息放置@szBuffer缓冲区中
invoke SetDlgItemText,hWnd,IDC_SEL1,addr @szBuffer
;设置对话框中的字符串显示【项目几】
;******************************************************************************************************************************
; 双击项目弹出对话框
;******************************************************************************************************************************
.elseif ax == LBN_DBLCLK ;用户双击了一个项目
invoke SendDlgItemMessage,hWnd,IDC_LISTBOX1,LB_GETCURSEL,0,0
;获取单选框中选定状态的项目索引
lea ecx,@szBuffer
invoke SendDlgItemMessage,hWnd,IDC_LISTBOX1,LB_GETTEXT,eax,ecx
;获取eax中存储项目的字符串,放置到@szBuffer缓冲区中
invoke wsprintf,addr @szBuffer1,addr szMessage,addr @szBuffer
;格式化字符串
invoke MessageBox,hWnd,addr @szBuffer1,addr szTitle,MB_OK
;弹出消息框显示选中的项目
.endif
.endif
;******************************************************************************************************************************
.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 ;创建模态对话框
;函数从hInstance模块装载DLG_MAIN的资源
;父窗口就是本身,对话框过程是_ProcDlgMain
;dwInitParam是当做WM_INITDIALOG消息的lParam传给对话框过程,用来自定义消息
invoke ExitProcess,NULL
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
end start
#include <resource.h>
//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
#define ICO_MAIN 0x1000 //图标
#define DLG_MAIN 0x2000 //对话框
#define IDC_LISTBOX1 101
#define IDC_LISTBOX2 102
#define IDC_SEL1 103
#define IDC_RESET 104
#define IDC_ALL 105
//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
ICO_MAIN ICON "Main.ico" //图标文件
//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
DLG_MAIN DIALOG 163, 160,190,108 //对话框资源定义:X坐标,Y坐标,宽度,高度
STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU//风格定义
CAPTION "列表框控件示例" //定义显示在窗口标题栏上的文字
FONT 8, "微软雅黑" //定义对话框包括子窗口控件使用的字体和大小
//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
BEGIN
LISTBOX IDC_LISTBOX1,6,5,55,86,LBS_STANDARD
LISTBOX IDC_LISTBOX2,68,5,115,86,LBS_STANDARD | LBS_MULTIPLESEL | LBS_EXTENDEDSEL
LTEXT " ",IDC_SEL1,6,93,25,8
DEFPUSHBUTTON "查看(&S)",IDOK,139,90,45,14
PUSHBUTTON "复位(&R)",IDC_RESET,89,90,45,14
PUSHBUTTON "全选(&A)", IDC_ALL,39, 90, 45, 14
END
//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
//WS_POPUP :弹出式窗口
//WS_VISIBLE :初始状态可见
//WS_SYSMENU :创建一个在其标题条中具有系统菜单框的窗口,仅适用于带标题条的窗口
//DS_MODALFRAME :指定带模式对话框边界的对话框,此风格和WS_CAPTION、WS_SYSMENU风格一起,创建带标题条和系统菜单的对话框
//WS_CAPTION :创建一个有标题的窗口,包含了WS_BORDER,不能和WS_DLGFRAME一起使用
//WS_BORDER :创建一个有边框的窗口
//WS_DLGFRAME :创建一个带有双层边框但没有标题的窗口
//CONTROL 文本, ID, 类, 风格, X, Y, 宽度, 高度 [,扩展风格]
//invoke CreateWindow, 类名, 文本, 风格, X, Y, 宽度, 高度, 对话框窗口句柄, ID, hInstance, NULL
//控件名称 [文本,] ID,X,Y,宽度,高度[,风格][,扩展风格]
//类介绍 :按钮(Button)、静态(Static)、编辑(Edit)、滚动条(ScrollBar)、列表框(ListBox)、组合框(ComboBox)
|
|