0

我正在使用 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);
}

这里

处理 hBitmap;CStatic m_picture; //图片控制CRect picRect; //图片控制矩形

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

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

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

}

4

3 回答 3

0

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

CBitmap m_bBitmap1;

在 OnInitialUpdate() 我写如下:

m_bBitmap1.LoadBitmapW(IDB_BITMAP1);

在 OnPaint() 我写如下:

m_picture.SetBitmap(m_bBitmap1);

无论在哪里(其中所有功能)需要加载图像只需在相应的功能中调用上面的代码行..

于 2013-10-17T12:33:20.613 回答
0

[上一个答案中的评论变得非常广泛,因此有了一个新答案]

CMyPicturea )基于 CStatic派生一个新类(例如),更改m_picture为这个新类

b) 在 中CMyPicture,为 创建一个处理程序WM_PAINT,这通常会被调用CMyPicture::OnPaint()

c) 将您的ImageLoading()函数更改为采用CDC *pDCas 参数并使用它DC来渲染图像

d)

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

注意:您可以将图像加载到 中OnInitialUpdate(),无需每次绘画时都加载

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

于 2013-10-15T10:29:15.820 回答
0

调用LoadImage()OnInitialUpdate()ok了,实际画图需要以下两种方式之一进行:

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

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

于 2013-10-15T08:11:35.713 回答