📄 coolmenu.cpp
字号:
( bSelected && !bDisabled ) ? CoolInterface.m_crBackCheckSel : CoolInterface.m_crBackCheck );
}
nIcon = CoolInterface.ImageForID( (DWORD)lpDrawItemStruct->itemID );
if ( bChecked && nIcon < 0 ) nIcon = m_nCheckIcon;
if ( nIcon >= 0 )
{
CPoint pt( rcItem.left + 4, rcItem.top + 4 );
if ( bDisabled )
{
ImageList_DrawEx( CoolInterface.m_pImages.m_hImageList, nIcon, pDC->GetSafeHdc(),
pt.x, pt.y, 0, 0, CLR_NONE, CoolInterface.m_crDisabled, CM_DISABLEDBLEND );
}
else if ( bChecked )
{
CoolInterface.m_pImages.Draw( pDC, nIcon, pt, ILD_NORMAL );
}
else if ( bSelected )
{
pt.Offset( 1, 1 );
pDC->SetTextColor( CoolInterface.m_crShadow );
CoolInterface.m_pImages.Draw( pDC, nIcon, pt, ILD_MASK );
pt.Offset( -2, -2 );
CoolInterface.m_pImages.Draw( pDC, nIcon, pt, ILD_NORMAL );
}
else
{
ImageList_DrawEx( CoolInterface.m_pImages.m_hImageList, nIcon, pDC->GetSafeHdc(),
pt.x, pt.y, 0, 0, CLR_NONE, CoolInterface.m_crMargin, ILD_BLEND25 );
}
}
CFont* pOld = (CFont*)pDC->SelectObject(
( lpDrawItemStruct->itemState & ODS_DEFAULT ) && ! bDisabled ?
&CoolInterface.m_fntBold : &CoolInterface.m_fntNormal );
pDC->SetBkMode( TRANSPARENT );
pDC->SetTextColor( bDisabled ? CoolInterface.m_crDisabled :
( bSelected ? CoolInterface.m_crCmdTextSel : CoolInterface.m_crCmdText ) );
DrawMenuText( pDC, &rcText, strText );
pDC->SelectObject( pOld );
dc.BitBlt( lpDrawItemStruct->rcItem.left, lpDrawItemStruct->rcItem.top,
rcItem.Width(), rcItem.Height(), pDC, 0, 0, SRCCOPY );
dc.Detach();
}
//////////////////////////////////////////////////////////////////////
// CCoolMenu formatted text helper
void CCoolMenu::DrawMenuText(CDC* pDC, CRect* pRect, const CString& strText)
{
int nPos = strText.Find( '\t' );
if ( nPos >= 0 )
{
pRect->right -= 8;
pDC->DrawText( strText.Left( nPos ), pRect, DT_SINGLELINE|DT_VCENTER|DT_LEFT );
pDC->DrawText( strText.Mid( nPos + 1 ), pRect, DT_SINGLELINE|DT_VCENTER|DT_RIGHT );
pRect->right += 8;
}
else
{
pDC->DrawText( strText, pRect, DT_SINGLELINE|DT_VCENTER|DT_LEFT );
}
}
//////////////////////////////////////////////////////////////////////
// CCoolMenu watermark helper
void CCoolMenu::DrawWatermark(CDC* pDC, CRect* pRect, int nOffX, int nOffY)
{
for ( int nY = pRect->top - nOffY ; nY < pRect->bottom ; nY += m_czWatermark.cy )
{
if ( nY + m_czWatermark.cy < pRect->top ) continue;
for ( int nX = pRect->left - nOffX ; nX < pRect->right ; nX += m_czWatermark.cx )
{
if ( nX + m_czWatermark.cx < pRect->left ) continue;
pDC->BitBlt( nX, nY, m_czWatermark.cx, m_czWatermark.cy, &m_dcWatermark, 0, 0, SRCCOPY );
}
}
}
//////////////////////////////////////////////////////////////////////
// CCoolMenu border effects
HHOOK CCoolMenu::m_hMsgHook = NULL;
LPCTSTR CCoolMenu::wpnOldProc = _T("RAZA_MenuOldWndProc");
BOOL CCoolMenu::m_bPrinted = TRUE;
int CCoolMenu::m_nEdgeLeft = 0;
int CCoolMenu::m_nEdgeTop = 0;
int CCoolMenu::m_nEdgeSize = 0;
void CCoolMenu::EnableHook()
{
ASSERT( m_hMsgHook == NULL );
ASSERT( m_bUnhook == FALSE );
m_bEnable = IsModernVersion();
if ( ! m_bEnable ) return;
m_bUnhook = TRUE;
EnableHook( TRUE );
}
void CCoolMenu::EnableHook(BOOL bEnable)
{
if ( bEnable == ( m_hMsgHook != NULL ) ) return;
if ( bEnable )
{
m_hMsgHook = SetWindowsHookEx( WH_CALLWNDPROC, MsgHook,
AfxGetInstanceHandle(), GetCurrentThreadId() );
}
else
{
UnhookWindowsHookEx( m_hMsgHook );
m_hMsgHook = NULL;
}
}
void CCoolMenu::RegisterEdge(int nLeft, int nTop, int nLength)
{
m_nEdgeLeft = nLeft;
m_nEdgeTop = nTop;
m_nEdgeSize = nLength;
}
//////////////////////////////////////////////////////////////////////
// CCoolMenu message hook and subclassed window procedure
LRESULT CALLBACK CCoolMenu::MsgHook(int nCode, WPARAM wParam, LPARAM lParam)
{
CWPSTRUCT* pCWP = (CWPSTRUCT*)lParam;
while ( nCode == HC_ACTION )
{
if ( pCWP->message != WM_CREATE && pCWP->message != 0x01E2 ) break;
TCHAR szClassName[16];
int nClassName = GetClassName( pCWP->hwnd, szClassName, 16 );
if ( nClassName != 6 || _tcscmp( szClassName, _T("#32768") ) != 0 ) break;
if ( ::GetProp( pCWP->hwnd, wpnOldProc ) != NULL ) break;
HWND hWndFore = GetForegroundWindow();
if ( hWndFore != NULL && CWnd::FromHandlePermanent( hWndFore ) == NULL ) break;
WNDPROC pWndProc = (WNDPROC)(LONG_PTR)::GetWindowLong( pCWP->hwnd, GWL_WNDPROC );
if ( pWndProc == NULL ) break;
ASSERT( pWndProc != MenuProc );
if ( ! SetProp( pCWP->hwnd, wpnOldProc, pWndProc ) ) break;
if ( ! SetWindowLong( pCWP->hwnd, GWL_WNDPROC, (DWORD)(DWORD_PTR)MenuProc ) )
{
::RemoveProp( pCWP->hwnd, wpnOldProc );
break;
}
break;
}
return CallNextHookEx( CCoolMenu::m_hMsgHook, nCode, wParam, lParam );
}
LRESULT CALLBACK CCoolMenu::MenuProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
WNDPROC pWndProc = (WNDPROC)::GetProp( hWnd, wpnOldProc );
switch ( uMsg )
{
case WM_NCCALCSIZE:
{
NCCALCSIZE_PARAMS* pCalc = (NCCALCSIZE_PARAMS*)lParam;
pCalc->rgrc[0].left ++;
pCalc->rgrc[0].top ++;
pCalc->rgrc[0].right --;
pCalc->rgrc[0].bottom --;
}
return 0;
case WM_WINDOWPOSCHANGING:
if ( WINDOWPOS* pWndPos = (WINDOWPOS*)lParam )
{
DWORD nStyle = GetWindowLong( hWnd, GWL_STYLE );
DWORD nExStyle = GetWindowLong( hWnd, GWL_EXSTYLE );
CRect rc( 0, 0, 32, 32 );
AdjustWindowRectEx( &rc, nStyle, FALSE, nExStyle );
pWndPos->cx -= ( rc.Width() - 34 );
pWndPos->cy -= ( rc.Height() - 34 ) - 1;
if ( pWndPos->x != m_nEdgeLeft || pWndPos->y != m_nEdgeTop )
pWndPos->x ++;
}
break;
case WM_PRINT:
if ( ( lParam & PRF_CHECKVISIBLE ) && ! IsWindowVisible( hWnd ) ) return 0;
if ( lParam & PRF_NONCLIENT )
{
CWnd* pWnd = CWnd::FromHandle( hWnd );
CDC* pDC = CDC::FromHandle( (HDC)wParam );
CRect rc;
pWnd->GetWindowRect( &rc );
BOOL bEdge = ( rc.left == m_nEdgeLeft && rc.top == m_nEdgeTop );
rc.OffsetRect( -rc.left, -rc.top );
pDC->Draw3dRect( &rc, CoolInterface.m_crDisabled, CoolInterface.m_crDisabled );
if ( bEdge ) pDC->FillSolidRect( rc.left + 1, rc.top, min( rc.Width(), m_nEdgeSize ) - 2, 1, CoolInterface.m_crBackNormal );
}
if ( lParam & PRF_CLIENT )
{
CWnd* pWnd = CWnd::FromHandle( hWnd );
CDC* pDC = CDC::FromHandle( (HDC)wParam );
CBitmap bmBuf, *pbmOld;
CDC dcBuf;
CRect rc;
pWnd->GetClientRect( &rc );
dcBuf.CreateCompatibleDC( pDC );
bmBuf.CreateCompatibleBitmap( pDC, rc.Width(), rc.Height() );
pbmOld = (CBitmap*)dcBuf.SelectObject( &bmBuf );
m_bPrinted = TRUE;
dcBuf.FillSolidRect( &rc, GetSysColor( COLOR_MENU ) );
SendMessage( hWnd, WM_PRINTCLIENT, (WPARAM)dcBuf.GetSafeHdc(), 0 );
pDC->BitBlt( 1, 1, rc.Width(), rc.Height(), &dcBuf, 0, 0, SRCCOPY );
dcBuf.SelectObject( pbmOld );
}
return 0;
case WM_NCPAINT:
{
CWnd* pWnd = CWnd::FromHandle( hWnd );
CWindowDC dc( pWnd );
CRect rc;
pWnd->GetWindowRect( &rc );
BOOL bEdge = ( rc.left == m_nEdgeLeft && rc.top == m_nEdgeTop );
rc.OffsetRect( -rc.left, -rc.top );
dc.Draw3dRect( &rc, CoolInterface.m_crDisabled, CoolInterface.m_crDisabled );
if ( bEdge ) dc.FillSolidRect( rc.left + 1, rc.top, min( rc.Width(), m_nEdgeSize ) - 2, 1, CoolInterface.m_crBackNormal );
}
return 0;
case WM_PAINT:
m_bPrinted = FALSE;
break;
case WM_NCDESTROY:
::RemoveProp( hWnd, wpnOldProc );
break;
}
return CallWindowProc( pWndProc, hWnd, uMsg, wParam, lParam );
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -