📄 rtwnd.cpp
字号:
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;
}
BOOL CRTWnd::OnRTSetIcon(HWND hWnd,UINT uMsg,WPARAM wParam,LPARAM lParam,LRESULT* pResult)
{
*pResult = DefWindowProc(hWnd,uMsg,wParam,lParam);
if(IsWindow(hWnd))
{
HDC hDC = GetWindowDC(hWnd);
if(hDC != NULL)
{
CDC *pDC = CDC::FromHandle(hDC);
RTDrawTitleBar(pDC,m_bActive,hWnd);
pDC->Detach();
ReleaseDC(hWnd,hDC);
}
}
return TRUE;
}
BOOL CRTWnd::OnRTNcMouseMove(HWND hWnd,UINT uMsg,WPARAM wParam,LPARAM lParam,LRESULT* pResult)
{
if(m_bUsedDefTitleBar)return FALSE;
*pResult = 0;
HDC hDC = GetWindowDC(hWnd);
if(hDC == NULL)return TRUE;
CDC* pDC = CDC::FromHandle(hDC);
switch(wParam)
{
case HTMAXBUTTON:
if(m_NcMouseState == MouseStateNormal)
{
if(m_MaximizeButtonState != StateFocus)
{
m_MaximizeButtonState = StateFocus;
m_MinimizeButtonState = StateNormal;
m_ExitButtonState = StateNormal;
RTDrawTitleBarButtons(pDC,hWnd);
}
}
else if(m_NcMouseState == MouseStateDown)
{
if(m_SelTitleButton == MaximizeButton)
{
if(m_MaximizeButtonState != StateDown)
{
m_MaximizeButtonState = StateDown;
RTDrawTitleBarButtons(pDC,hWnd);
}
}
else if(m_SelTitleButton != NoneButton)
{
m_MinimizeButtonState = StateNormal;
m_ExitButtonState = StateNormal;
RTDrawTitleBarButtons(pDC,hWnd);
}
}
break;
case HTMINBUTTON:
if(m_NcMouseState == MouseStateNormal)
{
if(m_MinimizeButtonState != StateFocus)
{
m_MinimizeButtonState = StateFocus;
m_MaximizeButtonState = StateNormal;
m_ExitButtonState = StateNormal;
RTDrawTitleBarButtons(pDC,hWnd);
}
}
else if(m_NcMouseState == MouseStateDown)
{
if(m_SelTitleButton == MinimizeButton)
{
if(m_MinimizeButtonState != StateDown)
{
m_MinimizeButtonState = StateDown;
RTDrawTitleBarButtons(pDC,hWnd);
}
}
else if(m_SelTitleButton != NoneButton)
{
m_MaximizeButtonState = StateNormal;
m_ExitButtonState = StateNormal;
RTDrawTitleBarButtons(pDC,hWnd);
}
}
break;
case HTCLOSE:
if(m_NcMouseState == MouseStateNormal)
{
if(m_ExitButtonState != StateFocus)
{
m_ExitButtonState = StateFocus;
m_MaximizeButtonState = StateNormal;
m_MinimizeButtonState = StateNormal;
RTDrawTitleBarButtons(pDC,hWnd);
}
}
else if(m_NcMouseState == MouseStateDown)
{
if(m_SelTitleButton == ExitButton)
{
if(m_ExitButtonState != StateDown)
{
m_ExitButtonState = StateDown;
RTDrawTitleBarButtons(pDC,hWnd);
}
}
else if(m_SelTitleButton != NoneButton)
{
m_MaximizeButtonState = StateNormal;
m_MinimizeButtonState = StateNormal;
RTDrawTitleBarButtons(pDC,hWnd);
}
}
break;
default:
if(m_ExitButtonState != StateNormal || m_MinimizeButtonState != StateNormal || m_MaximizeButtonState != StateNormal)
{
m_MaximizeButtonState = StateNormal;
m_MinimizeButtonState = StateNormal;
m_ExitButtonState = StateNormal;
RTDrawTitleBarButtons(pDC,hWnd);
}
break;
}
pDC->Detach();
ReleaseDC(hWnd,hDC);
return TRUE;
}
BOOL CRTWnd::OnRTNcLMouseDown(HWND hWnd,UINT uMsg,WPARAM wParam,LPARAM lParam,LRESULT* pResult)
{
if(m_bUsedDefTitleBar)return FALSE;
HDC hDC = GetWindowDC(hWnd);
if(hDC == NULL)return TRUE;
CDC *pDC = CDC::FromHandle(hDC);
switch(wParam)
{
case HTMAXBUTTON:
m_NcMouseState = MouseStateDown;
m_SelTitleButton = MaximizeButton;
m_MaximizeButtonState = StateDown;
RTDrawTitleBarButtons(pDC,hWnd);
SetCapture(hWnd);
break;
case HTMINBUTTON:
m_NcMouseState = MouseStateDown;
m_SelTitleButton = MinimizeButton;
m_MinimizeButtonState = StateDown;
RTDrawTitleBarButtons(pDC,hWnd);
SetCapture(hWnd);
break;
case HTCLOSE:
m_NcMouseState = MouseStateDown;
m_SelTitleButton = ExitButton;
m_ExitButtonState = StateDown;
RTDrawTitleBarButtons(pDC,hWnd);
SetCapture(hWnd);
break;
default:
pDC->Detach();
ReleaseDC(hWnd,hDC);
return FALSE;
break;
}
pDC->Detach();
ReleaseDC(hWnd,hDC);
return TRUE;
}
BOOL CRTWnd::OnRTNcLMouseUp(HWND hWnd,UINT uMsg,WPARAM wParam,LPARAM lParam,LRESULT* pResult)
{
if(m_bUsedDefTitleBar)return FALSE;
if(m_NcMouseState == MouseStateNormal)
{
return FALSE;
}
m_NcMouseState = MouseStateNormal;
ReleaseCapture();
pResult = 0;
HDC hDC = GetWindowDC(hWnd);
CDC* pDC = CDC::FromHandle(hDC);
if(wParam == HTMAXBUTTON)
{
if(m_SelTitleButton == MaximizeButton)
{
m_SelTitleButton = NoneButton;
m_MaximizeButtonState = StateNormal;
RTDrawTitleBarButtons(pDC,hWnd);
if(IsZoomed(hWnd))
{
SendMessage(hWnd,WM_SYSCOMMAND, SC_RESTORE, lParam);
}
else
{
SendMessage(hWnd,WM_SYSCOMMAND, SC_MAXIMIZE,lParam);
}
}
}
else if(wParam == HTMINBUTTON)
{
if(m_SelTitleButton == MinimizeButton)
{
m_SelTitleButton = NoneButton;
m_MinimizeButtonState = StateNormal;
RTDrawTitleBarButtons(pDC,hWnd);
SendMessage(hWnd,WM_SYSCOMMAND, SC_MINIMIZE,lParam);
}
}
else if(wParam == HTCLOSE)
{
if(m_SelTitleButton == ExitButton)
{
m_SelTitleButton = NoneButton;
m_ExitButtonState = StateNormal;
SendMessage(hWnd,WM_SYSCOMMAND,SC_CLOSE,lParam);
}
}
else
{
m_MinimizeButtonState = StateNormal;
m_MaximizeButtonState = StateNormal;
m_ExitButtonState = StateNormal;
pDC->Detach();
ReleaseDC(hWnd,hDC);
return FALSE;
}
pDC->Detach();
ReleaseDC(hWnd,hDC);
return TRUE;
}
BOOL CRTWnd::OnRTMouseMove(HWND hWnd,UINT uMsg,WPARAM wParam,LPARAM lParam,LRESULT* pResult)
{
if(m_bUsedDefTitleBar)return FALSE;
if(m_NcMouseState != MouseStateNormal)
{
CRect rtWnd;
GetWindowRect(hWnd,&rtWnd);
CPoint point(lParam);
ClientToScreen(hWnd,&point);
UINT hit = (UINT)DefWindowProc(hWnd,WM_NCHITTEST,wParam,MAKELPARAM(point.x,point.y));
return OnRTNcMouseMove(hWnd,WM_NCMOUSEMOVE,hit,MAKELPARAM(point.x,point.y),pResult);
}
return FALSE;
}
BOOL CRTWnd::OnRTLButtonUp(HWND hWnd,UINT uMsg,WPARAM wParam,LPARAM lParam,LRESULT* pResult)
{
if(m_bUsedDefTitleBar)return FALSE;
if(m_NcMouseState != MouseStateNormal)
{
CRect rtWnd;
GetWindowRect(hWnd,&rtWnd);
CPoint point(lParam);
ClientToScreen(hWnd,&point);
UINT hit = (UINT)DefWindowProc(hWnd,WM_NCHITTEST,wParam,MAKELPARAM(point.x,point.y));
return OnRTNcLMouseUp(hWnd,WM_NCLBUTTONUP,hit,MAKELPARAM(point.x,point.y),pResult);
}
return FALSE;
}
BOOL CRTWnd::RTDrawDefaultMenu(LPARAM lParam,HRGN hRgn,HWND hWnd)
{
HMENU hMenu = GetMenu(hWnd);
if(hMenu == NULL)return TRUE;
CRect rtMenu;
CRect rtWnd;
GetWindowRect(hWnd,&rtWnd);
rtMenu.left = GetSystemMetrics(SM_CXFRAME);
rtMenu.top = GetSystemMetrics(SM_CYSIZE) + GetSystemMetrics(SM_CXFRAME) + 1;
rtMenu.right = rtWnd.Width() - GetSystemMetrics(SM_CXFRAME);
rtMenu.bottom = rtMenu.top + GetSystemMetrics(SM_CYMENU);
UINT ItemCount = GetMenuItemCount(hMenu);
int PrevTop = rtMenu.top;
int PrevLeft = rtMenu.left;
int MenuItemHeight = GetSystemMetrics(SM_CYMENU);
CRect rtMenuItem;
for(UINT items = 0; items < ItemCount; items++)
{
GetMenuItemRect(hWnd,hMenu,items,&rtMenuItem);
HRGN rgn = CreateRectRgn(rtMenuItem.left,rtMenuItem.top,rtMenuItem.right,rtMenuItem.bottom);
if(hRgn != NULL)
{
if(NULLREGION != CombineRgn(rgn,rgn,hRgn,RGN_AND))
{
DefWindowProc(hWnd,WM_NCPAINT,(WPARAM)(rgn),lParam);
DeleteObject(rgn);
}
}
}
return TRUE;
}
BOOL CRTWnd::OnRTSetCursor(HWND hWnd,UINT uMsg,WPARAM wParam,LPARAM lParam,LRESULT* pResult)
{
if(m_bUsedDefTitleBar)return FALSE;
*pResult = DefWindowProc(hWnd,uMsg,wParam,lParam);
UINT uHitTest = LOWORD(lParam);
HDC hDC = GetWindowDC(hWnd);
CDC *pDC = CDC::FromHandle(hDC);
switch(uHitTest)
{
case HTBORDER:
case HTLEFT:
case HTRIGHT:
case HTTOP:
case HTBOTTOM:
case HTBOTTOMLEFT:
case HTBOTTOMRIGHT:
case HTTOPLEFT:
case HTTOPRIGHT:
RTDrawTitleBar(pDC,m_bActive,hWnd);
break;
default:
break;
}
pDC->Detach();
ReleaseDC(hWnd,hDC);
return TRUE;
}
BOOL CRTWnd::OnRTSysCommand(HWND hWnd,UINT uMsg,WPARAM wParam,LPARAM lParam,LRESULT* pResult)
{
if(m_bUsedDefTitleBar)return FALSE;
HDC hDC = GetWindowDC(hWnd);
if(hDC != NULL)
{
CDC *pDC = CDC::FromHandle(hDC);
RTDrawTitleBar(pDC,m_bActive,hWnd);
pDC->Detach();
ReleaseDC(hWnd,hDC);
}
return FALSE;
}
BOOL CRTWnd::OnRTNcHitTest(HWND hWnd,UINT uMsg,WPARAM wParam,LPARAM lParam,LRESULT* pResult)
{
return FALSE;
}
BOOL CRTWnd::OnRTInitMenuPop(HWND hWnd,UINT uMsg,WPARAM wParam,LPARAM lParam,LRESULT* pResult)
{
if(m_bUsedDefTitleBar)return FALSE;
HDC hDC = GetWindowDC(hWnd);
if(hDC != NULL)
{
CDC *pDC = CDC::FromHandle(hDC);
RTDrawTitleBar(pDC,m_bActive,hWnd);
pDC->Detach();
ReleaseDC(hWnd,hDC);
}
return FALSE;
}
BOOL CRTWnd::RTWindowProc(HWND hWnd,UINT uMsg,WPARAM wParam,LPARAM lParam,LRESULT* pResult)
{
BOOL bPass = FALSE;
if(!m_bUseRTStyle)return bPass;
switch(uMsg)
{
case WM_NCPAINT:
bPass = OnRTNcPaint(hWnd,uMsg,wParam,lParam,pResult);
break;
case WM_NCMOUSEMOVE:
bPass = OnRTNcMouseMove(hWnd,uMsg,wParam,lParam,pResult);
break;
case WM_NCLBUTTONDOWN:
bPass = OnRTNcLMouseDown(hWnd,uMsg,wParam,lParam,pResult);
break;
case WM_NCLBUTTONUP:
bPass = OnRTNcLMouseUp(hWnd,uMsg,wParam,lParam,pResult);
break;
case WM_NCACTIVATE:
bPass = OnRTNcActive(hWnd,uMsg,wParam,lParam,pResult);
break;
case WM_ACTIVATE:
bPass = OnRTActive(hWnd,uMsg,wParam,lParam,pResult);
break;
case WM_ACTIVATEAPP:
bPass = OnRTActiveApp(hWnd,uMsg,wParam,lParam,pResult);
break;
case WM_SYSCOMMAND:
bPass = OnRTSysCommand(hWnd,uMsg,wParam,lParam,pResult);
break;
case WM_INITMENUPOPUP:
bPass = OnRTInitMenuPop(hWnd,uMsg,wParam,lParam,pResult);
break;
case WM_NCHITTEST:
bPass = OnRTNcHitTest(hWnd,uMsg,wParam,lParam,pResult);
break;
case WM_SETCURSOR:
bPass = OnRTSetCursor(hWnd,uMsg,wParam,lParam,pResult);
break;
default:
break;
}
return bPass;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -