• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:Win32 メッセージループ)

Win32メッセージループとウィンドウプロシージャについての質問

このQ&Aのポイント
  • ウィンドウプログラミング初心者が質問です。GetMessage関数の第2引数についてやウィンドウプロシージャがコールバック関数である理由について教えてください。
  • GetMessage関数の第2引数、ウィンドウハンドルの指定についてどのような場合に使用するのか知りたいです。また、ウィンドウプロシージャがコールバック関数なのはなぜでしょうか。
  • DispatchMessage関数がウィンドウプロシージャを直接呼び出さない理由や、メッセージの処理方法について知りたいです。

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

  • ベストアンサー
  • anmochi
  • ベストアンサー率65% (1332/2045)
回答No.2

 Win32APIは当然MSDNライブラリが一番だよね。なんたって本家だもん。  後「猫でもわかる」で検索すると幸せになれるかも知れません。いや、必ずや幸せになれるでしょう。  私はVisual C++ 5.0 Learning Edition(安い上にWin32APIの解説本とWin32API主要APIリファレンスとMFC5.0の解説本がついてきたので・・・・)を買ってとりあえず穴が開くほどその3冊を読んだ。それ以降はずっとMSDNライブラリ+猫わかですな。MSDN OS サブスクリプションに入ってて、CDがあほほど送られてくるのに辟易して止めた。最近はWindows Mobile 6用の開発をするためにeVC++4.0とPPC2003SDKでまたWinAPIと格闘中ですわ。  大丈夫、APIリファレンスを何度も眺めてたら次第に設計理念が分かってくる。そうするとメッセージループの仕組みも存在理由も分かるようになってくるから。  結局、ある程度の形を覚えたら後はどんな機能(API)があるのか全体像を把握していく課程になる。これは大体どんな言語でも同じで、言語自体はすぐ習得できるので、その後は提供される機能一覧を適当につまみ食いしてプログラムをとにかく作っていく事が重要でしょう。  知っているかも知れないが、Win32APIとは、もともとWindows 3.1までで動いていたWinAPI(Win16API)を無理やり拡張したもので、理にかなっているところもあれば「なんでこんな形なんだ?」と疑問に思うところもきっとあるでしょう。ライブラリ設計の理念だけで言えばJava Coreパッケージを眺めてみる方がきっと勉強になるだろう。

yozakura20
質問者

お礼

返事ありがとうございます。返信遅れてすみません。 とても勇気が沸きました。 だんだんプログラムを勉強を続けてきたらプログラムが楽しくなってきました。がんばって今ある本に穴が開くほど読んでみたいと思います。

その他の回答 (1)

  • anmochi
  • ベストアンサー率65% (1332/2045)
回答No.1

> NULL以外で実際にウィンドウハンドルを指定する > プログラムは一体どういうときなのか知りたいです。 お絵かきソフトの範囲指定など、ドラッグ動作を自前で書く時に使うんじゃないですかね。メイン窓とメイン窓の中にペイント窓、そしてパレット小窓があるとしましょう。 ・ペイント窓でマウスダウンメッセージ受信→マウスをキャプチャ→マウスボタンがダウンの状態を維持する限りドラッグ動作としてGetMessageをループ内で使用し、マウスムーブ、マウスアップイベントを監視→自分の窓はマウスイベント以外は無視しても(捨てても)良いが、メイン窓とパレット小窓へのメッセージは保留にしておくためにハンドルにペイント窓を指定→マウスアップメッセージでキャプチャを開放してループ終了→ウィンドウプロシージャ終了→メイン窓、パレット小窓へのメッセージは残ったままでメインメッセージループにまわされる。 こんな感じかな。 > DispatchMessage関数が > 直接ウィンドウプロシージャ呼び出さない理由が知りたい。  うううううう~ん・・・・。逆になぜDispatchMessage関数が直接ウィンドウプロシージャを「呼び出さない」と思ったのかを聞いてみたいところですけど。そもそもコールバック関数、特にWin32APIにおけるコールバック関数(あるいはC言語における関数へのポインタ「*func()」)とは何ぞやから調べた方が良いかも知れない。  まず、メッセージループに先立ってWNDCLASSの登録をしたですよね。で、ウィンドウプロシージャのアドレスはこのWNDCLASS構造体に突っ込んでる。あなたがアプリの中でテキストボックス(Win32で言えばWNDCLASS="EDIT")を作った時には、テキストボックス用のウィンドウプロシージャがある。ではあなたのアプリが受け取ったメッセージを「どのウィンドウプロシージャが処理するのか」判定しているのは誰でしょうか(OSなのかアプリなのか)。サブクラス化を行うとどうなるのか。それはぜひ解析してみていただきたい。

yozakura20
質問者

お礼

返事ありがとうございます。 自分のコンピュータの知識の無さを実感しました。 まずGetMessage関数ですが、NULL以外もうまい使い方があるのだとわかったので(具体的にどういうときかはよくわかりませんが)今現在はこの関数が柔軟に対応できるものなんだという理解に留めておくことにします。 そしてコールバック関数というかウィンドウズの仕組みについてですがこれも今の自分では理解できないので勉強したいとおもいます。 アマゾンで買ったAPIで学ぶWindows徹底理解という本を見たところDispatchMessage関数はMSG構造体のhwndメンバーを参照して、そのウィンドウプロシージャを呼び出すようにウィンドウズに依頼するAPIだ。直接ウィンドウ・プロシャージャを呼び出しても同じではないか、と考えるかもしれないがウィンドウズに依頼したほうが良い理由が少なくとも2つある・・・・・・・・略。と丁度、自分の疑問の解消が書いてありました。もちろん本の内容を完全に理解できてないのでその場の納得にしか過ぎないですが、疑問は解消できました。 win32APIを使ったプログラム作るにあたってどのように勉強していくと良いのか教えてもらえませんか? win32APIを使ったプログラムを書くときに実際の仕組みなどについて詳しく書かれたお勧めの書籍などありませんか?