mcrblog

vcpp-ml

2003年04月

25

[vcpp 00060603] Re: コントロールのサイズ変更での不具合


馬渕です。

Tietew wrote in [vcpp 00060600] Re: コントロールのサイズ変更での不具合:

>富豪的プログラミングの立場からは,無駄ではありません :-)
>むしろ,ユーザフレンドリなので,推奨されます。

描画されなきゃ、いくら OnSize() で処理したって意味ないでしょう。
Windows Messaging を分かっていっているのでしょうか。

それとも、軽くて速いプログラムよりも、
必要以上に重たいプログラムがユーザフレンドリーって
いいたいのでしょうか?

実際にその仕組みで作ってみればどっちが正しいか、分かることです。
私は実際に作ったものでは、全画面に近いサイズのドラッグでも
リアルタイム表示され、ストレスを全く感じません。CPU が 333Mhz 
時代の話です。

神戸さんが「重たい」と感じたのは、「サイズの変動」と「描画」という
二つの全く独立したメッセージをセットで考えた節があるためです。
たとえば、ウィンドウが隠れているときにサイズが変わる(復元される)
ことだってあります。そういうときには WM_SIZE が来ても
WM_PAINT は来ないことがあります。

ところで、富豪的プログラミングってなんでしょうか?自分の高速CPU上で
満足にさえ動けばいいってことでしょうか?

>> (ドラッグでウィンドウの再描画をしない画面設定の場合がそう)
>
>だうと。
>ドラッグでウィンドウの描画を行わない設定(枠だけが移動する設定)
>の時,ドラッグ中には WM_SIZING (WM_WINDOWPOSCHANGING /
>WM_GETMINMAXINFO) だけがやってきます。そして,ユーザがボタンを放
>したとき初めて WM_SIZE (WM_WINDOWPOSCHANGED) がやってきます。
>
># これが OnSizing と OnSize の違いです>元質問者さん

思いっきり本末転倒のことを書いていますね。
Windows 3.1 時代からプログラムを書いている人間でないと
勘違いしそうな話です。

サイズ変更の時、ボタンを放さなくても WM_MOVE や
WM_SIZE は何度だって来ます。WM_PAINT が来ないだけです。
(カーネルが代わりに枠を再描画してくれるだけです)
昔のマシンは遅いから、必要になるまでなるべく WM_PAINT を
処理しないという発想です。

「ドラッグ中にウィンドウを表示する」という設定は、
WM_SIZE や WM_MOVE を発行するたびに、WM_PAINT を送る
かどうか、そういう違いです。WM_SIZE や WM_MOVE を
送る、送らないことではありません。

WM_SIZING はあくまでも、サイズ変動を監視するための、
WM_SIZE の前処理です。「そのサイズに変更させますか?
それとも強制的に別のサイズに変更しますか?」という目的の
ためにあるメッセージです。OKなら WM_SIZE を、ダメなら
WM_SIZE なし、変更なら、WM_SIZE に異なる値が入るという
性格のものです。移動中とか、そういう経過的なものでは
ありません。ボタンのリリースと関連づけてしまうと、
カーネルでのメッセージ処理はたいへんなことになります。

もう一度よくWindows API をよく読んでみてください。
いまどきのプログラマには、Windows API の仕組みを理解しなくても
プログラムが書けるから、内部処理まで考えて書く人間って
絶滅しかかっているかも(^^;


馬渕 茂
KOAH INTERACTIVE
25

[vcpp 00060602] Re: コントロールのサイズ変更での不具合

Tietew です。

On Fri, 25 Apr 2003 16:47:24 +0900
In article <02e101c30afe$e96c36a0$2...@fja.fujitsu.co.jp>
[[vcpp 00060601] Re: コントロールのサイズ変更での不具合]
"Yasuhiro.Kambe" <k...@fja.fujitsu.co.jp> wrote:

> > ドラッグでウィンドウの描画を行わない設定(枠だけが移動する設定)
> とは?ウィンドウスタイルでしょうか?

画面のプロパティに「ドラッグ中にウィンドウの内容を表示する」(O
Sによって微妙に場所や表現が違うのでよく探すこと)みたいな設定項
目があります。それのこと。

Windows95 初代 までは「枠だけ移動」しかありませんでした。
(Windows 95 PLUS! を入れるとウィンドウごと移動できるようになって
いた)

> 現状はドラッグでウィンドウの再描画がされて無駄な再描画が働いているかも
> しれないということですよね.

読んでくれなかったのですね…

私曰く:
> 富豪的プログラミングの立場からは,無駄ではありません :-)
> むしろ,ユーザフレンドリなので,推奨されます。



> (実際そのような動作してます)
> ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
> ↑これを回避するにはどのようにすればよろしいのでしょうか?

> LED表示器みたいなのを作っているのですが,ドラック操作で
> ドットがリアルタイムに大きさが変わっていく動作は捨てがたいのですが..
> (画面を大きくすればドットも大きくなる仕様)

えっと,ウィンドウに追従して再描画したいのかしたくないのかはっき
りさせましょう。「これを回避」とは再描画したくないと読めるし,そ
のあと「捨てがたい」と言ってるし。


―[ Tietew ]――――――――――――――――――――――――――――
Mail: t...@tietew.net / t...@raug.net
Web : http://www.tietew.net/     Tietew Windows Lab.
PGP fingerprint: 26CB 71BB B595 09C4 0153  81C4 773C 963A D51B 8CAA
25

[vcpp 00060601] Re: コントロールのサイズ変更での不具合

> > (ドラッグでウィンドウの再描画をしない画面設定の場合がそう)
>
> だうと。
> ドラッグでウィンドウの描画を行わない設定(枠だけが移動する設定)
> の時,ドラッグ中には WM_SIZING (WM_WINDOWPOSCHANGING /
> WM_GETMINMAXINFO) だけがやってきます。そして,ユーザがボタンを放
> したとき初めて WM_SIZE (WM_WINDOWPOSCHANGED) がやってきます。
>
> # これが OnSizing と OnSize の違いです>元質問者さん

馬渕さん
Yongさん
Tietew さん

お世話になります.
元質問者です.
すみません.もう1つご教授ください.

> ドラッグでウィンドウの描画を行わない設定(枠だけが移動する設定)
とは?ウィンドウスタイルでしょうか?

現状はドラッグでウィンドウの再描画がされて無駄な再描画が働いているかも
しれないということですよね.
(実際そのような動作してます)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
↑これを回避するにはどのようにすればよろしいのでしょうか?

LED表示器みたいなのを作っているのですが,ドラック操作で
ドットがリアルタイムに大きさが変わっていく動作は捨てがたいのですが..
(画面を大きくすればドットも大きくなる仕様)
25

[vcpp 00060600] Re: コントロールのサイズ変更での不具合

Tietew です。

On Fri, 25 Apr 2003 13:07:04 +0900
In article <2...@ns.petoffice.co.jp>
[[vcpp 00060598] Re: コントロールのサイズ変更での不具合]
Shigeru Mabuchi <m...@wing.gr.jp> wrote:

> >OnSize()で変更完了後の処理を行っていますが、これでよいと理解しました.

> OnSize() はサイズ変更のたびに呼ばれるので、一回のドラッグでヘタすると
> 何百回も呼ばれたりします。OnSize() の中で描画したり、メモリDCの割り当て
> をやり直したりするのは、無駄が多すぎます。OnSize()が何百回呼ばれても、

富豪的プログラミングの立場からは,無駄ではありません :-)
むしろ,ユーザフレンドリなので,推奨されます。

> (ドラッグでウィンドウの再描画をしない画面設定の場合がそう)

だうと。
ドラッグでウィンドウの描画を行わない設定(枠だけが移動する設定)
の時,ドラッグ中には WM_SIZING (WM_WINDOWPOSCHANGING /
WM_GETMINMAXINFO) だけがやってきます。そして,ユーザがボタンを放
したとき初めて WM_SIZE (WM_WINDOWPOSCHANGED) がやってきます。

# これが OnSizing と OnSize の違いです>元質問者さん


―[ Tietew ]――――――――――――――――――――――――――――
Mail: t...@tietew.net / t...@raug.net
Web : http://www.tietew.net/     Tietew Windows Lab.
PGP fingerprint: 26CB 71BB B595 09C4 0153  81C4 773C 963A D51B 8CAA
25

[vcpp 00060599] Re: コントロールのサイズ変更での不具合

こんにちは、Yasuhiro.Kambe さん。
よん@さっぽろです。

On 2003/4/25 11:44:54 k...@fja.fujitsu.co.jp
   "[vcpp 00060597] Re: コントロールのサイズ変更での不具合" について...

>OnSize()で変更完了後の処理を行っていますが、これでよいと理解しました.

基本的には、

WM_SIZEは、ウインドウサイズが変更された後へ通知されます。
WM_SIZINGは、ウインドウサイズ変更中(サイズが変化した場合)に通知されます。

ただし、Windows 95+Plus!、Windows 98、Windows NT4.0以降で、'ドラッグ中に
ウインドウの内容を表示する'が有効になっている場合は、ウインドウサイズの
変更中(サイズが変化した後)にWM_SIZEが通知されます。

なので、ウインドウのサイズ変更中にWM_SIZEが送られない場合もあるので注意
が必要です。というか、それが基本です。

>他に方法がありましたらご教授のほどよろしくお願いします.

OnPaintの処理では、画面全体を描画するのですか?
画面全体を描画するのであれば、WM_ERASEBKGNDのデフォルト処理を行わないよ
するとチラツキ防止や若干の速度向上が見込めます。

--------------------------------------------------------------------------------
Osamu Yotsuya
y...@sisd.dnp.co.jp
記事検索
Amazon.co.jp
  • ライブドアブログ