kyj 发表于 2005-10-6 00:43:24

GetOpenfilename 的使用

<P>帮忙看看,以下的代码问题出在哪里?</P>
<P>s_openfilename openfilename</P>
<P>OpenFilename.lStructSize = 260<BR>OpenFilename.hwndOwner = GetForegroundWindow()<BR>OpenFilename.hInstance = Handle(GetApplication())<BR>OpenFilename.lpstrFilter = "所有文件"<BR>OpenFilename.nFilterIndex = 1 <BR>OpenFilename.lpstrFile = Space(254)<BR>OpenFilename.nMaxFile = 255<BR>OpenFilename.lpstrFileTitle = OpenFilename.lpstrFile <BR>OpenFilename.nMaxFileTitle = OpenFilename.nMaxFile <BR>OpenFilename.lpstrInitialDir = "C:\" <BR>OpenFilename.lpstrTitle = "打开文件"<BR>OpenFilename.flags = 0</P>
<P><BR>return GetOpenfilename(openfilename)</P>

阿辉 发表于 2005-10-8 09:52:52

<P>你用的是一个对象吧?</P>
<P>pb里有一个GetFileOpenName,也很好用的</P>

xgbluebird 发表于 2015-5-6 20:00:46

阿辉 发表于 2005-10-8 09:52
你用的是一个对象吧?
pb里有一个GetFileOpenName,也很好用的

PB内部的函数运行倒是正常,但有2个问题:一是不能改变窗口大小,即查找文件时很不方便,这也是PB系统中多处函数、说明的通病,
二是不能居中显示。但OS的GetFileOpenName要使用内存操作才能运行,但内存操作常使程序异常中止(内存不能read之类的)。

xgbluebird 发表于 2015-5-6 20:02:41

Long ll_rc
Long MAX_BUFFER_LENGTH = 256
Integer li_Start, li_TabPos
String ls_Token
String Filter
long ll_len
String ls_bmp, ls_bitmapfilename

//定义OPENFILENAME类型的结构变量
OPENFILENAME OFName

//定义过滤文件的类型
Filter = "Text Files (*.txt)~t*.TXT~tBitmap files (*.bmp)~t*.BMP~tRTF files (*.rtf)~t*.RTF"               

//为结构成员lpstrFilter分配内存
OFName.lpstrFilter        = LocalAlloc(LMEM_ZEROINIT,Len(Filter) + 2) // 以两个NULL字符结尾
If OFName.lpstrFilter = 0 Then
        MessageBox("错误","无法分配所需的内存!",StopSign!,Ok!)
End If

//将制表符~t转换为Null分隔符
li_Start= 1
li_TabPos = Pos(Filter,"~t",1)
Do While li_TabPos > 0
        ls_Token = Mid(Filter,li_Start,li_TabPos - li_Start)
        StrCopy(OFName.lpstrFilter + (li_Start - 1), ls_Token, Len(ls_Token))
        li_Start        = li_TabPos + 1
        li_TabPos = Pos(Filter,"~t",li_TabPos + 1)
Loop

ls_Token        = Mid(Filter,li_Start)
StrCopy(OFName.lpstrFilter + (li_Start - 1),ls_Token,Len(ls_Token))

//设置结构的大小
OFName.lStructSize = 76
//设置父窗口为对话框的属主
OFName.hwndOwner = Handle(Parent)
//设置应用实例,在PB中设置为0
OFName.hInstance = 0
OFName.lpstrFile = ""
OFName.nMaxFile = MAX_BUFFER_LENGTH - 1
OFName.lpstrFileTitle = Space(MAX_BUFFER_LENGTH)
OFName.nMaxFileTitle = MAX_BUFFER_LENGTH - 1
//设置初始化目录
OFName.lpstrInitialDir = "C:\"
//设置对话框标题
OFName.lpstrTitle = "打开文件"
OFName.nFilterIndex        = 1
//设置标识符
OFName.flags = 0

//显示打开对话框
ll_rc = GetOpenFileName(OFName)
       
//判断用户的操作
If ll_rc = 1 Then
   //显示用户选择的文件名在文本框中
        sle_1.Text = RightTrim(OFName.lpstrFile)

        //显示文件内容在文本编辑框中
        ll_len = Len(Trim(sle_1.Text))
        ls_bmp = Mid(Trim(sle_1.Text), ll_len - 2, 3)

        If ls_bmp = "bmp" or ls_bmp = "BMP" Then
                //如果为位图文件,将位图插入到RichText控件
                rte_1.InsertPicture(trim(sle_1.Text))
        Else
                //将打开的文本文件或RTF文件插入到RichText控件
                rte_1.InsertDocument(sle_1.Text, TRUE)
        End If
Else
   MessageBox("打开文件: ","按下取消按钮")
End If

//释放内存
LocalFree(OFName.lpstrFilter)

--------------摘自《Win32 API程序设计 基础卷》\第13章 文件及文件夹选择对话框\GetOpenFile_API



xgbluebird 发表于 2015-5-6 20:05:55

楼主上的代码第一行就是错的
s_openfilename openfilename

结构类名应放行前,实例名放在行后
OPENFILENAME OFName
页: [1]
查看完整版本: GetOpenfilename 的使用

免责声明:
本站所发布的一切破解补丁、注册机和注册信息及软件的解密分析文章仅限用于学习和研究目的;不得将上述内容用于商业或者非法用途,否则,一切后果请用户自负。本站信息来自网络,版权争议与本站无关。您必须在下载后的24个小时之内,从您的电脑中彻底删除上述内容。如果您喜欢该程序,请支持正版软件,购买注册,得到更好的正版服务。如有侵权请邮件与我们联系处理。

Mail To:Admin@SybaseBbs.com