2

アプリケーションでwxPropertyGrid 1.4と一緒に wxWidgets 2.8を使用しています。浮動小数点値の場合、スライダーを使用して編集したいと思います。ただし、スライダー エディターはデフォルトで提供されていないため、ドキュメントに記載されているガイドラインに従って、独自のエディターを実装することにしました。

ただし、この新しいエディターでは、float プロパティのエディターとして設定しても、プロパティ グリッド セルが何らかの方法で操作 (クリックなど) されるまで、実際には表示されません。それまでは、従来のテキスト ボックス ベースのコントローラーが引き続き表示されます。

どうやら、スライダー エディターの実際の CreateControl メソッドは、propgrid が生成されたときに呼び出されるのではなく、セル自体がなんらかの方法で操作されたときにのみ呼び出されます。

これが私のカスタム プロパティ エディタです。

wxpgslider.h

class WXDLLIMPEXP_PG wxPGSliderEditor : public wxPGEditor
{
#ifndef SWIG
  WX_PG_DECLARE_EDITOR_CLASS(wxPGSliderEditor)
#endif

公衆:
  wxPGSliderEditor (int p = 10000)
    : 精度(p)
  {
  }

  ~wxPGSliderEditor ()
  {}

  // CreateControls メソッド スタブのマクロ
  wxPG_DECLARE_CREATECONTROLS

  void UpdateControl ( wxPGProperty* プロパティ, wxWindow* wnd) const;
  bool OnEvent ( wxPropertyGrid* propgrid, wxPGProperty* プロパティ, wxWindow* wnd, wxEvent& イベント) const;
  bool GetValueFromControl ( wxVariant& バリアント, wxPGProperty* プロパティ, wxWindow* wnd) const;
  void SetValueToUnspecified ( wxPGProperty* プロパティ, wxWindow* wnd) const;
  //void DrawValue ( wxDC& dc, const wxRect& rect, wxPGProperty* プロパティ, const wxString& text) const;

プライベート:
  int 精度;
};

wxpgslider.cpp

#include "cseditor/wxpgslider.h"

//----------------- wxPGSliderEditor ---------------------

WX_PG_IMPLEMENT_EDITOR_CLASS(SliderEditor, wxPGSliderEditor, wxPGEditor)

wxPGWindowList wxPGSliderEditor::CreateControls( wxPropertyGrid* propgrid,
                                                 wxPGProperty* プロパティ、
                                                 const wxPoint& pos,
                                                 const wxSize& size ) const
{
  double v_d = プロパティ->GetValue().GetDouble();
  もし ( v_d 1 )
    v_d = 1;

  wxSlider *ctrl = new wxSlider();

#ifdef __WXMSW__
  ctrl->Hide();
#endif

  ctrl->Create ( propgrid->GetPanel(),
                 wxPG_SUBID2,
                 (int)(v_d * 精度),
                 0,
                 精度、
                 位置、
                 サイズ、
                 wxSL_HORIZONTAL );

  return wxPGWindowList(ctrl);
}

void wxPGSliderEditor::UpdateControl ( wxPGProperty* プロパティ, wxWindow* wnd ) const
{
  wxSlider* ctrl = wxDynamicCast ( wnd, wxSlider );
  もし (ctrl)
  {
    ダブルバリュー;
    if (wxPGVariantToDouble (プロパティ->DoGetValue(), &val))
    {
      もし ( 値 1 )
        値 = 1;
      ctrl->SetValue ( (int)(val * 精度) );

      //static_cast(プロパティ)->GetLabel()
      // ->SetValue( wxString::Format(wxT("%ld"), val * precision) );
    }
  }
}

bool wxPGSliderEditor::OnEvent ( wxPropertyGrid* propgrid,
                                 wxPGProperty* プロパティ、
                                 wxWindow* wnd,
                                 wxEvent& イベント ) const
{
  if(event.GetEventType() == wxEVT_SCROLL_CHANGED)
  {
    // 値を更新します    
    event.Skip();
    propgrid->EditorsValueWasModified();

    true を返します。
  }
  
  false を返します。
}

bool wxPGSliderEditor::GetValueFromControl ( wxVariant& バリアント,
                                             wxPGProperty* プロパティ、
                                             wxWindow* wnd ) const
{
  wxSlider* ctrl = wxDynamicCast ( wnd, wxSlider );
  もし (ctrl)
  {
    variant = wxVariant ( (double)(ctrl->GetValue())/(double)(precision) );
    property->SetValue (バリアント);
  }

  true を返します。
}

void wxPGSliderEditor::SetValueToUnspecified ( wxPGProperty* プロパティ, wxWindow* wnd) const
{
  wxSlider* ctrl = wxDynamicCast ( wnd, wxSlider );
  もし (ctrl)
  {
    ctrl->SetValue (0);
  }
}

これは、Populate 関数で、スライダーを生成するために使用しているコードです。

double 値 = variant->GetFloat();

// 自作のスライダーを生成する
wxFloatProperty* fp = new wxFloatProperty(translatedName, originalName, value);
wxPGEditor* rHandle = wxPropertyGrid::RegisterEditorClass(new wxPGSliderEditor(), wxT("SliderEditor"));
fp->SetEditor(rHandle);
page->AppendIn(categoryID, fp);

以前に登録されていない場合に備えてクラスを登録し、プロパティのエディターを設定します。次に、プロパティをグリッドに追加します。セルが操作されるまでスライダーが表示されないのはなぜですか?

pgMan->GetGrid()->SelectProperty(fp, false);それを描画させる唯一の方法は呼び出しですか?

4

1 に答える 1

0

あなたが使用している

#ifdef __WXMSW__
  ctrl->Hide();
#endif

どうしたの

#ifdef __WXMSW__
    ctrl->Show();
#endif

サンプル:

....
  wxSlider* ctrl = new wxSlider();
#ifdef __WXMSW__
    ctrl->Hide();
#endif
....
ctrl->Create ( propgrid->GetPanel(),
             wxPG_SUBID2,
             (int)(v_d * precision),
             0,
             precision,
             pos,
             size,
             wxSL_HORIZONTAL );

#ifdef __WXMSW__
    ctrl->Show();
#endif

return wxPGWindowList(ctrl);
}

編集

コードに OnCustomEditorEvent が表示されません。

wxEVT_SCROLL_THUMBTRACK または wxEVT_SCROLL_CHANGED で。

....

propgrid->Connect( wxPG_SUBID2, wxEVT_SCROLL_CHANGED,
                       (wxObjectEventFunction) (wxEventFunction) (wxCommandEventFunction)
                       &wxPropertyGrid::OnCustomEditorEvent, NULL, propgrid );

#ifdef __WXMSW__
  ctrl->Show();
#endif

return wxPGWindowList(ctrl);
}
于 2012-08-19T02:41:10.320 に答える