ウインドウサイズとリサイズ・イベントについて

ActiveBasicでのプログラミングでわからないこと、困ったことなどがあったら、ここで質問してみましょう(質問を行う場合は、過去ログやWeb上であらかじめ問題を整理するようにしましょう☆)。
メッセージ
作成者
jacoby
記事: 106
登録日時: 2006年6月02日(金) 18:20

ウインドウサイズとリサイズ・イベントについて

#1 投稿記事 by jacoby »

例えばビットマップビューワなどで、新たにビットマップファイルを
読み込んだ時、ウインドウサイズがたまたま変わらない場合などに、
SetWindowPos命令を行ってもリサイズ・イベントが実行されない
ということがあります。
もちろんウインドウサイズ自体はそのままでも良いかも知れませんが、
諸々の付随するもの、スクロールバーなどはリサイズ・イベントへ
飛んでくれないと再描画されず、表示がおかしくなってしまいます。

ヘルプを見ればSetWindowPosのところにはフラグとして
"「SWP_FRAMECHANGED」ウィンドウ サイズが変更されない
場合でも、WM_NCCALCSIZE メッセージを送ります。"
という意味ありげなものがあるのですが、NCCALCSIZEは
「WM_SIZE」とは違うようもののですし今ひとつどう使うものか
分かりません。
"ウィンドウ サイズが変更されない場合でも、WM_SIZE メッセージを
送ります。"だったらと思うのですが。

ウインドウサイズが変わらないときでもリサイズイベントを
実行させたいのですが良い方法はあるでしょうか?

調べていてこんなページを見つけましたが、、、
http://oshiete1.goo.ne.jp/qa1502910.html
淡幻星
記事: 183
登録日時: 2005年7月19日(火) 07:02
お住まい: 宮城県

Re:ウインドウサイズとリサイズ・イベントについて

#2 投稿記事 by 淡幻星 »

どういうコーディング(コード設計)をしているかによって、対処方法は様々だと
思うのですが、MoveWindow命令や、InvalidateRgn命令あたりを
調べてみてはいかがでしょうか?

たとえば、InvalidateRgn( hMainWnd, NULL, TRUE ) とすると、
窓hMainWnd全体に対して再描画を実施することが出来ます。
jacoby
記事: 106
登録日時: 2006年6月02日(金) 18:20

レスありがとうございます。

#3 投稿記事 by jacoby »

レスありがとうございます。
うまく行ってないのは、何よりスクロールバーの表示ですね。
(単純なビットマップ・ビューワと仮定して頂いて、
「ファイルを開く」から選んだ画像ファイルをメインウインドウの
クライアントエリアに表示するという基本的なものですが)

プログラムのの設計としては、リサイズ・イベント内で
「SetScrollInfo」でスクロールバーの情報のセットと
その表示をしています。
それ以外ではタテヨコ各スクロールバーが動かされたときの
イベント処理内でSetScrollInfoを使って再描画していますが、
それ以外にはSetScrollInfoは使用していません。

教えて頂いた「MoveWindow」ですが、再描画フラグ
「bRepaint」をTRUEにしてやってみたのですが、
それによってスクロールバーが再描画されることはこちらでは
確認できませんでした。
どうもやはり「ウインドウサイズが変わらなければWM_SIZEは
出ない」ということのようで、その点については
SetWindowPosと同様なのかなと思います。
それから「InvalidateRgn( hMainWnd, NULL, TRUE )」も
やってみたのですが、スクロールバーの再描画は出来ません
でした。
(もっとも、淡幻星さんの意図した使い方で僕が使ってないから
かもしれません)

それで、もちろんスクロールバーの再描画ということのみに
絞ればそれこそ必要な時点で「SetScrollInfo」を書いてやれば
いいということになるので、とりあえず今は
SetWindowPos(又はMoveWindow)命令でウインドウの
RECTをセットした時、「リサイズ・イベント」に飛ばない可能性を
考慮して
「以前のサイズと現在のサイズを比べて、変わらない時は
SetScrollInfoを実行」
としてどうにかこうにかスクロールバーの更新描画を行っています。
これでもいいかとも思うのですが、、、
それって何ともバタついてるよなぁ、、と、つい思ってしまうんですよね。

多くの場合、ビットマップ・ファイルを読み込めばウインドウサイズは
変化するのでリサイズ・イベントは実行されます。だからその時に、
ムヤミに改めてSetScrollInfoを使ってしまえば二度手間、三度
手間になってしまう。
だからといって、以前のサイズと現在のサイズを比べてどうのこうの
ってのはちょっとどうなのかなと。
「SWP_FRAMECHANGED」なんて悩ましいフラグもあったりなんかして。。

とりあえずスクロールバーの表示については(バタついてますが)
上の方法でやろうと思っています。
何か、こうした方がいいということがありましたらまた是非教えて下さい。
レスありがとうごさいました。