win32汇编打开文件对话框Demo

		.386
		.model flat, stdcall
		option casemap :none

include		windows.inc
include		user32.inc
includelib	user32.lib
include		kernel32.inc
includelib	kernel32.lib
include		Comdlg32.inc
includelib	Comdlg32.lib

ICO_MAIN	equ	1000
DLG_MAIN	equ	1000
IDM_MAIN	equ	1000
IDM_OPEN	equ	1101
IDM_EXIT	equ	1104

		.data?
hInstance	dd	?
hWinMain	dd	?
szFileName	db	MAX_PATH dup (?)

		.const
szCaption	db	'执行结果',0
szFilter	db	'Text Files(*.txt)',0,'*.txt',0,'All Files(*.*)',0,'*.*',0,0
szDefExt	db	'txt',0

		.code

; 显示“打开文件”对话框
_OpenFile	proc
		local	@stOF:OPENFILENAME

		invoke	RtlZeroMemory,addr @stOF,sizeof @stOF
		mov	@stOF.lStructSize,sizeof @stOF
		push	hWinMain
		pop	@stOF.hwndOwner
		mov	@stOF.lpstrFilter,offset szFilter
		mov	@stOF.lpstrFile,offset szFileName
		mov	@stOF.nMaxFile,MAX_PATH
		mov	@stOF.Flags,OFN_FILEMUSTEXIST or OFN_PATHMUSTEXIST
		invoke	GetOpenFileName,addr @stOF
		.if	eax
			invoke	MessageBox,hWinMain,addr szFileName,addr szCaption,MB_OK
		.endif
		ret

_OpenFile	endp


_ProcDlgMain	proc	uses ebx edi esi hWnd,wMsg,wParam,lParam
		mov	eax,wMsg
		.if	eax ==	WM_CLOSE
			invoke	EndDialog,hWnd,NULL
		.elseif	eax ==	WM_INITDIALOG
		.elseif	eax ==	WM_COMMAND
			mov	eax,wParam
			.if	ax ==	IDM_EXIT
				invoke	EndDialog,hWnd,NULL
			.elseif	ax ==	IDM_OPEN
				invoke	_OpenFile
			.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
		invoke	ExitProcess,NULL
		end	start

rc文件;

#include		<resource.h>

#define	ICO_MAIN		1000
#define	DLG_MAIN		1000
#define	IDM_MAIN		1000
#define	IDM_OPEN		1101
#define	IDM_EXIT		1104

ICO_MAIN	ICON		"Main.ico"

DLG_MAIN DIALOGEX 150, 180, 120, 80
MENU IDM_MAIN
STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU | WS_THICKFRAME
EXSTYLE WS_EX_CLIENTEDGE
CAPTION "打开文件对话框示例"
FONT 9, "宋体"
{
}
IDM_MAIN	menu	discardable
BEGIN
	popup	"文件(&F)"
	BEGIN
		menuitem	"打开文件(&O)...",	IDM_OPEN
		menuitem	"退出(&X)",		IDM_EXIT
	END


END

运行如下;

用到的结构体定义在windows.inc中;

主程序调用_OpenFile过程;过程包含一个本地变量 @stOF,其类型是OPENFILENAME结构;

结构体使用之前先用 RtlZeroMemory 清零;

结构体赋值使用 mov,类似如下,
        mov    @stOF.lpstrFilter,offset szFilter
        mov    @stOF.lpstrFile,offset szFileName
        mov    @stOF.nMaxFile,MAX_PATH

szFileName的偏移赋给结构体的lpstrFile字段,调用之后获取选择的文件名;

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值