• ベストアンサー

WM_SIZEとWM_SIZINGの違い (Win32API)

Windowsプログラミングで、画面のサイズを変更したときに送られてくるメッセージで、 WM_SIZEで処理するのとWM_SIZINGで処理するのとでは何が違うのでしょうか? WM_SIZEとWM_SIZINGの違いは何なのでしょうか? また、似たようなものでWM_MOVEとWM_MOVINGの違いも教えてもらいたいです。

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

  • ベストアンサー
  • koko_u_
  • ベストアンサー率18% (459/2509)
回答No.2

実際にプログラムを書いてみれば、両者の違いは明白になるでしょう。 WM_SIZE は「サイズの変更後に」メッセージがアプリケーションに飛んでくるので、 ウィンドウのコーナーからマウスを離した時に文字がビョンと移動します。 Windows98 くらいまではウィンドウのサイズの変更はまずは輪郭だけサイズが変って マウスをコーナーから離した時にウィンドウの中身が再描画されていたので、 WM_SIZE のメッセージハンドラを実装することになったでしょう。 しかし最近のインターフェイスはサイズ変更中もズリズリとウィンドウの中身が 再描画され続けます。これには WM_SIZING のメッセージハンドラを実装して、 サイズ変更中常に文字列の再描画を繰り返す必要があるでしょう。

oropon
質問者

お礼

更に回答ありがとうございます。 WM_SIZEは古いOSのなごりのようなものなのでしょうかね? おかげさまでなんとなく違いが分かってきたので、あとは自分でいろいろ試してみて理解しようと思います。 ありがとうございました。

その他の回答 (1)

  • koko_u_
  • ベストアンサー率18% (459/2509)
回答No.1

ドキュメントを読めばすぐわかる The WM_SIZE message is sent to a window after its size has changed. The WM_SIZING message is sent to a window that the user is resizing.

oropon
質問者

お礼

回答ありがとうございます。まだはっきりと理解できてないので更に質問よろしいでしょうか? ある入門書で文字列を常に画面の中央に表示するプログラムの例として、WM_SIZEメッセージを受け取ったときに描画位置を再計算するというものがあり、またそれとは別で、サイズ変更を抑制するプログラムの例として、WM_SIZINGを受け取ったとき変更後のウィンドウ位置を強制的に元の状態に書き換えて変更をできなくするというのもあったのですが、例えば前者をWM_SIZINGに、後者をWM_SIZEにしても問題はないのでしょうか? 具体的に両者の違いを意識しなければいけないような場合はどんなときでしょうか?

関連するQ&A

  • Win32APIを始めたのですが・・・。

    Window Handleについての質問です。Win32APIではCreateWindow()でチェックボックスを作ることが出来るのですが、 C++でプログラミングしていたところ、困ったことになりました。 まず、クラスのメンバーとしてHWND m_Hwndを宣言し、メンバー関数(CreateChk())において m_Hwnd = CreateWindow(...)とし、WM_CREATEのメッセージ処理内で関数CreateChk()を呼び出して チェックボックスを作るようにしたのですが、WM_CREATEのメッセージ処理を終えると同時にm_Hwndの内容が意味を持たないものに 変わってしまい、チェックボックスの状態を利用することが出来ません。 変数の寿命に関係したものだとは思うのですが、クラスを用いたオブジェクト指向プログラミングも始めたばかりでよくわかりません。 どなたか対処方法をご存知でないでしょうか?

  • WM_PAINTとWM_MOVEで同じ事をしたいけど

    VC.NETにて、 ウィンドウプロシージャでWM_PAINTとWM_MOVEを拾って、テキストを書き直す関数に飛ばしているのですが、WM_MOVEでは書き直してくれません。 書き直し関数はウインドウの座標の絶対と相対をGetClientRectとGetWindowRectで得て表示をするだけです。 WM_MOVEでも関数に飛んで、座標を得てはいるようですが、表示しなおしてくれません。 ウインドウの大きさを変えると表示し直してくれます。 何故でしょうか?

  • WM_NCLBUTTONUPについて

    タイトルバー上でのマウスボタンのアップを検出したいので、 WM_NCLBUTTONUPメッセージを拾うために、単純に以下のようなコードを書きました。 が、このコードではうまくWM_NCLBUTTONUPメッセージを拾えません。 ウィンドウを最大化しているときは問題なくメッセージを拾えるのですが、 それ以外の時(縮小表示)はメッセージを拾えません。 ただ、WM_NCLBUTTONDOWNは正しく拾うことができました。 ウィンドウが縮小表示になっている時にWM_NCLBUTTONUPを取得する場合には何か特殊な処理が必要なんでしょうか? ご存知の方がいらっしゃったら、よろしくお願いします。 // ウィンドウプロシージャ LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { switch (message) { case WM_NCLBUTTONUP: MessageBox(hWnd, "UP", "LBUTTON", MB_OK); return 0; case WM_DESTROY: // ウインドウが破棄されたときの処理 PostQuitMessage(0); return 0; default: // デフォルトの処理 return DefWindowProc(hWnd, message, wParam, lParam); } }

  • WIN32APIアプリでツールバー/スステータスバーの表示切り替え

    VC++6.0のwin32sdkで、MFCのSDI標準テンプレートのようにメニューでツールバー,ステータスバーを切り替えるアプリケーションにしたいと思います。 以下のようなコードにしていますが、このままでは表示非表示を切り替えた場合、中央ウインドウのサイズが変更されません。 ドラッグして全体のサイズを変更すると中央メインウインドウも正常な表示になりますが、なにか中央のウインドウを再描画する処理が必要と思われます。その再描画処理についてご教示くださいますようお願いします。 1)ステータスバーの高さ,ツールバーの高さをグローバル変数にする 2)メニューからのメッセージでこのグローバル変数を表示(夫々のバーの高さ)、非表示(夫々のバーの高さ=0)を切り替える。 3)WndProcのWM_SIZEで中央メインウインドウをMoveMindowする [グローバル変数] ---------------------------------------------- static int bShow = 16;//ステータスバーの高さ(非表示は0) static int tbShow = 25;//ツールバーの高さ(非表示は0) ---------------------------------------------- [LRESULT CALLBACK WndProcの一部] ----------------------------------------------- case WM_SIZE: ...... MoveWindow(中央のハンドル, 0, tbShow, LOWORD(lp), HIWORD(lp)-tbShow-bShow, TRUE); break; -----------------------------------------------

  • WM_SIZEを発生させる方法

    コントロールを動的に初めて表示させた時にコントロールを ウインドウの大きさに合わせてリサイズさせようと思います。 SendMessageなどを使った2つのパラメータを指定する という方法ではなく、それ以外の方法でWM_SIZEを 発生させる方法を教えてください。 WM_SIZEにリサイズのソースが書いてあるので、ウインドウを 初めて表示させた時にもそれを利用しようとしているところです。

  • VBA API WM_KEYDOWN

    エクセル内のオブジェクトの移動を判定するため、マウスアップを検出しようと考えています。 GetAsyncKeyStateでできるのですが、エクセルが受け取るWM_KEYDOWNを受け取る方法はないのでしょうか? そもそもWindowsがイベント待ちで動いているのに、GetAsyncKeyStateだとループ処理で監視することになるので、すっきりしません。私だけでしょうか? ちなみに、新規に図形を作ったり、図形を移動したりしたときに処理したいですが、このイベントは準備されていないですよね?

  • WinAPIにてWM_SIZE以外の方法で最大化を検出したい

    環境:WinXP, VS2005 WinAPIでウィンドウプロシージャのWM_SIZEメッセージを使えば 最大化状態などウィンドウの状態を調べることができますが、 プロシージャを直接使わないでするような方法はあるのでしょうか?

  • Win32APIで困っています

    Win32APIでWM_PAINTメッセージを使って変数Bufの中の文字列を表示した場合に 表示した後になんらかのイベントを発生させて表示されている文字列に違う文字列を代入しても、画面に変化がありません。 画面を再描画する方法を教えてください よろしくお願いします。

  • C言語とWin32APIで全角かなの文字を取得する方法について。

    いつも、お世話になっております。 小生、只今、WinXPSP3上でC言語とWin32APIを使い、BCC5.5.1でコンパイルしながら、Windowsプログラミングを勉強しています。 今回、ご質問させて頂きたい内容は、 クライアント領域において、全角かなの文字を取得する方法についてです。 自分自身で考えてみたのですが、WM_CHARメッセージの箇所を工夫して利用し、文字を取得する方法と、エディットコントロールにて文字を取得する方法です。 自分自身、WM_CHARメッセージを最近、勉強し始めたところなので、 出来ればWM_CHARメッセージを使用し、処理してみたいのですが。。。 以上です。 お忙しい中、本当に申し訳ございませんが、先輩方アドバイス宜しくお願いします。

  • Win32 APIを使ったWindowsプログラミング製作について質問です

    只今、VisualStudio2005のVC++でWin32 APIを使ってWindowsアプリケーション製作の練習をしています。今、ドラゴンクエストIのようなゲームを作りたいと思っており、画面に画像を表示し、キーボードの十字キーで操作できるようにしていますが、ここまでやっていて一つ不思議に思ったことがあります。それは、画像の読み込みや表示・キーボードの入力などすべてをウィンドウプロシージャ内にコーディングしています。WinMain()関数内には、ウィンドウの登録・生成・表示という当たり前の処理しかありません。これから、戦闘の処理なども加えていきますが、それを考えてもWM_PAINTやWM_KEYDOWNなどのメッセージ内で事足りるような気がします。アプリの製作の経験はほとんどない初心者なので、C言語みたいにMain()関数内にほとんど処理を記述しないのが不安に思います。自分の書き方は間違っているのかどうなのか、何か参考になる意見をいただけないでしょうか?どうかよろしくお願い致します。

専門家に質問してみよう