私は単純なウィジェット システムに取り組んでおり、現在いくつかのコンテナーを実装しています。
これが私がいる状況です:
Widget
基本クラス、他のウィジェットを含むことができるウィジェットであるクラスContainer
、および のようないくつかのウィジェット サブクラスがありますButton
。- コンテナには 2 つのタイプがあります。
Container
子を絶対的に配置するそれ自体とBox
、ウィジェットを水平または垂直に並べてスタックする です。 - 各ウィジェットは、x=0、y=0 で自分自身を描画します。したがって、コンテナーは、ウィジェットが自分自身を描画するように指示される前に、描画コンテキストにオフセットを追加する必要があります。
- 各ウィジェットは、x/y 位置に基づいて独自のヒット テストを行います。
これまでのところ、問題なく動作しています。しかし、私が実装しているので、それはバラバラになります:私がしていることは、継承されBox
た関数を上書きして、x/y 位置に基づいてではなく、それらをすべて並べて描画することです。とてもシンプルです。draw
Container
しかし、ウィジェットの x/y 位置が無意味になったため、イベント処理は完全にオフになっています。
次の 2 つのオプションがあると思います。
- 描画のように、x=0、y=0 の位置でウィジェットにヒット テストを実行させます。次に、マウスの位置を で一致するように再計算し
Container
ます。 - 各レイアウト セットをその子に対して x/y にし、子に x/y 位置で再び自分自身を描画させます。描画コンテキストのオフセットはもうありません
最初のものは少し醜いと思います。2 つ目の実装は、ウィジェットの位置の変更に対応する必要があるため、かなり複雑です。
Qt、Gtk、wxWidgets などの他のウィジェット システムは、一般的にこれにどのように取り組んでいますか? これらのいくつかのソースを見てきましたが、洗練されすぎているため、よくわかりません。考慮すべきサイズ変更や梱包の問題はありません。