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);
}

ここ

HANDLE hBitmap; CStatic m_picture; //ピクチャ コントロール CRect picRect; //画像制御矩形

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();

}

4

3 に答える 3

0

[前の回答のコメントが非常に拡張されたため、新しい回答]

a)CMyPictureCStaticに基づいて新しいクラス(たとえば)を派生させ、m_pictureこの新しいクラスに変更します

b) でCMyPicture、 のハンドラを作成しますWM_PAINT。これは通常呼び出されますCMyPicture::OnPaint()

c) as パラメータImageLoading()を受け取るように関数を変更し、これを使用して画像をレンダリングしますCDC *pDCDC

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

私の問題に対する答えを見つけました。次のように CBitmap クラスを使用しました。

CBitmap m_bBitmap1;

OnInitialUpdate() では、次のように書きました。

m_bBitmap1.LoadBitmapW(IDB_BITMAP1);

OnPaint() では、次のように書きました。

m_picture.SetBitmap(m_bBitmap1);

どこでも(すべての関数で)画像をロードする必要がある場合は、対応する関数で上記のコード行を呼び出すだけです..

于 2013-10-17T12:33:20.613 に答える
0

呼び出しLoadImage()OnInitialUpdate()問題ありません。実際のペイントは、次の 2 つの方法のいずれかで行う必要があります。

a) in CECUSimulatorView::OnDraw()-- 簡単ですが、ちらつきが発生する可能性があります

b) ClassWizard を使用しOnPaint()てコントロールの機能をオーバーライドし、m_pictureそこに画像を描画する

于 2013-10-15T08:11:35.713 に答える