• ベストアンサー

タブコントロール上のピクチャーコントロールへの描画

お世話になっております。 VC2005を使用しております。 SDIベースです。 ダイアログを作成し、その上にタブコントロール(2ページ)を作成しました。 タブコントロールの1ページ目にピクチャーコントロールを配置し、ピクチャーコントロール上に描画を行おうと思うのですが、正常に動作しません。 OnPaintの中で描画を行っているのですがだめのようです。 タブコントロール外に、ピクチャーコントロールを配置すると描画する事ができます。 どのような、タイミングで描画を行えばよいのでしょうか? 教えてください。 よろしくお願いします。

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

  • ベストアンサー
  • redfox63
  • ベストアンサー率71% (1325/1856)
回答No.1

ピクチャーボックスへの描画をどのようにしていますか? CStatic* pWnd = (CStatic*)GetDlgItem( IDC_PICTURE ) pWnd->SetBitmap( m_bmpImage ); と言った具合にビットマップをピクチャーボックスに張るようにしてはいかがでしょう ビットマップへの描画は メモリー上にデバイスコンテキスト(DC)を作成しておきこのdcに対して描画を行う ビットマップをdcに選択 描画終了後に dcから選択を外して SetBitmapでピクチャーボックスに貼り付け と言った具合にして見ましょう メンバー変数として CStatic m_ctlImage; // ピクチャーボックスに関連付けした変数 CBitmap m_bmpImage; // ピクチャーボックスに貼り付けるイメージ CDC m_dcImage; // Bitmap描画用のDC HBITMAP m_holdBmp; // DCへの選択時にビットマップを外すためのハンドル などを準備します OnInitDialogなどで CDC * pDC = m_ctlImage.GetDC(); m_dcImage.CreatecompatibleDC( pDC ); m_bmpImage.CreateCompatibleBitmap( pDC, width, height ); // もともと貼り付けてあったハンドルを保存 // 描画時にビットマップを外すため // HBITMAP型のメンバー変数 m_holdBmpを準備 m_holdBmp = m_ctlImage.SetBitmap( m_bmpImage ); m_ctl_image.ReleaseDC( pDC ); と言った具合にしておきます 描画イベントで // ピクチャーボックスのビットマップを外す m_ctlImage.SetBitmap( m_hOldBmp ); // メモリーDCへビットマップを選択 CBitmap* pOld = m_dcImage.SelelctObject( &m_bmpImage ); // 描画コードを記述 m_dcImage.SetPixel( 100,100, RGB( 255, 0, 0 ) ); // ビットマップの選択を戻す m_dcImage.SelectObject( pOld ); // ピクチャーボックスへビットマップを設定 m_ctlImage.SetBitmap( m_bmpImage ); と言った具合です 現在どのように描画していて どんな不具合が発生しているのかを明記してみましょう

cappcino
質問者

お礼

お世話になっております。 ご回答ありがとうございます。 現在の方法は、OnPaintの中で、 ピクチャーコントロールのdcを取り、CBrushで作成した色をベタで塗っています。 この方法で、タブコントロール以外の所は正常に表示します。 タブコントロールの中では一度表示してから色が消えてしまいます。 よろしくお願いします。

その他の回答 (3)

  • redfox63
  • ベストアンサー率71% (1325/1856)
回答No.4

ん~ よい書籍といっても知らないので orz … 私は いろいろな経験とMSDNなどのヘルプそれとネットなどのコミュニティからの情報です まずはいろいろなコントロールを使ってみることでしょうね VBやC#など他はどのように実現しているのかとか MFCなどのクラスライブラリーやランタイムライブラリーのソース サンプルプログラマムなどを改造してみるとか がんばってください m(__)m

cappcino
質問者

お礼

お世話になっております。 重ね重ねありがとうございます。 今後ともよろしくお願いします。

  • redfox63
  • ベストアンサー率71% (1325/1856)
回答No.3

やはり 先に回答したようにビットマップを作成して SetBitmapでピクチャーボックスに貼り付けたほうが良いように思います Paintイベントでなくても描画できますし、Paintイベントのたびにアプリ側の負担も少ないと思います Typeはビットマップにして Center ImageをTrueにしてデフォルトの大きさを決めてから Falseに設定します Real Size ImageがFalseならここで決めた大きさが GetClientRectなどで取得可能です フレームのままで ビットマップを貼り付けると表示しませんでした

cappcino
質問者

お礼

お世話になっております。 ご回答ありがとうございます。 参考にさせていただきたいと思います。 本当に親切にご対応いただきありがとうございます。 質問ですが、このような情報はどこを参照すればよいでしょうか? 書籍等があればお教えいただけると幸いです。 自分の周りに、知識を持った人がいないためいきずまった時に非常に苦労します。 よろしくお願いします。

  • redfox63
  • ベストアンサー率71% (1325/1856)
回答No.2

OnPaintで コントロールのDCをGetDCで取得して描画しているのでしょうか 初期表示の段階から表示されますか? 当方ですとベタ塗りは一瞬表示されるだけですが … 表示後ダイアログの一部を書き換えるような操作(別ウィンドウを少しだけかぶせる)を行うとベタ塗りがされます ただし、ピクチャーボックスにかかるように操作してしまうとその部分は塗ってくれませんよ これって 何処にあっても同じだと思います ためしに そのダイアログにボタンを追加してそのクリックイベントで Invalidate(); を実行してみてください 一瞬 ベタ塗りされて デザイン時の灰色になってしまいませんか ピクチャーボックスのプロパティって何をいじりました 貼り付けて IDとTypeだけでしょうか

cappcino
質問者

お礼

お世話になっております。 親切な対応本当にありがとうございます。 そのとおりです。一瞬表示するだけです。 ピクチャーボックスのプロパティは、標準のままです。 IDのみです。Typeはフレームです。 よろしくお願いします。

関連するQ&A

専門家に質問してみよう