// DialogExt.cpp: implementation of the CDialogExt class. // ////////////////////////////////////////////////////////////////////// #include "stdafx.h" #include "DialogExt.h" #include "resource.h" #include "library.h" #include "ylgl.h" #ifdef _DEBUG #undef THIS_FILE static char THIS_FILE[]=__FILE__; #define new DEBUG_NEW #endif #include ".\scrollbar\coolscroll.h" void InitTest(void); LRESULT HandleCustomDraw(UINT, NMCSBCUSTOMDRAW *); HDC hdcCoolSkin; HBITMAP hCoolSkinBmp; BOOL fCustomDraw = FALSE; BOOL fButtons = FALSE; BOOL fThumbAlways = FALSE; BOOL fLeftScroll = FALSE; BOOL fEnableCSB = TRUE; ////////////////////////////////////////////////////////////////////// // Construction/Destruction ////////////////////////////////////////////////////////////////////// HWND CDialogExt::m_hWnd=NULL; WNDPROC CDialogExt::m_cWndProc = NULL; CBitmap CDialogExt::m_bmptop; CBitmap CDialogExt::m_bmpclose; CBitmap CDialogExt::m_bmpmax; CBitmap CDialogExt::m_bmpmin; CBitmap CDialogExt::m_bmprestore; int CDialogExt::m_height=0; int CDialogExt::m_width=0; int CDialogExt::m_buttonstate=0; CFont CDialogExt::m_CaptionFont; void RedrawNC(HWND hwnd) { SetWindowPos(hwnd, 0, 0, 0, 0, 0, SWP_NOMOVE|SWP_NOSIZE|SWP_NOZORDER|SWP_NOACTIVATE| SWP_FRAMECHANGED|SWP_DRAWFRAME); } void InitTest(void) { if(hCoolSkinBmp)return; hdcCoolSkin = CreateCompatibleDC(0); CBitmap bmp; AfxSetResourceHandle(GetModuleHandle(NULL)); bmp.LoadBitmap (IDB_SCROLL); hCoolSkinBmp = (HBITMAP)bmp.m_hObject ; SelectObject(hdcCoolSkin, hCoolSkinBmp); } BOOL CALLBACK EnumChildProcDlg(HWND hwnd,LPARAM lParam) { char sClassName[201] = "\0"; if(hwnd) { GetClassName( hwnd, sClassName, 200 ); if( strcmp( sClassName, "Edit" ) == 0 ||strcmp( sClassName, "ListBox" ) == 0||strcmp( sClassName, "ComboBox" ) == 0) { InitTest(); InitializeCoolSB(hwnd); fCustomDraw=1; CoolSB_SetSize(hwnd, SB_BOTH, SYSTEM_METRIC, SYSTEM_METRIC); CoolSB_SetMinThumbSize(hwnd, SB_BOTH, (UINT)-1); } return TRUE; } else { return FALSE; } } void CDialogExt::Init() { // AfxSetResourceHandle(GetModuleHandle(NULL)); m_bmptop.LoadBitmap(IDB_TITLE); m_bmpclose.LoadBitmap(IDB_CLOSE); m_bmpmax.LoadBitmap(IDB_MAX); m_bmpmin.LoadBitmap(IDB_MIN); m_bmprestore.LoadBitmap(IDB_RESTORE); BITMAP bm; memset( &bm, 0, sizeof(bm) ); m_bmptop.GetBitmap(&bm); m_height=bm.bmHeight; m_width=bm.bmWidth ; m_CaptionFont.CreatePointFont( GetSystemMetrics(SM_CYSMCAPTION), "System" ); g_frameedgebrush=CreateSolidBrush(RGB(85, 119, 217)); g_frameedgepen=::CreatePen (PS_SOLID, 1, RGB(85, 119, 217)); if(g_crDialogbkColor==0) g_crDialogbkColor=RGB(204,204,204); } CRect CDialogExt::GetMaximizeRect() { CRect r; SystemParametersInfo(SPI_GETWORKAREA, 0, r, 0); return r; } LRESULT CDialogExt::DefWindowProc( HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam ) { m_hWnd=hWnd; CWnd *pWnd = NULL; CPoint point; pWnd = CWnd::FromHandle( hWnd ); WNDSTATE *m_wndstate; if (g_ctrlMap.Lookup( hWnd, (void*&)m_wndstate) ) { m_cWndProc=m_wndstate->oldWndProc ; DWORD style=GetWindowLong(hWnd, GWL_STYLE); if(((style & WS_CHILD) == WS_CHILD||(style & WS_CAPTION) != WS_CAPTION)&&(message!=WM_INITDIALOG&&message!=WM_NOTIFY)) { return CallWindowProc( m_cWndProc, hWnd, message, wParam, lParam ); } } switch( message ) { case WM_NOTIFY: { NMHDR *hdr = (NMHDR *)lParam; if(hdr->code == NM_COOLSB_CUSTOMDRAW) { return HandleCustomDraw(wParam, (NMCSBCUSTOMDRAW *)lParam); } break; } case WM_INITDIALOG: { int ret=CallWindowProc( m_cWndProc, hWnd, message, wParam, lParam ); EnumChildWindows(hWnd,(WNDENUMPROC)EnumChildProcDlg,0); return ret; } case WM_SETTEXT: { CallWindowProc( m_cWndProc, hWnd, message, wParam, lParam ); OnNcPaint( pWnd ); return 0; } case WM_NCCALCSIZE: OnNcCalcSize( (BOOL)wParam, (NCCALCSIZE_PARAMS *)lParam ); return 0; case WM_NCPAINT: { OnNcPaint( pWnd ); return 0; } case WM_SIZE: { if(::IsZoomed (m_hWnd)) Maximize(); CRect wr; pWnd->GetWindowRect (&wr); CRgn rgn; rgn.CreateRoundRectRgn(0 , 0, wr.Width()+1, wr.Height()+10,8,6); pWnd->SetWindowRgn ((HRGN)rgn, TRUE); break; } case WM_ACTIVATE: case WM_NCACTIVATE: { OnNcPaint( pWnd ); return 1; } case WM_DESTROY: { WNDSTATE *m_wndstate; if (g_ctrlMap.Lookup( m_hWnd, (void*&)m_wndstate) ) { delete m_wndstate; g_ctrlMap.RemoveKey( m_hWnd ); } break; } case WM_NCLBUTTONDOWN: if(!OnNcLButtonDown(wParam, CPoint(LOWORD(lParam), HIWORD(lParam)))) return 0; else break; case WM_NCLBUTTONUP: OnNcLButtonUp(wParam, CPoint(LOWORD(lParam), HIWORD(lParam))); return 0; case WM_NCLBUTTONDBLCLK: OnNcLButtonDblClk(wParam, CPoint(LOWORD(lParam), HIWORD(lParam))); return 0; case WM_NCMOUSEMOVE: OnNcMouseMove( wParam,CPoint(LOWORD(lParam), HIWORD(lParam))); return 0; case WM_CTLCOLORSTATIC: { HDC hdc=(HDC)wParam; HWND hwnd=(HWND)lParam; ::SetBkMode (hdc, TRANSPARENT); char szTemp[MAX_PATH]; GetClassName(hwnd, szTemp, sizeof(szTemp)); if (lstrcmpi(szTemp, "Edit") == 0) { CRect rc,rc2; ::GetWindowRect (hwnd, rc); CPoint pt1,pt2; pt1=rc.TopLeft (); pt2=rc.BottomRight (); ::ScreenToClient (::GetParent (hwnd), &pt1); ::ScreenToClient (::GetParent (hwnd), &pt2); rc.left =pt1.x; rc.top =pt1.y; rc.right =pt2.x; rc.bottom =pt2.y; rc2=rc; rc.DeflateRect (2, 2, 2, 2); ::SetBkColor(hdc, RGB(128, 162, 223) ); if(g_pMainWnd2->m_pBk) { HDC hdc2=::GetDC (::GetParent (hwnd)); Graphics graph(hdc2); Rect destinationRect(rc.left,rc.top,rc.Width (), rc.Height ()); rc=g_pMainWnd2->m_rcarray.ElementAt (16); rc2.left +=rc.left ; rc2.right +=rc.left ; rc2.top +=rc.top ; rc2.bottom +=rc.top ; rc=rc2; rc.left /=g_fscalex; rc.right /=g_fscalex; rc.top /=g_fscaley; rc.bottom /=g_fscaley; graph.DrawImage(g_pMainWnd2->m_pBk, destinationRect, rc.left , rc.top ,rc.Width (), rc.Height (),UnitPixel); ::ReleaseDC (::GetParent (hwnd), hdc2); } } return (INT_PTR)::GetStockObject(NULL_BRUSH); } case WM_ERASEBKGND: #ifdef NEW_SKIN if(g_pMainWnd2->m_pBk) { CRect rc; pWnd->GetClientRect (rc); HDC hdc=(HDC)wParam; // ::FillRect (hdc, rc, (HBRUSH)::GetStockObject (WHITE_BRUSH)); Graphics graph(hdc); Rect destinationRect(0,0,rc.Width (), rc.Height ()); rc=g_pMainWnd2->m_rcarray.ElementAt (16); rc.left /=g_fscalex; rc.right /=g_fscalex; rc.top /=g_fscaley; rc.bottom /=g_fscaley; graph.SetSmoothingMode(SmoothingModeHighQuality); graph.DrawImage(g_pMainWnd2->m_pBk, destinationRect, rc.left , rc.top ,rc.Width (), rc.Height (),UnitPixel); return 1; } #else return CDialog::OnEraseBkgnd(pDC); #endif default: break; } return CallWindowProc( m_cWndProc, hWnd, message, wParam, lParam ); } void CDialogExt::OnNcPaint(CWnd* pWnd ) { CDC * pDC = pWnd->GetWindowDC(); CRect wr; pWnd->GetWindowRect( wr ); CDC memdc; memdc.CreateCompatibleDC(pDC); CBitmap *pOldBmp=memdc.SelectObject(&m_bmptop); CBrush brush; CBrush brush2; bool m_bActive; if(m_hWnd==GetForegroundWindow ()) m_bActive=true; else m_bActive=false; if(m_bActive) { brush.CreateSolidBrush (RGB(0,33,169)); brush2.CreateSolidBrush (RGB(8,85,221)); pDC->StretchBlt(0, 0, wr.Width (), m_height, &memdc, 0, 0, m_width, m_height, SRCCOPY); } else { brush.CreateSolidBrush (RGB(122,150,223)); brush2.CreateSolidBrush (RGB(122,150,223)); pDC->FillRect (CRect(0,0,wr.Width (), m_height), &brush2); } memdc.SelectObject(pOldBmp); pDC->FillRect (CRect(0,0,3,wr.Height ()), &brush2); pDC->FillRect (CRect(wr.Width()-3,0,wr.Width(),wr.Height ()), &brush); pDC->FillRect (CRect(0,wr.Height ()-3,wr.Width(),wr.Height ()), &brush); //////////////////////////////////////////// if ( m_buttonstate == 3 ) DrawButton( pDC, 0, 2 ); else if ( m_buttonstate == 6) DrawButton( pDC, 0, 1 ); else DrawButton( pDC, 0, 0 ); if ( m_buttonstate == 1 ) DrawButton( pDC, 2, 2 ); else if ( m_buttonstate == 4) DrawButton( pDC, 2, 1 ); else DrawButton( pDC, 2, 0 ); if ( m_buttonstate == 2 ) DrawButton( pDC, 1, 2 ); else if ( m_buttonstate == 5) DrawButton( pDC, 1, 1 ); else DrawButton( pDC, 1, 0 ); //////////////////////////////////////////// wr.left=5; if ( pWnd->GetStyle () & WS_SYSMENU ) { HICON hIcon=(HICON)::SendMessage(m_hWnd, WM_QUERYDRAGICON, 0, 0); if ( hIcon != NULL ) { ::DrawIconEx(pDC->m_hDC, 5, 4, hIcon, 16, 16, 0, NULL, DI_NORMAL); wr.left +=19; } } CString m_title; pWnd->GetWindowText(m_title); if (m_bActive) pDC->SetTextColor( RGB(255,255,255) ); else pDC->SetTextColor( RGB(192,192,192) ); CFont *oldfont; oldfont = pDC->SelectObject(&m_CaptionFont); pDC->SetBkMode(TRANSPARENT); pDC->DrawText( m_title, CRect( wr.left, 0, wr.Width (), m_height ), DT_SINGLELINE | DT_LEFT | DT_VCENTER | DT_WORD_ELLIPSIS ); pDC->SelectObject(oldfont); } BOOL CDialogExt::Draw( CDC *pDC, int x, int y, LPRECT sr , CBitmap &bmp) { CDC dc; dc.CreateCompatibleDC( pDC ); CBitmap * oldbmp = dc.SelectObject( &bmp ); int a=sr->right - sr->left; int b=sr->bottom - sr->top; if ( sr != NULL) pDC->BitBlt( x, y, sr->right - sr->left, sr->bottom - sr->top, &dc, sr->left, sr->top, SRCCOPY ); dc.SelectObject( oldbmp ); return TRUE; } void CDialogExt::Maximize() { CRect r = GetMaximizeRect(); ::MoveWindow( m_hWnd, r.left, r.top, r.Width(), r.Height(), TRUE ); UpdateWindow( m_hWnd ); } void CDialogExt::OnNcCalcSize(BOOL bCalcValidRects, NCCALCSIZE_PARAMS *lpncsp) { if ( bCalcValidRects ) { lpncsp->rgrc[0].left = lpncsp->rgrc[0].left + 3; lpncsp->rgrc[0].right = lpncsp->rgrc[0].right - 3; lpncsp->rgrc[0].top = lpncsp->rgrc[0].top + 23; lpncsp->rgrc[0].bottom = lpncsp->rgrc[0].bottom - 3; lpncsp->rgrc[1] = lpncsp->rgrc[0]; } } BOOL CDialogExt::DrawButton( CDC * pDC, int i, int state) { bool m_maxable; bool m_minable; WNDSTATE *m_wndstate; if (g_ctrlMap.Lookup( m_hWnd, (void*&)m_wndstate) ) { m_maxable=m_wndstate->m_maxable ; m_minable=m_wndstate->m_minable ; } if ( i == 0 ) { // if ( m_bmpCloseBtn.GetSafeHandle() ) // { CRect r = GetButtonRect(0); Draw( pDC, r.left, r.top, CRect( state * r.Width(), 0, (state + 1 ) * r.Width(), 21 ), m_bmpclose ); // } } if ( i == 1 ) { CRect r = GetButtonRect(1); if ( m_maxable ) { //if ( m_winstate == 1) Draw( pDC, r.left, r.top, CRect( state * r.Width(), 0, (state + 1 ) * r.Width(), 21 ), m_bmprestore ); //else // m_bmpMaxBtn.Draw( pDC, r.left, r.top, // CRect( state * r.Width(), 0, (state + 1 ) * r.Width(), m_bmpCloseBtn.Height() ) , m_colTrans, m_bTrans); } } if ( i == 2 ) { if ( m_minable ) { CRect r = GetButtonRect(2); Draw( pDC, r.left, r.top, CRect( state * r.Width(), 0, (state + 1 ) * r.Width(), 21 ) , m_bmpmin); } } return TRUE; } CRect CDialogExt::GetButtonRect(int i) { CWnd *pWnd = CWnd::FromHandle(m_hWnd); CRect wr; pWnd->GetWindowRect(wr); CRect r=CRect(CPoint(wr.Width () -2*4-3*21-4, 1),CSize(21,21)); if ( i == 0 )//&& m_bmpCloseBtn.GetSafeHandle() ) { //close r.left += 21*2+2*3; r.right += 21*2+2*3; } if ( i == 1 )//&& m_bmpMaxBtn.GetSafeHandle()) { //max r.left += 21+3; r.right += 21+3; } if ( i == 2 )//&& m_bmpMinBtn.GetSafeHandle()) { //min r.left += 0; r.right += 0; } return r; } bool CDialogExt::OnNcLButtonDown(UINT nHitTest, CPoint point) { CWnd *pWnd = CWnd::FromHandle(m_hWnd); CRect wr; CDC * pDC = pWnd->GetWindowDC(); pWnd->GetWindowRect(wr); point.x -= wr.left; point.y -= wr.top; bool m_maxable; bool m_minable; WNDSTATE *m_wndstate; if (g_ctrlMap.Lookup( m_hWnd, (void*&)m_wndstate) ) { m_maxable=m_wndstate->m_maxable ; m_minable=m_wndstate->m_minable ; } if ( PtInRect( GetButtonRect(0), point ) ) { m_buttonstate=0; // SendMessage(m_hWnd, WM_CLOSE, 0,0); //return 0; } else if ( PtInRect( GetButtonRect(2), point ) && m_minable ) { m_buttonstate=4; // SendMessage(m_hWnd, WM_SYSCOMMAND, SC_MINIMIZE, MAKELPARAM(point.x, point.y)); } else if ( PtInRect( GetButtonRect(1), point ) && m_maxable ) { m_buttonstate=5; /* if (IsZoomed(m_hWnd)) { SendMessage(m_hWnd, WM_SYSCOMMAND, SC_RESTORE, MAKELPARAM(point.x, point.y)); } else { SendMessage(m_hWnd, WM_SYSCOMMAND, SC_MAXIMIZE, MAKELPARAM(point.x, point.y)); }*/ } /* else if(PtInRect( CRect(5,4,21,20), point )&& (pWnd->GetStyle () & WS_SYSMENU)) { CPoint pt=CPoint(0,0); ::ClientToScreen (m_hWnd, &pt); PopupSysMenu(pt); return 0; }*/ else { return 1; } if ( m_buttonstate == 3 ) DrawButton( pDC, 0, 2 ); else if ( m_buttonstate == 6) DrawButton( pDC, 0, 1 ); else DrawButton( pDC, 0, 0 ); if ( m_buttonstate == 1 ) DrawButton( pDC, 2, 2 ); else if ( m_buttonstate == 4) DrawButton( pDC, 2, 1 ); else DrawButton( pDC, 2, 0 ); if ( m_buttonstate == 2 ) DrawButton( pDC, 1, 2 ); else if ( m_buttonstate == 5) DrawButton( pDC, 1, 1 ); else DrawButton( pDC, 1, 0 ); return 0; } void CDialogExt::OnNcLButtonUp(UINT nHitTest, CPoint point) { CWnd *pWnd = CWnd::FromHandle(m_hWnd); CRect wr; CDC * pDC = pWnd->GetWindowDC(); pWnd->GetWindowRect(wr); point.x -= wr.left; point.y -= wr.top; bool m_maxable; bool m_minable; WNDSTATE *m_wndstate; if (g_ctrlMap.Lookup( m_hWnd, (void*&)m_wndstate) ) { m_maxable=m_wndstate->m_maxable ; m_minable=m_wndstate->m_minable ; } if ( PtInRect( GetButtonRect(0), point ) ) { m_buttonstate=0; SendMessage(m_hWnd, WM_CLOSE, 0,0); return ; } else if ( PtInRect( GetButtonRect(2), point ) && m_minable ) { m_buttonstate=4; SendMessage(m_hWnd, WM_SYSCOMMAND, SC_MINIMIZE, MAKELPARAM(point.x, point.y)); } else if ( PtInRect( GetButtonRect(1), point ) && m_maxable ) { m_buttonstate=5; if (IsZoomed(m_hWnd)) { SendMessage(m_hWnd, WM_SYSCOMMAND, SC_RESTORE, MAKELPARAM(point.x, point.y)); } else { SendMessage(m_hWnd, WM_SYSCOMMAND, SC_MAXIMIZE, MAKELPARAM(point.x, point.y)); } } if ( m_buttonstate == 3 ) DrawButton( pDC, 0, 2 ); else if ( m_buttonstate == 6) DrawButton( pDC, 0, 1 ); else DrawButton( pDC, 0, 0 ); if ( m_buttonstate == 1 ) DrawButton( pDC, 2, 2 ); else if ( m_buttonstate == 4) DrawButton( pDC, 2, 0 ); if ( m_buttonstate == 2 ) DrawButton( pDC, 1, 2 ); else if ( m_buttonstate == 5) DrawButton( pDC, 1, 0 ); m_buttonstate=0; } void CDialogExt::OnNcLButtonDblClk(UINT nHitTest, CPoint point) { bool m_maxable; WNDSTATE *m_wndstate; if (g_ctrlMap.Lookup( m_hWnd, (void*&)m_wndstate) ) { m_maxable=m_wndstate->m_maxable ; if(!m_maxable)return; } if (IsZoomed(m_hWnd)) // ����Ѿ��������SC_RESTORE�������̣�Ҫ��ָ����� SendMessage(m_hWnd, WM_SYSCOMMAND, SC_RESTORE, MAKELPARAM(point.x, point.y)); else // ���δ�������SC_MAXIMIZE�������̣�Ҫ������� SendMessage(m_hWnd, WM_SYSCOMMAND, SC_MAXIMIZE, MAKELPARAM(point.x, point.y)); } void CDialogExt::OnNcMouseMove(UINT nHitTest, CPoint point) { CWnd *pWnd = CWnd::FromHandle(m_hWnd); CDC * pDC = pWnd->GetWindowDC(); CRect wr; pWnd->GetWindowRect(wr); point.x -= wr.left; point.y -= wr.top; bool m_maxable; bool m_minable; WNDSTATE *m_wndstate; if (g_ctrlMap.Lookup( m_hWnd, (void*&)m_wndstate) ) { m_maxable=m_wndstate->m_maxable ; m_minable=m_wndstate->m_minable ; } if ( PtInRect( GetButtonRect(0), point ) ) m_buttonstate=3; //return HTCLOSE; else if ( PtInRect( GetButtonRect(2), point ) && m_minable ) m_buttonstate=1; // return HTMINBUTTON; else if ( PtInRect( GetButtonRect(1), point ) && m_maxable ) m_buttonstate=2; if ( m_buttonstate == 3 ) DrawButton( pDC, 0, 2 ); else if ( m_buttonstate == 6) DrawButton( pDC, 0, 1 ); else DrawButton( pDC, 0, 0 ); if ( m_buttonstate == 1 ) DrawButton( pDC, 2, 2 ); else if ( m_buttonstate == 4) DrawButton( pDC, 2, 1 ); else DrawButton( pDC, 2, 0 ); if ( m_buttonstate == 2 ) DrawButton( pDC, 1, 2 ); else if ( m_buttonstate == 5) DrawButton( pDC, 1, 1 ); else DrawButton( pDC, 1, 0 ); m_buttonstate=0; }