クライアント領域のコントロールが描画されない

このQ&Aのポイント
  • WindowsXP / VC2005 / VC++ MFCにてダイヤログベースの画像ビューワの作成を行っています。機能としては、独自形式のバイナリファイルをダイヤログへドラッグ&ドロップすることにより、メモリに描画した画像をクライアント領域へ転送して表示します。
  • しかし、ダイヤログへ画像をドラッグ&ドロップする際に、元々配置していたエディットボックスやスピンボタンなどのコントロールが消えてしまいます。
  • この問題を解決するためには、クライアント領域を描画する際にコントロールを消さないようにする必要があります。また、再描画を行うことによりコントロールが表示されるようになりますが、クライアント領域の書き換え時にちらつきが発生します。
回答を見る
  • ベストアンサー

クライアント領域のコントロールが描画されない

WindowsXP / VC2005 / VC++ MFCにてダイヤログベースの画像ビューワの作成を行っています。 機能としては、独自形式のバイナリファイルをダイヤログへドラッグ&ドロップすることにより、 メモリに描画した画像をクライアント領域へ転送して表示します。 こちらが疑問点となるところなのですが、その際にもともと配置していた エディットボックスやスピンボタンなどのコントロールが消えてしまいます。 (見えなくてもボタンを押すことはできるので描画の問題と思われます) 1.なぜこのようなことが起こるのでしょうか? 2・また、コントロールを消さないためにはどうすればよいのでしょうか? 上記に関してご回答いただけると幸いです。 個人的な考えとしては、  1.クライアント領域を描画する際にコントロールを消してしまっている  2.再描画することによりコントロールは表示される(但し問題点としてクライアント領域を書き換える際にちらつく) です。 以下該当関数です //------------------------------------------------------------------------------ void CTestBitBltDlg::OnDropFiles(HDROP hDropInfo) { char acFileName[256]; SHORT sRet; memset(acFileName, 0, sizeof(acFileName)); DragQueryFile(hDropInfo, 0, acFileName, sizeof(acFileName)); memcpy( g_acSpriteFileName, acFileName, 256 - 1 ); CRect rc; GetClientRect(&rc); CClientDC dc(this); CDC dcMem; dcMem.CreateCompatibleDC(&dc); CBitmap bmp; bmp.CreateCompatibleBitmap(&dc, rc.Width(), rc.Height()); CBitmap* pOldBmp = dcMem.SelectObject(&bmp); dcMem.FillSolidRect(&rc, RGB(0xC0, 0xC0, 0xC0)); // 本関数にてメインとなるメモリDCへの描画をおこなってます sRet = GetMemoryImage(g_acSpriteFileName, 0, &dcMem); if( sRet == FALSE ){ GetDefaultImage(&dcMem); } dc.BitBlt(0, 0, rc.Width(), rc.Height(), &dcMem, 0, 0, SRCCOPY); dcMem.SelectObject(pOldBmp); //InvalidateRect(FALSE); CDialog::OnDropFiles(hDropInfo); } //------------------------------------------------------------------------------ なお、OnEraseBkgnd関数においてはTRUEのみを返すようにしてます。

  • y3k
  • お礼率90% (48/53)

質問者が選んだベストアンサー

  • ベストアンサー
  • Wr5
  • ベストアンサー率53% (2177/4070)
回答No.1

クリッピングの問題ではないでしょうか? リソースエディタでダイアログのプロパティから「Clip Children」か「Clip Siblings」かをTrueに設定してみては? # ダイアログのDCに直接転送しているようですし、「Clip Children」かな?

y3k
質問者

お礼

早速のご回答ありがとうございます。 「Clip Children」「Clip Siblings」ともにFalseとなっており、「Clip Children」をTrueにしましたところ、 コントロールが非表示とならず、正しく描画されるようになりました!大変たすかりました。 詳しく知りたかったので、Googleなどで"Clip Children"を検索してみたのですが、 まったくと言っていいほどみつかりませんでした。あまり知られてないのでしょうか^^;

関連するQ&A

  • 非クライアント領域への描画について

    非クライアント領域に文字を書こうとしました。 以下の(2)では書けますが、(1)では書いてくれません。 CPaintDCはクライアント領域でないとダメなのですか? void CMainFrame::OnPaint() { CPaintDC dc(this); // 描画用のデバイス コンテキスト dc.TextOut(0,0,"こんにちは"); ・・・(1) CDC* pDC = GetWindowDC(); pDC->TextOut(100,0,"こんにちは"); ・・・(2) 環境 WIN98 VC++6.0 MFC

  • クライアント領域をCBitmapに取り込みたい

    VC6.0MFCで クライアント領域(みたまま)を CBitmapに取り込みたいのですがどうすればよいのでしょうか? ためしにダイアログの領域をクリップボードに取り込むコード OnPaint書いたのですが真っ黒の画像しか取り込めていませんでした。 根本的に使うAPIが違うのでしょうか? void CCaptureDlg::OnPaint() {  CPaintDC dc(this); // 描画用のデバイス コンテキスト  CRect cr;  GetClientRect(&cr);  dc.TextOut(0,0,"テスト");  CDC* pDC = new CDC();  pDC->CreateCompatibleDC(&dc);  CBitmap img;  img.CreateCompatibleBitmap(pDC, cr.Width(), cr.Height());  OpenClipboard();  ::EmptyClipboard();  ::SetClipboardData(CF_BITMAP, img.GetSafeHandle());  ::CloseClipboard();  pDC->DeleteDC();  delete pDC;  CDialog::OnPaint(); }

  • ビットマップに描画をしてピクチャーコントロールに貼り付けるためには?

    ビットマップに描画をしてピクチャーコントロールに貼り付けるためには どうすればよいでしょうか? ネットで検索しましたそして、 下のようなコードを書きましたがうまくゆきません。 void CXXXView::OnButton() { CStatic m_ctlImage; // ピクチャーボックスに関連付けした変数 CBitmap m_bmpImage; // ピクチャーボックスに貼り付けるイメージ CDC m_dcImage; // Bitmap描画用のDC CDC* pDC = m_ctlImage.GetDC(); m_dcImage.CreateCompatibleDC(pDC); CRect Cltsz; picture1.GetClientRect(&Cltsz); m_bmpImage.CreateCompatibleBitmap(pDC,Cltsz.Width(),Cltsz.Height()); CBitmap* pOld=m_dcImage.SelectObject(&m_bmpImage); CPen myPEN(PS_SOLID,5,RGB(0,0,255)); CPen* oldPEN=m_dcImage.SelectObject(&myPEN); m_dcImage.MoveTo(10,10); m_dcImage.LineTo(100,100); m_dcImage.SelectObject(oldPEN); m_dcImage.SelectObject(pOld); m_ctlImage.SetBitmap(m_bmpImage); } この様にしましたが、ピクチャーコントロールには 何も描画されません、 何故でしょうか? VS2005で、ボタンをクリックした イベントで描画する場合です、 直線とかは、問題なく描画できました。 ビットマップに描画して貼り付けたいのです、 よろしくお願いします

  • クライアント領域を再描画させない方法

    クライアント領域で左クリックを押したままマウスを移動させた時の処理 (WM_MOUSMOVE)として、マウスの位置情報を、 InvalidateRect(hWnd, NULL, FALSE); でWM_PAINTに送り、WM_PAINTで描画処理をさせます。 右クリックでの処理として、 case WM_RBUTTONDOWN:    InvalidateRect(NULL, NULL, TRUE);    return 0; とした時、WM_PAINTでは 右クリックによるWM_PAINTでは、クライアント領域を 再描画させない様にしたいのですが、 どのようにしたら良いのでしょうか? クライアント領域に描画されたのを再描画させないことで、 消したいのです。 MS VC++ & Win98 の環境で作成しています。

  • クライアント領域の保存

     初歩的な質問でごめんなさい。 VC.netのMFCで、OnLButtonDownで描画の処理をしているのですが、これだと画面を最小化したりするとクライアント領域に描画していたものが消去されてしまうので、画面全体のビットマップをメモリに保存しておきOnPaint関数でブロック転送すればよいと参考書に載っているのですが、このメモリに保存してブロック転送というのがうまくできません。  BitBltを使うのはわかるのですが、どうもうまくいきません。よろしければ、恐縮ですがソースを教えていただきたいです。お願いします。

  • MFC ビットマップ描画で残像が残る

    MFCです。 ワーカースレッドで取得したDIBを定期的に描画するプログラムを作っています。 ダブルバッファリングで実現しているのですが、画面リサイズを繰り返すと、再描画の後に、拡大して発生した新しいクライアント領域に古い画像が残ってしまいます。 SelectObject()で選択したコンパチDCのビットマップを選択前のものに戻してなかったのですが、これが原因なんでしょうか?

  • CDC(LineTo)で描画した線を透過したい

    タイトルのままで恐縮です。 ソースは、以下のような感じです。 描画の所で線を描いているのですが、例えば、SetBkModeなどで、背景を透過(TRANSPARENT)等は、やった事があるのですが、文字そのものの透過がわかりません。透過率は適当で構いません。ご存知の方、ご教授願います。 宜しくお願い致します。 (中略) // 描画した線自体を透過させたいです。 CDC* dc; // 実際は、関数のパラメータです // ペンの作成 CPen Pen; CPen* pOldPen = NULL; if ( Pen.CreatePen( PS_SOLID, 2, color ) == FALSE ) { return false; } pOldPen = dc->SelectObject( &Pen ); // 描画(線を描く) // widht, height は関数パラメータ dc->MoveTo( x, y ); // この線を透過したい dc->LineTo( x + width, x + height ) ); dc->MoveTo( x + width, y ); // この線を透過したい dc->LineTo( x, y + height ); // ペンを元に戻す dc->SelectObject( pOldPen );

  • オブジェクトの削除について

    環境 WIN98 VC++6.0 MFC にて オブジェクトを使い終わってから削除している場合としていない場合が有るのですが、どうしてなのですか? 作ったオブジェクトはなんでもかんでも削除したほうが無難な気がしますが、本にのっているコードで削除してない場合も良く見かけます。 <削除していない>//著名な本のコード void Cxxx::OnDraw(CDC* pDC) {  CBitmap bmp;  bmp.LoadBitmap(nID);  略  //bmp.DeleteObject(); //■この記述が無い } <削除している>//ネット上でみかけたコード void CMainFrame::_SetBmp(CWnd* pBox,int nID,int  width,int height) // 単品 {  CDC* pDC=pBox->GetDC();  CDC memDC;  CBitmap bmp;  bmp.LoadBitmap(nID);  memDC.CreateCompatibleDC(pDC);  CBitmap* pOldBmp=memDC.SelectObject(&bmp);  pDC->BitBlt(0,0,width,height,&memDC,0,0,SRCCOPY);  memDC.SelectObject(pOldBmp);  bmp.DeleteObject();  memDC.DeleteDC(); }

  • MFCでウィンドウ枠をアニメーションさせたい

    こんにちは、VC++初心者です。 今MFCでデスクトップマスコットを作りたいと思っています。 MFCのSDIアプリでとりあえず作成している最中で、 BMP画像の表示はC***ViewクラスのOnDraw関数で表示させています。 問題はウィンドウ枠です。 スタイル指定をWS_POPUPにして、クライアント領域にのみ表示させていますが、 リージョンを使って、BMP画像を切り取った形のウィンドウにするのにてこずっています。 ちうか、そもそもOnDraw関数内でBMP表示とともに行っている、 SetWindowRgn関数がうまく動いてくれていない状態です(泣)。 ソースの一部をのせておきますで、どうかご判断ください。 宜しくお願いします。 CTestView::CTestView() { //コンストラクタでビットマップの読み込みとリージョンの設定 gazou.LoadBitmap( IDB_GAZOU); //CBitmapのメンバ変数 m_rgn[0].CreateEllipticRgn(0, 0, 48,48); //CRgnのメンバ変数1 m_rgn[1].CreateRectRgn(0, 0, 48,48); //CRgnのメンバ変数1 } void CTestView::OnDraw(CDC* pDC) { //画像表示及びリージョンの切り替え 中略... static int anim = 0; CDC dc; dc.CreateCompatibleDC( pDC); dc.SelectObject( gazou); pDC->BitBlt(0,0,48,48,&dc,0,0,SRCAND); //48*48ドットのBMP HRGN hrgn =(HRGN)m_rgn[anim].Detach(); SetWindowRgn( hrgn, true); dc.DeleteDC(); anim ^= 1; 中略... }

  • ダイアログでの再描画

    こんばんわ。 ダイアログに2つBMPが表示されているとします。 説明上、AとBとします。 なんらかの処理後、 Aを表示したまま。 Bを表示されないよう消去したいのです。 コントロールを指定して描画をできないものでしょうか? 現在、 Invalidate(FALSE); GetDlgItem(IDCxxx)->Invalidate(TRUE); と、AもBも消去されないように残した後、 Bだけ再描画させて表示しないようにさせたのですが、 うまく動きません・・・。 宜しくお願いします。 Win98、VC++6.0、MFCで作成してます。

専門家に質問してみよう