領域を指定した再描画について

ActiveBasicでのプログラミングでわからないこと、困ったことなどがあったら、ここで質問してみましょう(質問を行う場合は、過去ログやWeb上であらかじめ問題を整理するようにしましょう☆)。
返信する
メッセージ
作成者
jacoby

領域を指定した再描画について

#1 投稿記事 by jacoby »

 Ver.4.04、RADツールを使って簡単なプログラムを
作っているのですが、ウインドウの再描画で悩んでいます。

 クライアント領域いっぱいにビットマップを
貼り付けて、その上にボタンやコンボボックスなどの
コントロールを配置しました。
 再描画のPaintイベントでは

コード: 全て選択


Sub MainWnd_Paint(hDC As DWord)
  BitBlt(hDC,0,0,clientAreaWide,clientAreaHeight,hMemDC,0,0,SRCCOPY)
End Sub
などとしてクライアントエリア全体を再描画しています。

 ところがこの方法だとビットマップのほんの一部に
新たな描画をしたり、あるいはこのウインドウの上に
僅かに他のウインドウが重なったりするだけでも
クライアントエリア全体を再描画してしまい、結果
配置されているボタンやコンボボックスなどの
コントロール部品がその都度ひどくちらついて見えて
しまいます。

 解決には、ウインドウの重なりや新たな描画で
画像が変わってしまったその必要最小限の領域のみ
の再描画をさせればいいのだろうと、
 BeginPaint()の実行時にその領域の大きさがセット
されるPAINTSTRUCT構造体をABのプログラムの中に
調べてみました。

 Callback.wbpの中に以下の部分を見つけました。

コード: 全て選択

	
	Case WM_PAINT
            Dim ps As PAINTSTRUCT
            Dim hDC As DWord
            hDC=BeginPaint(hWnd,ps)
            MainWnd_Paint(hDC)
            EndPaint(hWnd,ps)
 ただこの情報のセットされた構造体ps、
メインのMainWnd.sbpのPaint()イベントからは
どうしても参照することが出来ず、
CallBack.wbpを書き換えたり、色々試してみたのですが
CallBackwbpは実行時には改めて書き換えられてしまう様だったりして
中々うまく情報を取得出来ずにいます。

 指定した範囲領域のウインドウの再描画について、
仮にそれ以外でも、再描画によるコントロール部品の
ちらつきを抑える相応しい方法がありましたら
是非教えてください。
xsb007

#2 投稿記事 by xsb007 »

RADツールでウィンドウを選択して、右側のプロパティで「子ウィンドウをクリップ」をチェックすれば、ちらつきはなくなるはずです。
ゲスト

#3 投稿記事 by ゲスト »

 xsb007さんの教えて頂いた通り、
「子ウィンドウをクリップ」、チェックを入れて実行してみました。
 コントロールのちらつきは無くなりました。とてもきれいに見えています。
 ありがとうございました。またよろしくお願いします。
返信する