如何在对话框首次出现时使用SDI应用程序放置图像?

时间:2013-10-15 06:26:51

标签: visual-c++ mfc sdi

我正在使用VC ++中的CFormView类开发基于MFC的SDI应用程序。我的问题是我需要在对话框最初出现时加载图像。如何在SDI应用程序中放置图像..我知道基于对话框的应用程序可以使用OnInitDialog应用程序完成。但对于SDI应用程序,没有这样的功能。我尝试使用OnInitialUpdate()和OnPaint()函数放置图像。但是它失败了......当我第一次出现时,我该怎么做才能将图像置于对话框中?请帮忙

提前致谢

我放在OnInitialUpdate()

中的代码
void CECUSimulatorView::OnInitialUpdate()
{
CFormView::OnInitialUpdate();
GetParentFrame()->RecalcLayout();
ResizeParentToFit();
hBitmap = LoadImage(0,_T("F:/ECUSimulator/ECUSimulator_New/res/LedOff.bmp"),               IMAGE_BITMAP,0,0,LR_LOADFROMFILE);
ImageLoading();
}

ImageLoading()函数的代码

void CECUSimulatorView::OnInitialUpdate()
{
HDC hDC, hDCToDisplay = NULL;
hDC = CreateCompatibleDC(hDCToDisplay);
SelectObject(hDC,hBitmap);
hDCToDisplay = ::GetDC(m_picture.m_hWnd);
m_picture.GetWindowRect(&picRect);
BitBlt(hDCToDisplay,0 , 0, (picRect.right - picRect.left), (picRect.bottom -picRect.top), hDC, 0 ,0 ,SRCCOPY);
DeleteDC(hDC);
DeleteDC(hDCToDisplay);
}

这里

HANDLE hBitmap; CStatic m_picture; //优化校准 CRect picRect; // Picture Control Rect

我从OnInitialUpdate()中删除了代码并将其放在OnPaint()函数中,如下所示:

void CECUSimulatorView :: OnPaint() {     CPaintDC dc(this); //绘画的设备上下文

hBitmap = LoadImage(0,_T("F:/ECUSimulator/ECUSimulator_New/res/LedOff.bmp"), IMAGE_BITMAP,0,0,LR_LOADFROMFILE);
ImageLoading();

}

3 个答案:

答案 0 :(得分:0)

LoadImage()中调用OnInitialUpdate()即可,实际绘画​​需要通过以下两种方式之一完成:

a)在CECUSimulatorView::OnDraw()中 - 更容易,但可能会引入闪烁

b)使用ClassWizard覆盖OnPaint()控件的m_picture函数并在那里绘制图片

答案 1 :(得分:0)

[上一个答案中的评论非常广泛,因此是一个新答案]

a)基于CStatic派生一个新类(比如CMyPicture),将m_picture更改为这个新类

b)在CMyPicture中,为WM_PAINT创建一个处理程序,通常称为CMyPicture::OnPaint()

c)更改您的ImageLoading()功能,以CDC *pDC为参数,并使用此DC呈现图片

d)

void CMyStatic::OnPaint(void)
{   CPaintDC dc(this);
    ImageLoading(&dc); // or even move the painting logic here
}

注意:您可以在OnInitialUpdate()中加载图片,无需在每次绘画时加载

this SO Answer中的示例(对话框,但不应影响绘画逻辑)。

答案 2 :(得分:0)

我找到了问题的答案。 我使用CBitmap类如下:

CBitmap m_bBitmap1;

在OnInitialUpdate()中,我写了如下:

m_bBitmap1.LoadBitmapW(IDB_BITMAP1);

在OnPaint()中,我写了如下:

m_picture.SetBitmap(m_bBitmap1);

无论何处(其中所有函数都需要加载图像)只需在相应的函数中调用上面的代码行。