Jak z klasy TreeCtrlComboPopup wywołać inicjację wybranych pól z klasy combodlg, która tworzy obiekt TreeCtrlComboPopup. Takie masło maślane.
Tworzę kontrolkę, drzewo wxTreeCtrl w okienku wxComboPopup i to kontroluje kontrolka wxGenericComboCtrl. Wybór elementu z drzewa przepisuje poprawnie element do kontrolki wxGenericComboCtrl. Pytanie zasadnicze jak zrobić zdarzenie wyboru elementu które będzie sygnalizowane w klasie ComboDlg (albo wybór z drzewka wywoła metodę XSelectSzablon z klasy ComboDlg). Samo wpisanie tekstu w kontrolkę wxGenericComboCtrl wywołuje zdarzenie EVT_TEXT(4000,ComboDlg::ed_szablonSelected), ale wyboru z drzewka już nie jestem w stanie obsłużyć.
Poniżej zarys kodu...
combodlg.h
#ifndef __COMBODLG_h__
#define __COMBODLG_h__
#include "TreeCtrlComboPopup.h"
class ComboDlg : public wxDialog
{
private:
DECLARE_EVENT_TABLE();
public:
ComboDlg(wxWindow *parent, wxWindowID id = 1, const wxString &title = wxT("Combo"), const wxPoint& pos = wxDefaultPosition, consCombointaktDlg();
wxGenericComboCtrl *ctrl_szablon;
TreeCtrlComboPopup *edn_szablon;
void XSelectSzablon(wxString NazwaSzablonu);
private:
void OnClose(wxCloseEvent& event);
void CreateGUIControls();
void ed_szablonSelected(wcCommandEvent& event)
wxString jakis_tekst;
};
#endif
combodlg.cpp
#include "combodlg.h"
...
BEGIN_EVENT_TABLE(ComboDlg,wxDialog)
...
EVT_TEXT(4000,ComboDlg::ed_szablonSelected)
...
END_EVENT_TABLE()
ComboDlg::intaktDlg(wxWindow *parent, wxWindowID id, const wxString &title, const wxPoint &position, const wxSize& size, long style)
: wxDialog(parent, id, title, position, size, style)
{
CreateGUIControls();
}
ComboDlg::~ComboDlg()
{
}
void ComboDlg::CreateGUIControls()
{
ctrl_szablon = new wxGenericComboCtrl(this,4000 /*wxID_ANY*/ ,"<Wybierz szablon>", wxPoint(500,50), wxSize(200,22),wxCB_SORT);
ctrl_szablon->UseAltPopupWindow();
edn_szablon = new TreeCtrlComboPopup();
ctrl_szablon->SetPopupControl(edn_szablon);
wxTreeItemId rootId = edn_szablon->AddRoot(wxT("<hidden_root>"));
// load_tree(edn_szablon,_T("A:B:C:D:E:F:G:H:I:J:K:L:M"));
ctrl_szablon->SetButtonPosition(-1,-1,wxLEFT,0);
void ComboDlg::XSelectSzablon(wxString NazwaSzablonu)
{
jakis_tekst=NazwaSablonu;
};
void ComboDlg::ed_szablonSelected(wcCommandEvent& event)
{
wxMessageBox(_T("test"));
};
TreeCtrlComboPopup.h
#ifndef __TreeCtrlComboPopup_h__
#define __TreeCtrlComboPopup_h__
#ifdef __BORLANDC__
#pragma hdrstop
#endif
#include <wx/combo.h>
#include <wx/treectrl.h>
//#include "ComboDlg.h"
class TreeCtrlComboPopup : public wxTreeCtrl, public wxComboPopup {
public:
virtual void Init()
{
}
virtual bool Create( wxWindow* parent )
{
return wxTreeCtrl::Create(parent,1, wxPoint(0,0),wxDefaultSize,wxTR_HIDE_ROOT|wxTR_HAS_BUTTONS|wxTR_SINGLE|wxTR_LINES_AT_ROOT|wxSIMPLE_BORDER);
}
virtual void OnShow()
{
if ( m_value.IsOk() )
EnsureVisible(m_value);
}
virtual wxSize GetAdjustedSize( int minWidth, int WXUNUSED(prefHeight), int maxHeight )
{
return wxSize(wxMax(300,minWidth),wxMin(250,maxHeight));
}
virtual wxWindow *GetControl() { return this; }
void OnMouseClick(wxMouseEvent& event)
{
int resFlags;
wxTreeItemId itemHere = HitTest(event.GetPosition(),resFlags);
if ( itemHere.IsOk() && (resFlags & wxTREE_HITTEST_ONITEMLABEL) )
{
if (!ItemHasChildren(itemHere))
{
m_itemHere = itemHere;
m_value = itemHere;
Dismiss();
// TODO: Send event
} else {
Toggle(itemHere);
Próbowałem mało sensowne rozwiązanie, ponieważ musiałbym załączyć tu plik
nagłówkowy ComboDlg.h, który to plik włącza TreeCtrlComboPopup.h i mam zapętlenie, błąd podczas kompilacji... a poza tym parent wxTreeCtrl w ogóle nie jest obiektem ComboDlg :)
((ComboDlg*)wxTreeCtrl::GetParent())->XSelectSzablon(_T("SZABLON"));
};
};
event.Skip();
}
protected:
wxTreeItemId m_value; // current item index
wxTreeItemId m_itemHere; // hot item in popup
private:
DECLARE_EVENT_TABLE()
};
#endif
TreeCtrlComboPopup.cpp
#include "TreeCtrlComboPopup.h"
BEGIN_EVENT_TABLE(TreeCtrlComboPopup, wxTreeCtrl)
EVT_LEFT_DOWN(TreeCtrlComboPopup::OnMouseClick)
END_EVENT_TABLE()