static LRESULT CALLBACK
ScrollHookWndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
	CSkinScrollWnd* pSkin = (CSkinScrollWnd*)GetWindowLong(hwnd, GWL_USERDATA);
	WNDPROC procOld = NULL;
	switch (msg)
	{
	case WM_DESTROY:
		procOld = pSkin->m_funOldProc;
		UnskinWndScroll(CWnd::FromHandle(hwnd));
		return CallWindowProc(pSkin->m_funOldProc, hwnd, msg, wParam, lParam);
	case WM_ERASEBKGND:
		SCROLLINFO si;
		DWORD dwStyle = GetWindowLong(hwnd, GWL_STYLE);
		if (dwStyle&WS_VSCROLL)
		{
			memset(&si, 0, sizeof(si));
			si.cbSize = sizeof(si);
			si.fMask = SIF_ALL;
			GetScrollInfo(hwnd, SB_VERT, &si);
		}
	}
}
示例#2
0
static LRESULT CALLBACK
HookWndProc(HWND hwnd, UINT msg, WPARAM wp, LPARAM lp)
{
	CSkinScrollWnd *pSkin=(CSkinScrollWnd*)GetWindowLong(hwnd,GWL_USERDATA);
	if(msg==WM_DESTROY)
	{
		WNDPROC procOld=pSkin->m_funOldProc;
		UnskinWndScroll(CWnd::FromHandle(hwnd));
		return ::CallWindowProc(procOld,hwnd,msg,wp,lp);
	}
	
	LRESULT lr=::CallWindowProc(pSkin->m_funOldProc,hwnd,msg,wp,lp);
	if(pSkin->m_bOp) return lr;
	if(msg==WM_ERASEBKGND)
	{
			SCROLLINFO si;
			DWORD dwStyle=::GetWindowLong(hwnd,GWL_STYLE);
			if(dwStyle&WS_VSCROLL)
			{
				memset(&si,0,sizeof(si));
				si.cbSize=sizeof(si);
				si.fMask=SIF_ALL;
				::GetScrollInfo(hwnd,SB_VERT,&si);
				if(si.nMax!=pSkin->m_sbVert.m_si.nMax 
					||si.nMin!=pSkin->m_sbVert.m_si.nMin
					||si.nPos!=pSkin->m_sbVert.m_si.nPos
					||si.nPage!=pSkin->m_sbVert.m_si.nPage)
				{
					pSkin->m_sbVert.SetScrollInfo(&si,!pSkin->m_bOp);
					pSkin->m_sbVert.EnableWindow(si.nMax>=si.nPage);
				}
			}
			if(dwStyle&WS_HSCROLL)
			{
				memset(&si,0,sizeof(si));
				si.cbSize=sizeof(si);
				si.fMask=SIF_ALL;
				::GetScrollInfo(hwnd,SB_HORZ,&si);
				if(si.nMax!=pSkin->m_sbHorz.m_si.nMax 
					||si.nMin!=pSkin->m_sbHorz.m_si.nMin
					||si.nPos!=pSkin->m_sbHorz.m_si.nPos
					||si.nPage!=pSkin->m_sbHorz.m_si.nPage)
				{
					pSkin->m_sbHorz.SetScrollInfo(&si,!pSkin->m_bOp);
					pSkin->m_sbHorz.EnableWindow(si.nMax>=si.nPage);
				}
			}
	}else if(msg==WM_NCCALCSIZE && wp)
	{
			LPNCCALCSIZE_PARAMS pNcCalcSizeParam=(LPNCCALCSIZE_PARAMS)lp;
			DWORD dwStyle=::GetWindowLong(hwnd,GWL_STYLE);
			DWORD dwExStyle=::GetWindowLong(hwnd,GWL_EXSTYLE);
			BOOL  bLeftScroll=dwExStyle&WS_EX_LEFTSCROLLBAR;
			int nWid=::GetSystemMetrics(SM_CXVSCROLL);
			if(dwStyle&WS_VSCROLL) 
			{
				if(bLeftScroll)
					pNcCalcSizeParam->rgrc[0].left-=nWid-pSkin->m_nScrollWid;
				else
					pNcCalcSizeParam->rgrc[0].right+=nWid-pSkin->m_nScrollWid;
			}
			if(dwStyle&WS_HSCROLL) pNcCalcSizeParam->rgrc[0].bottom+=nWid-pSkin->m_nScrollWid;
			
			RECT rc,rcVert,rcHorz;
			::GetWindowRect(hwnd,&rc);
			::OffsetRect(&rc,-rc.left,-rc.top);
			
			nWid=pSkin->m_nScrollWid;
			if(bLeftScroll)
			{
				int nLeft=pNcCalcSizeParam->rgrc[0].left;
				int nBottom=pNcCalcSizeParam->rgrc[0].bottom;
				rcVert.right=nLeft;
				rcVert.left=nLeft-nWid;
				rcVert.top=0;
				rcVert.bottom=nBottom;
				rcHorz.left=nLeft;
				rcHorz.right=pNcCalcSizeParam->rgrc[0].right;
				rcHorz.top=nBottom;
				rcHorz.bottom=nBottom+nWid;
			}else
			{
				int nRight=pNcCalcSizeParam->rgrc[0].right;
				int nBottom=pNcCalcSizeParam->rgrc[0].bottom;
				rcVert.left=nRight;
				rcVert.right=nRight+nWid;
				rcVert.top=0;
				rcVert.bottom=nBottom;
				rcHorz.left=0;
				rcHorz.right=nRight;
				rcHorz.top=nBottom;
				rcHorz.bottom=nBottom+nWid;
			}
			if(dwStyle&WS_VSCROLL && dwStyle&WS_HSCROLL)
			{
				pSkin->m_nAngleType=bLeftScroll?1:2;
			}else
			{
				pSkin->m_nAngleType=0;
			}
			if(dwStyle&WS_VSCROLL)
			{
				pSkin->m_sbVert.MoveWindow(&rcVert);
				pSkin->m_sbVert.ShowWindow(SW_SHOW);
			}else
			{
				pSkin->m_sbVert.ShowWindow(SW_HIDE);
			}
			if(dwStyle&WS_HSCROLL)
			{
				pSkin->m_sbHorz.MoveWindow(&rcHorz);
				pSkin->m_sbHorz.ShowWindow(SW_SHOW);
			}else
			{
				pSkin->m_sbHorz.ShowWindow(SW_HIDE);
			}
			pSkin->PostMessage(UM_DESTMOVE,dwStyle&WS_VSCROLL,bLeftScroll);
	}
	return lr;
}