SpinControl Werte zu groß?
-
Ich habe ein Edit-Feld, welches Werte von 1 bis 99999 anzeigen soll.
Dafür hätte ich gerne ein SpinControl mit ins Spiel gebracht, damit
unsere Anwender nicht immer alles händisch neu eingeben müssen,
wenn es vielleicht nur um eine Nummer höher geht.Nun mag das Control offenbar meine Range 0-99999 nicht.
Ist es grundsätzlich nicht vorgesehen so hohe Werte ansteuern
zu können? In der MSDN steht ja Standard wäre 0 bis 100CSpinButtonCtrl * pSpin = ( CSpinButtonCtrl * ) GetDlgItem ( IDC_SPIN1 ) ; CWnd *pWnd = (CWnd *) GetDlgItem (IDC_EDIT1) ; pSpin->SetBuddy (pWnd); pSpin -> SetRange ( 0 , 99999 ) ; pSpin -> SetPos ( 0 ) ;
Meine OnVScroll sieht so aus:
CString strTemp ; int pos ; if ( nSBCode == SB_ENDSCROLL ) { return ; // falsche Nachrichten zurückweisen } if ( pScrollBar -> GetDlgCtrlID() == IDC_SPIN1 ) { int pos = nPos ; strTemp.Format ("%i" , pos) ; SetDlgItemText ( IDC_EDIT1 , strTemp) ; }
-
Und wieder mal hätte en simpler Blick in die Doku die Frage beantwortet.
CSpinButtonCtrl::SetRange
http://msdn.microsoft.com/en-us/library/fy9kyatf(VS.80).aspxZitat:
nLowerand nUpper
Upper and lower limits for the control. For SetRange, neither limit can be greater than UD_MAXVAL or less than UD_MINVAL; in addition, the difference between the two limits cannot exceed UD_MAXVAL. SetRange32 places no restrictions on the limits; use any integers.
Remarks
The member function SetRange32 sets the 32-bit range for the spin button control.
-
Har! Ich habe SetRange32 auch schon entdeckt, aber dann erklär mir bitte mal was ich noch falsch mache:
pSpin = ( CSpinButtonCtrl * ) GetDlgItem ( IDC_SPIN1 ) ; CWnd *pWnd = (CWnd *) GetDlgItem (IDC_EDIT1) ; pSpin->SetBuddy(pWnd); // pSpin -> SetRange ( 0 , 99999 ) ; pSpin->SetRange32(0,99999); pSpin->SetPos32(50000 ) ;
Er soll also mit 50000 starten. Klicke ich nun auf den Spinbutton nach oben
oder unten, steht er sofort im Editfeld auf -15535 bzw. -15337?!
-
Mein Testprojekt arbeitet wie erwartet.
Edit Control erzeugt.
Spin Control erzeugt. mit AutoBuddy, NoThousands.
FolgenderCode nach OnInitDialogCSpinButtonCtrl *pWnd = static_cast<CSpinButtonCtrl*>(GetDlgItem(IDC_SPIN1)); pWnd->SetRange32(63000,70000);
Funktioniert prima!
-
Und wie hast du das Editcontrol zur Anzeige des Wertes eingebunden?
Das Edit soll ebenso manuell eine Eingabe erhalten können und dann
die pos des SpinControl neu setzen. Meine Range war beim Versuch zudem 1-99999.OnVScroll hast du bei dir in dem Zusammenhang offenbar auch nicht mit verwendet.
Ich denke die beiden Projekte kann man kaum vergleichen.
-
Nö warum auch? Wenn ich ein Buddy habe, kann ich doch einfach loslegen.
Sowohl Eingabe wie auch Up/Down gehen direkt. Da muss ich gar nichts machen...Dann zeige mal Deinen OnVScroll Handler. Da wird Dein fehler sein.
Im Spin Control nicht. Das konnte ich mit meinem Minimal-Sample sehen.
-
Also ich habe mir mit diesem Gefrickel erstmal beholfen.
//Position setzen GetDlgItem(IDC_SPIN1)->SendMessage(UDM_SETPOS32, 0, xPos); //Position abfragen: int pos = GetDlgItem(IDC_SPIN1)->SendMessage(UDM_GETRANGE32+2, 0, NULL);
Und dann halt in OnVScroll(...);
Oh man Microsoft.....
-
Damit andere das evtl. einfacher hin bekommen hier noch was ich
in OnEnChangeEdit1 drin habe:int editpos; CString cs_editpos; GetDlgItem(IDC_EDIT1)->GetWindowText(cs_editpos); editpos=atoi(cs_editpos); GetDlgItem(IDC_SPIN1)->SendMessage(UDM_SETPOS32, 0, editpos);
Dann könnt ihr im Edit auch den Wert ändern und einfach mit den Pfeiltasten weiter navigieren...
-
Dann benötigst Du aber keinen Buddy!
Ich verstehe nicht warum Du das machst?1. Ich erzeuge ein Edit Control
2. Ich erzeuge ein Spin Control in der Z-Order nachfolgend. Stil:Autobuddy, NoThousands etc.
3. Ich setze den Range.Nun kann ich sowohl die Daten in dem Edit Control eingeben als auch das Spin Control benutzen ohne weitere Tricks, und auch nach Eingaben das Spin-Control nutzen. Man benötigt keinen WM_VSCROLL Handler für die einfachen Fälle.
Ansonsten ist dein atoi Gebastel auch nicht nötig, denn es gibt GetDlgItemInt und SetDlgItemInt...