ページ 11

WM_QUITとはなにですか?

Posted: 2016年6月05日(日) 13:22
by notebook
http://wisdom.sakura.ne.jp/system/winap ... win11.html

ここで終了コードが「終了コードは必ず WS_QUIT の wParam の値でなければならないとされます」
とかいてありますが

return msg.wParam;

となっていてWS_QUITなんてオブジェクトでてきてませんがどういうことなんでしょうか?

WS_QUIT.wParamみたいなかたちで出てこないんでしょうか?

Re: WM_QUITとはなにですか?

Posted: 2016年6月05日(日) 18:13
by YuO
WS_QUITはWM_QUITの誤記でしょう。
で,WM_QUITはウィンドウメッセージです。

return msg.wParam;する時の,msg.messageを調べてみると,WM_QUITが入っていることがわかると思います。
この時の追加の情報として,msg.wParamにPostQuitMessageの引数が入っています。

Re: WM_QUITとはなにですか?

Posted: 2016年6月05日(日) 18:43
by notebook
?????????

最後のreturnのmsg.wParamの

msgがWM_QUITになってるってことですか??????????

頭が混乱しそうです!!!!!

Re: WM_QUITとはなにですか?

Posted: 2016年6月06日(月) 00:44
by YuO
MSG structureはちゃんと読んだでしょうか。
MSGは構造体です。
msgはMSG型の変数ですから,msgがWM_QUITになる,ということはないです。
YuO さんが書きました:return msg.wParam;する時の,msg.messageを調べてみると,WM_QUITが入っていることがわかると思います。
この時の追加の情報として,msg.wParamにPostQuitMessageの引数が入っています。
ここを,ちゃんと読み返してください。
msg.messageにWM_QUITが入っているとは書きましたが,msgがWM_QUITになるとは書いていません。

Re: WM_QUITとはなにですか?

Posted: 2016年6月06日(月) 09:49
by notebook
YuOさん返信ありがとうございます。

でもhttp://wisdom.sakura.ne.jp/system/winapi/win32/win10.html
だとmsg == WM_LBUTTONUPみたいなことしてるから、msg=メッセージではないんでしょうか?
もしmessageなるものがあるなら

msg.message==WM_LBUTTONUPとしないとダメでは??また混乱してしまいました。
そのままmsgだけでcaseしてるからmsgがWM_CLOSEとかWM_PAINTとかいうメッセージの変数なのかと思ってたんですけど。

Re: WM_QUITとはなにですか?

Posted: 2016年6月06日(月) 10:25
by softya(ソフト屋)
これはですね。
C言語の仮引数や変数がちゃんと理解出来ていないんだと思います。
変数名は変数の型を表していませんので、msgという変数名が同じ型だと思い込むのは理解する上で大変危険です。
よく読んでみてください。型が違いませすよ。

Re: WM_QUITとはなにですか?

Posted: 2016年6月06日(月) 10:34
by notebook
softya(ソフト屋)さん

C言語だと

int k
k=20;
switch(i)
case k

の場合iとkは同じ型ですよね?

それなら

msg == WM_LBUTTONUPとかを判定するなら

msgとWM_LBUTTONUPは同じ型なのでは?

すいません、もちろんなんらかの理屈があるから
msg == WM_LBUTTONUPこういう書き方できるんでしょうけど、実際動きますし。

Re: WM_QUITとはなにですか?

Posted: 2016年6月06日(月) 10:38
by notebook
あ…

UNITって書いてありましたね…

mainの方でMSG msgって書いてあるから
プロシージャのほうのmsgの型を確認してませんでした…
うっかりです。

Re: WM_QUITとはなにですか?

Posted: 2016年6月06日(月) 10:42
by softya(ソフト屋)
そうですね。同じmsgと言う変数名ですが型が違います。
なので、#1から混乱されていることになります。
WM_QUITですがVisualStudioで検索すれば定義を見ることも出来ますよ。
MSG型も同様に検索できます。

Re: WM_QUITとはなにですか?

Posted: 2016年6月06日(月) 10:45
by notebook
ということはプロシージャにはMSGのmsgが渡されるわけだから
msg.msgという書き方は許されるんでしょうか?

Re: WM_QUITとはなにですか?

Posted: 2016年6月06日(月) 10:54
by softya(ソフト屋)
notebook さんが書きました:ということはプロシージャにはMSGのmsgが渡されるわけだから
msg.msgという書き方は許されるんでしょうか?
プロシージャの仮引数はMSG型じゃないですし、そもそもMSG型にmsgと言う名前のメンバ変数がなければ出来ませんね。
根本的なところですが、他の方も書いてますがC言語の理解不足だと思います。
プロシージャにはmsg型のmsgは存在しない(未定義)。MSG型にはmsgとメンバ名も存在しない(未定義)です。
まぁ、疑問に思うならコンパイルしてためしてみるのが一番です。試した上で質問して下さい。
経験したことが理解につながるので、質問ばかりで済ませると理解が進みません。

なお、VisualStudio2010だと型名を選択しておいて右クリックで「定義への移動」で見れるはずです。

Re: WM_QUITとはなにですか?

Posted: 2016年6月06日(月) 10:57
by notebook
softya(ソフト屋) さん

ということは仮引数で渡される(HWND hwnd , UINT msg , WPARAM wp , LPARAM lp)
この4つの引数には親がいるわけじゃないですか?

親.msg
親.wp
としても間違いではないですよね?
でその親を明示する場合どうしたらいいんでしょうか?

Re: WM_QUITとはなにですか?

Posted: 2016年6月06日(月) 11:01
by notebbok
だってjavaだって

親オブジェクト.フィールド
親オブジェクト.メソッド

みたいな書き方しますよね。僕が疑問なのはそこです。

Re: WM_QUITとはなにですか?

Posted: 2016年6月06日(月) 11:09
by softya(ソフト屋)
親ですか?
Javaでもオブジェクトを引数で渡せばオブジェクト=親も参照できますが、メンバ変数だけ引数で渡した場合は、その親は参照できないはずですが。
試してみてください。

【補足】
逆にできたらカプセル化を破壊することになるのでオブジェクト指向言語としては大問題かもしれません。

Re: WM_QUITとはなにですか?

Posted: 2016年6月06日(月) 11:26
by notebook
main関数内のMSG msgとはいったい…
このmsgをディスパッチしてコールバックでプロシージャに送って
そのmsgのUNITやらwParamなどを参照しているというのは全くの間違いということですか??
ちょっとどうしようもないくらい混乱してしまいました…

Re: WM_QUITとはなにですか?

Posted: 2016年6月06日(月) 11:35
by softya(ソフト屋)
引数で渡すということの本質を理解されていない気がしますが。
Javaでも関数間のオブジェクトの場合とメンバ変数の場合の引数の受け渡しを試されましたか?
試さずに混乱していると書かれても理解が進まないだけですよ。

Re: WM_QUITとはなにですか?

Posted: 2016年6月06日(月) 11:42
by notebook
引数で渡すということは、渡す主体がいるっていうことですよね。
プロシージャが呼ばれてその4つの引数は誰かの持ち物ってことですよね。
こういう理解でいいですか?

Re: WM_QUITとはなにですか?

Posted: 2016年6月06日(月) 11:52
by softya(ソフト屋)
実体は必要ですよ。
ただ、受け取る関数側がどのオブジェクトのメンバ変数であるかを知る事はできません。
そもそもメンバ変数である必要もありません。引数が同じ型であればよいのです。

Re: WM_QUITとはなにですか?

Posted: 2016年6月06日(月) 12:21
by notebook
なるほど、でも引数として受け取った後、その引数の値を使うだけでなく実体として変化させたい場合は
&paramのようにポインタとして使うんですね。

Re: WM_QUITとはなにですか?

Posted: 2016年6月06日(月) 13:24
by softya(ソフト屋)
確かにポインタにすれば書き換えれますが、他に良い代案がない場合の手段であって基本は書き換えずに戻り値です。
プログラムのバグを考えるなら関数先で気軽に値を書き換えるのは厳禁ですよ。

Re: WM_QUITとはなにですか?

Posted: 2016年6月06日(月) 17:16
by notebook
softya(ソフト屋)さん
注意致します。ありがとうございました!