最初はあまり気乗りしなかったのですが、一応手を付けたので作ってみようと始めたら、迷路にはまり、熱くなってしまいました。
1.最初CDICEというクラスを作り、CPICBOXの様にダミーのコールバック関数でウィンドウクラス登録をしてウィンドウプロパティに書き込んでCDICEクラスの真正コールバック関数を呼ぶ形や、サブクラス化して乗っ取ってしまう形を考えたのですが、どうもうまくゆきません。
2.又、クラスごとDLLに入れてしまうつもりだったので、クラスのExport、Importもトライアンドエラーで学習しながらの開発で動作試験の結果が思わしくありません。
3.そんな時にまた早朝「あっ、DLLで提供するのはリソースとウィンドウクラスの登録と共通の真正コールバック関数でいいんだ。クラスなんていらないじゃん。」というひらめきが降りてきて、早速BCCSkeltonを捨てて、SDKでDLLを組みます。
4.特にメインプログラムのインススタンスとDLLのインスタンス、いつウィンドウ(今回はダイアログですが)が生成されるかのタイミングが結構重要でした。
そうしてやっとこさ、「ウィンドウ版チンチロリン」のプロトタイプが出来上がりました。
が、
DLLのコールバック関数を共用している関係上、3つのサイコロの目を決定するタイミングと(InvalidateRect、UpdateWindowの両関数でWM_PAINTを読んで行う)コントロールの描画のタイミングからい「一挙に行うと最後のサイコロの目で3つとも描画されてしまう」問題が生じました。
これを抜本的に解決するには、(非効率ですが)コントロールごとにコールバック関数を独立させるか、オールバック関数を利用しているウィンドウ毎にサイコロビットマップ番号を独立して持たせ、それをDB化して呼ばれる度にウィンドウハンドルからそのウィンドウのサイコロビットマップ番号を検索、抽出するか、或いは(無理やり)描画が完了するまでにウェイトをかけるか、になります。
で、
どうしたかというと(一番手を抜いた)最後のウェイト方式をメッセージボックスを使って行うことにしました。(だって、面倒くさいんだもん!)
これで(どんくさいのですが)意図した動作をするようになりましたので、手役を判断させ、ログを採らせて手じまいにしようかと思います。(一応サイコロ単体はボタンの様に見えるようになりましたし、10回ほどクルクル目を変えてゆくことにしました。また、久々に(別に必要性はないのですが、お勉強までに)メッセージ等に英語を使ってしまいましたよ。)


