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_APPWINDOWWie 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.
-
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?
-
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));
-
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);
}
-
IsWindow kannst Du getrost weglassen. Solange der Dialog existiert existiert auch der CStatusbar sofern er eben erzeugt wurde.