Gezeichneter Punkt per Slider verschieben
-
Nachdem auch hier wohl keiner weiß wo das Problem mit dem Picture Control lag und es in anderen Projekten normal zu funktionieren scheint wollte ich jetzt mal ein bischen was ausprobieren.
Deshalb habe ich einen Dialog mit einem Rechteck und zwei Slider erstellt.
Einen für das horizontale bewegen eines Punktes in diesem Rechteck und den anderen zum vertikalen bewegen des Rectheckes.Aber irgend wie komem ich auf keinen Nenner.
Entweder der Punkt bewegt sich garnicht oder total merkwürdig.Ich habe die zwei Slider
CSliderCtrl d2slider1; CSliderCtrl d2slider2;
und die dazgehörigen Kontrollfunktionen
afx_msg void OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar); afx_msg void OnVScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar);
dazu habe ich das Rechteck an ein CRect übergeben, ein zweites CReckt für den zu zeichnen Punkt und ein CPoint angelegt den ich mit den Slidern verschieben will und den ich als Mittelpunkt für den zu zeichnenden Punkt verweden will
CPoint p; CRect rahmen,punkt;
Im Konstruktor initialiesiere ich das alles
p.SetPoint(rahmen.left,rahmen.top); punkt.SetRect(0,0,4,4); d2slider1.SetRange(0,100,TRUE); d2slider1.SetPos(0); d2slider2.SetRange(0,100,TRUE); d2slider2.SetPos(0);
Und ab hier würde ich gerne euer weiters vorgehen sehen, denn bei mir läuft alles aus den Fugen seit ich am Wochenende nur mit Problemen zu kämpfen hatte.
-
Machen wir es doch bitte anders herum, so wie es eher üblich ist. Du zeigst uns, wo du den Punkt zeichnest (und beschreibst vielleicht noch mal genauer, was da schief läuft), und wir sagen dir (hoffentlich), wo der Fehler liegt.
-
Nachdem ich alles mehrmals gelöscht habe, ist mein code nicht mehr verwendbar und was ich hier posten werde ich eigentlich nur noch Schrott aber bitte schön:
Da sich die horizontale Verschiebung in die vertikale übertragen lässt poste ich nur eines.
void Dialog2::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar) { // TODO: Fügen Sie hier Ihren Meldungsbehandlungscode ein, und/oder benutzen Sie den Standard. //CDialog::OnHScroll(nSBCode, nPos, pScrollBar); switch(nSBCode) { case VK_END: scroll_to(100,ypos,nPos); break; case VK_RIGHT: scroll_to(xpos+1,ypos,nPos); break; case VK_LEFT: scroll_to(xpos-1,ypos,nPos); break; case VK_HOME: scroll_to(100,ypos,nPos); break; case WM_LBUTTONUP: break; case VK_NEXT: scroll_to(nPos,ypos,nPos); break; case VK_PRIOR: scroll_to(nPos,ypos,nPos); break; case WM_KEYUP: break; } InvalidateRect( rahmen, FALSE); // Invalidate ohne Erase UpdateWindow(); // Neu zeichnen }
Hier dazu die scroll_to() funktion
void Dialog2::scroll_to(int posx, int posy, UINT nPos) { if(posx>100) posx=100; if(posy>100) posy=100; if(posx<1) posx=1; if(posy<1) posy=1; xpos=posx; ypos=posy; d2slider1.SetScrollPos(xpos,nPos,TRUE); d2slider2.SetScrollPos(ypos,nPos,TRUE); }
und die OnPaint
void Dialog2::OnPaint()
{
CPaintDC dc(this); // device context for paintingdc.FillSolidRect(rahmen, RGB(255,255,255));
punkt.SetRect(xpos-2,ypos-2,xpos+2,ypos+2);
dc.FillSolidRect(punkt,farbe);
}
Also nochmal, ich zeichne einen Punkt in einem Picture Control Rahmen und will diesen via zwei Slider verschieben.
Nach ungefair 10 verschiedenen Versuchen bin ich total raus und dabei hatte es am Anfang noch am besten geklappt.
Die SLider hatte ich mal am Anfang auf 100 nominiert um mich halt prozentual zu bewegen ...
-
Wieso erstellst du nicht für dein Picture Ctrl eine eigene Klasse und Zeichnest in der onPaint der Klasse, da hast du schon mal das koordinatenproblem nicht, weil im Dialog ist 0,0 links oben im Dialog, aslo müsstest du die koordinaten erstmal auf das Picture Ctrl umrechnen.
Wenn du dann die Koordinaten an die Picture Ctrl Klasse weiterleitest und neu zeichnen lässt dann wird auch nur das Ctrl neu gezeichnet.