Fenstergröße ermitteln



  • hallo,

    ich öffne ein fenster und möchte nun die fenstergröße ermitteln. mit fenstergröße meine ich dabei die größe von der menüleiste bis runter zur statusleiste. also nicht wirklich das ganze fenster, sonder der " nutzbare" bereich.

    lg
    Alexa





  • hallo,

    ich haabe das mal versucht,a ber irgendwie komme ich da nicht weiter, da ich nicht weß, was ich bei mir als hwnd einsetzen soll.

    mein fenster erzeuge ich folgendermaßen

    int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
    {
    	if (CFrameWnd::OnCreate(lpCreateStruct) == -1)
    		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 der Symbolleiste
    	}
    
    	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 der Statusleiste
    	}
    	// HINWEIS: 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;
    }
    
    BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs)
    {
    	if( !CFrameWnd::PreCreateWindow(cs) )
    		return FALSE;
    	// HINWEIS: Ändern Sie hier die Fensterklasse oder die Darstellung, indem Sie
    	//          CREATESTRUCT cs modifizieren.
    
    	cs.style = WS_OVERLAPPED | WS_CAPTION | FWS_ADDTOTITLE
    		  | WS_SYSMENU | WS_MINIMIZEBOX;
    	///| WS_THICKFRAME
    	cs.cx= 800;        // Breite des sich öffnenden Fenster
    	cs.cy= 600;        // Höhe des sich öffnenden Fensters
    
    	return TRUE;
    }
    

    und nun wollte ich die größe so abfragen:

    RECT rect; 
    GetClientRect(CFrameWnd, &rect);
    height=rect.right; 
    width=rect.bottom;
    

    Leider brint der mir immer einen fehler, ungültige verwendung dieses typs CFrameWnd als ausdruck.
    wäre toll, wenn mir da jemand auf die sprünge helfen könnte.

    vielen dank
    gruß
    alexa



  • RECT rect; 
    GetClientRect(this->m_hWnd, &rect); 
    height=rect.right; 
    width=rect.bottom;
    

    Du kannst aber auch direkt die MFC-Funktion:

    this->GetClientRect/&rect);
    

    aufrufen...



  • oh...vielen dank. das funktioniert prima....:-)



  • Bei mir funktioniert dies leider nicht.

    Ich habe in einem Fenster ein Textfeld geschaffen - ich will dessen Breite in Abhängigkeit zu dessen Parentwindow setzen, ich hatte mir das wie folgt vorgestellt:

    RECT aRect;
            GetWindowRect(hwnd,&aRect);
    
            case WM_CREATE:
    
                TextField = CreateWindow("EDIT",
                                         "",
                                         WS_VISIBLE | WS_CHILD | WS_BORDER | ES_READONLY | WS_VSCROLL | ES_MULTILINE,
                                         aRect.left+10, aRect.top+10, (aRect.right-aRect.top)-10,150,
                                         hwnd, (HMENU) 3, NULL, NULL);
    

    Das geht leider nicht, denn mit aRect.right-aRect.top lässt sich keine Breite ermitteln; gibt es da eventuell einen Workaround? Ich bin leider nirgends fündig geworden.



  • Du meinst wohl

    aRect.right-aRect.left
    

    ?!



  • Ich meinte dies zwar nicht, aber auch

    aRect.right-aRect.left
    

    funktioniert nicht, denn egal was ich von (aRect.right-aRect.left) abziehe (z. B. (aRect.right-aRect.left)-300) - die Größe jenes Childfensters ändert sich nicht.



  • MoveWindow im WM_SIZE-Zweig verwenden. So wird die Controlgröße auch bei Größenänderungen des Elternfensters angepasst.



  • Klar geht das. GetWindowRect ist in jedem Fall falsch.
    GetClientRect ist korrekt.