Page 1 of 1

Custom scrollbar

Posted: 14 Jan 2015, 16:31
by mesajflaviu
Ce solutie ar fi sa customizez scrollbar-ul unui control ? Am gasit ceva aici, si am incercat sa cusomizez scrollbar-ul unui gridcontrol ... incercarea este atasata ca aplicatie de test ... arata naspa, dar o mai luam eu la pila, daca mergea in aplicatia reala ... insa, acel grid-control, imi trebuie intr-un dialogbar (in situatia reala), si in momentul cand am implementat Solutia de mai sus in dialogbar, toate au luat-o razna (anomalii de focus, de redesenare, etc.) ... banui ca din cauza functiilor globale folosite de aceasta solutie ...

Intrebarea mea este, ce alte slutii ar fi pentru customizarea scrollbar-ului standard pentru un control windows ? Orice idee, link, indrumare, ar fi superbine venita !

Multumesc anticipat.

Re: Custom scrollbar

Posted: 17 Jan 2015, 12:34
by Ovidiu Cucu
Tot nu ne-am lasat de macelarit gridul lui Chris...
Mizeriile alea de "custom scrollbar" luate de la Codeproject stau pe grid ca nuca pe perete. :)
Pana gasim o solutie, vezi si raspunsul de la Codeguru: http://forums.codeguru.com/showthread.p ... ost2172331

De curiozitate, la ce bun sa schimbi culoarea la scrollbar?

Re: Custom scrollbar

Posted: 18 Jan 2015, 20:51
by mesajflaviu
In acel dialogbar am pus un CGridCtrl (un pic customizat) pentru a face o lista cu item-uri text, bitmap-uri, etc., totul pe fond negru ... Functioneaza, dar sefului meu nu-i place scrollbar-ul standard ... m-a pus sa-l fac negru/gri ... si la asta imi storc neuronul ...

Re: Custom scrollbar

Posted: 19 Jan 2015, 09:22
by Ovidiu Cucu
Spune-i ca de la primavara nu se mai poarta scrollbarurile negru-gri. :)

Re: Custom scrollbar

Posted: 19 Jan 2015, 10:48
by mesajflaviu
Daca as putea, i-as spune-o ! :biggrin:

Re: Custom scrollbar

Posted: 19 Jan 2015, 19:17
by Ovidiu Cucu
Problema e daca merita sau nu efortul de a schimba ceva in aspectul standard. Daca se da o caruta de parale, atunci da, merita. :)
Initial ma gandeam sa-ti spun sa tratezi WM_NCPAINT si sa desenezi acolo scrollbar-urile. Am icercat insa si nu merge. Altceva n-am gasit inca.
Arunca un ochi in MSDN la Visual Styles.
N-am prea sapat pe-acolo insa presupun ca ai putea sa schimbi tema unei fereste cu una cu scrollbar-uri care a arate asa cum vrea sefu.

Re: Custom scrollbar

Posted: 20 Jan 2015, 10:26
by mesajflaviu
ai putea sa schimbi tema unei fereste cu una cu scrollbar-uri care a arate asa cum vrea sefu
Incerc sa vad ce iese ...

Re: Custom scrollbar

Posted: 21 Jan 2015, 16:56
by mesajflaviu
Cred ca nu sant departe:

Code: Select all

void CGridCtrlExt::OnDraw(CDC* pDC)
{
    // draw the grid

	HTHEME hTheme = OpenThemeData(m_hWnd, L"WINDOW");
	if(NULL != hTheme)
	{
		CRect rect;
		GetClientRect(&rect);
		DrawThemeBackground(hTheme, pDC->GetSafeHdc(), WP_VERTSCROLL, VSS_NORMAL, &rect, NULL);
		CloseThemeData(hTheme);
	}
}
Nu functioneaza inca, dar cred ca asta e drumul ...

Re: Custom scrollbar

Posted: 22 Jan 2015, 12:26
by mesajflaviu
Am incercat in modul urmator:

Code: Select all

	HTHEME hTheme = OpenThemeData(m_hWnd, L"WINDOW");
//	HTHEME hTheme = OpenThemeData(m_hWnd, L"MFCGridCtrl");
	if(NULL != hTheme)
	{
		CScrollBar* pScrollbar = GetScrollBarCtrl(SB_VERT);
		if(NULL != pScrollbar->GetSafeHwnd()) // <-- is always null
		{
			CRect rect;
			pScrollbar->GetWindowRect(&rect);
			pDC->FillSolidRect(&rect, RGB(255, 255, 0));
			DrawThemeBackground(hTheme, pDC->GetSafeHdc(), WP_VERTSCROLL, VSS_NORMAL, &rect, NULL);
		}
		CloseThemeData(hTheme);
	}
insa nu pare sa stie de scrollbar-ul vertical, CScrollBar* pScrollbar = GetScrollBarCtrl(SB_VERT); returneaza intotdeauna NULL ... de ce ?
Ciudat ...

Re: Custom scrollbar

Posted: 23 Jan 2015, 13:47
by mesajflaviu
Desi totul pare correct, totusi nu functioneaza :D

Code: Select all

void CGridCtrlExt::OnDraw(CDC* pDC)
{
//	draw the grid

	HTHEME hTheme = OpenThemeData(m_hWnd, L"WINDOW");
//	HTHEME hTheme = OpenThemeData(m_hWnd, L"MFCGridCtrl");
	if(NULL != hTheme)
	{
		if(WS_VSCROLL & GetStyle())
		{
			SCROLLBARINFO si;
			si.cbSize = sizeof(SCROLLBARINFO);
			GetScrollBarInfo(OBJID_VSCROLL, &si);
			CRect rect(si.rcScrollBar);
			pDC->FillSolidRect(&rect, RGB(255, 255, 0));
			DrawThemeBackground(hTheme, pDC->GetSafeHdc(), WP_VERTSCROLL, VSS_NORMAL, &rect, NULL);
		}
		CloseThemeData(hTheme);
	}
}

Re: Custom scrollbar

Posted: 23 Jan 2015, 13:50
by mesajflaviu
Ce e curios e ca, daca pun un rectangle cat clientul, vad doar galben in fata ochilor :))

Code: Select all

void CGridCtrlExt::OnDraw(CDC* pDC)
{
//   draw the grid

   HTHEME hTheme = OpenThemeData(m_hWnd, L"WINDOW");
//   HTHEME hTheme = OpenThemeData(m_hWnd, L"MFCGridCtrl");
   if(NULL != hTheme)
   {
      if(WS_VSCROLL & GetStyle())
      {
	CRect rect;
	GetClientRect(&rect);
	pDC->FillSolidRect(&rect, RGB(255, 255, 0));
	DrawThemeBackground(hTheme, pDC->GetSafeHdc(), WP_VERTSCROLL, VSS_NORMAL, &rect, NULL);
      }
      CloseThemeData(hTheme);
   }
}

Re: Custom scrollbar

Posted: 02 Feb 2015, 15:51
by mesajflaviu
mesajflaviu wrote:Desi totul pare correct, totusi nu functioneaza :D

Code: Select all

void CGridCtrlExt::OnDraw(CDC* pDC)
{
//	draw the grid

	HTHEME hTheme = OpenThemeData(m_hWnd, L"WINDOW");
//	HTHEME hTheme = OpenThemeData(m_hWnd, L"MFCGridCtrl");
	if(NULL != hTheme)
	{
		if(WS_VSCROLL & GetStyle())
		{
			SCROLLBARINFO si;
			si.cbSize = sizeof(SCROLLBARINFO);
			GetScrollBarInfo(OBJID_VSCROLL, &si);
			CRect rect(si.rcScrollBar);
			pDC->FillSolidRect(&rect, RGB(255, 255, 0));
			DrawThemeBackground(hTheme, pDC->GetSafeHdc(), WP_VERTSCROLL, VSS_NORMAL, &rect, NULL);
		}
		CloseThemeData(hTheme);
	}
}
eu cred ca ar merge acest cod, dar, fiind pus in OnDraw, cred ca sistemul de operare redeseneaza dupa aceea din nou scrollbar-urile ...