VizCommand #23 helloコマンドの実装

"hello"と入力したら、"Hello, world!"と返す、"hello"コマンドを実装する。

resource.hで、

独自メッセージUM_CONSOLECORECOMMAND、UM_RESPONSEMESSAGE、UM_FINISHRESPONSEを追加。

ConsoleCore.hは、

入力されたコマンドに対する処理を実行するウィンドウのウィンドウハンドルm_hProcWndや、それをセットするSetProcWindow、さらにOnUserMessage、OnResponseMessage、OnFinishResponseを追加。

ConsoleCore.cppでは、

SetProcWindowは、指定のウィンドウハンドルをm_hProcWndにセット。

GetCommandStringしたら、CScalableEditBox::OnKeyDownでリターンキーが入力された時の処理(改行し、CScalableEditBoxが1行大きくなり、CScalableEditBoxPanelも1行大きくなる。)をしてもらう。
そのあとPostMessageでUM_CONSOLECORECOMMANDとm_tstrCommandStringとm_hWndをm_hProcWndに投げる。

実は、投げた先はCConsoleで、

Console.hには、OnUserMessage、OnConsoleCoreCommand、OnHelloを追加。

Console.cppで、

pConsoleCore->SetProcWindowで、hwndを指定しているので、
CConsoleCoreで起きた入力イベントはウィンドウハンドルhwndを持つCConsoleオブジェクトで処理することにしている。

OnUserMessageでは、UM_CONSOLECORECOMMANDなら、OnConsoleCoreCommandを呼ぶ。

OnConsoleCoreCommandで、入力コマンドが"hello"なら、OnHelloを呼ぶ。

OnHelloでは、SendMessageでhSrcにUM_RESPONSEMESSAGEと"Hello, world!"を投げる。
そのあと、UM_FINISHRESPONSEも投げる。
hSrcは投げ元のウィンドウハンドル、つまりCConsoleCoreに投げ返している。

UM_RESPONSEMESSAGEならOnResponseMessage、UM_FINISHRESPONSEならOnFinishResponseを呼ぶ。

OnResponseMessageは渡されたメッセージ文字列をPutConsoleで出力。

OnFinishResponseはShowOutputFormでフォームを出力。

f:id:BG1:20170504121453p:plain

"hello"と入力し、リターンキーを押すと、

f:id:BG1:20170504121512p:plain

"Hello, world!"が返ってくる。
あえて改行せず、出力フォームがくっつくようにしている。

・helloコマンドの実装 · bg1bgst333/VizCommand@b15d37b · GitHub