我正在使用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();
}
答案 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);
无论何处(其中所有函数都需要加载图像)只需在相应的函数中调用上面的代码行。