📄 skinwin.cpp
字号:
return TRUE;
}
BOOL CSkinWin::InstallSkin(CWnd *wnd)
{
if ( !wnd || !m_bInit ) return FALSE;
HookWindow( (HWND)NULL);
int r = HookWindow( wnd );
DWORD style = GetWindowLong( m_hWnd, GWL_STYLE );
m_sizable = style & WS_SIZEBOX;
m_minable = style & WS_MINIMIZEBOX;
m_maxable = style & WS_MAXIMIZEBOX;
//m_sysmenu = style & WS_MAXIMIZEBOX;
style &= ~(WS_MINIMIZEBOX);
style &= ~WS_MAXIMIZEBOX;
style &= ~WS_SYSMENU;
SetWindowLong( m_hWnd, GWL_STYLE, style );
return r;
}
LRESULT CSkinWin::WindowProc(UINT msg, WPARAM wp, LPARAM lp)
{
if ( !IsWindow(m_hWnd) )
return 0;
if ( !m_bInit )
return Default();
switch ( msg )
{
case WM_SHOWWINDOW:
//call setwindowpos to force OnNcCalcSize when hWnd is a dialog
if ( wp )
SetWindowPos( m_hWnd, 0, 0, 0, 400, 400, SWP_NOSIZE|SWP_NOMOVE|SWP_FRAMECHANGED );
Default();
return 0;
break;
//case WM_ERASEBKGND:
case WM_INITMENUPOPUP:
Default();
return 0;
// return OnEraseBkgnd(CDC::FromHandle((HDC)wp) );
/*
case WM_INITMENU:
//a hack, when popup sysmenu, redraw title bar
HMENU h;
h = (HMENU)wp;
int c;
h = GetSubMenu(h, 0);
c = GetMenuItemID( h, 0 );
if ( c == SC_RESTORE )
{
CRect r;
GetClientRect( m_hWnd, r );
OnNcPaint(0);
r.bottom = GetSystemMetrics(SM_CYCAPTION);
InvalidateRect( m_hWnd, r, TRUE );
UpdateWindow( m_hWnd );
}
Default();
return 0;
*/
case WM_SYSCOMMAND:
OnSysCommand( wp, lp );
//Default();
return 0;
case WM_SETTEXT:
return OnSetText( wp, lp );
case WM_NCPAINT:
OnNcPaint( (HRGN)wp );
return 0;
case WM_NCCALCSIZE:
OnNcCalcSize( (BOOL)wp, (NCCALCSIZE_PARAMS *)lp );
return 0;
case WM_SIZE:
OnSize( wp, LOWORD(lp), HIWORD(lp) );
return 0;
case WM_NCACTIVATE:
return OnNcActivate( (BOOL)wp );
case WM_NCHITTEST:
return OnNcHitTest(CPoint(LOWORD(lp), HIWORD(lp)));
case WM_NCLBUTTONUP:
OnNcLButtonUp(wp, CPoint(LOWORD(lp), HIWORD(lp)));
return 0;
case WM_NCLBUTTONDOWN:
OnNcLButtonDown(wp, CPoint(LOWORD(lp), HIWORD(lp)));
return 0;
case WM_NCLBUTTONDBLCLK:
OnNcLButtonDblClk(wp, CPoint(LOWORD(lp), HIWORD(lp)));
return 0;
case WM_NCRBUTTONUP:
OnNcRButtonUp(wp, CPoint(LOWORD(lp), HIWORD(lp)));
return 0;
case WM_NCRBUTTONDOWN:
OnNcRButtonDown(wp, CPoint(LOWORD(lp), HIWORD(lp)));
return 0;
case WM_NCMOUSEMOVE:
OnNcMouseMove( wp,CPoint(LOWORD(lp), HIWORD(lp)));
return 0;
case WM_GETMINMAXINFO:
OnGetMinMaxInfo( (MINMAXINFO *)lp );
return 0;
case WM_WINDOWPOSCHANGING:
OnWindowPosChanging((WINDOWPOS *)lp);
return 0;
case WM_SIZING:
OnSizing( wp, (LPRECT)lp );
return 0;
case WM_ACTIVATE:
OnActivate( wp, CWnd::FromHandle((HWND)lp), 0 );
return 0;
case WM_COMMAND:
if ( !HandleSysCommand( wp, lp ) )
Default();
return 0;
default:
return Default();
}
}
void CSkinWin::OnNcPaint(HRGN rgn1)
{
CWnd *pWnd = CWnd::FromHandle(m_hWnd);
CDC * pDC = pWnd->GetWindowDC();
CRect wr;
pWnd->GetWindowRect( wr );
//f ( (DWORD)rgn)
//pDC->SelectClipRgn( CRgn::FromHandle(rgn) );
//m_bActive = GetActiveWindow() == m_hWnd;
int state = 0;
if ( m_bActive)
state = 0;
else state = 1;
pDC->ExcludeClipRect(0, 0, wr.Width(), m_TitleHeight );
DrawFrame( pDC, 0, 0, wr.Width(), wr.Height(), state, 0 );
pDC->SelectClipRgn( NULL );
CDC memDC, *pNewDC;
CMyBitmap bmp;
CBitmap *obmp;
memDC.CreateCompatibleDC( pDC );
bmp.CreateCompatibleBitmap( pDC, wr.Width(), m_TitleHeight );
obmp = memDC.SelectObject(&bmp);
pNewDC = &memDC;
DrawTitle( pNewDC, m_BorderLeftWidth , 0,
wr.Width() - m_BorderRightWidth - m_BorderLeftWidth + 1, state );
DrawLeft( pNewDC, 0, 0, m_bmpLeft.Height(), state );
DrawRight( pNewDC, wr.Width() - m_BorderRightWidth , 0, m_bmpRight.Height(), state );
CRgn newrgn;
newrgn.CreateRectRgn( 0, 0, wr.Width(), wr.Height() );
if ( m_bTrans )
{
CRgn rgn;
rgn.CreateRectRgn( 0, m_TitleHeight, wr.Width(), wr.Height() );
HRGN hrgn = bmp.CreateRgnFromFile( m_colTrans );
newrgn.CombineRgn( &rgn, CRgn::FromHandle(hrgn), RGN_XOR );
pDC->SelectClipRgn( &newrgn );
}
else
SetWindowRgn( m_hWnd, newrgn, FALSE );
if ( m_downHitTest == HTCLOSE )
DrawButton( pNewDC, 0, 1 );
else if ( m_moveHitTest == HTCLOSE)
DrawButton( pNewDC, 0, 2 );
else
DrawButton( pNewDC, 0, 0 );
if ( m_downHitTest == HTMINBUTTON )
DrawButton( pNewDC, 2, 1 );
else if ( m_moveHitTest == HTMINBUTTON)
DrawButton( pNewDC, 2, 2 );
else
DrawButton( pNewDC, 2, 0 );
if ( m_downHitTest == HTMAXBUTTON )
DrawButton( pNewDC, 1, 1 );
else if ( m_moveHitTest == HTMAXBUTTON)
DrawButton( pNewDC, 1, 2 );
else
DrawButton( pNewDC, 1, 0 );
int cx = GetSystemMetrics(SM_CXSMICON);
int cy = GetSystemMetrics(SM_CYSMICON);
HICON hi = (HICON)SendMessage( m_hWnd, WM_GETICON, ICON_SMALL, 0);
if ( !hi )
{
#ifdef IDR_MAINFRAME
hi = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
#endif
}
//draw icon
::DrawIconEx( pNewDC->GetSafeHdc(), m_BorderLeftWidth, 5, (HICON)
CopyImage( hi, IMAGE_ICON,
cx, cy, 0), cx, cy, 0, 0, DI_NORMAL);
//draw text
if ( m_title.IsEmpty() )
pWnd->GetWindowText(m_title);
if (m_bActive)
pNewDC->SetTextColor( m_colTitle1 );
else
pNewDC->SetTextColor( m_colTitle2 );
CFont font, *ofont;
font.CreatePointFont( GetSystemMetrics(SM_CYSMCAPTION), "System" );
ofont = pNewDC->SelectObject(&font);
pNewDC->SetBkMode(TRANSPARENT);
pNewDC->DrawText( m_title, CRect( m_textShift, m_textShiftVer, wr.Width() - m_bmpTitle.Width() + m_titleoff2,
m_TitleHeight ), DT_SINGLELINE | DT_LEFT | DT_VCENTER | DT_WORD_ELLIPSIS );
pNewDC->SelectObject(&font);
pDC->BitBlt( 0, 0, wr.Width(),
m_TitleHeight, pNewDC, 0, 0, SRCCOPY );
memDC.SelectObject(obmp);
pDC->SelectClipRgn(NULL);
}
void CSkinWin::OnNcCalcSize(BOOL bCalcValidRects, NCCALCSIZE_PARAMS *lpncsp)
{
if ( bCalcValidRects )
{
lpncsp->rgrc[0].left = lpncsp->rgrc[0].left + m_BorderLeftWidth;
lpncsp->rgrc[0].right = lpncsp->rgrc[0].right - m_BorderRightWidth;
lpncsp->rgrc[0].top = lpncsp->rgrc[0].top + m_TitleHeight;
lpncsp->rgrc[0].bottom = lpncsp->rgrc[0].bottom - m_BorderBottomHeight;
lpncsp->rgrc[1] = lpncsp->rgrc[0];
}
else
{
Default();
}
}
void CSkinWin::OnSizing(UINT nSide, LPRECT lpRect)
{
//Default();
CWnd *pWnd = CWnd::FromHandle(m_hWnd);
CRect wr(lpRect);
/*
if ( m_bTrans )
SetWindowRgn( m_hWnd, GetRegion(wr.Width(), wr.Height() ), TRUE );
else
SetWindowRgn( m_hWnd, NULL, TRUE );
*/
}
void CSkinWin::OnSize(UINT nType, int cx, int cy)
{
//Default();
CWnd *pWnd = CWnd::FromHandle(m_hWnd);
CRect wr;
Default();
pWnd->GetWindowRect(wr);
pWnd->Invalidate();
OnNcPaint(0);
if ( m_bTrans )
SetWindowRgn( m_hWnd, GetRegion(wr.Width(), wr.Height() ), TRUE );
else
SetWindowRgn( m_hWnd, NULL, TRUE );
}
HRGN CSkinWin::GetRegion(int w, int h)
{
CWnd *pWnd = CWnd::FromHandle(m_hWnd);
CRect wr;
pWnd->GetWindowRect(wr);
CRgn rgn;
if ( m_bTrans )
{
CDC *pDC = pWnd->GetDC();
CDC memDC;
CMyBitmap bmp;
CBitmap *obmp;
memDC.CreateCompatibleDC(pDC);
bmp.CreateCompatibleBitmap( pDC, w, m_TitleHeight );
obmp = memDC.SelectObject(&bmp);
/*
memDC.FillSolidRect( 0, 0, w, h, 0 );
DrawFrame( &memDC, 0, 0, w, h, 0 );
*/
DrawTitle( &memDC, m_BorderLeftWidth , 0,
wr.Width() - m_BorderRightWidth - m_BorderLeftWidth + 1, 0 );
DrawLeft( &memDC, 0, 0, m_bmpLeft.Height(), 0 );
DrawRight( &memDC, wr.Width() - m_BorderRightWidth , 0, m_bmpRight.Height(), 0 );
memDC.SelectObject(obmp);
pWnd->ReleaseDC( pDC );
rgn.CreateRectRgn( 0, m_TitleHeight, wr.Width(), wr.Height() );
HRGN hrgn = bmp.CreateRgnFromFile( m_colTrans );
CRgn newrgn;
newrgn.CreateRectRgn( 0, m_TitleHeight, wr.Width(), wr.Height() );
newrgn.CombineRgn( &rgn, CRgn::FromHandle(hrgn), RGN_XOR );
return (HRGN)newrgn.Detach();
}
else
rgn.CreateRectRgn( 0, 0, wr.Width(), wr.Height() );
return (HRGN)rgn.Detach();
}
BOOL CSkinWin::OnNcActivate(BOOL bActive)
{
m_bActive = bActive;
OnNcPaint(0);
if ( !bActive )
{
return 1;
}
else
return 0;
}
UINT CSkinWin::OnNcHitTest(CPoint point)
{
CWnd *pWnd = CWnd::FromHandle(m_hWnd);
CRect wr;
pWnd->GetWindowRect(wr);
point.x -= wr.left;
point.y -= wr.top;
if ( PtInRect( GetButtonRect(0), point ) )
return HTCLOSE;
if ( PtInRect( GetButtonRect(2), point ) && m_minable )
return HTMINBUTTON;
if ( PtInRect( GetButtonRect(1), point ) && m_maxable )
return HTMAXBUTTON;
CRect r;
int cx = GetSystemMetrics(SM_CXSMICON);
int cy = GetSystemMetrics(SM_CYSMICON);
if ( PtInRect( CRect(m_BorderLeftWidth, 5, m_BorderLeftWidth + cx, cy + 5), point ) )
return HTSYSMENU;
r = CRect( 0, 0, m_BorderLeftWidth, m_TitleHeight );
if ( PtInRect( r, point ) && m_sizable && m_winstate != 1 ) //!IsZoomed(m_hWnd) )
return HTTOPLEFT;
r = CRect( wr.Width() - m_BorderLeftWidth, 0, wr.Width(), m_TitleHeight );
if ( PtInRect( r, point ) && m_sizable && m_winstate != 1 ) //!IsZoomed(m_hWnd) )
return HTTOPRIGHT;
r = CRect( 0, wr.Height() - m_BorderBottomHeight, m_BorderLeftWidth, wr.Height() );
if ( PtInRect( r, point ) && m_sizable && m_winstate != 1 ) //!IsZoomed(m_hWnd) )
return HTBOTTOMLEFT;
r = CRect( wr.Width()-m_BorderRightWidth, wr.Height() - m_BorderBottomHeight, wr.Width(), wr.Height() );
if ( PtInRect( r, point ) && m_sizable && m_winstate != 1 ) //!IsZoomed(m_hWnd) )
return HTBOTTOMRIGHT;
r = CRect( 0, m_TitleHeight, m_BorderLeftWidth, wr.Height() - m_BorderBottomHeight );
if ( PtInRect( r, point ) && m_sizable && m_winstate != 1 ) //!IsZoomed(m_hWnd) )
return HTLEFT;
r = CRect( wr.Width()-m_BorderRightWidth, m_TitleHeight, wr.Width(), wr.Height() - m_BorderBottomHeight );
if ( PtInRect( r, point ) && m_sizable && m_winstate != 1 ) //!IsZoomed(m_hWnd) )
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -