📄 dialogmintraybtn.cpp
字号:
DWORD dwExStyle = GetExStyle();
INT cyCaption = ((dwExStyle & WS_EX_TOOLWINDOW) == 0) ? GetSystemMetrics(SM_CYCAPTION) - 1 : GetSystemMetrics(SM_CYSMCAPTION) - 1;
if (cyCaption < CAPTION_MINHEIGHT)
cyCaption = CAPTION_MINHEIGHT;
CSize borderfixed(-GetSystemMetrics(SM_CXFIXEDFRAME), GetSystemMetrics(SM_CYFIXEDFRAME));
CSize bordersize(-GetSystemMetrics(SM_CXSIZEFRAME), GetSystemMetrics(SM_CYSIZEFRAME));
CRect rcWnd;
GetWindowRect(&rcWnd);
// get Windows' frame window button width/height (this may not always be a square!)
CSize szBtn;
szBtn.cy = cyCaption - (CAPTION_BUTTONSPACE * 2);
if (IsWindowsClassicStyle())
szBtn.cx = GetSystemMetrics(SM_CXSIZE) - 2;
else
szBtn.cx = GetSystemMetrics(SM_CXSIZE) - 4;
// set our frame window button width/height...
if (IsWindowsClassicStyle()){
// ...this is same as Windows' buttons for non WinXP
m_MinTrayBtnSize = szBtn;
}
else{
// ...this is a square for WinXP
m_MinTrayBtnSize.cx = szBtn.cy;
m_MinTrayBtnSize.cy = szBtn.cy;
}
m_MinTrayBtnPos.x = rcWnd.Width() - (CAPTION_BUTTONSPACE + m_MinTrayBtnSize.cx + CAPTION_BUTTONSPACE + szBtn.cx);
m_MinTrayBtnPos.y = CAPTION_BUTTONSPACE;
if ((dwStyle & WS_THICKFRAME) != 0)
{
// resizable window
m_MinTrayBtnPos += bordersize;
}
else
{
// fixed window
m_MinTrayBtnPos += borderfixed;
}
if ( ((dwExStyle & WS_EX_TOOLWINDOW) == 0) && (((dwStyle & WS_MINIMIZEBOX) != 0) || ((dwStyle & WS_MAXIMIZEBOX) != 0)) )
{
if (IsWindowsClassicStyle())
m_MinTrayBtnPos.x -= (szBtn.cx * 2) + CAPTION_BUTTONSPACE;
else
m_MinTrayBtnPos.x -= (szBtn.cx + CAPTION_BUTTONSPACE) * 2;
}
}
TEMPLATE void CDialogMinTrayBtn<BASE>::MinTrayBtnShow()
{
if (MinTrayBtnIsVisible())
return;
m_bMinTrayBtnVisible= TRUE;
if (IsWindowVisible())
{
RedrawWindow(NULL, NULL, RDW_FRAME | RDW_INVALIDATE | RDW_UPDATENOW);
}
}
TEMPLATE void CDialogMinTrayBtn<BASE>::MinTrayBtnHide()
{
if (!MinTrayBtnIsVisible())
return;
m_bMinTrayBtnVisible= FALSE;
if (IsWindowVisible())
{
RedrawWindow(NULL, NULL, RDW_FRAME | RDW_INVALIDATE | RDW_UPDATENOW);
}
}
TEMPLATE void CDialogMinTrayBtn<BASE>::MinTrayBtnEnable()
{
if (MinTrayBtnIsEnabled())
return;
m_bMinTrayBtnEnabled= TRUE;
MinTrayBtnSetUp();
}
TEMPLATE void CDialogMinTrayBtn<BASE>::MinTrayBtnDisable()
{
if (!MinTrayBtnIsEnabled())
return;
m_bMinTrayBtnEnabled= FALSE;
if (m_bMinTrayBtnCapture)
{
ReleaseCapture();
m_bMinTrayBtnCapture= FALSE;
}
MinTrayBtnSetUp();
}
TEMPLATE void CDialogMinTrayBtn<BASE>::MinTrayBtnDraw()
{
if (!MinTrayBtnIsVisible())
return;
CDC *pDC= GetWindowDC();
if (!pDC)
return; // panic!
if (IsWindowsClassicStyle())
{
CBrush black(GetSysColor(COLOR_BTNTEXT));
CBrush gray(GetSysColor(COLOR_GRAYTEXT));
CBrush gray2(GetSysColor(COLOR_BTNHILIGHT));
// button
if (m_bMinTrayBtnUp)
pDC->DrawFrameControl(MinTrayBtnGetRect(), DFC_BUTTON, DFCS_BUTTONPUSH);
else
pDC->DrawFrameControl(MinTrayBtnGetRect(), DFC_BUTTON, DFCS_BUTTONPUSH | DFCS_PUSHED);
// dot
CRect btn= MinTrayBtnGetRect();
btn.DeflateRect(2,2);
UINT caption= MinTrayBtnGetSize().cy + (CAPTION_BUTTONSPACE * 2);
UINT pixratio= (caption >= 14) ? ((caption >= 20) ? 2 + ((caption - 20) / 8) : 2) : 1;
UINT pixratio2= (caption >= 12) ? 1 + (caption - 12) / 8: 0;
UINT dotwidth= (1 + pixratio * 3) >> 1;
UINT dotheight= pixratio;
CRect dot(CPoint(0,0), CPoint(dotwidth, dotheight));
CSize spc((1 + pixratio2 * 3) >> 1, pixratio2);
dot-= dot.Size();
dot+= btn.BottomRight();
dot-= spc;
if (!m_bMinTrayBtnUp)
dot+= CPoint(1,1);
if (m_bMinTrayBtnEnabled)
{
pDC->FillRect(dot, &black);
}
else
{
pDC->FillRect(dot + CPoint(1,1), &gray2);
pDC->FillRect(dot, &gray);
}
}
else
{
// VisualStylesXP
CRect btn= MinTrayBtnGetRect();
int iState;
if (!m_bMinTrayBtnEnabled)
iState= TRAYBS_DISABLED;
else if (GetStyle() & WS_DISABLED)
iState= MINBS_NORMAL;
else if (m_bMinTrayBtnHitTest)
iState= (m_bMinTrayBtnCapture) ? MINBS_PUSHED : MINBS_HOT;
else
iState= MINBS_NORMAL;
// inactive
if (!m_bMinTrayBtnActive)
iState+= 4; // inactive state TRAYBS_Ixxx
if ((m_bmMinTrayBtnBitmap.m_hObject) && (_TransparentBlt))
{
// known theme (bitmap)
CBitmap *pBmpOld;
CDC dcMem;
if ((dcMem.CreateCompatibleDC(pDC)) && ((pBmpOld= dcMem.SelectObject(&m_bmMinTrayBtnBitmap)) != NULL))
{
_TransparentBlt(pDC->m_hDC, btn.left, btn.top, btn.Width(), btn.Height(), dcMem.m_hDC, 0, BMP_TRAYBTN_HEIGHT * (iState - 1), BMP_TRAYBTN_WIDTH, BMP_TRAYBTN_HEIGHT, BMP_TRAYBTN_TRANSCOLOR);
dcMem.SelectObject(pBmpOld);
}
}
else
{
// unknown theme (ThemeData)
HTHEME hTheme= g_xpStyle.OpenThemeData(m_hWnd, L"Window");
if (hTheme)
{
btn.top+= btn.Height() / 8;
g_xpStyle.DrawThemeBackground(hTheme, pDC->m_hDC, WP_TRAYBUTTON, iState, &btn, NULL);
g_xpStyle.CloseThemeData(hTheme);
}
}
}
ReleaseDC(pDC);
}
TEMPLATE BOOL CDialogMinTrayBtn<BASE>::MinTrayBtnHitTest(CPoint point) const
{
CRect rWnd;
GetWindowRect(&rWnd);
point.Offset(-rWnd.TopLeft());
CRect rBtn= MinTrayBtnGetRect();
rBtn.InflateRect(0, CAPTION_BUTTONSPACE);
return (rBtn.PtInRect(point));
}
TEMPLATE void CDialogMinTrayBtn<BASE>::MinTrayBtnSetUp()
{
m_bMinTrayBtnUp= TRUE;
MinTrayBtnDraw();
}
TEMPLATE void CDialogMinTrayBtn<BASE>::MinTrayBtnSetDown()
{
m_bMinTrayBtnUp= FALSE;
MinTrayBtnDraw();
}
TEMPLATE BOOL CDialogMinTrayBtn<BASE>::IsWindowsClassicStyle() const
{
return m_bMinTrayBtnWindowsClassicStyle;
}
TEMPLATE void CDialogMinTrayBtn<BASE>::SetWindowText(LPCTSTR lpszString)
{
BASE::SetWindowText(lpszString);
MinTrayBtnDraw();
}
TEMPLATE INT CDialogMinTrayBtn<BASE>::GetVisualStylesXPColor() const
{
if (IsWindowsClassicStyle())
return -1;
WCHAR szwThemeFile[MAX_PATH];
WCHAR szwThemeColor[256];
if (g_xpStyle.GetCurrentThemeName(szwThemeFile, MAX_PATH, szwThemeColor, 256, NULL, 0) != S_OK)
return -1;
WCHAR *p;
if ((p= wcsrchr(szwThemeFile, '\\')) == NULL)
return -1;
p++;
if (_wcsicmp(p, VISUALSTYLESXP_DEFAULTFILE) != 0)
return -1;
if (_wcsicmp(szwThemeColor, VISUALSTYLESXP_NAMEBLUE) == 0)
return VISUALSTYLESXP_BLUE;
if (_wcsicmp(szwThemeColor, VISUALSTYLESXP_NAMEMETALLIC) == 0)
return VISUALSTYLESXP_METALLIC;
if (_wcsicmp(szwThemeColor, VISUALSTYLESXP_NAMEHOMESTEAD) == 0)
return VISUALSTYLESXP_HOMESTEAD;
return -1;
}
TEMPLATE BOOL CDialogMinTrayBtn<BASE>::MinTrayBtnInitBitmap()
{
m_bMinTrayBtnWindowsClassicStyle = !(g_xpStyle.IsThemeActive() && g_xpStyle.IsAppThemed());
INT nColor;
m_bmMinTrayBtnBitmap.DeleteObject();
if ((nColor= GetVisualStylesXPColor()) == -1)
return FALSE;
return m_bmMinTrayBtnBitmap.LoadBitmap(m_pszMinTrayBtnBmpName[nColor]);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -