0

私の最初の Gtkmm 3.0 プログラムでは、プログラム構造に問題があり、DrawingArea クラスからクラス データにアクセスできません。

gnome Web サイトのデモ プログラム (「細い線の描画」) に基づいて、window クラス、drawingArea クラス、およびユーザー データを含む Board クラスがあります。

drawingArea オブジェクトは、windows クラスのメンバ変数として定義されています。ウィンドウ クラス コンストラクターで、Board オブジェクトをインスタンス化します。

ここで、drawingArea クラスの on_draw ルーチンで Board メンバー変数にアクセスしたいと考えています。これを行う最善の方法は何ですか?

私のボードクラスは次のとおりです。

class Board {
public:
   int sqPix;       

私のウィンドウクラスは次のとおりです。

Board &ExampleWindow::getBd()   { return bdw; }
void  ExampleWindow::setBd(Board b) {bdw = b; }
ExampleWindow::ExampleWindow(char * fn, vector<int>& t)
{
  Board bd = Board(t);
  setBd(bd);

私のウィンドウ クラス .h ファイルには次のものがあります。

 class ExampleWindow : public Gtk::Window
{
public:
  ExampleWindow();
  ExampleWindow(char * fn, std::vector<int>& t);
  virtual ~ExampleWindow();
  Board &getBd();
  void  setBd(Board b);
private:
  Board bdw;
  MyArea m_Area;

私の描画領域クラスでは、次のようなことをしたいと思っています:

bool MyArea::on_draw(const Cairo::RefPtr<Cairo::Context>& cr)
{
  Gtk::Allocation allocation = get_allocation();
  =====> int sqPix = ExampleWindow::getBd().sqPix;  
4

2 に答える 2

0

トップ レベル ウィンドウを描画領域に結合しないでください。そうしないと、アプリケーションの他のウィンドウ (サンプル ボードの外観を変更するための設定など) で描画コードを再利用できなくなります。

代わりに、Board 参照またはポインターをコンストラクターで DrawingArea に渡します。DrawingArea が Board 参照を受け取るウィンドウのコンストラクターを次に示します。DrawingArea が常に 1 つのボードに関連付けられているとは限らないと思われる場合は、代わりにポインターと setBoard() を使用できます。

ExampleWindow(const char * fn, const vector<int>& t) : bdw(t), m_Area(bdw) {
  ...
}
于 2013-04-13T19:26:31.697 に答える
0

後でコンストラクターで初期化できる定義ExampleWindowへのポインターを追加します。このようにして、ExampleWindow のパブリック インターフェイスにアクセスできます。public getter を作成して、外部ユーザー ( ) がフィールドにアクセスできるようにすることができます。MyAreaMyAreaMyArea

于 2013-04-13T18:57:23.147 に答える