Button FLÜSSIG von links nach rechts wandern lassen !



  • Hi,

    ich möchte einen Button 'wandern' lassen. Er soll sich FLÜSSIG (nicht so abgehackt) von links nach rechts bewegen !
    Momentan habe ich einen Timer, der jede 1/10 Sek. den Button wandern lässt:

    CRect rect;
    		GetDlgItem(IDC_BUTTON1)->GetClientRect(rect); //Koordinaten holen
    
    		GetDlgItem(IDC_BUTTON1)->SetWindowPos(NULL, rect.Width() + 3, 20, 100,50, NULL);
    

    Leider funktioniert dieser Code nicht, der Button bewegt sich nur einmal, und das wars ! Weiss jemand warum ? Oder hat jemand einen anderen Lösungvorschlag ?

    Danke
    Spy-Eye



  • Hallo Spy-Eye!

    Versuch es doch mal mit:

    GetDlgItem(IDC_BUTTON1)->SetWindowPos(NULL, rect.left + 3, 20, 100,50, NULL);
    

    Viel Erfolg, Lothar.



  • Leider klappt das auch nicht, der Button bewegt sich nur einmal und das wars !
    😞



  • Spy-Eye schrieb:

    Leider klappt das auch nicht, der Button bewegt sich nur einmal und das wars !
    😞

    poste doch mal bitte den kompletten code, der den button bewegen lassen soll.

    Esco



  • Hab ich doch schon oben :

    if(nIDEvent == timer)
    	{
    		CRect rect;
    		GetDlgItem(IDC_BUTTON1)->GetClientRect(rect);
    
    		GetDlgItem(IDC_BUTTON1)->SetWindowPos(NULL, rect.left + 3, 20, 100,50, NULL);
    	}
    


  • Spy-Eye schrieb:

    Hab ich doch schon oben :

    if(nIDEvent == timer)
    	{
    		CRect rect;
    		GetDlgItem(IDC_BUTTON1)->GetClientRect(rect);
    
    		GetDlgItem(IDC_BUTTON1)->SetWindowPos(NULL, rect.left + 3, 20, 100,50, NULL);
    	}
    

    naja, das mit dem timer steht oben noch nich dabie, das hat mich interessiert, vielleciht wird die methode ja nur einmal angesprochen. 😉

    ich hab grad zwar echt keine zeit, konnts aber nicht lassen:

    also wenn du setwindowpos in einer schleife mit i von 1 bis 100 durchlaufen lässt, dann gehts. es liegt also an rect.left. irgendwie gibt getclientrect immer das gleiche uas, muss jezz aber weg.
    behelfsmässig kannste das ja mal auslesen, vor der schleife, und das ganze dann mit ner schleife verschieben

    Esco



  • Hallo Spy-Eye!

    Also ich würde jetzt an Deiner Stelle zwei Fragen klären:

    1. Wird SetWindowPos bzw. GetClientRect mehr als einmal aufgerufen?
    2. Wird rect.left von IDC_BUTTON1 wirklich durch SetWindowPos bei jedem
      Aufruf um 3 erhöht?

    Geb mal Rückmeldung wenn Du beide Fragen geklärt hast.

    Mit besten Grüßen, Lothar.



  • Aloha,

    vergeßt SetWindowPos 👎

    Nehmt

    Sleep(1);
    GetDlgItem(IDC_BUTTON1)->MoveWindow(r);
    UpdateWindow();
    

    inner Schleife oder nen Timer, oder sontwo.
    r ist natürlich ein CRect.

    Grüße

    BOA



  • @Esco

    Meinst du es so ? Wenn ja, bei mir klappt nicht, Der Button bewegt sich wieder nur einmal !

    if(nIDEvent == timer)
    	{
    		for(int i = 0; i < 100; i++)
    		{
    			CRect rect;		
    			GetDlgItem(IDC_BUTTON1)->GetClientRect(rect);		
    			GetDlgItem(IDC_BUTTON1)->SetWindowPos(NULL, rect.left + 3, 20, 100,50, NULL);	
    		}	
    	}
    

    @lsowada

    Zu 1) Denke schon, da der Timer ja nicht beendet wird !
    Zu 2) Denke nicht, da der Button ja nur einmal wandert !

    @BOA

    Auch wenn ich MoveWindow verwende klappts nicht ! Der Button bewegt sich nur ein mal !

    @All
    Woran kann das liegen ?

    Danke
    Spy-Eye



  • Sorry lsowada, habe ausversehen dein Nickname Gecopyied & gepasted ! Natürlich habe ich (Spy-Eye) das oben gepostet 😃

    Sorry



  • BOA schrieb:

    Aloha,

    vergeßt SetWindowPos 👎

    Nehmt

    Sleep(1);
    GetDlgItem(IDC_BUTTON1)->MoveWindow(r);
    UpdateWindow();
    

    inner Schleife oder nen Timer, oder sontwo.
    r ist natürlich ein CRect.

    ja gähn, daran liegts ja, wie oben beschriebn nicht.

    @wada:

    ich meine, dass du das rect nur einmal einlesen sollst, und dann den button immer mit

    GetDlgItem(IDC_BUTTON1)->SetWindowPos(NULL, i+rect.left, 20, 100,50, NULL);
    

    rect.left musst du dann einmal, vor der schleife auslesen.
    Esco



  • Stimmt Esco, mit einer Schleife geht es ! Doch jetzt ist das Problem, das man während der For-Schleife den Button ja nicht anklicken kann. Und wenn ich den Code in einem Thread packe, dann kann ich von dort aus nicht auf dem Button zugreifen. Es entsteht dann ein (Compiler-)Fehler !

    Hast du einen anderen Lösungsvorschlag ?

    Danke
    Spy-Eye



  • Spy-Eye schrieb:

    Stimmt Esco, mit einer Schleife geht es ! Doch jetzt ist das Problem, das man während der For-Schleife den Button ja nicht anklicken kann. Und wenn ich den Code in einem Thread packe, dann kann ich von dort aus nicht auf dem Button zugreifen. Es entsteht dann ein (Compiler-)Fehler !

    Hast du einen anderen Lösungsvorschlag ?

    Danke
    Spy-Eye

    hallo, was für ein fehler entsteht denn da genau?!

    es gibt ja zwei arten von threats: die einen können währenddessen noch benutzeringaben empfangen, die anderen nicht.

    Esco



  • Ich meine einen ganz normalen Arbeits-Thread !

    //ArbeitsThread :
    
    UINT Thread(LPVOID pParam)
    {
    ...
    }
    

    Es entstehen z.B. solche Fehler :

    'GetDlgItem' : function does not take 1 parameters

    left of '->GetClientRect' must point to class/struct/union

    'GetDlgItem' : function does not take 1 parameters

    '->SetWindowPos' must point to class/struct/union

    Weisst du was ich da machen kann ?

    Danke



  • worker threats können keine benutzereingaben empfangen.
    das buch, wo ich das damals raus hab hab ich aber nich mehr. musst dich mal erkundigen; es gibt zwei verschiedene threat arten, der nicht_worker_threat kann dann benujtzereingaben empfangen.

    Esco



  • http://search.microsoft.com/search/results.aspx?view=msdn&st=b&na=82&qu=CWinThread+purpose&s=1&swc=4

    das kannst dir ma anschauen. ich hab immer mit der msdn aufm rechner gearbeitet, und da stehts unter CWinThreat -> purpose of
    warum weshalb und wieso du da den andern threat aufmachen musst und wie du das machst. du musst eben ne klasse von CWinthreat ableiten, die dann deinen threat startet.

    esco



  • Dabke ! Werde ich mir mal anschauen !


Anmelden zum Antworten