ピクチャボックスの画像を消えなくするには?

解決


かかし  2010-02-06 00:30:57  No: 71361

サブダイアログのピクチャボックスにビットマップ画像を
表示していますが、他のウィンドウが重なると、その
部分の画像が消えてしまいます。

消えない対象方法をお教え頂けないでしょうか。

ビットマップ画像表示のコードです。
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);


aetos  2010-02-06 00:49:24  No: 71362

そのコードをどこに書いているかが問題です。
ダイアログであれば OnPaint に書きましょう。


かかし  2010-02-06 22:31:30  No: 71363

お世話になります。

Visual Stduio2005 C++にてダイアログクラスで
ダイアログを表示しています。
cImageViewP = new CImageView(this);
cImageViewP->Create(IDD_IMAGE_VIEW);
cImageViewP->ShowWindow(SW_SHOW);

ビットマップ画像表示のコードは
CImageView::SetViewData(int pageno)
{
}
に書いてあります。

ダイアログクラスにOnPaint()をオーバーライドする
方法がわかりません。


かかし  2010-02-09 02:57:47  No: 71364

お世話になります。

OnPaint()でビットマップ表示する関数SetImageData()
呼んでいるのでが、やはり他のウィンドウが重なると、その
部分の画像が消えてしまいます。

対処方法をご存知の方がいらっしゃいましら教えてください。

void CImageView::OnPaint()
{
CPaintDC dc(this); // device context for painting
// TODO: ここにメッセージ ハンドラ コードを追加します。
// 描画メッセージで CDialog::OnPaint() を呼び出さないでください。
if(m_DrawStatus == TRUE)
    SetImageData();
    m_DrawStatus = FALSE;
}


ryo  2010-02-09 04:01:50  No: 71365

OnPaintにTRACE文やブレイクをつかって、
「他のウィンドウをかぶせたあと、それをどかしたときに、OnPaintが呼び出されているか」
を確認してください。

で、呼び出されている場合は以下を

まず、
他のウィンドウに隠れたり最小化した場合、その「描画情報」は無くなります。

そのため、「必要になったら毎回書きなおす」ことになります
OnPaintは、この「必要なった時」にOSから通知されて呼び出される場所になります。

「OnPaintにかけば、あとはOSがうまいこと保持・管理してくれる」わけではありません。

なので、
「OnPaintで一回描画したあと、フラグを変更し、次回呼ばれたときは描画しない」
という流れになっている処理では、再描画されません


かかし  2010-02-09 05:39:12  No: 71366

お世話になります。

ryoさん

御指摘通り、OnPaintが呼び出されるたびに、
再描画できていませんでした。
フラグを設けて再描画するように変更したところ、意図した処理を実現
できました。

有難う御座いました。


GAKU  2010-03-07 01:34:05  No: 71367

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();//これはもともとある関数

原因がなかなかつかめなくて困ってます。

よろしくお願いします。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加