AppBar



  • Ich habe versucht eine AppBar zu erstellen(mein Programmfenster ist meine AppBar).
    Die AppBar wird registriert und der Desktop wird auch angepasst.
    Doch das Problem ist, dass mein Programm nicht an dem dafür vorgesehen Platz ist.
    Anders formuliert:
    Die Icons usw. auf dem Desktop werden verschoben und ein Platz für die AppBar freigemacht. Doch mein Programm geht nicht an diese freie stelle, sondern wird auf dem "verkleinerten" Desktop angezeigt.
    Das merkwürdige ist, wenn man das Programm startet, wird es für ganz kurze Zeit am vorgesehenden Platz angezeigt und dann geht es auf den "verkleinerten" Desktop.(ich rufe die Funktionen für das Registrieren usw. in Create auf).
    P.S. Soll ich euch auch den benutzten Code geben?Wenn ja alles was mit der AppBar zu tun hat oder irgendetwas bestimmtes?
    Ich verstehe es einfach nicht.
    Bitte helft mir weiter.



  • Den Artikel hier hast Du ja sicherlich schon ganz durchgelesen, oder?
    http://msdn.microsoft.com/library/en-us/shellcc/platform/shell/programmersguide/shell_int/shell_int_programming/appbars.asp

    Und Du reagierst auch auf "ABN_POSCHANGED"... und Du rufst auch "ABM_SETPOS" auf?



  • Ja theoretisch schon
    Soll ich dir den Code für die AppBar anzeigen oder dir das Testprog zu schicken, damit du dir ein besseres Bild machen kannst?
    Zu deinen Fragen habe ich das hier:

    ABN_POSCHANGED

    ist in der CMainFrame::AppBarCallback

    case ABN_POSCHANGED: 
    
                // The taskbar or another appbar has changed its 
                // size or position. 
                AppBarPosChanged(&abd); 
                break;
    

    ABM_SETPOS

    ist in der AppBarQuerySetPos.
    Ich denke der fehler liegt wahrscheinlich in der AppBarCallback. Habe nämlich mal eine MessageBox hineingeschrieben und diese wird nie aufgerufen.
    Wie soll ich die AppBarCallback deklarieren?Doch einfach nur mit dem Assiten hinzufügen oder muss ich irgendetwas überschreiben?
    P.S. Bin mir aber nicht sicher ob der Fehler da liegt.
    Schon mal Danke



  • Bin es nochmal.
    Ich muss dieses Problem so schnell es geht lösen. Doch ich verstehe einfach nicht was ich falsch machen.
    Das komische ist. Das Programm wird für eine ganz kurze Zeit am richtigen Platz angezeigt und in der nächsten Sekunde ist es am falschen Platz.
    Noch komischer ist:
    Wenn ich in der AppBarQuerySetPos-Funktion eine MessageBox vor MoveWindow aufrufe ,dann klappt es(das Prog bleibt am vorgesehenden Platz).
    Ich verstehe es einfach nicht.
    Bitte helft mir weiter.



  • Und Du hast es wirklich so gemacht, wie in der Beschreibung beschrieben?
    http://msdn.microsoft.com/library/en-us/shellcc/platform/shell/programmersguide/shell_int/shell_int_programming/appbars.asp

    Das ABM_SETPOS hast Du auch *vor* dem Aufruf zu MoveWindow gemacht?



  • Ja
    hier ist der letzte Teil von meiner AppBarQuerySetPos-Funktion:

    // Query the system for an approved size and position. 
        SHAppBarMessage(ABM_QUERYPOS, pabd); 
    
        // Adjust the rectangle, depending on the edge to which the 
        // appbar is anchored. 
        switch (uEdge) { 
    
            case ABE_LEFT: 
                pabd->rc.right = pabd->rc.left + iWidth; 
                break; 
    
            case ABE_RIGHT: 
                pabd->rc.left = pabd->rc.right - iWidth; 
                break; 
    
            case ABE_TOP:
    			AfxMessageBox("uEdge");
    			pabd->rc.bottom = pabd->rc.top + iHeight; 
                break; 
    
            case ABE_BOTTOM: 
                pabd->rc.top = pabd->rc.bottom - iHeight; 
                break; 
    
        } 
    
    	// Pass the final bounding rectangle to the system. 
        SHAppBarMessage(ABM_SETPOS, pabd); 
    
    	//AfxMessageBox("break");
        // Move and size the appbar so that it conforms to the 
        // bounding rectangle passed to the system. 
    	 MoveWindow(pabd->rc.left,pabd->rc.top ,    
            pabd->rc.right - pabd->rc.left, 
            pabd->rc.bottom - pabd->rc.top, TRUE);
    

    Ich verstehe es ja leider auch nicht.
    Habe den Code nicht mal stark verändert. Nur bei MoveWindow habe ich das erste Argument heraus genommen da die Funktion nur 5 Argumente übernimmt. Wenn ich aber die MessageBox("break") nicht herausnehme klappt es.
    Bin ratlos



  • Das erste Argument bei MoveWindow ist vermutlich das wichtigste! Das definiert nämlich das Fenster-Handle... und falls Du hier das falsche verwendest, kann das natürlich schiefgehen...
    Verwendest Du MFC? Die Beispiele sind ja nur für normale WinAPI!



  • Ja ich verwende Mfc und rufe die Funktionen in der Klasse MainFrm auf.
    Geht das mit der AppBar nicht in Mfc?Ich meine ja nur weil es zum Teil ja klappt.
    Doch wenn es nicht geht. Kann man den einfach eine WinAPI Klasse zu meinem Projekt hinzufügen und die Aufgaben dann darin erledigen?



  • Bin es nochmal
    Habe immer noch das Problem mit dem hinzufügen einer Klasse in der ich den WinAPI Code schreiben kann.
    Kann ich einfach eine allgemeine Klasse mit dem Assisten hinzufügen oder wie muss ich das machen?



  • Hallo
    ich habe jetzt den ganzen Code in WinAPI geschrieben. Also auch bei MoveWindow das erste Argument beibehalten. Doch es passiert immer noch das gleiche. Mein Prog. bleibt nicht an der vorgesehenden Stelle. Wenn ich aber wieder eine AfxMessageBox vor MoveWindow setze klappt es.
    Hat jemand eine Idee woran es leigt?


Anmelden zum Antworten