📄 rtdialog.cpp
字号:
for(int i = 0; i < 5; i ++)
{
m_RestoreButtonBitmap[i] = RestoreButtonBitmap[i];
m_RestoreButtonBitmapDrawMode[i] = DrawMode[i];
}
return TRUE;
}
BOOL CRTDialog::SetExitButtonBitmap(CBitmap* ExitButtonBitmap[],UINT DrawMode[])
{
for(int i = 0; i < 5; i ++)
{
m_ExitButtonBitmap[i] = ExitButtonBitmap[i];
m_ExitButtonBitmapDrawMode[i] = DrawMode[i];
}
return TRUE;
}
BOOL CRTDialog::RTDrawTitleBarButtons(CDC* pDC)
{
//取得标题栏的位置
CRect rtWnd;
CRect rtTitle;
GetWindowRect(&rtWnd);
rtTitle.left = GetSystemMetrics(SM_CXDLGFRAME);
rtTitle.top = GetSystemMetrics(SM_CYDLGFRAME);
rtTitle.right = rtWnd.right - rtWnd.left - GetSystemMetrics(SM_CXDLGFRAME);
rtTitle.bottom = rtTitle.top + GetSystemMetrics(SM_CYCAPTION);
CRect rtButtons;
//画标题栏按扭
DWORD dwStyle = GetStyle();
CBitmap* pCloseBox = NULL;
CBitmap* pMaximizeBox = NULL;
CBitmap* pMinimizeBox = NULL;
if(TRUE)
{
if(m_ExitButtonState == StateNormal)
{
pCloseBox = m_ExitButtonBitmap[BMP_NORMAL];
}
else if(m_ExitButtonState == StateDown)
{
pCloseBox = m_ExitButtonBitmap[BMP_DOWN];
}
else if(m_ExitButtonState == StateFocus)
{
pCloseBox = m_ExitButtonBitmap[BMP_FOCUS];
}
}
if(WS_MAXIMIZEBOX & dwStyle)
{
if(IsZoomed())
{
if(m_MaximizeButtonState == StateNormal)
{
pMaximizeBox = m_RestoreButtonBitmap[BMP_NORMAL];
}
else if(m_MaximizeButtonState == StateDown)
{
pMaximizeBox = m_RestoreButtonBitmap[BMP_DOWN];
}
else if(m_MaximizeButtonState == StateFocus)
{
pMaximizeBox = m_RestoreButtonBitmap[BMP_FOCUS];
}
}
else
{
if(m_MaximizeButtonState == StateNormal)
{
pMaximizeBox = m_MaximizeButtonBitmap[BMP_NORMAL];
}
else if(m_MaximizeButtonState == StateDown)
{
pMaximizeBox = m_MaximizeButtonBitmap[BMP_DOWN];
}
else if(m_MaximizeButtonState == StateFocus)
{
pMaximizeBox = m_MaximizeButtonBitmap[BMP_FOCUS];
}
}
}
else if(WS_MINIMIZEBOX & dwStyle)
{
if(IsZoomed())
{
pMaximizeBox = m_RestoreButtonBitmap[BMP_DISABLE];
}
else
{
pMaximizeBox = m_MaximizeButtonBitmap[BMP_DISABLE];
}
}
if(WS_MINIMIZEBOX & dwStyle)
{
if(m_MinimizeButtonState == StateNormal)
{
pMinimizeBox = m_MinimizeButtonBitmap[BMP_NORMAL];
}
else if(m_MinimizeButtonState == StateDown)
{
pMinimizeBox = m_MinimizeButtonBitmap[BMP_DOWN];
}
else if(m_MinimizeButtonState == StateFocus)
{
pMinimizeBox = m_MinimizeButtonBitmap[BMP_FOCUS];
}
}
else if(WS_MAXIMIZEBOX & dwStyle)
{
pMinimizeBox = m_MinimizeButtonBitmap[BMP_DISABLE];
}
//重画关闭button
if(dwStyle & WS_SYSMENU)
{
rtButtons.left = rtTitle.right - rtTitle.Height();
rtButtons.top = rtTitle.top + 2;
rtButtons.right = rtTitle.right - 2;
rtButtons.bottom = rtTitle.bottom - 2;
CRTDraw::RTDrawBitmap(pDC,&rtButtons,pCloseBox,CRTDraw::DrawModeAllStretch);
}
//重画最大化/恢复button
if(dwStyle & WS_MAXIMIZEBOX || dwStyle & WS_MINIMIZEBOX)
{
rtButtons.right = rtButtons.left - 2;
rtButtons.left = rtButtons.left - rtTitle.Height();
CRTDraw::RTDrawBitmap(pDC,&rtButtons,pMaximizeBox,CRTDraw::DrawModeAllStretch);
}
//重画最小化button
if(dwStyle & WS_MAXIMIZEBOX || dwStyle & WS_MINIMIZEBOX)
{
rtButtons.right = rtButtons.left;
rtButtons.left = rtButtons.left - rtTitle.Height() + 2;
CRTDraw::RTDrawBitmap(pDC,&rtButtons,pMinimizeBox,CRTDraw::DrawModeAllStretch);
}
return TRUE;
}
LRESULT CRTDialog::OnRTNcRButtonUp(WPARAM wParam,LPARAM lParam)
{
if(!m_bEnableSkin)return CDialog::WindowProc(WM_NCRBUTTONUP,wParam,lParam);
if(!m_bEnableTitleBar)return CDialog::WindowProc(WM_NCRBUTTONUP,wParam,lParam);
CWindowDC dc(this);
RTDrawTitleBar(&dc,m_bActive);
return CDialog::WindowProc(WM_NCRBUTTONUP,wParam,lParam);
}
LRESULT CRTDialog::OnRTSetIcon(WPARAM wParam, LPARAM lParam)
{
LRESULT result = CDialog::WindowProc(WM_SETICON,wParam,lParam);
if(!m_bEnableSkin)return result;
if(!m_bEnableTitleBar)return result;
if(IsWindow(m_hWnd))
{
CWindowDC dc(this);
RTDrawTitleBar(&dc,m_bActive);
}
return result;
}
LRESULT CRTDialog::OnRTNcMouseMove(WPARAM wParam,LPARAM lParam)
{
if(!m_bEnableSkin)return CDialog::WindowProc(WM_NCMOUSEMOVE,wParam,lParam);
if(!m_bEnableTitleBar)return CDialog::WindowProc(WM_NCMOUSEMOVE,wParam,lParam);
LRESULT result = 0;
CWindowDC dc(this);
switch(wParam)
{
case HTMAXBUTTON:
if(m_NcMouseState == MouseStateNormal)
{
if(m_MaximizeButtonState != StateFocus)
{
m_MaximizeButtonState = StateFocus;
m_MinimizeButtonState = StateNormal;
m_ExitButtonState = StateNormal;
RTDrawTitleBarButtons(&dc);
}
}
else if(m_NcMouseState == MouseStateDown)
{
if(m_SelTitleButton == MaximizeButton)
{
if(m_MaximizeButtonState != StateDown)
{
m_MaximizeButtonState = StateDown;
RTDrawTitleBarButtons(&dc);
}
}
else if(m_SelTitleButton != NoneButton)
{
m_MinimizeButtonState = StateNormal;
m_ExitButtonState = StateNormal;
RTDrawTitleBarButtons(&dc);
}
}
break;
case HTMINBUTTON:
if(m_NcMouseState == MouseStateNormal)
{
if(m_MinimizeButtonState != StateFocus)
{
m_MinimizeButtonState = StateFocus;
m_MaximizeButtonState = StateNormal;
m_ExitButtonState = StateNormal;
RTDrawTitleBarButtons(&dc);
}
}
else if(m_NcMouseState == MouseStateDown)
{
if(m_SelTitleButton == MinimizeButton)
{
if(m_MinimizeButtonState != StateDown)
{
m_MinimizeButtonState = StateDown;
RTDrawTitleBarButtons(&dc);
}
}
else if(m_SelTitleButton != NoneButton)
{
m_MaximizeButtonState = StateNormal;
m_ExitButtonState = StateNormal;
RTDrawTitleBarButtons(&dc);
}
}
break;
case HTCLOSE:
if(m_NcMouseState == MouseStateNormal)
{
if(m_ExitButtonState != StateFocus)
{
m_ExitButtonState = StateFocus;
m_MaximizeButtonState = StateNormal;
m_MinimizeButtonState = StateNormal;
RTDrawTitleBarButtons(&dc);
}
}
else if(m_NcMouseState == MouseStateDown)
{
if(m_SelTitleButton == ExitButton)
{
if(m_ExitButtonState != StateDown)
{
m_ExitButtonState = StateDown;
RTDrawTitleBarButtons(&dc);
}
}
else if(m_SelTitleButton != NoneButton)
{
m_MaximizeButtonState = StateNormal;
m_MinimizeButtonState = StateNormal;
RTDrawTitleBarButtons(&dc);
}
}
break;
default:
if(m_ExitButtonState != StateNormal || m_MinimizeButtonState != StateNormal || m_MaximizeButtonState != StateNormal)
{
m_MaximizeButtonState = StateNormal;
m_MinimizeButtonState = StateNormal;
m_ExitButtonState = StateNormal;
RTDrawTitleBarButtons(&dc);
}
result = 0;//DefWindowProc(WM_NCMOUSEMOVE,wParam,lParam);
break;
}
return result;
}
LRESULT CRTDialog::OnRTNcLMouseDown(WPARAM wParam,LPARAM lParam)
{
if(!m_bEnableSkin)return CDialog::WindowProc(WM_NCLBUTTONDOWN,wParam,lParam);
if(!m_bEnableTitleBar)return CDialog::WindowProc(WM_NCLBUTTONDOWN,wParam,lParam);
LRESULT result = 0;
CWindowDC dc(this);
switch(wParam)
{
case HTMAXBUTTON:
m_NcMouseState = MouseStateDown;
m_SelTitleButton = MaximizeButton;
m_MaximizeButtonState = StateDown;
RTDrawTitleBarButtons(&dc);
SetCapture();
break;
case HTMINBUTTON:
m_NcMouseState = MouseStateDown;
m_SelTitleButton = MinimizeButton;
m_MinimizeButtonState = StateDown;
RTDrawTitleBarButtons(&dc);
SetCapture();
break;
case HTCLOSE:
m_NcMouseState = MouseStateDown;
m_SelTitleButton = ExitButton;
m_ExitButtonState = StateDown;
RTDrawTitleBarButtons(&dc);
SetCapture();
break;
default:
result = CDialog::WindowProc(WM_NCLBUTTONDOWN,wParam,lParam);
break;
}
RTDrawTitleBar(&dc,m_bActive);
return result;
}
LRESULT CRTDialog::OnRTNcLMouseUp(WPARAM wParam,LPARAM lParam)
{
if(!m_bEnableSkin)return CDialog::WindowProc(WM_NCLBUTTONUP,wParam,lParam);
if(!m_bEnableTitleBar)return CDialog::WindowProc(WM_NCLBUTTONUP,wParam,lParam);
LRESULT result = 0;
if(m_NcMouseState == MouseStateNormal)
{
return CDialog::WindowProc(WM_NCLBUTTONUP,wParam,lParam);
}
m_NcMouseState = MouseStateNormal;
ReleaseCapture();
if(wParam == HTMAXBUTTON)
{
if(m_SelTitleButton == MaximizeButton)
{
CWindowDC dc(this);
m_SelTitleButton = NoneButton;
m_MaximizeButtonState = StateNormal;
RTDrawTitleBarButtons(&dc);
if(IsZoomed())
{
SendMessage(WM_SYSCOMMAND, SC_RESTORE, lParam);
}
else
{
SendMessage(WM_SYSCOMMAND, SC_MAXIMIZE,lParam);
}
}
}
else if(wParam == HTMINBUTTON)
{
if(m_SelTitleButton == MinimizeButton)
{
CWindowDC dc(this);
m_SelTitleButton = NoneButton;
m_MinimizeButtonState = StateNormal;
RTDrawTitleBarButtons(&dc);
SendMessage(WM_SYSCOMMAND, SC_MINIMIZE,lParam);
}
}
else if(wParam == HTCLOSE)
{
if(m_SelTitleButton == ExitButton)
{
CWindowDC dc(this);
m_SelTitleButton = NoneButton;
m_ExitButtonState = StateNormal;
RTDrawTitleBarButtons(&dc);
SendMessage(WM_CLOSE);
}
}
else
{
m_MinimizeButtonState = StateNormal;
m_MaximizeButtonState = StateNormal;
m_ExitButtonState = StateNormal;
result = CDialog::WindowProc(WM_NCLBUTTONUP,wParam,lParam);
}
return result;
}
LRESULT CRTDialog::OnRTMouseMove(WPARAM wParam, LPARAM lParam)
{
if(!m_bEnableSkin)return CDialog::WindowProc(WM_MOUSEMOVE,wParam,lParam);
if(!m_bEnableTitleBar)return CDialog::WindowProc(WM_MOUSEMOVE,wParam,lParam);
if(m_NcMouseState != MouseStateNormal)
{
CRect rtWnd;
GetWindowRect(&rtWnd);
CPoint point(lParam);
ClientToScreen(&point);
UINT hit = (UINT)CDialog::WindowProc(WM_NCHITTEST,wParam,MAKELPARAM(point.x,point.y));
return OnRTNcMouseMove(hit,MAKELPARAM(point.x,point.y));
}
else
{
if(m_ExitButtonState != StateNormal || m_MinimizeButtonState != StateNormal || m_MaximizeButtonState != StateNormal)
{
CWindowDC dc(this);
m_MaximizeButtonState = StateNormal;
m_MinimizeButtonState = StateNormal;
m_ExitButtonState = StateNormal;
RTDrawTitleBarButtons(&dc);
}
}
return CDialog::WindowProc(WM_MOUSEMOVE,wParam,lParam);
}
LRESULT CRTDialog::OnRTLButtonUp(WPARAM wParam, LPARAM lParam)
{
if(!m_bEnableSkin)return CDialog::WindowProc(WM_LBUTTONUP,wParam,lParam);
if(!m_bEnableTitleBar)return CDialog::WindowProc(WM_LBUTTONUP,wParam,lParam);
if(m_NcMouseState != MouseStateNormal)
{
CRect rtWnd;
GetWindowRect(&rtWnd);
CPoint point(lParam);
ClientToScreen(&point);
UINT hit = (UINT)CDialog::WindowProc(WM_NCHITTEST,wParam,MAKELPARAM(point.x,point.y));
return OnRTNcLMouseUp(hit,MAKELPARAM(point.x,point.y));
}
return CDialog::WindowProc(WM_LBUTTONUP,wParam,lParam);
}
LRESULT CRTDialog::OnRTEraseBackGround(WPARAM wParam,LPARAM lParam)
{
if(!m_bEnableSkin || m_TitleBarBitmap[BMP_BACK] == NULL || !m_bEnableBack)
return CDialog::WindowProc(WM_ERASEBKGND,wParam,lParam);
CDC *pDC = CDC::FromHandle((HDC)wParam);
CRect rtClient;
GetClientRect(&rtClient);
CRTDraw::RTDrawBitmap(pDC,&rtClient,m_TitleBarBitmap[BMP_BACK],m_TitleBarBitmapDrawMode[BMP_BACK]);
return TRUE;
}
LRESULT CRTDialog::OnRTNcRButtonDown(WPARAM wParam,LPARAM lParam)
{
if(!m_bEnableSkin)return CDialog::WindowProc(WM_NCRBUTTONDOWN,wParam,lParam);
if(!m_bEnableTitleBar)return CDialog::WindowProc(WM_NCRBUTTONDOWN,wParam,lParam);
return 0;
}
LRESULT CRTDialog::OnRTSysCommand(WPARAM wParam,LPARAM lParam)
{
if(!m_bEnableSkin)return CDialog::WindowProc(WM_SYSCOMMAND,wParam,lParam);
if(!m_bEnableTitleBar)return CDialog::WindowProc(WM_SYSCOMMAND,wParam,lParam);
CWindowDC dc(this);
RTDrawTitleBar(&dc,m_bActive);
return CDialog::WindowProc(WM_SYSCOMMAND,wParam,lParam);
}
LRESULT CRTDialog::OnRTSetCursor(WPARAM wParam,LPARAM lParam)
{
LRESULT rt = CDialog::WindowProc(WM_SETCURSOR,wParam,lParam);
if(!m_bEnableSkin)return rt;
if(!m_bEnableTitleBar)return rt;
UINT nHitTest = LOWORD(lParam);
if(m_bEnableSkin)
{
CWindowDC dc(this);
switch(nHitTest)
{
case HTBORDER:
case HTLEFT:
case HTRIGHT:
case HTTOP:
case HTBOTTOM:
case HTBOTTOMLEFT:
case HTBOTTOMRIGHT:
case HTTOPLEFT:
case HTTOPRIGHT:
RTDrawTitleBar(&dc,m_bActive);
break;
default:
break;
}
}
return rt;
}
LRESULT CRTDialog::WindowProc(UINT message, WPARAM wParam, LPARAM lParam)
{
switch(message)
{
case WM_INITMENUPOPUP:
if(m_bEnableSkin && m_bEnableTitleBar)
{
CWindowDC dc(this);
RTDrawTitleBar(&dc,m_bActive);
}
break;
case WM_NCPAINT:
return OnRTNcPaint(wParam,lParam);
case WM_NCACTIVATE:
return OnRTNcActive(wParam,lParam);
case WM_ACTIVATE:
return OnRTActive(wParam,lParam);
case WM_ACTIVATEAPP:
return OnRTActiveApp(wParam,lParam);
case WM_NOTIFY:
return OnRTNodify(wParam,lParam);
case WM_SETTEXT:
return OnRTSetText(wParam,lParam);
case WM_SETICON:
return OnRTSetIcon(wParam,lParam);
case WM_NCMOUSEMOVE:
return OnRTNcMouseMove(wParam,lParam);
case WM_NCLBUTTONDOWN:
return OnRTNcLMouseDown(wParam,lParam);
case WM_NCLBUTTONUP:
OnRTNcLMouseUp(wParam,lParam);
case WM_LBUTTONUP:
return OnRTLButtonUp(wParam,lParam);
case WM_MOUSEMOVE:
return OnRTMouseMove(wParam,lParam);
case WM_ERASEBKGND:
return OnRTEraseBackGround(wParam,lParam);
case WM_NCRBUTTONUP:
return OnRTNcRButtonUp(wParam,lParam);
case WM_NCRBUTTONDOWN:
return OnRTNcRButtonDown(wParam,lParam);
case WM_SYSCOMMAND:
return OnRTSysCommand(wParam,lParam);
case WM_SETCURSOR:
return OnRTSetCursor(wParam,lParam);
default:
break;
}
return CDialog::WindowProc(message, wParam, lParam);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -