• ベストアンサー

再描画について

ピクチャボックスにスクロールバーと連動させて色を出したいのですが OnHScroll関数でピクチャボックスに色を出すまではできましたが、 アプリケーションを画面外に出し、戻すと元の色に戻ります。 OnPaint内で再描画しても出ませんでした。 どうやればいいでしょうか? 低レベルな質問ですみません。 (スクロールバーは3つあり、それぞれRGBに分けています。)

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

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

CBitmap型のメンバー変数を用意して OnHScrollなどのイベントでこれにメモリーDCなどで描画を行うようにする 描画が終わったらメモリーDCからBitmapの選択を外す 選択をはずしたBitmapをPicturBoxにSetBitmapで貼り付ける といった具合にしてやると わざわざOnPaintで描画処理をする必要がなくなります 『ダブルバッファ』など画面のチラつきを抑える手法について検索してみましょう

ahoprog
質問者

お礼

解答ありがとうございます。 Invalidate();ですが inlidate(FALSE);でちらつきはおさえられました。 くだらない事で質問すみませんでした。 もう少し調べてCBitmap型の変数で簡潔なコードを書きたいと思います 勉強不足ですみません。

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (2)

  • titokani
  • ベストアンサー率19% (341/1726)
回答No.3

ダイアログのOnPaintで描画しても、ピクチャボックスのOnPaintと競合してしまい、思うような動作とならないことがあります。 方法としては、#2さんのおっしゃるBitmapを貼り付ける方法の他に、オーナードローを用いる方法や、WM_CTLCOLORを処理する方法が考えられますね。

ahoprog
質問者

お礼

何とか解決しました。 ありがとうございました。 また何か勉強しながら分からないことがありましたら お願いします。

全文を見る
すると、全ての回答が全文表示されます。
  • redfox63
  • ベストアンサー率71% (1325/1856)
回答No.1

どのようなコードをお書きなのでしょう? OnHScroll、OnPaintの内容を投稿してみませんか そのアプリに別のアプリをかぶせてから、そのアプリをアクティブにした場合はどうなのでしょう

ahoprog
質問者

お礼

すみません。解決しました。 OnPaint内で int red; int green; int blue; red = mySCR1->GetScrollPos(); green = mySCR2->GetScrollPos(); blue = mySCR3->GetScrollPos(); mySCR1->SetScrollPos(red,TRUE); mySCR2->SetScrollPos(green,TRUE); mySCR3->SetScrollPos(blue,TRUE); CWnd* myPICT1 = GetDlgItem(IDC_PICT); CClientDC myDC(myPICT1); CRect myRECT; CBitmap BMP; myPICT1->GetClientRect(myRECT); memDC1.DeleteDC(); memDC1.CreateCompatibleDC(&myDC); BMP.CreateCompatibleBitmap(&myDC,myRECT.Width(),myRECT.Height()); memDC1.SelectObject(BMP); myDC.FillSolidRect(myRECT,RGB(red,green,blue)); CBrush myBrush ,*oldBrush; myBrush.CreateSolidBrush(RGB(red,green,blue)); oldBrush = myDC.SelectObject(&myBrush); としまして、 HSCrollないでも 同じようにしました。 HScroll内でInvalidate(); で呼び出しましたらちらつきが酷いために 回りくどいですがこうやりました。 お早い返答ありがとうございました。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • テキストの画像描画について

    初投稿失礼致します。 現在、VC++2003にてダイアログベースのアプリケーションを作成中です。 内容は、テキストファイルに記載されている文字をダイアログに画像として表示する、というものです。1行ずつTEXTOUTで描画していくやり方でやってみています。 現在画像表示はされるものの、テキストファイルの容量が大きくなると、ダイアログのサイズを描画サイズが上回り、表示がおかしくなる、という状態です。 これを解消するためスクロールバーを導入し、ダイアログ内に収まるようにしようと考えたのですが、関数の使い方が分からず作業が頓挫してしまいました。この内容について、どなたか解決策、代替案を思いつける方がいらっしゃいましたら、ご助力をお願い致します。 以下は画像描画に関する所について私がコーディングしたものです。 ScrollWindowEx関数について、理解ができないため、NULLが許される箇所にはNULLと代入してしまっています。 _____________________________________________________________ void COCRDiffToolDlg::OnPaint() { dc.SetBkColor(RGB(255,255,255)); int nXStart = 450; int nYStart=5; for(int i =0; i < 200;i++){   dc.TextOut(nXStart,nYStart,imgText1[i]/*テキストファイルを1行ずつ分割したもの*/);   nYStart = nYStart + 10;   ScrollWindowEx(100,600,NULL,NULL,NULL,NULL,SW_INVALIDATE); } } _____________________________________________________________

  • GUIアプリケーション

    ユーザーがボタンを押すと,キャンバスの色を変更するためのスクロールバーを持った.ダイアログボックスが表示されます. スクロールバーは3つあり,それぞれ赤,緑,青の輝度を調整します. ダイアログボックスを消すためのボタンも用意します. このようなアプリケーションを作りたいのですができません RGBの値を読み取りキャンバスの色を変えるだけのアプリならできるのですが。。

  • CStaticコントロールの静的イメージ描画

    はじめまして、質問させてください。 VC++ 2005 MFC で開発しております。 Picture Control(DDX CStasic型)に イメージ(外部ファイル JPG)を静的に描画させたいのですが 方法がわかりません。 お詳しい方がおられましたら、ご教授お願いいたします。 ちなみに CImageを使用して描画はできるのですが その場合、OnPaintをオーバーライドして 描画更新処理を書かないと一度だけ描画されて終わって しまうと思います。 CStaic変数にロードしたら 再度ロードされるまで ずっと描画させていたいです。 以上になります。 宜しくお願いいたします。

  • グラフ表示の仕方 教えてください

    随時データを取得して、それを折れ線グラフで描画したいと思っています。 また一定期間をスクロールさせて表示できるようにしたいのですが、ピクチャボックスとスクロールバーを使用すれば出来るでしょうか? アドバイスまたはサンプルのプログラム等がありましたら教えて下さい。

  • VBの印刷について

    VB6で、自作アプリケーションを作成中ですが、 そこで、PrintForm関数でフォームをハードコピーしています。 ピクチャーボックスにスクロールバーを使って画面を制御していますのでprintformを使うと 全てが印刷されません。 やりたいことは、2画面分のハードコピーを 1枚にして印刷したいのですが、どうやればよろしいでしょうか? 2枚分(A4+A4)(縮小) ------> 1枚(A4)ということです。 どなたか、アドバイスいただければ幸いです。よろしくお願いします。

  • ピクチャーコントロールへの描画方法について

    お世話になります、fujitomoです。 現在、Visual Studio2005にてC++のダイアログベースのアプリケーションを作成しており、行き詰った箇所があったため質問させて頂きました。 アプリケーションの内容としては 現在、アプリケーションで、ダイアログベース上にピクチャーコントロールを2つ設置し、それぞれに波形を描画させています。 ピクチャーコントロールへの波形の描画にはメモリデバイスコンテキストを使い、それぞれ波形描画用のCStatic派生クラスを作成し、そのクラスを SubclassDlgItem でメインダイアダイアログのサブクラスとし、描画間隔として、それぞれの描画クラス内で SetTimer(1,10,NULL) でタイマーイベントを起こし、メモリデバイスコンテキストの描画更新をしています。 ここで質問させていただきたい事なのですが、 2つのピクチャーコントロールのうち、1つのピクチャーコントロールへのみ波形描画を実行させているときはピクチャーコントロールの端から端まで描画が約7秒かかるのに対し、 2つのピクチャーコントロールの描画を同時に実行させた場合には端から端までで約11秒もかかってしまいます。 これを何とか、1つのピクチャーコントロールへの描画時間と同じ時間まで早く出来ればなと思っているのですが、どの様に工夫すれば時間短縮をさせることが出来ますでしょうか? 2つのクラスでそれぞれ10msのタイマーを動かしているのが問題なのかと思い、メインダイアログで10msのタイマーイベントを発生させ、それぞれの描画クラスに描画更新のメッセージを送信させるようにコードを変更してみたのですが、やはり同じ結果となりました。 開発環境は Widows CE 6.0 Visual Studio 2005 です。 ご意見、ご回答をお待ちしております。よろしくお願い致します。

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

    ビットマップに描画をしてピクチャーコントロールに貼り付けるためには どうすればよいでしょうか? ネットで検索しましたそして、 下のようなコードを書きましたがうまくゆきません。 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で、ボタンをクリックした イベントで描画する場合です、 直線とかは、問題なく描画できました。 ビットマップに描画して貼り付けたいのです、 よろしくお願いします

  • 描画キャンパス内にテキストボックスを作成したい

    Windows 7 Ultimate 64 SP1、Word 2010で、描画キャンパス内にテキストボックスを作成するにはどうしたらいいですか。 次の(1)~(6)の順でクリックしたら、テキストボックスはできたのですが描画キャンパス外にできてしまいます。 (1)挿入 (2)図形 (3)新しい描画キャンパス (4)挿入 (5)「テキストボックス」の下向き黒色▼(※このクリックをする直前には描画キャンパスは画面上に表示されています) (6)シンプルテキストボックス(※このクリックをする直前には描画キャンパスは画面上に表示されています)

  • photoshop7の描画色について

    photoshopの描画色の色が変更できないのです。 カラーピッカー上では色は変更されているのですが、ツールボックスの描画色の色は変更されません。(カラーピッカーでオレンジの色指定をして、ピッカー上では変更されているが、ツールボックスではグレーになったり、薄グレーになったり、グレー以外の色が表示されない)再度カラーピッカーを表示させると、きちんと指定した色(オレンジ)のままになっています。 初歩的な質問ですいませんがよろしくお願いいたします。

  • MFC XPでのTextOutのボヤケについて

    はじめまして。 質問させてください。 CImageを使用して OnPaint( )でBMP画像を描画するアプリを作成しております。 仕様といたしまして ダイアログのDC部にBMPを全体に描画して RGB( 255, 255, 255 )を透明化(背景が完全に見える)する ようにしております。 OnInitDialog( )で透過、透明処理をしています。 OnPaint( )で PaintDC PDC; //背景を透過 PDC.SetBkMode( TRANSPARENT ); PDC.SetTextColor( RGB( 255, 0, 0 ) ); PDC.SetBkColor( RGB( 255, 255, 255 ) ); PDC.TextOutW( 100, 100, _T( "TEST" ) ); 上記のように実装して、EXEで実行して確認しますと Windows2000の場合、正常に文字(TEST)が赤字で描画されるのですが WindowsXPの場合、赤字で描画されるのですが文字の周りがぼやけてしまいます。 イメージとしては文字描画部分が 2000の場合、BMP表示 XPの場合、JPG表示 のようになります。 これは仕様なのでしょうか? それとも何かコードレベルで解決できるのでしょうか? お詳しい方がおりましたらご教授お願いいたします。 よろしくお願いいたします。