游戏开发论坛

 找回密码
 立即注册
搜索
查看: 2633|回复: 6

调用GetOpenFileName()出现了奇怪的问题

[复制链接]

21

主题

92

帖子

92

积分

注册会员

Rank: 2

积分
92
QQ
发表于 2007-5-9 08:54:00 | 显示全部楼层 |阅读模式
/*----------------------------
*OpenSaveDialog
*功能:打开另存为对话框函数
*参数说明:dwFlag模式 0为打开对话框,1为另存为对话框
*----------------------------*/
BOOL CMapEditor::OpenSaveDialog( int dwFlag )
{
    // 设置OPENFILENAME结构
    OPENFILENAME ofn ;//
    ZeroMemory(&ofn, sizeof(ofn));

    static const TCHAR szFilter[] =
                TEXT("Map Files (.txt)\0*.txt;\0")TEXT("All Files (*.*)\0*.*;\0");
    ofn.lStructSize         = sizeof(OPENFILENAME);
    ofn.hwndOwner           = m_pApp->GetWindow();
    ofn.hInstance           = NULL;
    ofn.lpstrFilter         = szFilter;
    ofn.nFilterIndex        = 1;
    ofn.lpstrCustomFilter   = NULL;
    ofn.nMaxCustFilter      = 0;
    ofn.lpstrFile           = m_MapFileName;
    ofn.nMaxFile            = MAX_PATH;
    ofn.lpstrFileTitle      = NULL;
    ofn.nMaxFileTitle       = 0;
    ofn.lpstrInitialDir     = NULL;
    if( dwFlag == 0 )//打开文件编辑
        ofn.lpstrTitle      = TEXT("选择一个场景文件...");
    else//保存文件
        ofn.lpstrTitle      = TEXT("保存为指定的文件...");
    ofn.Flags               = OFN_HIDEREADONLY;
    ofn.nFileOffset         = 0;
    ofn.nFileExtension      = 0;
    ofn.lpstrDefExt         = TEXT("txt");
    ofn.lCustData           = 0L;
    ofn.lpfnHook            = NULL;
    ofn.lpTemplateName      = NULL;

    if( dwFlag == 0 )//打开文件编辑
        return GetOpenFileName( &ofn );
    else //保存文件
        return GetSaveFileName( &ofn );
}





BOOL CDDraw::GetBMPInfo(char* FileName,int &iBMPW,int &iBMPH)
{
        if(FileName==NULL)
        {
                MessageBox(m_hWnd,"传递的文件名是空的!","出错",0);
                return FALSE;
        }
        HBITMAP hbm;
        BITMAP bm;
        hbm=(HBITMAP)LoadImage( NULL,FileName,IMAGE_BITMAP,0,0,LR_LOADFROMFILE|LR_CREATEDIBSECTION);
        if(hbm==NULL)
        {
                MessageBox(m_hWnd,"无法加载Bitmap文件","出错",0);
                return FALSE;
        }
        GetObject(hbm,sizeof(bm),&bm);
        iBMPW=bm.bmWidth;
        iBMPH=bm.bmHeight;
        if(hbm)
                DeleteObject(hbm);
        return TRUE;
}







void CMapEditor::ShowNpc()
{
        for( int i=0; i<m_iNpcNum; i++ )
        {
                if( m_Npc.ID != -1 &&
                        m_Npc.XPos >= m_iMapX &&
                        m_Npc.YPos >= m_iMapY &&
                        m_Npc.XPos <= m_iMapX+16 &&       
                        m_Npc.YPos <= m_iMapX+16 )
                {
                        int W=0, H=0, RoleW=0, RoleH=0;

                                //用LoadImage()来加载
                        m_pDDraw->GetBMPInfo( m_Npc.PicFileName, W, H );
                        RoleW = W/m_Npc.MaxFrame;
                        RoleH = H/m_Npc.MaxFace;;

                        RECT rect = { 0,0,RoleW,RoleH };

                        LPDIRECTDRAWSURFACE7 lpDDSNpc = NULL;
                        m_pDDraw->CreateBMPSurface( lpDDSNpc, 0, 0, m_Npc.PicFileName );
                        m_pDDraw->DDSetColorKey( lpDDSNpc, RGB( m_Npc.r, m_Npc.g, m_Npc.b ) );

                        //画出来
                        m_pDDraw->Blit( m_lpDDSMap, (m_Npc.XPos-m_iMapX)<<5, ((m_Npc.YPos-m_iMapY)<<5)-16, lpDDSNpc, &rect, SrcKey );                       
                       
                        if( lpDDSNpc )
                        {
                                lpDDSNpc->Release();
                                lpDDSNpc = NULL;
                        }
                }
        }
}


在不出现打开/保存对话框时都好好的,每当GetOpenFileName()或GetSaveFileName()之后再调用ShowNpc()时,LoadImage()函数就返回NULL [em7]

9

主题

249

帖子

260

积分

中级会员

Rank: 3Rank: 3

积分
260
发表于 2007-5-9 14:53:00 | 显示全部楼层

Re:调用GetOpenFileName()出现了奇怪的问题

看不出来
很怀疑问题是在上面代码中吗?

8

主题

390

帖子

390

积分

中级会员

Rank: 3Rank: 3

积分
390
发表于 2007-5-9 17:21:00 | 显示全部楼层

Re:调用GetOpenFileName()出现了奇怪的问题

GetOpenFileName 和 GetSaveFileName这俩家伙会改变当前路径,所以再打开文件时会路径出错,记得搞这个前调用类似GetCurrentDirectory(),完了再恢复SetCurrentDirectory(),具体api名称记的不一定对。

89

主题

4036

帖子

4132

积分

论坛元老

Rank: 8Rank: 8

积分
4132
发表于 2007-5-9 20:25:00 | 显示全部楼层

Re:调用GetOpenFileName()出现了奇怪的问题

用MSDN
我一般用 ABSPATH("./xxxx.xx")这样的宏来设置绝对路径。

21

主题

92

帖子

92

积分

注册会员

Rank: 2

积分
92
QQ
 楼主| 发表于 2007-5-10 10:12:00 | 显示全部楼层

Re:调用GetOpenFileName()出现了奇怪的问题

我单步调试时,就是在调用GetOpenFileName()和GetSaveFileName()后,才出现问题

郁闷了我好长时间了...

是不是调用GetOpenFileName()和GetSaveFileName()后,改变的只是  
ofn.lpstrFile = m_MapFileName; 这个啊

21

主题

92

帖子

92

积分

注册会员

Rank: 2

积分
92
QQ
 楼主| 发表于 2007-5-10 10:27:00 | 显示全部楼层

Re:调用GetOpenFileName()出现了奇怪的问题

我试了试,把保存的地点设的和默认路径相同,果然就好了,看来就是调用后改变路径的原因,我再找找看怎么能改过来

谢谢了   

21

主题

92

帖子

92

积分

注册会员

Rank: 2

积分
92
QQ
 楼主| 发表于 2007-5-10 10:56:00 | 显示全部楼层

Re:调用GetOpenFileName()出现了奇怪的问题

谢谢大家,问题解决了

to ReallyBigBug:
就是那两个API,名子没记错
真的是太谢谢了,这个问题折腾我好长时间了
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2026-1-26 11:56

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表