さて、katahiromz/Win32Templates をダウンロードしてVisual C++(MSVC)かRosBEでビルドしてみて下さい。
UIがだいぶリッチになりました。
C++を使わないという縛りでフレームワークを作っています。
今日はTextFileAppのCommandUIを読み解いていただきます。
CommandUIという構造体がありますね。これはコマンドIDと文字列IDを結びつけています。
いきなりですが。
#define DEFINE_COMMAND_UI(id, ids) { id, ids },
#include "CommandUI.dat"
#undef DEFINE_COMMAND_UI
これ読めますか?
なんとなくは
さらにdumpCommandUIでも
#define DEFINE_COMMAND_UI(id, ids) TRACEA("%s\t%d\t0x%X\t%s\t%d\t0x%X\n", #id, id, id, #ids, ids, ids);
#include "CommandUI.dat"
#undef DEFINE_COMMAND_UI
TRACEAはprintfのように動作するデバッグ用の関数だと考えて下さい。
IDを登録して登録したIDをぽんぽんデバッグログ出してる感じですかね
次はfindCommand。読めますか。 そしてgetCommandText。
純粋に配列前部探して一致したものを返す関数とそれで見つけた文字列を基に変換して返す関数ですね
LoadStringDxのバッファは書き換え可能だからこんな書き方でもOKです。
doCreateToolbarはツールバーを作成します。 TODO:と書いてある場所を改造してもいいけど時間がないから先に進みます。
rgbMaskColorのRGB(255, 0, 255)はピンクですね。RGBはRed, Green, Blueの略でそれぞれ0~255の値です。
TB_ADDBITMAPメッセージを使うのは古い方法で新しい方法はイメージリスト(TB_SETIMAGELIST)を使います。
createControlsはコントロール群を作成します。まずCreateFontIndirectでキャンバスのフォントを作成してキャンバスウィンドウを作成してフォントを設定します。
CreateStatusWindowはステータスバーです。
後始末はdestroyControlsです。g_hCanvasFontとs_himlToolbarはstaticなのでこのコンパイル単位で破棄しなければなりません。
OnMenuSelectはメニューを選択したときにステータスバーに文字列が表示されるようにWM_MENUSELECTを処理しています。
課題は全部終わったかな?
課題6は一部の関数(ex.ImmGetContext)などで想定しない値が返ってきているためfailedになっている。
こんな感じでしょうか
そうですね。使用している関数の周辺で不具合が混入しているのでしょう。それもImmCreateContext/ImmDestroyContext/ImmGetContextの周辺です。
$(REACTOS)/dll/win32/imm32
$(REACTOS)/win32ss/user/ntuser/ime.c
$(REACTOS)/win32ss/user/user32/misc/imm.c
この中に混入しています。
HIMCはカーネル内部(win32ss/user/ntuser)で自己参照構造体で制御されているから、これがあやしいですね。
なるほど
【課題】ImmCreateContextの呼び出しツリーをWin2k3で調べて下さい。それとReactOSのコードと比較して下さい。
今日はここまでとしましょう。
わかりました ありがとうございました