wxWidgets - komunikacja między kontrolkami

0

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()
0

A nie możesz wysłać komunikatu np. wxEVT_COMMAND_COMBOBOX_SELECTED?

0

a jak?... sorry ale czego nie mogę strawić w wxWidgets (choć to właściwei podstawa) to event-tów

Umieszczenie w tym kawałku kodu
#include "combodlg.h"
...
BEGIN_EVENT_TABLE(ComboDlg,wxDialog)
...
EVT_TEXT(4000,ComboDlg::ed_szablonSelected)
...
END_EVENT_TABLE()

wpisu

	EVT_CHECKBOX(4000,ComboDlg::obsługa)

nie ma żadnej reakcji

0

nie
EVT_CHECKBOX
tylko
EVT_COMBOBOX

0

Coś w ten deseń:

void OnMouseClick(wxMouseEvent& event)
{
	...

	wxCommandEvent cmd_ev(wxEVT_COMMAND_COMBOBOX_SELECTED,m_combo->GetId());
	
	cmd_ev.SetInt(666); // przykładowo jakieś dane
		
	m_combo->ProcessEvent(cmd_ev);

	...
}
0

Robiłem wstawkę zamiast

// TODO: Send event
w metodzie OnMouseClick

            wxCommandEvent cmd_ev(wxEVT_COMMAND_COMBOBOX_SELECTED,this->GetId());
            cmd_ev.SetInt(4000); // przykładowo jakieś dane               
            this->ProcessEvent(cmd_ev);

Obsłużyłem zdarzenie w ComboDlg

EVT_COMBOBOX(4000,ComboDlg::ed_szablonSelected)

Ale zdarzenie nie jest wywoływane

0
  this->ProcessEvent(cmd_ev);

A dlaczego tu jest this?

0

Zmieniłem konstruktor dla TreeCtrlComboPopup

    TreeCtrlComboPopup(wxWindow* parent)
    {
        pr=parent;
    };

przekazuje mu wskaźnik obiektu kontrolnego wxGenericComboCtrl

zmieniłem wywołanie zdarzenia na

          wxCommandEvent cmd_ev(wxEVT_COMMAND_COMBOBOX_SELECTED,pr->GetId());
          cmd_ev.SetInt(4000); // przykładowo jakieś dane               
          pr->ProcessEvent(cmd_ev);

i zadziałało

WIELKIE DZIĘKI [browar]

0

W dokumentacji jest napisane, że m_combo to właśnie combo, które jest właścicielem popup'u, więc w sumie moja wersja powinna działać. No ale nieważne...

0

no a ja zamiast skopiować i wypróbować zacząłem kombinować...

jutro sprawdzę m_combo

jeszcze raz dzięki

1 użytkowników online, w tym zalogowanych: 0, gości: 1