アプリ版:「スタンプのみでお礼する」機能のリリースについて

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

A 回答 (4件)

ピクチャーボックスへの描画をどのようにしていますか?


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

と言った具合です

現在どのように描画していて どんな不具合が発生しているのかを明記してみましょう
    • good
    • 0
この回答へのお礼

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

お礼日時:2007/10/30 22:42

OnPaintで コントロールのDCをGetDCで取得して描画しているのでしょうか


初期表示の段階から表示されますか?
当方ですとベタ塗りは一瞬表示されるだけですが …

表示後ダイアログの一部を書き換えるような操作(別ウィンドウを少しだけかぶせる)を行うとベタ塗りがされます

ただし、ピクチャーボックスにかかるように操作してしまうとその部分は塗ってくれませんよ

これって 何処にあっても同じだと思います

ためしに そのダイアログにボタンを追加してそのクリックイベントで
Invalidate();
を実行してみてください
一瞬 ベタ塗りされて デザイン時の灰色になってしまいませんか

ピクチャーボックスのプロパティって何をいじりました
貼り付けて IDとTypeだけでしょうか
    • good
    • 0
この回答へのお礼

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

お礼日時:2007/10/31 08:54

やはり 先に回答したようにビットマップを作成して


SetBitmapでピクチャーボックスに貼り付けたほうが良いように思います
Paintイベントでなくても描画できますし、Paintイベントのたびにアプリ側の負担も少ないと思います

Typeはビットマップにして Center ImageをTrueにしてデフォルトの大きさを決めてから Falseに設定します
Real Size ImageがFalseならここで決めた大きさが GetClientRectなどで取得可能です

フレームのままで ビットマップを貼り付けると表示しませんでした
    • good
    • 0
この回答へのお礼

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

お礼日時:2007/10/31 16:16

ん~ よい書籍といっても知らないので orz …


私は いろいろな経験とMSDNなどのヘルプそれとネットなどのコミュニティからの情報です

まずはいろいろなコントロールを使ってみることでしょうね
VBやC#など他はどのように実現しているのかとか
MFCなどのクラスライブラリーやランタイムライブラリーのソース
サンプルプログラマムなどを改造してみるとか

がんばってください m(__)m
    • good
    • 0
この回答へのお礼

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

お礼日時:2007/10/31 18:02

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!