CProgressCtrl in CStatusBarCtrl einbetten

Kriz

Mitglied
Hallo,

ich habe in einer Dialoanwendung eine CStatusBarCtrl eingebaut. Nun möchte ich gerne wissen, ob man irgendwie in einer der Panes auch andere Komponenten außer Text und Icons wie z.B. eine CProgressCtrl einbetten kann? Sieht nämlich nicht so aus...

Hat jemand eine Idee?
 
Ich vermute, du möchtest einen Fortschrittsbalken da reinsetzen. Ja, das geht.

Ein Statusbar hat eine Funktion GetItemRect. Damit holst du dir nach dem Setzen der einzelnen Panes die Grösse der Pane und benutzt die für das Erstellen der CProgressCtrl.
Die CProgressCtrl muss als Parent natürlich den Statusbar haben.

Wichtig: Du musst beim Resizen natürlich die Grösse und Position der CProgressCtrl anpassen!
 
Danke für die Antwort.

Dummerweise will das nicht so wie ich, daher mal der Codeabschnitt aus dem Hauptdialog:

Code:
int CTestDlg::OnCreate(LPCREATESTRUCT lpCreateStruct) 
{
	if (CDialog::OnCreate(lpCreateStruct) == -1) return -1;
 
	// TODO: Speziellen Erstellungscode hier einfügen
	m_statusbar.Create(WS_VISIBLE | WS_CHILD, CRect(0,0,0,0), this, IDC_STATUSBAR);
 
	CRect rect;
	m_statusbar.GetRect(1, &rect);
 
	m_progress.Create(WS_VISIBLE | WS_CHILD | PBS_SMOOTH, rect, &m_statusbar, IDC_PROGRESS);
 
	return 0;
}

Die Statusbar hat zwei Panes, die IDs sind auch korrekt und der Aufruf von m_progress.SetPos(50); in InitDialog() bringt auch nix konkretes.

Und ich seh auf Anhieb auch nicht, wo der Fehler liegt..
 
Was klappt denn nicht? D.h., was passiert denn?

Ich sehe jedenfalls, dass du dir das Rect vom gesamten Statusbar holst -- nicht nur von dem Panel, wo der Progressbar rein soll. Da solltest du mal schauen, ob das so richtig ist.
 
Sorry, aber ich habe einen logischen (Denk)Fehler gemacht. Ich habe - wie aus dem vorherigen Code ersichtlich - keinerlei Angaben zur Aufteilung der Statusbar in Panes gemacht. Das geschieht erst in InitDialog(). Da aber InitDialog() erst nach OnCreate() aufgerufen wird, konnte das GetRect() auch keine definierten Panes finden. Ein ASSERT() über GetRect() hat er natürlich gleich mit einem Abbruch bestraft, tja...

Na egal, so funktioniert es nun jedenfalls richtig:

Code:
int CTestDlg::OnCreate(LPCREATESTRUCT lpCreateStruct) 
  {
  	if (CDialog::OnCreate(lpCreateStruct) == -1) return -1;
  	
  	// TODO: Speziellen Erstellungscode hier einfügen
  	int pWidths[] = {400, -1};
  	m_statusbar.Create(WS_VISIBLE | WS_CHILD, CRect(0,0,0,0), this,  IDC_STATUSBAR);
  	m_statusbar.SetParts(2, pWidths);
  
  	CRect rect;
  	m_statusbar.GetRect(1, &rect);
  	m_progress.Create(WS_VISIBLE | WS_CHILD | PBS_SMOOTH, rect, &m_statusbar, IDC_PROGRESS);
  	
  	return 0;
  }

Danke an alle für die Hilfe!
 
Hallo Gemeinde!

Ich habe das jetzt auch mal ausprobiert mit dem ProgressCtrl im StatusBar. Ich hab's auch fast genauso gemacht wie Kriz, aber es funktioniert nicht. das Create(...) funktioniert, das Fenster wird also scheinbar erzeugt. Nur sichtbar ist es nicht. Hier ist mal der Code:
Code:
static UINT indicators[] =
    {
    	ID_SEPARATOR,		   // Statusleistenanzeige
    	ID_SEPARATOR,		   // Statusleistenanzeige
    	ID_SEPARATOR,		   // Statusleistenanzeige
    	ID_INDICATOR_OVR,
    	ID_INDICATOR_CAPS,
    	ID_INDICATOR_NUM
    };
    ...
    ...
    ...
    int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
   {
   	CRect cRect;
   ...
   ...
   ...
   	if (!m_wndStatusBar.Create(this) ||
   		!m_wndStatusBar.SetIndicators(indicators,
   		  sizeof(indicators)/sizeof(UINT)))
   	{
   		TRACE0("Statusleiste konnte nicht erstellt werden\n");
   		return -1;	  // Fehler bei Erstellung
   	}
   	m_pLeftView->GetClientRect(cRect);
   	m_wndStatusBar.SetPaneInfo(0, SB_ID_ACT_NAME, 0, cRect.Width());
   	m_wndStatusBar.SetPaneInfo(1, SB_ID_ACT_PROCESS, SBPS_STRETCH, 0);
   	m_wndStatusBar.SetPaneInfo(2, SB_ID_ACT_PROGRESS, 0, 150);
   
   	m_wndStatusBar.GetItemRect(2, &cRect);
 	if(!m_wndProgressCtrl.Create(WS_VISIBLE | WS_CHILD | PBS_SMOOTH, cRect, &m_wndStatusBar, IDC_PROGRESS))
   	{
   		TRACE0("ProgressCtrl konnte nicht erstellt werden\n");
   		return -1;	  // Fehler bei Erstellung
   	}
   	m_wndProgressCtrl.SetRange(0, 100);
   	m_wndProgressCtrl.SetPos(50);
   
   ...
   ...
   ...
   	return 0;
 }
Zum Testen habe ich nach der Erzeugung mal das SetRange und SetPos engefügt. Aber wie schon gesagt, es ist nichts zu sehen. Kann mir evtl. einer sagen, was ich da noch falsch mache?
 
Für sowas ist der Spy eine tolle Hilfe. Da kannst du nachsehen, ob und wo dein ProgressCtrl ist. Du setzt Pane 2 da auf Breite 0, prüf mal, ob das Rect, das du mit GetItemRect holst, nicht auch die Breite 0 hat.
 
Ich setze zwar die Breite auf 0, habe aber das SBPS_STRETCH-Flag gesetzt. Das bewirkt, daß die Länge automatisch gesetzt wird.
Aber das mit dem Spy werde ich morgen mal versuchen.
 
Zurück