Leiste zum Vergrößern/Verkleinern von CWnd-Elementen



  • Hallo,
    ich habe einen Dialog erstellt, der im oberen Bereich eine Listbox enthält. In der Mitte befindet sich eine "leere Leiste", die nur einen static-Text enthält. Am unteren Dialogrand befindet sich noch ein Editfeld. Den mittleren Bereich wollte ich nun dazu nutzen, um die Größe zwischen listbox und editfeld vertikal zu verändern. Fahre ich nun über diesen Bereich ändert sich auch dementsprechend der Mauszeiger. Das ganze funktioniert soweit auch, nur habe ich das Problem, dass die Veränderung beim Austritt und beim Wiedereintritt mit dem Mauszeiger am Dialog, bei Größenveränderung mit der Leiste, verfälscht wird. Auch bei übertrieben schnellen Bewegungen stimmt die Größenveränderung nicht mehr überein. Ich hoffe, es kann vllt jemand weitere Verbesserungen an dem Source vornehmen und mir bei diesen Problemen weiterhelfen.

    Danke im Voraus.

    Hier der Source:

    BOOL CLogInfoDlg::PreTranslateMessage( MSG* pMsg )
    {
    	BOOL rvalue = FALSE;
    
    	boolWatch watch( m_binpremousemove ); // Um Rekursionen zu vermeiden, sonst Stackoverflow!
    	if( pMsg->message == WM_MOUSEMOVE && watch.bHas() ){
    
    		RECT listrect;
    		m_listbox_fehler.GetWindowRect( &listrect );
    		ScreenToClient( &listrect );
    
    		RECT editrect;
    		m_richedit_infotext.GetWindowRect( &editrect );
    		ScreenToClient( &editrect );
    
    		RECT staticrect;
    		m_cstaticinfo.GetWindowRect( &staticrect );
    		ScreenToClient( &staticrect );
    
    #ifdef _DEBUG
    		CPoint pt = pMsg->pt;
    		ScreenToClient(&pt);
    		CString text;
    		text.Format("x:%d\ty:%d",pt.x,pt.y);
    		GetDlgItem(IDC_STATIC_YDIFF)->SetWindowText(text);
    #endif _DEBUG
    
    		int ixpos = ( pMsg->lParam )& 0xFFFF;
    		int iypos = ( pMsg->lParam >> 16 )& 0xFFFF;
    
    		if( (ixpos >= listrect.left && ixpos <= listrect.right &&
    			iypos >= listrect.bottom + 1 && iypos <= editrect.top - 1))
    		{
    			if( ! m_binmoverect ){
    				SetCursor( LoadCursor( NULL, IDC_SIZENS )); // IDC_ARROW
    			}
    			bool bbreak = true;
    
    			if((( pMsg->wParam & MK_LBUTTON ) != 0 ) && m_binmoverect )
    			{
    
    				int ydiff = iypos - m_lastposinrect.y;
    				bool bmove = false;
    				if( ydiff < 0 ){
    					// ListBox kleiner und EditBox groesser (Maximale Verkleinerung eines Cwnds)
    					if( listrect.bottom - listrect.top > ( abs( ydiff ) + 30 )){
    						bmove = true;
    					}
    				}
    				else{
    					if( editrect.bottom - editrect.top > ( abs( ydiff ) + 30 )){
    						bmove = true;
    					}
    				}
    				if( bmove ){
    					m_listbox_fehler.SetWindowPos( NULL, listrect.left, listrect.top, 
    						listrect.right - listrect.left, 
    						listrect.bottom - listrect.top + ydiff , SWP_NOOWNERZORDER );
    					m_richedit_infotext.SetWindowPos( NULL, editrect.left, editrect.top + ydiff, 
    						editrect.right - editrect.left, 
    						editrect.bottom - editrect.top - ydiff, SWP_NOOWNERZORDER );
    					m_cstaticinfo.SetWindowPos(  NULL, staticrect.left, staticrect.top + ydiff, 0, 0,
    									SWP_NOOWNERZORDER | SWP_NOSIZE	);
    					DoMsg();
    				}
    			}
    
    			m_binmoverect = true;
    			m_lastposinrect.x = ixpos;
    			m_lastposinrect.y = iypos;
    		}
    		else{
    			if((( pMsg->wParam & MK_LBUTTON ) == 0 ) && m_binmoverect )
    			{
    				SetCursor( LoadCursor( NULL, IDC_ARROW ));
    				m_binmoverect = false;
    			}
    		}
    	}
    
    	if( rvalue == FALSE ){
    		rvalue = CFEDlg::PreTranslateMessage( pMsg );
    	}
    	return rvalue;
    }
    

  • Mod

    Für so etwas gibt es CSplitterWnd!
    Ansonsten ist es IMHO der falsche Ansatz. Du müsstest einfach einen Mauscapture setzen wenn in den entsprechenden Bereich geklickt wurde und dann in dem OnMouseMove Handler die entsprechenden Veränderungen vornehmen.

    PreTranslateMessage ist der falsche Platz!


Anmelden zum Antworten