rtframewnd.cpp
来自「vc++编写的界面源代码,对C++爱好者是很发的帮助。」· C++ 代码 · 共 1,069 行 · 第 1/2 页
CPP
1,069 行
}
BOOL CRTFrameWnd::SetRestoreButtonBitmap(CBitmap* RestoreButtonBitmap[],UINT DrawMode[])
{
for(int i = 0; i < 5; i ++)
{
m_RestoreButtonBitmap[i] = RestoreButtonBitmap[i];
m_RestoreButtonBitmapDrawMode[i] = DrawMode[i];
}
return TRUE;
}
BOOL CRTFrameWnd::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 CRTFrameWnd::RTDrawTitleBarButtons(CDC* pDC)
{
//取得标题栏的位置
CRect rtWnd;
CRect rtTitle;
GetWindowRect(&rtWnd);
rtTitle.left = GetSystemMetrics(SM_CXFRAME);
rtTitle.top = GetSystemMetrics(SM_CYFRAME);
rtTitle.right = rtWnd.right - rtWnd.left - GetSystemMetrics(SM_CXFRAME);
rtTitle.bottom = rtTitle.top + GetSystemMetrics(SM_CYSIZE);
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 CRTFrameWnd::OnRTSetIcon(WPARAM wParam, LPARAM lParam)
{
LRESULT result = CFrameWnd::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 CRTFrameWnd::OnRTNcMouseMove(WPARAM wParam,LPARAM lParam)
{
if(!m_bEnableSkin)return CFrameWnd::WindowProc(WM_NCMOUSEMOVE,wParam,lParam);
if(!m_bEnableTitleBar)return CFrameWnd::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;//CFrameWnd::WindowProc(WM_NCMOUSEMOVE,wParam,lParam);
break;
}
return result;
}
LRESULT CRTFrameWnd::OnRTNcLMouseDown(WPARAM wParam,LPARAM lParam)
{
if(!m_bEnableSkin)return CFrameWnd::WindowProc(WM_NCLBUTTONDOWN,wParam,lParam);
if(!m_bEnableTitleBar)return CFrameWnd::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 = CFrameWnd::WindowProc(WM_NCLBUTTONDOWN,wParam,lParam);
break;
}
RTDrawTitleBar(&dc,m_bActive);
return result;
}
LRESULT CRTFrameWnd::OnRTNcLMouseUp(WPARAM wParam,LPARAM lParam)
{
if(!m_bEnableSkin)return CFrameWnd::WindowProc(WM_NCLBUTTONUP,wParam,lParam);
if(!m_bEnableSkin)return CFrameWnd::WindowProc(WM_NCLBUTTONUP,wParam,lParam);
LRESULT result = 0;
if(m_NcMouseState == MouseStateNormal)
{
return CFrameWnd::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_SYSCOMMAND,SC_CLOSE,lParam);
}
}
else
{
m_MinimizeButtonState = StateNormal;
m_MaximizeButtonState = StateNormal;
m_ExitButtonState = StateNormal;
result = CFrameWnd::WindowProc(WM_NCLBUTTONUP,wParam,lParam);
}
return result;
}
LRESULT CRTFrameWnd::OnRTMouseMove(WPARAM wParam, LPARAM lParam)
{
if(!m_bEnableSkin)return CFrameWnd::WindowProc(WM_MOUSEMOVE,wParam,lParam);
if(!m_bEnableTitleBar)return CFrameWnd::WindowProc(WM_MOUSEMOVE,wParam,lParam);
if(m_NcMouseState != MouseStateNormal)
{
CRect rtWnd;
GetWindowRect(&rtWnd);
CPoint point(lParam);
ClientToScreen(&point);
UINT hit = (UINT)CFrameWnd::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 CFrameWnd::WindowProc(WM_MOUSEMOVE,wParam,lParam);
}
LRESULT CRTFrameWnd::OnRTLButtonUp(WPARAM wParam, LPARAM lParam)
{
if(!m_bEnableSkin)return CFrameWnd::WindowProc(WM_LBUTTONUP,wParam,lParam);
if(!m_bEnableTitleBar)return CFrameWnd::WindowProc(WM_LBUTTONUP,wParam,lParam);
if(m_NcMouseState != MouseStateNormal)
{
CRect rtWnd;
GetWindowRect(&rtWnd);
CPoint point(lParam);
ClientToScreen(&point);
UINT hit = (UINT)CFrameWnd::WindowProc(WM_NCHITTEST,wParam,MAKELPARAM(point.x,point.y));
return OnRTNcLMouseUp(hit,MAKELPARAM(point.x,point.y));
}
return CFrameWnd::WindowProc(WM_LBUTTONUP,wParam,lParam);
}
BOOL CRTFrameWnd::LoadFrame (UINT nIDResource, DWORD dwDefaultStyle, CWnd* pParentWnd, CCreateContext* pContext)
{
if ( !CFrameWnd::LoadFrame (nIDResource, dwDefaultStyle, pParentWnd, pContext) )
{
return false;
}
return true;
}
LRESULT CRTFrameWnd::OnRTSysCommand(WPARAM wParam,LPARAM lParam)
{
if(!m_bEnableSkin)return CFrameWnd::WindowProc(WM_SYSCOMMAND,wParam,lParam);
if(!m_bEnableTitleBar)return CFrameWnd::WindowProc(WM_SYSCOMMAND,wParam,lParam);
if(wParam != SC_CLOSE)
{
CWindowDC dc(this);
RTDrawTitleBar(&dc,m_bActive);
}
return CFrameWnd::WindowProc(WM_SYSCOMMAND,wParam,lParam);
}
LRESULT CRTFrameWnd::OnRTSetCursor(WPARAM wParam,LPARAM lParam)
{
LRESULT rt = CFrameWnd::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 CRTFrameWnd::OnRTNcHitTest(WPARAM wParam, LPARAM lParam)
{
LRESULT lrst = CFrameWnd::WindowProc(WM_NCHITTEST,wParam,lParam);
return lrst;
}
LRESULT CRTFrameWnd::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_SYSCOMMAND:
return OnRTSysCommand(wParam,lParam);
case WM_SETCURSOR:
return OnRTSetCursor(wParam,lParam);
default:
break;
}
return CFrameWnd::WindowProc(message, wParam, lParam);
}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?