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); } } }
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; }