OnSize gibt für cx bzw cy jeweils 0 zurück??



  • Hallo Leute,

    bin grad bischen am rumspielen mit meine SDI anwendung (ohne Doc/view) prinzip..

    Nun hab ich eine CListBox in der CChildview eingefügt, und es wird auch angezeigt. nun will ich die größe der Listbox entsprechende der CChildview fenstergröße anpassen aber:

    void CChildView::OnSize(UINT nType,int cx ,int cy){
    	//CRect rc;
    	//GetWindorectRect(&rc);
    	m_lbReport.SetWindowPos(this,0,0,200,200,SWP_SHOWWINDOW);
    }
    

    gibt mir bey cx, cy immer 0 zurück, wenn ich GetWindowRect mache bekomm ich auch bei height und width 0 zurück.. ? warum..

    in der Paint Methode

    void CChildView::OnPaint() 
    {
    	CPaintDC dc(this); // Gerätekontext zum Zeichnen
    
    	CRect rc;
    	GetWindowRect(&rc);
    	dc.Rectangle(0,0,rc.Width(),rc.Height());
    
    	CSize o= dc.GetTextExtent("HALLO WELT");
    
    	dc.TextOut((rc.Width()/2)-(o.cx/2),(rc.Height()/2) - (o.cy/2),"HALLO WELT");
    	// TODO: Fügen Sie hier Ihren Nachrichtenbehandlungscode ein.
    
    	// Rufen Sie nicht CWnd::OnPaint() für Nachrichten zum Zeichnen auf
    }
    

    funktioniert das mit dem GetWindowRect ja auch.. 😕 😕


  • Mod

    Weil das Fenster bene keine Ausdehnug hat! OnSize wird recht haben!

    1. Es macht keinen Sinn GetWindowRect in WM_PAINT zu verwenden! Denn Koordinaten die schließen FRame und Caption mit ein.
    2. Verwende in einem View niemals OnPaint, sondern immer OnDraw!



  • servus Martin,

    ja aber das lustige ist ja, das die OnPaint methode autoamtisch über en wizard eingefügt wurde das war ich net:) ! Aber wie kann ich es dennnoch erreicht, das ich meine konstrol im CChildView dynamisch der Größe anpassen kann? gar nicht?

    OHH... das ja von CWnd abgeleitet nich von CView sorry... aber trozdem muss das doch mit dem reszie gehen...! wenn ich in OnPaint einen Rechtecke über die GRöße der fesnter GetWindowRect zeichne passt es sich automatisch an wenn ich bspw. das toolbar rauszieh und wieder andock (so wie ich es eigentlich möchte)-..


  • Mod

    Dein Frame ist dafür verantwortlich. Bei SDI Anwendungegn geschieht dies automatisch. Entweder macht esdas Parent Frame oder eben das Splitter Windows. Wer erzeugt Deinen View?

    Wenn ein View erzeugt wird, wird garantiert nicht OnPaint erzeugt. Kannst Du mir nicht erzählen 🕶 !



  • ja martin , das CCliendView ist kein Cview , sonder ein Cwnd fenster das in den clientbereich gezeichnet wird sorry;) Meine CMainFrame klasse erzeugt das das CClientviewm und auch das toobar und status bar...! Wie kann ich das denn dann tun? damit OnSize funktioniert?

    int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
    {
    	if (CFrameWnd::OnCreate(lpCreateStruct) == -1)
    		return -1;
    	// Ansicht erstellen, um den Clientbereich des Rahmens zu belegen
    	if (!m_wndView.Create(NULL, NULL, AFX_WS_DEFAULT_VIEW,
    		CRect(0, 0, 0, 0), this, AFX_IDW_PANE_FIRST, NULL))
    	{
    		TRACE0("Ansichtsfenster konnte nicht erstellt werden\n");
    		return -1;
    	}
    
    	if (!m_wndToolBar.CreateEx(this, TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE | CBRS_TOP
    		| CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC) ||
    		!m_wndToolBar.LoadToolBar(IDR_MAINFRAME))
    	{
    		TRACE0("Symbolleiste konnte nicht erstellt werden\n");
    		return -1;      // Fehler bei Erstellung
    	}
    
    	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
    	}
    	// TODO: Löschen Sie diese drei Zeilen, wenn Sie nicht möchten, dass die Systemleiste andockbar ist
    	m_wndToolBar.EnableDocking(CBRS_ALIGN_ANY);
    	EnableDocking(CBRS_ALIGN_ANY);
    	DockControlBar(&m_wndToolBar);
    
    	return 0;
    }
    

  • Mod

    Durch die ID AFX_IDW_PANE_FIRST weiß das Frame was es mit diesen Child WIndow zu tun hat.

    Kann es sein dass Du OnSize im CMainFrame manipuliert hast?



  • nein.. da hab ich nichts gemacht, die OnSize Methode ist da auch nicht implementiert.. er springt mir, wenn ich die fenster größe veränder auch in die OnSize methode des CChildVies, wobei halt cx,cy Null sind??? probierst mal aus.. wirds dann sehen..


  • Mod

    BorisDieKlinge schrieb:

    probierst mal aus.. wirds dann sehen..

    ... jetzt habe ich es ausprobiert und ich weiß eigentlich nicht warum.

    - SDI Applikation erzeugt.
    - Nur OnPaint überschieben:

    void CChildView::OnPaint() 
    {
    	CPaintDC dc(this); // device context for painting
    
    	CRect rect;
    	GetClientRect(rect);
    
    	dc.DrawText(_T("TEST"),rect,DT_CENTER|DT_VCENTER|DT_SINGLELINE);
    }
    

    - Autosize alles OK!


  • Mod

    ... und um ganz sicher zu gehen:

    void CChildView::OnSize(UINT nType, int cx, int cy)
    {
    	TRACE(__FUNCTION__ "nType=%d, cx=%d, cy=%d\n", nType, cy, cy);
    	CWnd::OnSize(nType, cx, cy);
    }
    

    Ausgabe:

    CChildView::OnSizenType=0, cx=419, cy=419
    CChildView::OnSizenType=0, cx=423, cy=423
    CChildView::OnSizenType=0, cx=427, cy=427
    CChildView::OnSizenType=0, cx=429, cy=429
    CChildView::OnSizenType=0, cx=429, cy=429
    


  • hää

    nur die zeile

    CWnd::OnSize(nType, cx, cy);
    

    soll da helfen? ich bekommen 0,0,0,0,0,0,0,0........ 😞 :schland:

    in OnPaint simmt die größe mit GetWindowRect , in OnSize nich mehr 😞


  • Mod

    Dann zeige einfach mal mehr Code.

    Ichbin genau nach Deiner Anleitung vorgegangen ud es geht.
    Ansonsten hast Du eben <zensiert>...</zensiert> gebaut... 😉


Anmelden zum Antworten