Mouse Event w CEdit

0

Problem typu:
Mam okno dialogowe, a w nim kontrolke CEdit,
i chcialbym w niej moc wykrywac zdarzenia:
np.: srodkowym klawiszem myszki kasowac aktualnie zaznaczony tekst
kombinuje z np.:

ON_CONTROL(WM_MBUTTONDOWN, IDC_TEXTINPUT, OnEditMidMouseClick)

ale z tego nici ...
jak zmapowac taka kontrolke z wydarzeniami (mysz, klawiatura) ??

Z gory dziekuje

0

hook na klawiature/mysz.. w MSDN'ie jest ładnie opisane.. jest nawet przykład ze współgraniem przycisku myszki i np. przytrzymaniu shifta.. a o hookach dowiesz sie troszke tutaj oraz na http://winapi.org

0

No tak i najlepiej zakladac hook'a w kazdym wypadku gdy potrzeba uzyc jakikolwiek klawisz dla kontrolki.
A od czego sa funkcje z klasy CWnd?

0
Malcolm napisał(a)

No tak i najlepiej zakladac hook'a w kazdym wypadku gdy potrzeba uzyc jakikolwiek klawisz dla kontrolki.
A od czego sa funkcje z klasy CWnd?

a bo ja wiem?
ktos zadał pytanie, to staram się mu pomóc najlepiej jak potrafię

nie jestem guru, więc proszę nie ironizować

EOT

0

Oj tam od razu ironia :)

Ja tez nie jestem guru, ale uwazam, ze nie nalezy zbytnio kombinowac.
Kts dobrze kombinuje, poczytaj msdn, tam jest wyjasnione dokladnie co i jak.
Z tego co napisales wyglada na to, ze powinno byc ok, jeszcze zalezy gdzie dales ta funkcje i jak ja obslugujesz.

Greg_ napisał(a)

a bo ja wiem?

Poczytaj i juz bedziesz wiedzial :)

0

nie moge sobie z tym dac rady :(,
probowalem jeszcze z czyms taki jak:

HWND ctrl = GetDlgItem(hwnd, IDC_TEXTINPUT); // jak zlapac uchwyt
gOldEditWndProc = (WNDPROC)SetWindowLong(ctrl, GWL_WNDPROC, (LONG) RtClickWndProc);

czyli zmiana funkcji Window Procedure, ale nie wiem jak zlapac uchwyt do okna
mojego aktualnego okna dialogowego, w ktorym jest kontrolka CEdit :(,

GetDlgItem(IDC_TEXTINPUT);

zwraca niestety wskaznik do CWnd,
w sprawie Nr. 1:
wyglada to u mnie tak: (teraz proba tez z lewym)

BEGIN_MESSAGE_MAP(CEngTestDlg, CDialog)
ON_WM_SYSCOMMAND()
...
ON_CONTROL(WM_LBUTTONUP, IDC_TEXTINPUT, OnEditMidMouseClick)
...
END_MESSAGE_MAP()

...

i definicja funkcji zadeklarowanej w .h jako:

afx_msg void OnEditMidMouseClick();

void CEngTestDlg::OnEditMidMouseClick()
{
AfxMessageBox("m test");
}
</span>

i dupa!

Kurcze przeciez to nie mozliwe, zeby wczesniej ktos czegos takiego nie robil,
np.: zamiana funkcjonalnosci prawego guzika myszy w kontrolce CEdit...
Co ja tutaj robie zle???

0
kts napisał(a)

HWND ctrl = GetDlgItem(hwnd, IDC_TEXTINPUT); // jak zlapac uchwyt
gOldEditWndProc = (WNDPROC)SetWindowLong(ctrl, GWL_WNDPROC, (LONG) RtClickWndProc);

czyli zmiana funkcji Window Procedure, ale nie wiem jak zlapac uchwyt do okna
mojego aktualnego okna dialogowego, w ktorym jest kontrolka CEdit :(,

GetDlgItem(IDC_TEXTINPUT);

zwraca niestety wskaznik do CWnd,

::GetDlgItem(hwnd_okna, IDC_TEXTINPUT);

i poczytaj o CWnd::GetSafeHwnd

kts napisał(a)

w sprawie Nr. 1:
wyglada to u mnie tak: (teraz proba tez z lewym)

BEGIN_MESSAGE_MAP(CEngTestDlg, CDialog)
ON_WM_SYSCOMMAND()
ON_CONTROL(WM_LBUTTONUP, IDC_TEXTINPUT, OnEditMidMouseClick)
END_MESSAGE_MAP()

...
i definicja funkcji zadeklarowanej w .h jako:
afx_msg void OnEditMidMouseClick();
void CEngTestDlg::OnEditMidMouseClick()
{
AfxMessageBox("m test");
}

Ja mam pytanie, czy ty chcesz zrobic to dla kontrolki, czy dla calego okna dialogowego ?
Jak na razie to w ogole strasznie namieszales :)

Stworz sobie klase, pochodna z CEdit np. CMyEdit i w tym zaimplementuj WM_LBUTTONUP. Dorzuc klase do swojego dialogu, stworz zmienna CMyEdit m_Edit;
w DoDataExchange klasy dialogu dorzuc DDX_Control(pDX, IDC_TEXTINPUT, m_Edit);
Mozesz przy pomocy wizarda sobie wygenerowac banalnie prosto calosc.
To wlasciwie na tyle :)
Powinno hulac.

0

@Malcolm: dzieki stary za wszelka pomoc, ale ja chyba cos tutaj knoce! :(
wyprowadzilem klase pochodna:

class CMyEdit : public CEdit
{
protected:
afx_msg void OnMButtonDown(UINT nFlags, CPoint point);
afx_msg void OnLButtonDown(UINT nFlags, CPoint point);
afx_msg void OnRButtonDown(UINT nFlags, CPoint point);
afx_msg void OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags);
};

w ktorej zrobilem swoje wersje funkcji zdarzen,
nastepnie:
DDX_Control(pDX, IDC_TEXTINPUT, m_editText);
(m_editText to objekt klasy CMyEdit),

w tych funkcjach zdarzen wywalam tylko AfxMessageBox'a,
ale z tego nici??
sorry, wiem ze jestem natretem, ale kurcze uparlem sie, zeby to chodzilo! ;)

0

Dziwne, bo np. u mnie hula idealnie:

void CMyEdit::OnMButtonDown(UINT nFlags, CPoint point)
{
	// TODO: Add your message handler code here and/or call default
	if(nFlags & MK_SHIFT)
		AfxMessageBox("Middle button + shift");
	else if(nFlags & MK_CONTROL)
		AfxMessageBox("Middle button + ctrl");
	else
		AfxMessageBox("Middle button");

	CEdit::OnMButtonDown(nFlags, point);
}

Jak bedziesz mial nadal problemy daj znac na gg lub na mejla, podesle ci kod z powyzszym przykladem.
P.S. Mam nadzieje, ze dodawales metody wizardem, jak recznie to dla powyzszej funkcji w message map powinienes miec jeszcze ON_WM_MBUTTONDOWN()

0

Hi Malcolm,

wiec problem chyba lezy w message mapach,
niestety nie uzywam wizarda, poniewaz
pisze pod Emacsem, a kompiluje Make'ami,
moglbys mie podeslac kod message map'y do ktoregokolwiek
zdarzenia, np.: srodkowy guzik myszki.
Mam juz taki jeden Event, ale odnosi sie on do mojego Okna Dialogowego,
a nie kontrolki CEdit, pewnie tutaj musi gdzies byc roznica.

Z gory dziekuje
pozdrawiam
kts

0

ok, juz chodzi, brakowalo:
Message Map :)

i tak dzieki za pomoc, bo niezle to pchnalem, dziki waszym postom

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