Slider Programmieren
-
Hallo!
Ich möchte einen Slider (so einen Schieber....) programmieren.
Jetzt kann man de ja sehr einfach als Steuerelemt in sein Dialogfeld ziehen und in InitDialog... festlegen wo er die Teilstriche hat, größe, etc,...
Aber das wichtigste nämlich was passieren soll wenn jemand drauf klickt und den silder verschiebt wo ist das im code? z.B möchte ich das er in einem Feld den Wert Anzeigt den man am Slider einstellt. Wo schreibe ich was er machen muss wenn der silder verstellt wurde?
Ich nehme an das ist sehr banal bin aber in der Oberflächenprogrammierung noch relativ neu, genau so geht es mir zum Bsp. mit einer Checkbox wenn ich möchte das etwas verändert wird sobald sie angehackt wird .......Hoffe auf eure Hilfe!
Mit vielen Dank im Voraus
Ronny
-
Servus,
ist nicht so schwer:
1. Erstelle eine Membervar z.B. Controlmember "m_ctrSlider" (STRG + Doppelklick auf das Control)
2. Füge eine Methode für NM_CUSTONDRAW ein. (Rechte Maustaste auf "Add EventHandler" dann "NM_CUSTOMDRAW" auswählen ODER über die Properties unter Control Events)
Bsp:void CDeinDlg::OnNMCustomdrawSlider(NMHDR *pNMHDR, LRESULT *pResult) { LPNMCUSTOMDRAW pNMCD = reinterpret_cast<LPNMCUSTOMDRAW>(pNMHDR); CString strTemp; strTemp.Format("%d", m_ctrSlider.GetPos()); m_ctrEdit.SetWindowText(strTemp); *pResult = 0; }
3. Du bekommst die aktuelle Position immer mit GetPos() wenn die Msg NM_CUSTOMDRAW aufgerufen wird. Diese kannst du dann z.B. in ein Edit Feld schreiben. Vergiss aber nicht vorher deine Range mit SetRange() festzulegen sonst hast du standardmäßig 0 - 100.
Viel Spass
*winke*
Hellsgore
-
Super Danke!!
Funktioniert ja perfekt das Ding!
(Danke auch für die Info über SetRange das war seeeehr wichtig!)lg, ronny
-
Umm - die "übliche" Variante wären Handler für die WM_HSCROLL / WM_VSCROLL, die der Slider schickt... NM_CUSTOMDRAW geht natürlich auch, aber verletzt zumindest das "Prinzip der kleinsten Überraschung" (oder gibt es einen Grund fürs CustomDraw?)
Im Dialog Handler für WM_HSCROLL (bei horizontalem bzw. WM_VSCROLL für vertikalen Slider), dort:
if ( (HWND)lParam == m_ctrlSlider.m_hWnd) // scroll kommt vom slider: { // ... das gleiche wie Hellsgore }
-
Hallo!
Wie komme ich zu dem WM_HSCROLL bzw. WM_VSCROLL?
Bin durch herumbasteln darauf gekommen das ich mit dieser Funktion den Wert vom Slider anzeigen (später verwenden kann) kommt mir sehr unkompliziert vor ist an der Funtion etwas falsch?
void CTQ2Dlg::OnReleasedcaptureSliderChnumber(NMHDR* pNMHDR, LRESULT* pResult) { // Dürfte die Routine sein die beim anklicken läuft.... m_slidewert = m_slider.GetPos(); UpdateData(false); *pResult = 0; }
-
IIRC wird ReleaseCapture nicht bei tastaturbedienung aufgerufen.
WM_HSCROLL / WM_VSCROLL sind Nachrichten, die direkt an den Dialog gehen, dem Dialog also Handler für diese messages (OnHScroll, OnVScroll) hinzufügen
Rechtsklick auf Dialogklase / "Add Message Handler", links "WM_HSCROLL raussuchen
-
Servus,
ähm ajo hast natürlich recht. War mein Fehler, hatte gehandelt ohne groß nachzudenken. Man macht das schon im Prinzip mit den MSG WM_VSCROLL bzw. WM_HSCROLL.
Ich hatte das nur nicht gemacht weil ich in meinem Dlg noch andere Ctrls hatte die diese MSG geschickt haben und ich ehrlich gesagt zu faul war, mir eine ordentliche Lösung auszudenken
Jaja ich weiss -> Ich böse!! Hugh!!
Ich stell mich jetzt in die Ecke und schäme mich... aber mit einer Tasse Kaffee
*winke*
Hellsgore