サブダイアログのピクチャボックスにビットマップ画像を
表示していますが、他のウィンドウが重なると、その
部分の画像が消えてしまいます。
消えない対象方法をお教え頂けないでしょうか。
ビットマップ画像表示のコードです。
CImage img;
CBitmap *myBMP;
CDC *pDC = m_pict.GetDC();
CDC myDC;
CRect rect;
m_pict.GetClientRect(&rect);
pDC->Rectangle(&rect);
CClientDC myPictDC(&m_pict);
myPictDC.FillSolidRect(rect, RGB(255, 255, 255));
img.Load(_T("C:\\V_IF\\20091222_213031\\JobNo1\\img_1.bmp"));
myBMP = CBitmap::FromHandle(img);
myDC.CreateCompatibleDC(pDC);
CBitmap *oldBMP = myDC.SelectObject(myBMP);
pDC->BitBlt(0, 0, 1000, 1000, &myDC, 0,0,SRCCOPY);
myDC.SelectObject(oldBMP);
そのコードをどこに書いているかが問題です。
ダイアログであれば OnPaint に書きましょう。
お世話になります。
Visual Stduio2005 C++にてダイアログクラスで
ダイアログを表示しています。
cImageViewP = new CImageView(this);
cImageViewP->Create(IDD_IMAGE_VIEW);
cImageViewP->ShowWindow(SW_SHOW);
ビットマップ画像表示のコードは
CImageView::SetViewData(int pageno)
{
}
に書いてあります。
ダイアログクラスにOnPaint()をオーバーライドする
方法がわかりません。
お世話になります。
OnPaint()でビットマップ表示する関数SetImageData()
呼んでいるのでが、やはり他のウィンドウが重なると、その
部分の画像が消えてしまいます。
対処方法をご存知の方がいらっしゃいましら教えてください。
void CImageView::OnPaint()
{
CPaintDC dc(this); // device context for painting
// TODO: ここにメッセージ ハンドラ コードを追加します。
// 描画メッセージで CDialog::OnPaint() を呼び出さないでください。
if(m_DrawStatus == TRUE)
SetImageData();
m_DrawStatus = FALSE;
}
OnPaintにTRACE文やブレイクをつかって、
「他のウィンドウをかぶせたあと、それをどかしたときに、OnPaintが呼び出されているか」
を確認してください。
で、呼び出されている場合は以下を
まず、
他のウィンドウに隠れたり最小化した場合、その「描画情報」は無くなります。
そのため、「必要になったら毎回書きなおす」ことになります
OnPaintは、この「必要なった時」にOSから通知されて呼び出される場所になります。
「OnPaintにかけば、あとはOSがうまいこと保持・管理してくれる」わけではありません。
なので、
「OnPaintで一回描画したあと、フラグを変更し、次回呼ばれたときは描画しない」
という流れになっている処理では、再描画されません
お世話になります。
ryoさん
御指摘通り、OnPaintが呼び出されるたびに、
再描画できていませんでした。
フラグを設けて再描画するように変更したところ、意図した処理を実現
できました。
有難う御座いました。
visual studio 2005 C++ MFC
ダイアログベースでアプリを開発しています。
ダイアログにピクチャーボックスを貼り付けて、OnPaint()関数内で
ピクチャボックスの背景を黒にする処理だけを入れていて気がついたのですが一点問題が発生してこまっています。
このアプリをモニターから外したり、他のアプリを横切らしたりした場合は
問題なく再描画されて黒くなるのですが、他のアプリを開いてピクチャボックスの上に持ってきてXボタンでいきなり閉じるとピクチャボックスの領域が
クライアント領域のベージュの色のままになってしまいます。
この状態でこのアプリを移動してモニターから外して再度もどしたら
正常に黒になります。
ブレークをかけると他のアプリをxボタンで閉じてもちゃんとOnPaint()に
飛んできて黒くする関数は実行しているようなのですが何故か黒になりません。
以下のコードをOnPaint()内で実行しています。
CClientDC myPictDC(&m_PICTURE1);
CRect myRect;
m_PICTURE1.GetClientRect(myRect);
myPictDC.FillSolidRect(myRect,RGB(0,0,0));//picture1 boxを黒にする。
CDialog::OnPaint();//これはもともとある関数
原因がなかなかつかめなくて困ってます。
よろしくお願いします。
ツイート | ![]() |