C++ 使用mfc对话框显示.bmp图像时出错

C++ 使用mfc对话框显示.bmp图像时出错,c++,mfc,C++,Mfc,我正在尝试使用MFC应用程序显示位图图像。 我使用一个浏览按钮来选择正常工作的文件。但是,当我试图通过双击文件来加载图像时,应用程序会启动,但图像不会显示 下面是我的代码,用于浏览按钮和打开双击图像的函数 void COpenImageDlg::OnBnClickedButton1() { // TODO: Add your control notification handler code here CString path; CFileDialog dlg(TRUE)

我正在尝试使用MFC应用程序显示位图图像。 我使用一个浏览按钮来选择正常工作的文件。但是,当我试图通过双击文件来加载图像时,应用程序会启动,但图像不会显示

下面是我的代码,用于浏览按钮和打开双击图像的函数

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() { //如果应用程序 //清单指定使用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;
}`


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

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

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


在SDI MFC应用程序中,只要您没有覆盖默认的文件/打开处理机制,这将由框架自动处理,但如果您有一个基于对话框的应用程序,您需要自己为此添加代码。

我理解,当您双击文件以选择“文件上的图像”对话框时,图像没有显示。我刚刚在bClickedButton1和OpenImage1上尝试了你的函数代码。结果表明,双击选择图像时会显示图像。我在win7上使用VS2010。虽然我没有发现代码的错误,但我希望这将对您有所帮助。

在命令行有机会处理之前,您的对话框
COpenImageDlg
已创建并显示在对
DoModal
的调用中。当
DoModal
返回时,对话框已被破坏,因此没有可供代码使用的对话框。

我找到了问题的答案。 这实际上是一个非常愚蠢的错误。 当我使用命令行读取文件地址时,地址是单斜杠,而我需要使用双斜杠传递地址。
真是一只愚蠢的虫子。很抱歉浪费你的时间。

我理解你的意思。我添加了这个代码来获取路径。
char*buff;char*command_line=GetCommandLine();buff=strchr(命令行“”);buff++;如果(buff!=NULL){dlg.OpenImage1(buff);}
@Khushboo那么当您调试到该函数中时,您会得到与浏览时完全相同的文件名吗?请记住,命令行上的第一个参数是应用程序名本身。我查过了。但是不知道以后会发生什么错误。@Khushboo那么问题一定出在您没有显示的代码中。浏览按钮代码的作用是什么?这不需要双击,所以里面的任何事情都不会发生。好的,谢谢:)我会调查的。我不确定你现在是否理解我。我的意思是,当我为图像选择open with并选择此应用程序时,会出现对话框,但没有图像。然后我又不得不浏览打开它。是的,这就是问题所在。你能告诉我怎么修吗?调用OpenImage1函数后,是否应该调用
DoModal
?如果由于
CClientDC
@Khushboo而删除此调用,则会出现错误,解决此问题的简单方法是在
COpenImageDlg
本身内部绘制所有图形。要直接打开的文件的路径在对话框打开之前传递到对话框中(Domodal)。这可以通过声明一个公共成员变量
COpenImageDlg
来完成,并在对话框实例化后从外部设置值。@Khushboo,在对话框的
OnInitDialog
函数中,检查该变量,如果该变量不为空,则直接执行位图操作。但是,在绘制位图的逻辑顺序中存在一个问题,因为它可能没有正确地重新绘制。处理图形的正确方法是缓存位图并在
OnPaint
OnEraseBkgnd
中绘制。