Toolbar



  • Fröhliche Weihnachten
    Wie kann ich es schaffen, dass mein Programm sich wie eine Tollbar verhält.
    Genauer gesagt, wenn es am Bildschirmrand ist und man ein anderes Fenster maximiert, soll dieses nur bis zu meinem Progfenster maximiert werden(also nicht mein Prog verdecken).
    Mfg





  • Hallo
    Ich habe den Artikel gelesen.
    Habe aber noch einige Fragen.
    1. Beim nachfolgenden Code (steht so in der Msdn) soll man ein HWND übergeben.

    BOOL RegisterAccessBar(HWND hwndAccessBar, BOOL fRegister) 
    { 
        APPBARDATA abd; 
    
        // Specify the structure size and handle to the appbar. 
        abd.cbSize = sizeof(APPBARDATA); 
        abd.hWnd = hwndAccessBar; 
    
        if (fRegister) { 
    
            // Provide an identifier for notification messages. 
            abd.uCallbackMessage = APPBAR_CALLBACK; 
    
            // Register the appbar. 
            if (!SHAppBarMessage(ABM_NEW, &abd)) 
                return FALSE; 
    
            g_uSide = ABE_TOP;       // default edge 
            g_fAppRegistered = TRUE; 
    
        } else { 
    
            // Unregister the appbar. 
            SHAppBarMessage(ABM_REMOVE, &abd); 
            g_fAppRegistered = FALSE; 
        } 
    
        return TRUE; 
    
    }
    

    Doch ich möchte ja, dass das Hauptfenster meines Programms sich wie eine Toolbar verhält. Und dieses Fenster ist vom Typ CWnd und nicht von HWND. Wie kann ich das Problem lösen.
    Meine 2. Frage ist:
    Wo soll ich den benötigten Code für die Toolbar hineinschreiben.
    Also z.b. in MainFrm oder in der ...App usw.?
    Schon mal vielen Dank für eure Hilfe



  • 1:
    Die Klasse CWnd besitzt eine public Membervariable namens hWnd! Und diese ist - wer hätts gedacht - vom Typ HWND.

    2:
    Naja, wo du welchen Code hinschreibst, hängt davon ab was der Teil des Codes machen soll. Sachen die das gesamte Fenster betreffen, kannst du z.B. in CMainFrame schreiben, anderes was deine gesamte Anwendung betrifft vielleicht in die ...App und natürlich wirst du auch noch eigene Klassen haben, in die du Teile deiner Anwendung schreibst. 😕 Oder hab ich die Frage jetzt falsch verstanden?



  • Hallo
    zu 1:
    Brauche ich jetzt einfach nur eine public Membervariable hWnd vom Typ CWnd deklarieren? Oder wie hast du das gemeint bzw. wie soll ich das machen?
    zu 2:
    Ich muss ja auch Nachrichten von Windows empfangen wie z.B. ob ein Programm startet, welches den ganzen Bildschirm benötigt. Ich wollte daher wissen ob ich in allen Klassen diese Nachrichten empfangen kann oder nicht?(War dumm formuliert).



  • @1: Du hast doch schon eine CMainWnd (oder so ähnlich) in deiner Anwendung, also kannst du auch auf dessen Member zugreifen:

    RegisterAccessBar(AfxGetActiveWnd().hWnd,TRUE);
    

    @2: Visual Studio deklariert bei allen wichtigen Klassen deiner Anwendung eine Messega-Map - dort kannst du beliebige Nachrichten eintragen, die du in der entsprechenden Klasse abarbeiten willst (wer es letztendlich macht, ist MFC egal).



  • Egal wo ich

    RegisterAccessBar(AfxGetActiveWnd().hWnd,TRUE);
    

    aufrufe.Ich bekomme immer Fehlermeldungen.
    Hier die Fehlermeldungen:

    c:\AppBar2\MainFrm.cpp(73): error C2228: Der linke Teil von '.hWnd' muss eine Klasse/Struktur/Union sein
    c:\AppBar2\MainFrm.cpp(73): error C3861: 'AfxGetActiveWnd': Bezeichner wurde auch mit einer argumentbezogenen Suche nicht gefunden

    Was mache ich falsch?



  • Sorry, schlechtes Gedächtnis meinerseits - du mußt statt des AfxGetActiveWnd()-Aufrufs dein CWnd-Objekt einsetzen (laut deinen Ausführungen solltest du eins haben).



  • Ups, auch ein Fehler meinerseits. Die Variable heißt natürlich m_hWnd.

    Mach einfach

    [cpp]RegisterAccessBar(AfxGetApp()->m_pMainWnd->m_hWnd,TRUE);[/cpp]
    

    Das klappt überall!

    Wenn du das ganze aber eh in der CMainFrame schreibst reicht es wenn du schreibst:

    [cpp]RegisterAccessBar(m_hWnd,TRUE);[/cpp]
    

    (In der MainFrm.cpp befindest du dich ja bereits in der Klasse des Hauptfensters, deswegen kannst du die Member-Variable direkt benutzen)

    Gruß Brainiac



  • hab ma gegooglet http://www.codeproject.com/docking/AppBar.asp da gibts mfc klasse dafuer.



  • Erstmal danke redw0lf für den Artikel.
    Kannte ihn schon und fand ihn nicht so gut und möchte auch keine dll benutzen, sondern es so regeln.
    Das mit dem Anmelden der Toolbar geht jetzt ohne Fehler. Rufe die Registrierung in OnCreate auf. Doch verhält sich mein Fenster gar nicht wie eine Toolbar z.b. wird es immer noch von anderen Fenster verdeckt.
    Ich denke es liegt daran, dass ich bis jetzt erst die Toolbar registriert habe aber noch nicht die Position usw. festgelegt habe.(Wenn ich da falsch liege, sagt mir bitte bescheid).
    Habe mich also an den nächsten Code Abschnitt aus der Msdn gesetzt, der wie folgt lautet:

    // AppBarQuerySetPos - sets the size and position of an appbar. 
    // uEdge - screen edge to which the appbar is to be anchored 
    // lprc - current bounding rectangle of the appbar 
    // pabd - address of the APPBARDATA structure with the hWnd and 
    //     cbSize members filled 
    
    void PASCAL AppBarQuerySetPos(UINT uEdge, LPRECT lprc, PAPPBARDATA pabd) 
    { 
        int iHeight = 0; 
        int iWidth = 0; 
    
        pabd->rc = *lprc; 
        pabd->uEdge = uEdge; 
    
        // Copy the screen coordinates of the appbar's bounding 
        // rectangle into the APPBARDATA structure. 
        if ((uEdge == ABE_LEFT) || 
                (uEdge == ABE_RIGHT)) { 
    
            iWidth = pabd->rc.right - pabd->rc.left; 
            pabd->rc.top = 0; 
            pabd->rc.bottom = GetSystemMetrics(SM_CYSCREEN); 
    
        } else { 
    
            iHeight = pabd->rc.bottom - pabd->rc.top; 
            pabd->rc.left = 0; 
            pabd->rc.right = GetSystemMetrics(SM_CXSCREEN); 
    
        } 
    
        // 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: 
                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); 
    
        // Move and size the appbar so that it conforms to the 
        // bounding rectangle passed to the system. 
        MoveWindow(pabd->hWnd, pabd->rc.left, pabd->rc.top, 
            pabd->rc.right - pabd->rc.left, 
            pabd->rc.bottom - pabd->rc.top, TRUE); 
    
    }
    

    Als ich versucht habe diesen Code anzuwenden, bekam ich ein paar Probleme.
    Mein erstes Problem tauchte schon beim hinzufügen der Funktion auf. Wie soll man das PASCAL in den Namen bekommen(was bedeutet es überhaupt). Wenn man die Funktion mit dem Assistent hinzufügt, lässt er es nur zu, dass man void und AppBarQuerySetPos schreibt, aber nicht void PASCAL AppBarQuerySetPos.
    2.Problem:
    MoveWindow übernimmt nur 5 Argumente und nicht 6. Ich habe dann einfach das erste weggelassen, da ich es nicht für nötig halte(geht das oder muss ich es anderes erledigen?).
    3.Problem bezieht sich auf die Argumente der Funktion:
    Was ich für UINT uEdge einsetze ist klar z.B. ABE_TOP.
    Doch was ist mit den anderen beiden lprc und pabd. Verstehe nicht ganz was ich da übergeben soll.
    Ich weiss, dass es eine Menge Fragen sind. Ich hoffe, dass ihr mir weiter helfen könnt und ich euch nicht zu sehr auf die Nerven gehe.
    Schon mal Danke


Anmelden zum Antworten