📄 dialogmintraybtn.cpp
字号:
// ------------------------------------------------------------
// CDialogMinTrayBtn template class
// MFC CDialog with minimize to systemtray button (0.04)
// Supports WinXP styles (thanks to David Yuheng Zhao for CVisualStylesXP - yuheng_zhao@yahoo.com)
// ------------------------------------------------------------
// DialogMinTrayBtn.hpp
// zegzav - 2002,2003 - eMule project (http://www.emule-project.net)
// ------------------------------------------------------------
#include "stdafx.h"
#include "DialogMinTrayBtn.h"
#include "VisualStylesXP.h"
#include "ResizableLib\ResizableDialog.h"
#include "AfxBeginMsgMapTemplate.h"
#include "OtherFunctions.h"
#if 0
// define this to use that source file as template
#define TEMPLATE template <class BASE>
#else
// define this to instantiate functions for class 'BASE' right in this CPP module
#define TEMPLATE
#define BASE CResizableDialog
#endif
// ------------------------------
// constants
// ------------------------------
#define CAPTION_BUTTONSPACE (2)
#define CAPTION_MINHEIGHT (8)
#define TIMERMINTRAYBTN_ID 0x76617a67
#define TIMERMINTRAYBTN_PERIOD 200 // ms
#define WP_TRAYBUTTON WP_MINBUTTON
BEGIN_TM_PART_STATES(TRAYBUTTON)
TM_STATE(1, TRAYBS, NORMAL)
TM_STATE(2, TRAYBS, HOT)
TM_STATE(3, TRAYBS, PUSHED)
TM_STATE(4, TRAYBS, DISABLED)
// Inactive
TM_STATE(5, TRAYBS, INORMAL)
TM_STATE(6, TRAYBS, IHOT)
TM_STATE(7, TRAYBS, IPUSHED)
TM_STATE(8, TRAYBS, IDISABLED)
END_TM_PART_STATES()
#define BMP_TRAYBTN_WIDTH (21)
#define BMP_TRAYBTN_HEIGHT (21)
#define BMP_TRAYBTN_BLUE _T("TRAYBUTTON_LUNA_BLUE_BMP")
#define BMP_TRAYBTN_METALLIC _T("TRAYBUTTON_LUNA_METALLIC_BMP")
#define BMP_TRAYBTN_HOMESTEAD _T("TRAYBUTTON_LUNA_HOMESTEAD_BMP")
#define BMP_TRAYBTN_TRANSCOLOR (RGB(255,0,255))
TEMPLATE const TCHAR *CDialogMinTrayBtn<BASE>::m_pszMinTrayBtnBmpName[] = { BMP_TRAYBTN_BLUE, BMP_TRAYBTN_METALLIC, BMP_TRAYBTN_HOMESTEAD };
#define VISUALSTYLESXP_DEFAULTFILE L"LUNA.MSSTYLES"
#define VISUALSTYLESXP_BLUE 0
#define VISUALSTYLESXP_METALLIC 1
#define VISUALSTYLESXP_HOMESTEAD 2
#define VISUALSTYLESXP_NAMEBLUE L"NORMALCOLOR"
#define VISUALSTYLESXP_NAMEMETALLIC L"METALLIC"
#define VISUALSTYLESXP_NAMEHOMESTEAD L"HOMESTEAD"
// _WIN32_WINNT >= 0x0501 (XP only)
#define _WM_THEMECHANGED 0x031A
#define _ON_WM_THEMECHANGED() \
{ _WM_THEMECHANGED, 0, 0, 0, AfxSig_l, \
(AFX_PMSG)(AFX_PMSGW) \
(static_cast< LRESULT (AFX_MSG_CALL CWnd::*)(void) > (_OnThemeChanged)) \
},
// ------------------------------
// contructor/init
// ------------------------------
TEMPLATE CDialogMinTrayBtn<BASE>::CDialogMinTrayBtn() :
m_MinTrayBtnPos(0,0), m_MinTrayBtnSize(0,0), m_bMinTrayBtnEnabled(TRUE), m_bMinTrayBtnVisible(TRUE),
m_bMinTrayBtnUp(TRUE), m_bMinTrayBtnCapture(FALSE), m_bMinTrayBtnActive(FALSE), m_bMinTrayBtnHitTest(FALSE)
{
MinTrayBtnInit();
}
TEMPLATE CDialogMinTrayBtn<BASE>::CDialogMinTrayBtn(LPCTSTR lpszTemplateName, CWnd* pParentWnd) : BASE(lpszTemplateName, pParentWnd),
m_MinTrayBtnPos(0,0), m_MinTrayBtnSize(0,0), m_bMinTrayBtnEnabled(TRUE), m_bMinTrayBtnVisible(TRUE),
m_bMinTrayBtnUp(TRUE), m_bMinTrayBtnCapture(FALSE), m_bMinTrayBtnActive(FALSE), m_bMinTrayBtnHitTest(FALSE)
{
MinTrayBtnInit();
}
TEMPLATE CDialogMinTrayBtn<BASE>::CDialogMinTrayBtn(UINT nIDTemplate, CWnd* pParentWnd) : BASE(nIDTemplate, pParentWnd),
m_MinTrayBtnPos(0,0), m_MinTrayBtnSize(0,0), m_bMinTrayBtnEnabled(TRUE), m_bMinTrayBtnVisible(TRUE),
m_bMinTrayBtnUp(TRUE), m_bMinTrayBtnCapture(FALSE), m_bMinTrayBtnActive(FALSE), m_bMinTrayBtnHitTest(FALSE)
{
MinTrayBtnInit();
}
TEMPLATE void CDialogMinTrayBtn<BASE>::MinTrayBtnInit()
{
m_nMinTrayBtnTimerId= 0;
BOOL bBmpResult = MinTrayBtnInitBitmap();
// - Never use the 'TransparentBlt' function under Win9x (read SDK)
// - Load the 'MSIMG32.DLL' only, if it's really needed.
if (!afxData.bWin95 && bBmpResult && !_TransparentBlt)
{
HMODULE hMsImg32= LoadLibrary(_T("MSIMG32.DLL"));
if (hMsImg32)
{
(FARPROC &)_TransparentBlt= GetProcAddress(hMsImg32, "TransparentBlt");
if (!_TransparentBlt)
FreeLibrary(hMsImg32);
}
}
}
BEGIN_MESSAGE_MAP_TEMPLATE(TEMPLATE, CDialogMinTrayBtn<BASE>, CDialogMinTrayBtn, BASE)
ON_WM_NCPAINT()
ON_WM_NCACTIVATE()
ON_WM_NCHITTEST()
ON_WM_NCLBUTTONDOWN()
ON_WM_NCRBUTTONDOWN()
ON_WM_LBUTTONUP()
ON_WM_MOUSEMOVE()
ON_WM_TIMER()
_ON_WM_THEMECHANGED()
END_MESSAGE_MAP()
// ------------------------------
// messages
// ------------------------------
TEMPLATE BOOL CDialogMinTrayBtn<BASE>::OnInitDialog()
{
BOOL bReturn= BASE::OnInitDialog();
InitWindowStyles(this);
m_nMinTrayBtnTimerId= SetTimer(TIMERMINTRAYBTN_ID, TIMERMINTRAYBTN_PERIOD, NULL);
return bReturn;
}
TEMPLATE void CDialogMinTrayBtn<BASE>::OnNcPaint()
{
BASE::OnNcPaint();
MinTrayBtnUpdatePosAndSize();
MinTrayBtnDraw();
}
TEMPLATE BOOL CDialogMinTrayBtn<BASE>::OnNcActivate(BOOL bActive)
{
MinTrayBtnUpdatePosAndSize();
BOOL bResult= BASE::OnNcActivate(bActive);
m_bMinTrayBtnActive= bActive;
MinTrayBtnDraw();
return bResult;
}
TEMPLATE UINT CDialogMinTrayBtn<BASE>::OnNcHitTest(CPoint point)
{
BOOL bPreviousHitTest= m_bMinTrayBtnHitTest;
m_bMinTrayBtnHitTest= MinTrayBtnHitTest(point);
if ((!IsWindowsClassicStyle()) && (m_bMinTrayBtnHitTest != bPreviousHitTest))
MinTrayBtnDraw(); // Windows XP Style (hot button)
if (m_bMinTrayBtnHitTest)
{
return HTMINTRAYBUTTON;
}
return BASE::OnNcHitTest(point);
}
TEMPLATE void CDialogMinTrayBtn<BASE>::OnNcLButtonDown(UINT nHitTest, CPoint point)
{
if ((GetStyle() & WS_DISABLED) || (!MinTrayBtnIsEnabled()) || (!MinTrayBtnIsVisible()) || (!MinTrayBtnHitTest(point)))
{
BASE::OnNcLButtonDown(nHitTest, point);
return;
}
SetCapture();
m_bMinTrayBtnCapture= TRUE;
MinTrayBtnSetDown();
}
TEMPLATE void CDialogMinTrayBtn<BASE>::OnNcRButtonDown(UINT nHitTest, CPoint point)
{
if ((GetStyle() & WS_DISABLED) || (!MinTrayBtnIsVisible()) || (!MinTrayBtnHitTest(point)))
BASE::OnNcRButtonDown(nHitTest, point);
}
TEMPLATE void CDialogMinTrayBtn<BASE>::OnMouseMove(UINT nFlags, CPoint point)
{
if ((GetStyle() & WS_DISABLED) || (!m_bMinTrayBtnCapture))
{
BASE::OnMouseMove(nFlags, point);
return;
}
ClientToScreen(&point);
m_bMinTrayBtnHitTest= MinTrayBtnHitTest(point);
if (m_bMinTrayBtnHitTest)
{
if (m_bMinTrayBtnUp)
MinTrayBtnSetDown();
}
else
{
if (!m_bMinTrayBtnUp)
MinTrayBtnSetUp();
}
}
TEMPLATE void CDialogMinTrayBtn<BASE>::OnLButtonUp(UINT nFlags, CPoint point)
{
if ((GetStyle() & WS_DISABLED) || (!m_bMinTrayBtnCapture))
{
BASE::OnLButtonUp(nFlags, point);
return;
}
ReleaseCapture();
m_bMinTrayBtnCapture= FALSE;
MinTrayBtnSetUp();
ClientToScreen(&point);
if (MinTrayBtnHitTest(point))
SendMessage(WM_SYSCOMMAND, SC_MINIMIZETRAY, MAKELONG(point.x, point.y));
}
TEMPLATE void CDialogMinTrayBtn<BASE>::OnTimer(UINT_PTR nIDEvent)
{
if ((!IsWindowsClassicStyle()) && (nIDEvent == m_nMinTrayBtnTimerId))
{
// Visual XP Style (hot button)
CPoint point;
GetCursorPos(&point);
BOOL bHitTest= MinTrayBtnHitTest(point);
if (m_bMinTrayBtnHitTest != bHitTest)
{
m_bMinTrayBtnHitTest= bHitTest;
MinTrayBtnDraw();
}
}
}
TEMPLATE LRESULT CDialogMinTrayBtn<BASE>::_OnThemeChanged()
{
// BASE::OnThemeChanged();
MinTrayBtnInitBitmap();
return 0;
}
// ------------------------------
// methods
// ------------------------------
TEMPLATE void CDialogMinTrayBtn<BASE>::MinTrayBtnUpdatePosAndSize()
{
DWORD dwStyle = GetStyle();
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -