私は自分のパーソナライズされたwinapiラッパーを開発しています。私の希望構文は、次のとおりです。ボタンとウィンドウクラスをリンクする
// #define wndproc(name) void name (Window & hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
// #define buttonproc(name) void name (Button & hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
wndproc (rightClick) { //evaluates to function to handle window message
::msg ("You right clicked the window. Closing window...");
hwnd.close(); //close() is implemented in my Window class
}
buttonproc (buttonClick) { //same thing basically
::msg ("You clicked this button. I'm going to hide the other one...");
//if text on this button is "One button", find the one belonging to parent
//with the text "Other button" and hide it, or vice-versa
hwnd.text == "One button"
? hwnd.parent().button ("Other button").hide();
: hwnd.parent().button ("One button").hide();
}
int main() {
Window win; //create default window
win.addmsg (WM_LBUTTONDOWN, rightClick); //look for l-click message and call that
Button b1 (win, "One button", 100, 100, 50, 20, buttonClick); //parent, coords, size, clicked
Button b2 (win, "Other button", 200, 100, 50, 20, buttonClick);
return messageLoop(); //should be self-explanatory
}
事があり、wndproc
で、hwnd
はWindow &
あるとbuttonproc
で、hwnd
がButton &
です。
msgproc (Window, rightClick){...}
msgproc (Button, buttonClick){...}
問題は、私はこれらの手順を呼び出し、それらを右hwnd
を与えるために持っているという事実である:私は言って逃げることができるかもしれません。私のメインウィンドウの手順は私のWindow
クラスで実装されています。それは4つの通常の引数を取得します。右ボタンの手順にWM_COMMAND
というメッセージを渡す必要がある場合は、対応するButton
オブジェクトを付けたいと思います。
現状では、Window
とButton
の両方のスーパークラスへのポインタを渡します。もちろん、次のような複雑なコードを作成します。
((Window *)hwnd)->operator()() //get HWND of the Window
実際にはうまくいかないようです。残念ながら、現時点で私が考えることができる唯一の方法は、すべてButton
のリストを作成し、正しいものを取り出しておくことです。私はこれをすべての可能な受信者にまで拡大することさえできました。
このようにする利点は、私のButton
クラスには、メッセージが見つかるたびに呼び出される静的ウィンドウプロシージャがあることです。私は他のコントロールを追加していませんが、既存のものでIDをチェックし、一致する場合にボタンを作成するときに指定したプロシージャを呼び出すことによって動作するように設計されています。これが完了すると、WM_COMMAND
ハンドラを追加する他のもの(チェックボックスなど)も呼び出されます。
私はすべてのHWNDの子とその対応するオブジェクトのWindow
にリストを保持することを考えていました。このようにして、Button
のようなすべてのクラスで余分な処理を行い、余分な処理が多くなります。をproc [i] (control [loword(wParam)], msg, wParam, lParam)
の代わりにWM_COMMAND
に置き換え、lParam
を使用してコントロールかどうかを確認します。
私は大きなものを見逃しているようです。私はこれを実装してから大きな問題にぶつかる可能性があります。これをすべて行うには良い方法がありますか?
私がそれをやっている間に、正しいオブジェクトタイプ(Button、Checkbox ...)を返すcontrol()
関数を作る方法がありますさまざまなオブジェクト(これは私が行うべき方法を見ていると確信しています)?
あなたは明らかにC++を使用しています。なぜマクロを最初に使用するのですか? –
@Cody Grey、その背後にある理由は、一般的に使用されるパラメータのリストを削除することでした。毎回入力するのはかなりのビットです。 – chris
そうです、私はそれを手に入れます。なぜ仮想関数を使用しないのですか?あなたはすでに 'Window'クラスと' Button'クラスを定義しています。 –