Win32 API ScrollBalken

elfvyn

Mitglied
Wie lass ich mein Childfenster richtig Scrollen?

Also ich hab erstmal das Childfenster registriert:

Code:
void RegChildWindow()
{
	WNDCLASSEX WndClsEx;

	WndClsEx.cbSize			    	= sizeof(WNDCLASSEX);
	WndClsEx.style			    	= CS_HREDRAW | CS_VREDRAW;
	WndClsEx.lpfnWndProc			= ChildWndProc;
	WndClsEx.cbClsExtra		 	= 0;
	WndClsEx.cbWndExtra		  	= 0;
	WndClsEx.hInstance		  	         = hInstance;
	WndClsEx.hIcon			         = LoadIcon(NULL, IDI_APPLICATION);
	WndClsEx.hCursor		    	         = LoadCursor(NULL, IDC_ARROW);
	WndClsEx.hbrBackground			= (HBRUSH)(COLOR_BTNFACE + 1);
	WndClsEx.lpszMenuName	  		= NULL;
	WndClsEx.lpszClassName			= ChildWindowClassName;
	WndClsEx.hIconSm		    	         = LoadIcon(NULL, IDI_APPLICATION);

	RegisterClassEx(&WndClsEx);
}

...und aufgebaut

Code:
HWND CreateChildWindow(HWND hwnd)
{
	MDICREATESTRUCT mcs;
	HWND NewWnd;
  
	mcs.szTitle		= title;							                            
	mcs.szClass		= ChildWindowClassName;		                        
	mcs.hOwner		= GetModuleHandle(NULL);
	mcs.x	                  = (MainFrameRect.top + (MainFrameRect.right) - ((MainFrameRect.right/5)*4) + sx);//X Position of Window
	mcs.y	                  = (MainFrameRect.left + sy);					            
	mcs.style		         = MDIS_ALLCHILDSTYLES | WS_VSCROLL | WS_HSCROLL;  
	mcs.cx		         = 500;								                            
	mcs.cy		         = 400;								                            
	NewWnd                      =(HWND)SendMessage(hwnd, WM_MDICREATE, 0, (LONG)&mcs);
 

	return NewWnd;
}

So das ist soweit mein Fenster... Jetzt hab ich verschiedene Element (Slider, Buttons, etc) in meinem fenster angezeigt! Und das auch außerhalb vorgegebenen Fenstergröße.
Wenn ich mein Fenster per Maus größer ziehe sehe ich die Elemente... Scrollen kann ich jedoch nicht

danke schonmal im vorraus
 
moin


Der Scrollbalken muss abhängig von der Position den Sichtbaren bereich ändern.
Bei WinApi geht sowas leider nicht völlig automatisch.


mfg
umbrasaxum
 
das habe ich mir schon fast gedacht.. hab auch einiges Versucht aber ich komme nicht auf den gewünschten Effekt. Muss ich da die Scrollbalken mit CreateWindow auch noch selbst kreieren oder gehts ihrgendwie einfacher? Bei den anderen Elementen wie editbox ect gehts ja auch von selbst!
 
Bin mir nicht sicher, ob es reichen würde, deinem Childfenster die Styles WS_HSCROLL und WS_VSCROLL mitzugeben.

Sonst musst du da wirklich per Hand ran. Die Edit macht das ja auch selber.
 
Nein mit WS_HSCROLL und WS_VSCROLL geht es nicht... Da bekomme ich die zwar angezeigt aber machen tun sie nichts
 
jo hab ich schon und habe jetzt mal soweit was zusammengezimmert
Code:
LRESULT CALLBACK ChildWndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
  
        
  static const int   iRand         = 20;
  static const int   iZeichenhoehe = 16;
  static RECT  rect;

  switch (msg)
  {
    /***********************************SIZE**************************************/
    case WM_SIZE:
      {
       
         RECT         TextRect;
         SCROLLINFO   siScrollInfo;

         rect.left    = iRand;
         rect.top     = 0;
         rect.right   = LOWORD(lParam) - iRand;
         rect.bottom  = HIWORD(lParam);
         
         TextRect     = rect;
         
         siScrollInfo.cbSize    = sizeof(siScrollInfo);
         siScrollInfo.fMask     = SIF_RANGE | SIF_PAGE;
         siScrollInfo.nMin      = 0;
         siScrollInfo.nMax      = TextRect.bottom / iZeichenhoehe;
         siScrollInfo.nPage     = rect.bottom / iZeichenhoehe;

         SetScrollInfo(hWnd, SB_VERT, &siScrollInfo, TRUE);


         siScrollInfo.fMask     = SIF_POS;
         GetScrollInfo(hWnd, SB_VERT, &siScrollInfo);
         
         rect.top               = -iZeichenhoehe * siScrollInfo.nPos;
         
         return 0;
      }
		/*****************************************************************************/
Code:
/***********************************VSCROLL***********************************/
      case WM_VSCROLL:
      {
         SCROLLINFO    siScrollInfo;
         int           iPosition;

         siScrollInfo.cbSize   = sizeof(siScrollInfo);
         siScrollInfo.fMask    = SIF_ALL;
         GetScrollInfo(hWnd, SB_VERT, &siScrollInfo);
         
         iPosition             = siScrollInfo.nPos;

         switch (LOWORD(wParam))
         {
         case SB_TOP:
            siScrollInfo.nPos    = siScrollInfo.nMin;
            break;
            
         case SB_BOTTOM:
            siScrollInfo.nPos    = siScrollInfo.nMax;
            break;
            
         case SB_LINEUP:
            siScrollInfo.nPos   -= 1;
            break;
            
         case SB_LINEDOWN:
            siScrollInfo.nPos   += 1;
            break;
            
         case SB_PAGEUP:
            siScrollInfo.nPos   -= siScrollInfo.nPage;
            break;
         
         case SB_PAGEDOWN:
            siScrollInfo.nPos   += siScrollInfo.nPage;
            break;

         case SB_THUMBTRACK:
            siScrollInfo.nPos    = siScrollInfo.nTrackPos;
            break;
            
         default:
            return 0;
         }

         siScrollInfo.fMask      = SIF_POS;
         SetScrollInfo(hWnd, SB_VERT, &siScrollInfo, TRUE);


         GetScrollInfo(hWnd, SB_VERT, &siScrollInfo);
         
         if (siScrollInfo.nPos != iPosition)
         {

            rect.top             = -iZeichenhoehe * siScrollInfo.nPos;
            ScrollWindowEx(hWnd, 0, iZeichenhoehe * (iPosition - siScrollInfo.nPos),
                           NULL, NULL, NULL, NULL, SW_INVALIDATE | SW_ERASE);
         }
         
         return 0;
      }
    /*****************************************************************************/

Soweit hab ich dann auch einen Balken.... Nur der soll sich eben dynamisch auch anpassen können! Wenn ich das Fenster verkleinere soll sich der Scrollbalken an den Inhalt anpassen.. genauso wenn ich neue Zeilen in das Fenster Ausgebe
 
Zurück