Suwaki w MFC

0

Witam,
wlasnie pisze program w MFC, ktory obsluguje wiele suwakow. Chcialbym rozmieszczac je za pomoca petli, gdyz ich liczba podana jest w pliku zewnetrznym. Docelowo ma byc to dynamicznie, ale zalozmy, ze deklaruje tablice suwkow

CSliderCtrl suwak[100];

i tworze je w petli w funkcji OnInitDialog()

 za pomoca funkcji Create(). Niestety nie wiem jak obsluzyc zdarzenie CustomDraw w takiej sytuacji dla kazdego suwaka. Bez problemu dodaje obsluge tego zdarzenia jesli suwak umieszcze z Toolboxu, jednak wtedy rozmiescic ich za pomoca petli nie moge, a przynajmniej nie potrafie.
Z gory bardzo dziekuje za pomoc:)
0

Jeżeli ręcznie tworzysz kontrolki, to też ręcznie musisz wyedytować mapę komunikatów.
Siedzę w pracy i nie mam jak tego teraz sprawdzić, ale powinno działać:
http://www.programmersheaven.com/mb/mfc_coding/236324/236324/dynamic-button-creation/

Nie wiem czy w makrze ON_CONTROL_RANGE można dynamicznie ustawić zakres kontrolek, czy musi być znany na etapie kompilacji, ale zawsze możesz sobie zarezerwować odpowiednio duży zakres identyfikatorów.

0

Wielkie dzieki, ta strona bardzo mi pomogla jednak pojawil mi sie problem. Mianowicie wartosc suwakow ma byc wyswietlana obok i zmieniana na biezaco przy jego przesuwaniu, dlatego poprawilem odpowiednio fragmenty kodu na:

afx_msg void OnAnySlider( UINT nID );
	CSliderCtrl* m_SliderArray[10];
ON_NOTIFY(NM_CUSTOMDRAW, 100,110, OnAnySlider)
void CPrzyciskiDlg::OnAnySlider(UINT nID)
{
	//LPNMCUSTOMDRAW pNMCD = reinterpret_cast<LPNMCUSTOMDRAW>(pNMHDR);
	UpdateData(true);
	int cz=m_SliderArray[nID-100]->GetPos();
	CString cz2;
	cz2.Format(_T("%d"), cz);
	echo[nID-100].SetWindowTextW(cz2);
	UpdateData(false);
}

Pojawia mi sie nastepujacy blad:
error C2440: 'static_cast' : cannot convert from 'int' to 'void (__thiscall CCmdTarget::* )(NMHDR *,LRESULT *)' dotyczacy ON_NOTIFY

Gdy kod wyglada tak:

ON_CONTROL_RANGE (NM_CUSTOMDRAW, 100,110, OnAnySlider)

blad sie nie pojawia, jednak wartosci suwakow pozostaja takie jak w momencie startu programu, chyba, ze zle zmodyfikowalem te linie.

0

Przy ON_NOTIFY wygląda to trochę inaczej: http://msdn.microsoft.com/en-us/library/749htf6k%28VS.80%29.aspx

Może lepiej do tego użyć WM_HSCROLL/WM_VSCROLL?
http://msdn.microsoft.com/en-us/library/ekx9yz55%28v=VS.80%29.aspx

0

Wiem, ze to podstawy, ale caly czas probowalem roznych mozliwosci i nie umiem uzyc prawidlowo WM_HSCROLL. Moglbys mi podac jaka powinno miec to postac i czy jedyna zmiana to ta linia zamiast ON_NOTIFY

0

Użyj raczej makra:

ON_NOTIFY_RANGE( wNotifyCode, id, idLast, memberFxn )

a konkretniej:

ON_NOTIFY_RANGE( TRBN_THUMBPOSCHANGING, id, idLast, memberFxn )

TRBN_THUMBPOSCHANGING - ten komunikat chyba będzie dobry do zmiany cyfr w innej kontrolce w trakcie przesuwania.
id i idLast to jest zakres ID kontrolek, a memberFxn to funkcja, która ma być odpalana.

Nie sprawdzałem w praktyce, ale raczej powinno działać

0

Przy takim wywolaniu pojawiaja mi sie nastepujace bledy:
error C2440: 'static_cast' : cannot convert from 'void (__thiscall CPrzyciskiDlg::* )(UINT)' to 'void (__thiscall CCmdTarget::* )(UINT,NMHDR *,LRESULT *)'

error C2065: 'TRBN_THUMBPOSCHANGING' : undeclared identifier
Czy TRBN_THUMBPOSCHANGING nalezy wczesniej deklarowac? Jesli tak to w jaki sposob?

0

odnośnie drugiego błędu: http://msdn.microsoft.com/en-us/library/bb760172%28VS.85%29.aspx

Pierwszego: masz źle napisaną funkcję, która ma reagować na zdarzenie. Prototyp ma wyglądać tak:

afx_msg void memberFxn( UINT id, NMHDR * pNotifyStruct, LRESULT * result );

wszystko masz tu: http://msdn.microsoft.com/en-us/library/749htf6k%28VS.80%29.aspx w sekcji ON_NOTIFY_RANGE

P.S. Bez czytania i szukania w dokumentacji ciężko Ci będzie coś pisać.

0

Masz racje, wtedy za duzo sie nie naucze, mialem zla deklaracje i definicje, poniewaz wzorowalem sie na tym pierwszym linku, gdzie dla przyciskow jest ona w takiej prostej wersji. Uzylem NM_CUSTOMDRAW i wszystko dziala, poniewaz przczytalem, ze do obslugi TRBN_THUMBPOSCHANGING potrzebna jest co najmniej Vista, a ja mam XP.
Naprawde wielkie dzieki, bardzo mi pomogles:)
Pozdrawiam

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