2013-12-20 48 views
0

我想使用MFC应用程序显示位图图像。 我正在使用浏览按钮来选择正常工作的文件。但是,当我尝试通过双击文件加载图像时,应用程序启动,但图像不显示。使用mfc对话框显示.bmp图像时出错

这里是我的代码浏览按钮和功能打开双击图像。

void COpenImageDlg::OnBnClickedButton1() 
{ 
    // TODO: Add your control notification handler code here 
    CString path; 
    CFileDialog dlg(TRUE); 
    int result=dlg.DoModal(); 
    if(result==IDOK) 
    { 
    path=dlg.GetPathName(); 
    UpdateData(FALSE); 
    } 

    HBITMAP hBmp = (HBITMAP)::LoadImage(NULL, path, IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE|LR_CREATEDIBSECTION); 
    CBitmap bmp; 

    bmp.Attach(hBmp); 

    CClientDC dc(this); 
    CDC bmDC; 
    bmDC.CreateCompatibleDC(&dc); 
    CBitmap *pOldbmp = bmDC.SelectObject(&bmp); 

    BITMAP bi; 
    bmp.GetBitmap(&bi); 

    dc.BitBlt(0,0,bi.bmWidth,bi.bmHeight,&bmDC,0,0,SRCCOPY); 

    bmDC.SelectObject(pOldbmp); 
} 

void COpenImageDlg::OpenImage1(CString path) 
{ 

    //CString path; 
    CFileDialog dlg(TRUE); 
    int result=dlg.DoModal(); 
    if(result==IDOK) 
    { 
    path=dlg.GetPathName(); 
    UpdateData(FALSE); 
    } 

    HBITMAP hBmp = (HBITMAP)::LoadImage(NULL, path, IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE|LR_CREATEDIBSECTION); 
    CBitmap bmp; 

    bmp.Attach(hBmp); 

    CClientDC dc(this); 
    CDC bmDC; 
    bmDC.CreateCompatibleDC(&dc); 
    CBitmap *pOldbmp = bmDC.SelectObject(&bmp); 

    BITMAP bi; 
    bmp.GetBitmap(&bi); 

    dc.BitBlt(0,0,bi.bmWidth,bi.bmHeight,&bmDC,0,0,SRCCOPY); 
} 

初始化类:

`BOOL COpenImageApp :: InitInstance中(){ // INITCOMMONCONTROLSEX()需要在Windows XP中,如果一个应用程序 清单指定要//使用COMCTL32.DLL版本6或更高版本启用 //视觉样式。否则,任何窗口创建都将失败。

INITCOMMONCONTROLSEX InitCtrls; 
InitCtrls.dwSize = sizeof(InitCtrls); 
// Set this to include all the common control classes you want to use 
// in your application. 
InitCtrls.dwICC = ICC_WIN95_CLASSES; 
InitCommonControlsEx(&InitCtrls); 

CWinApp::InitInstance(); 

AfxEnableControlContainer(); 

// Create the shell manager, in case the dialog contains 
// any shell tree view or shell list view controls. 
CShellManager *pShellManager = new CShellManager; 


// Standard initialization 
// If you are not using these features and wish to reduce the size 
// of your final executable, you should remove from the following 
// the specific initialization routines you do not need 
// Change the registry key under which our settings are stored 
// TODO: You should modify this string to be something appropriate 
// such as the name of your company or organization 
SetRegistryKey(_T("Local AppWizard-Generated Applications")); 

COpenImageDlg dlg; 
m_pMainWnd = &dlg; 
INT_PTR nResponse = dlg.DoModal(); 

char* buff; 
char* command_line = GetCommandLine(); 

buff = strchr(command_line, ' '); 
buff++; 
buff = strchr(buff, ' '); 
buff++; 
buff = strchr(buff, ' '); 
buff++; 

if (buff != NULL) 
{ 

HBITMAP hBmp = (HBITMAP)::LoadImage(NULL, "C:\Users\Raguvaran\Desktop\tiger.bmp", IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE|LR_CREATEDIBSECTION); 
CBitmap bmp; 
bmp.Attach(hBmp); 

dlg.RedrawWindow(); 
CClientDC dc(m_pMainWnd); 
CDC bmDC; 
bmDC.CreateCompatibleDC(&dc); 
CBitmap *pOldbmp = bmDC.SelectObject(&bmp); 

BITMAP bi; 
bmp.GetBitmap(&bi); 

dc.BitBlt(0,0,bi.bmWidth,bi.bmHeight,&bmDC,0,0,SRCCOPY); 

} 

//RedrawWindow(dlg, NULL, NULL, RDW_INVALIDATE); 
//UpdateWindow(dlg); 

if (nResponse == IDOK) 
{ 
    // TODO: Place code here to handle when the dialog is 
    // dismissed with OK 
} 
else if (nResponse == IDCANCEL) 
{ 
    // TODO: Place code here to handle when the dialog is 
    // dismissed with Cancel 
} 

// Delete the shell manager created above. 
if (pShellManager != NULL) 
{ 
    delete pShellManager; 
} 

// Since the dialog has been closed, return FALSE so that we exit the 
// application, rather than start the application's message pump. 
return FALSE; 

}`

我用于浏览按钮相同的代码,并显示图像。但是,当我双击文件时,图像不显示。请告诉我我做错了什么。

回答

0

我找到了我的问题的答案。这其实是一个非常愚蠢的错误。 当我使用命令行读取文件地址时,地址有单斜杠,而我需要使用双斜杠传递地址。 这样一个愚蠢的错误。对不起,浪费你的时间。

1

如果您已将您的应用程序与特定的文件扩展名关联,则当您双击此文件时(如您所述),它将自动启动。

发生这种情况时,应用程序将以作为命令行参数提供给您的应用程序的文件名(实际上是完整路径)启动。

在SDI MFC应用程序中,只要您没有重写默认的文件/打开处理机制,就可以由框架自动处理,但是如果您有基于对话框的应用程序,则需要为此自行添加代码。

+0

我明白你的观点。 我添加了这段代码来获取路径。 \t'char * buff; \t char * command_line = GetCommandLine(); \t \t \t buff = strchr(command_line,''); \t buff ++; \t \t if(buff!= NULL) \t { \t \t dlg.OpenImage1(buff); \t \t \t}' – Khushboo

+0

我得到正确的路径。但静止图像不显示。 – Khushboo

+0

@Khushboo所以,当你调试到这个功能,你有没有得到完全相同的文件名,当你浏览?请记住,命令行中的第一个参数是应用程序名称本身。 –

0

据我所知,当你双击文件选择文件对话框中的图像时,图像不显示。我只是尝试了你的函数OnBnClickedButton1和OpenImage1的代码。事实证明,双击图像时显示图像。我在win7上使用VS2010。我希望这会帮助你,虽然我不会找到你的代码的错误。

+0

我不确定你目前是否了解我。我的意思是,当我选择打开图像并选择此应用程序时,会弹出对话框,但没有图像。然后我再次浏览打开它。 – Khushboo

1

您的对话框COpenImageDlg在命令行有机会处理之前被创建并显示在DoModal的调用中。当DoModal返回时,对话框已经被销毁,所以没有对话框供代码使用。

+0

是的,就是这个问题。你能告诉我该如何解决它?我应该在调用OpenImage1函数后给出'DoModal'调用吗?由于'CClientDC',如果我删除此调用,则会出现错误。 – Khushboo

+0

@Khushboo,解决这个问题的简单方法是在'COpenImageDlg'内部完成所有的绘图。直接打开文件的路径在对话框打开之前传递到对话框中(Domodal)。这可以通过声明一个公共成员变量'COpenImageDlg'来完成,并在实例化对话框之后从外部设置值。 – nobody99

+0

@Khushboo,在对话框的OnInitDialog函数中,检查这个变量,如果它不是空的,直接执行位图操作。但是,绘制位图的逻辑序列中存在问题,因为它可能无法正确重新绘制。处理图形的正确方法是缓存位图并将其绘制在“OnPaint”或“OnEraseBkgnd”中。 – nobody99