CStatusBarCtrl



  • Hei,
    ich setze eine Satusbar in eine dialogfeldbasierte Anwendung.

    Der Code ist wie folgt:

    m_StatusBar = new CStatusBarCtrl;
    		m_StatusBar->Create(WS_CHILD|WS_VISIBLE, CRect(0, 0, 0, 0), this, 0);
    
    		 // StatusBar einteilen
    		 int nTeilung[3]= {240, 320, -1};
    		 m_StatusBar->SetParts(3, nTeilung);
    
    		 // Text in die einzelnen Spalten schreiben
    		 m_StatusBar->SetText(("StatusBar im Dialog - Spalte 1"),0, 0);
    		 m_StatusBar->SetText(("Spalte 2"), 1, 0);
       		 m_StatusBar->SetText(("Spalte 3"), 2, 0);
    

    Zu den Widowstyles

    STYLE DS_MODALFRAME | DS_CENTER | WS_MINIMIZEBOX | WS_MAXIMIZEBOX | WS_VISIBLE | WS_CAPTION | WS_SYSMENU | WS_SIZEBOX 
    EXSTYLE WS_EX_APPWINDOW
    

    Wie ihr seht kann das fenster maximiert und minimiert werden und ist außerderm frei skalierbar. Die Frage ist nun: Wie bewege ich die Statusbar so, dass es immer am unteren Rand in der entsprechenden Größe bleibt. MoveWindow hat mich nicht richtig weitergebracht.

    Grüße,
    Michael



  • "hat mich nicht richtig weitergebracht" ist keine ausreichende Fehlerbeschreibung.

    Zeig, was du mit dem Steuerelement gemacht hast, und wie das dadurch erzeugte Verhalten vom gewünschten abweicht.


  • Mod

    Ich weiß nicht warum immer alle Leute eine dialog-basierende Anwendung um Attribute aufpeppen wollen, die ein SDI-Program mit einem CFormView von selbst mitbringt.

    Mein Rat: Bau Deine Applikation neu und mach nicht einen Dialog resizable.

    Ansonsten wenn Du unbedingt alles manuell nachbauen willst, was auch von selbst geht (ich weiß ich wiederhole mich), dann bau Die einen WM_SIZE Handler ein und platziere Deine Child Controls, inkl. Statusbar neu.

    Wenn Du aber jetzt auch noch Menu und Toolbar brauchst, dann... (ich spar es mir, zum dritten mal brache ich es ja nicht schreiben)...

    BTW: Spar Dir den new. Du kannst m_statusbar als Objekt und nicht als Zeiger in Deinem Dialog einbauen.



  • Habe in der WM_Size Funktion folgendes stehen:

    CRect window, statusbar_rect;
    	GetClientRect(&window);
    
    	statusbar_rect.left		=	window.left;
    	statusbar_rect.right	=	window.right;
    	statusbar_rect.top		=	window.bottom-30;
    	statusbar_rect.bottom	=	window.bottom;
    
    	m_StatusBar.MoveWindow(statusbar_rect,true);
    

    Kriege beim Starten gleich ne "Debug assertion failed". Was mache ich falsch?


  • Mod

    Und wo bekommst Du den ASSERT?
    Was sagt der Stack-Trace?

    PS: Warum bleibst Du dennoch bei dem Dialog-Design, wenn SDI es Dir leichter macht? Ich weiß ich bin hartnäckig! 🕶



  • Meiner Meinung nach macht es ne SDI Anwendung nicht wirklich einfacher, da du viel Code für das drumherum hast. Dieser Punkt sollte aber keine Priorität haben. Geschmäcker sind halt verschieden.

    Der Assert kommt hier:

    void CWnd::MoveWindow(int x, int y, int nWidth, int nHeight, BOOL bRepaint)
    {
    ASSERT(::IsWindow(m_hWnd));


  • Mod

    mhecker schrieb:

    Meiner Meinung nach macht es ne SDI Anwendung nicht wirklich einfacher, da du viel Code für das drumherum hast. Dieser Punkt sollte aber keine Priorität haben. Geschmäcker sind halt verschieden.

    Dein Drumherum ist in jedem Fall bei einem Dialog größer, wenn Du das ganze Gesumps mit Statusbar etc. haben möchtest. Just my 2 cents

    mhecker schrieb:

    Der Assert kommt hier:

    void CWnd::MoveWindow(int x, int y, int nWidth, int nHeight, BOOL bRepaint)
    {
    ASSERT(::IsWindow(m_hWnd));

    m_StatusBar.Create vergessen würde ich mal sagen! Du solltest doch nur den new entfernen...

    EDIT: Quote gefixt!



  • //
    // Die Statusbar
    //
    m_StatusBar.Create(WS_CHILD|WS_VISIBLE, CRect(0, 0, 0, 0), this, 0);

    // StatusBar einteilen
    int nTeilung[3]= {240, 320, -1};
    m_StatusBar.SetParts(3, nTeilung);

    // Text in die einzelnen Spalten schreiben
    m_StatusBar.SetText(("StatusBar im Dialog - Spalte 1"),0, 0);
    m_StatusBar.SetText(("Spalte 2"), 1, 0);
    m_StatusBar.SetText(("Spalte 3"), 2, 0);

    Ne das hatte ich nicht vergessen!



  • Und wo steht dieser Code?



  • So also jetzt mal alles zusammen:

    class CHSIDepotmanagerDlg : public CDialog
    {
    // Konstruktion
    public:
    	CHSIDepotmanagerDlg(CWnd* pParent = NULL);	// Standard-Konstruktor
    	CStatusBarCtrl m_StatusBar;
    

    In OnInitDialog steht:

    m_StatusBar.Create(WS_CHILD|WS_VISIBLE, CRect(0, 0, 0, 0), this, 0);
    
    		 // StatusBar einteilen
    		 int nTeilung[3]= {240, 320, -1};
    		 m_StatusBar.SetParts(3, nTeilung);
    
    		 // Text in die einzelnen Spalten schreiben
    		 m_StatusBar.SetText(("StatusBar im Dialog - Spalte 1"),0, 0);
    		 m_StatusBar.SetText(("Spalte 2"), 1, 0);
       		 m_StatusBar.SetText(("Spalte 3"), 2, 0);
    

    In OnSize steht:

    CDialog::OnSize(nType, cx, cy);
    	if(!GetSafeHwnd())
        return; 
    
    	CRect   rect1;  
    	m_StatusBar.GetWindowRect(&rect1);  
    	ScreenToClient(&rect1);  
    	m_StatusBar.MoveWindow(&rect1);
    


  • gelöst!

    CDialog::OnSize(nType, cx, cy);
    if(!GetSafeHwnd())
    return;

    HWND hWnd;
    hWnd = m_StatusBar.GetSafeHwnd();
    if (::IsWindow(hWnd))
    {
    RECT rcClient;
    RECT rcStatusBar;

    this->GetClientRect(&rcClient);
    rcStatusBar.bottom = rcClient.bottom;
    rcStatusBar.top = rcStatusBar.bottom - 30;
    rcStatusBar.left = rcClient.left;
    rcStatusBar.right = rcClient.right;
    m_StatusBar.MoveWindow(&rcStatusBar);
    }


  • Mod

    IsWindow kannst Du getrost weglassen. Solange der Dialog existiert existiert auch der CStatusbar sofern er eben erzeugt wurde.


Anmelden zum Antworten