📄 mainfrm.cpp
字号:
if (m_rtButtExit.PtInRect(point))
SendMessage(WM_CLOSE);
else if (m_rtButtMin.PtInRect(point))
SendMessage(WM_SYSCOMMAND, SC_MINIMIZE, MAKELPARAM(point.x, point.y));
else if (m_rtButtMax.PtInRect(point))
{
if (IsZoomed())
SendMessage(WM_SYSCOMMAND, SC_RESTORE, MAKELPARAM(point.x, point.y));
else
{
SendMessage(WM_SYSCOMMAND, SC_MAXIMIZE, MAKELPARAM(point.x, point.y));
Invalidate();
}
}
else
Default();
// CFrameWnd::OnNcLButtonDown(nHitTest, point);
}
void CMainFrame::OnNcMouseMove(UINT nHitTest, CPoint point)
{
// TODO: Add your message handler code here and/or call default
CWindowDC dc(this);
CWindowDC* pDC = &dc;
CDC* pDisplayMemDC=new CDC;
pDisplayMemDC->CreateCompatibleDC(pDC);
CBitmap* pBitmap = new CBitmap;
CBitmap* pOldBitmap;
CRect rtWnd, rtButton;
if (pDC)
{
GetWindowRect(&rtWnd);
//关闭button
if (m_rtButtExit.PtInRect(point))
pBitmap->LoadBitmap(IDB_EXIT_FOCUS);
else
pBitmap->LoadBitmap(IDB_EXIT_NORMAL);
rtButton = m_rtButtExit;
rtButton.OffsetRect(-rtWnd.left, -rtWnd.top);
pOldBitmap=(CBitmap*)pDisplayMemDC->SelectObject(pBitmap);
pDC->BitBlt(rtButton.left, rtButton.top, rtButton.Width(), rtButton.Height(), pDisplayMemDC, 0, 0, SRCCOPY);
pDisplayMemDC->SelectObject(pOldBitmap);
pBitmap->DeleteObject();
//最大化/恢复button
if (m_rtButtMax.PtInRect(point))
{
if (IsZoomed())
pBitmap->LoadBitmap(IDB_RESTORE_FOCUS);
else
pBitmap->LoadBitmap(IDB_MAX_FOCUS);
}
else
{
if (IsZoomed())
pBitmap->LoadBitmap(IDB_RESTORE_NORMAL);
else
pBitmap->LoadBitmap(IDB_MAX_NORMAL);
}
rtButton = m_rtButtMax;
rtButton.OffsetRect(-rtWnd.left, -rtWnd.top);
pOldBitmap=(CBitmap*)pDisplayMemDC->SelectObject(pBitmap);
pDC->BitBlt(rtButton.left, rtButton.top, rtButton.Width(), rtButton.Height(), pDisplayMemDC, 0, 0, SRCCOPY);
pDisplayMemDC->SelectObject(pOldBitmap);
pBitmap->DeleteObject();
//最小化button
if (m_rtButtMin.PtInRect(point))
pBitmap->LoadBitmap(IDB_MIN_FOCUS);
else
pBitmap->LoadBitmap(IDB_MIN_NORMAL);
rtButton = m_rtButtMin;
rtButton.OffsetRect(-rtWnd.left, -rtWnd.top);
pOldBitmap=(CBitmap*)pDisplayMemDC->SelectObject(pBitmap);
pDC->BitBlt(rtButton.left, rtButton.top, rtButton.Width(), rtButton.Height(), pDisplayMemDC, 0, 0, SRCCOPY);
pDisplayMemDC->SelectObject(pOldBitmap);
pBitmap->DeleteObject();
}
pDisplayMemDC->DeleteDC();
delete pDisplayMemDC;
delete pBitmap;
CFrameWnd::OnNcMouseMove(nHitTest, point);
}
void CMainFrame::OnActivate(UINT nState, CWnd* pWndOther, BOOL bMinimized)
{
CFrameWnd::OnActivate(nState, pWndOther, bMinimized);
// TODO: Add your message handler code here
}
LRESULT CMainFrame::DefWindowProc(UINT message, WPARAM wParam, LPARAM lParam)
{
// TODO: Add your specialized code here and/or call the base class
//LRESULT lrst=CFrameWnd::DefWindowProc(message, wParam, lParam);
LRESULT lrst= CFrameWnd::DefWindowProc(message, wParam, lParam);
if (!::IsWindow(m_hWnd))
return lrst;
if (message==WM_MOVE||message==WM_PAINT||message==WM_NCPAINT||message==WM_NCACTIVATE||
message==WM_SETTEXT)
{
try
{
CWindowDC dc(this);
if (&dc)
DrawTitleBar(&dc);
}
catch( CException* e )
{
e->Delete();
}
}
return lrst;
}
void CMainFrame::DrawXPBmp(CDC *pDC,int ID,CPoint pt1,CPoint pt2)
{
CDC *memdc=new CDC;
CRect rect;
CBitmap bitmap;
BITMAP szbitmap;
bitmap.LoadBitmap(ID);
bitmap.GetObject(sizeof(BITMAP),&szbitmap);
CSize size(szbitmap.bmWidth,szbitmap.bmHeight);
memdc->CreateCompatibleDC(pDC);
CBitmap *oldbitmap=memdc->SelectObject(&bitmap);
pDC->StretchBlt(pt1.x,pt1.y,pt2.x,pt2.y,memdc,0,0,size.cx ,size.cy ,SRCCOPY);
memdc->SelectObject(oldbitmap);
memdc->DeleteDC();
if( memdc )
delete memdc;
}
void CMainFrame::DrawTitleBar(CDC *pDC)
{
if (m_hWnd)
{
CBrush Brush(RGB(10,80,240));
CBrush* pOldBrush = pDC->SelectObject(&Brush);
CRect rtWnd, rtTitle, rtButtons;
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);
//用位图填充来做窗体边框
CPoint point;
point.x = GetSystemMetrics(SM_CXFRAME) + 1; //左边框
point.y = rtWnd.Height();
DrawXPBmp(pDC,IDB_LEFT,CPoint(0,0),CPoint(point.x,point.y));
point.x = rtWnd.Width(); //底边框
point.y = GetSystemMetrics(SM_CYFRAME) + 1;
DrawXPBmp(pDC,IDB_BOTTOM,CPoint(0, rtWnd.Height()-point.y), CPoint(point.x, point.y));
point.x = GetSystemMetrics(SM_CXFRAME) + 1; //右边框
point.y = rtWnd.Height();
DrawXPBmp(pDC,IDB_RIGHT,CPoint(rtWnd.Width()-point.x, 0), CPoint(point.x, point.y));
point.x = rtWnd.Width(); //顶边框
point.y = GetSystemMetrics(SM_CYSIZE) + GetSystemMetrics(SM_CYFRAME);
DrawXPBmp(pDC,IDB_TOP,CPoint(0,0),CPoint(point.x,point.y));
//重画图标
m_rtIcon.left = rtTitle.left ;
m_rtIcon.top = rtTitle.top;
m_rtIcon.right = m_rtIcon.left + 16;
m_rtIcon.bottom = m_rtIcon.top + 15;
::DrawIconEx(pDC->m_hDC, m_rtIcon.left, m_rtIcon.top, AfxGetApp()->LoadIcon(IDR_MAINFRAME),
m_rtIcon.Width(), m_rtIcon.Height(), 0, NULL, DI_NORMAL);
m_rtIcon.OffsetRect(rtWnd.TopLeft());
//准备画XP风格按钮
CBitmap* pBitmap = new CBitmap;
CBitmap* pOldBitmap;
CDC* pDisplayMemDC=new CDC;
pDisplayMemDC->CreateCompatibleDC(pDC);
//重画关闭button
rtButtons.left = rtTitle.right - 16;
rtButtons.top = rtTitle.top;
rtButtons.right = rtButtons.left + 16;
rtButtons.bottom = rtButtons.top + 15;
pBitmap->LoadBitmap(IDB_EXIT_NORMAL);
pOldBitmap=(CBitmap*)pDisplayMemDC->SelectObject(pBitmap);
pDC->BitBlt(rtButtons.left, rtButtons.top, rtButtons.Width(), rtButtons.Height(), pDisplayMemDC, 0, 0, SRCCOPY);
pDisplayMemDC->SelectObject(pOldBitmap);
m_rtButtExit = rtButtons;
m_rtButtExit.OffsetRect(rtWnd.TopLeft());
pBitmap->DeleteObject();
//重画最大化/恢复button
rtButtons.right = rtButtons.left - 3;
rtButtons.left = rtButtons.right - 16;
if (IsZoomed())
pBitmap->LoadBitmap(IDB_RESTORE_NORMAL);
else
pBitmap->LoadBitmap(IDB_MAX_NORMAL);
pOldBitmap=(CBitmap*)pDisplayMemDC->SelectObject(pBitmap);
pDC->BitBlt(rtButtons.left, rtButtons.top, rtButtons.Width(), rtButtons.Height(), pDisplayMemDC, 0, 0, SRCCOPY);
pDisplayMemDC->SelectObject(pOldBitmap);
m_rtButtMax = rtButtons;
m_rtButtMax.OffsetRect(rtWnd.TopLeft());
pBitmap->DeleteObject();
//重画最小化button
rtButtons.right = rtButtons.left - 3;
rtButtons.left = rtButtons.right - 16;
pBitmap->LoadBitmap(IDB_MIN_NORMAL);
pOldBitmap=(CBitmap*)pDisplayMemDC->SelectObject(pBitmap);
pDC->BitBlt(rtButtons.left, rtButtons.top, rtButtons.Width(), rtButtons.Height(), pDisplayMemDC, 0, 0, SRCCOPY);
pDisplayMemDC->SelectObject(pOldBitmap);
m_rtButtMin = rtButtons;
m_rtButtMin.OffsetRect(rtWnd.TopLeft());
pBitmap->DeleteObject();
//重画caption
int nOldMode = pDC->SetBkMode(TRANSPARENT);
COLORREF clOldText=pDC->SetTextColor(::GetSysColor(COLOR_3DSHADOW));
LOGFONT logFont; //获取标题栏字体
SystemParametersInfo( SPI_GETICONTITLELOGFONT, 0, &logFont, 0);
CFont m_captionFont;
m_captionFont.CreateFontIndirect(&logFont);
CFont* pOldFont = NULL; //zwh Adding,2002.6.20
pOldFont = pDC->SelectObject(&m_captionFont);
rtTitle.left += m_rtIcon.Width ()+3;
rtTitle.top = rtTitle.top;
rtTitle.bottom = rtTitle.top + 30;
CString m_strTitle;
GetWindowText(m_strTitle); //3D显示文字
pDC->DrawText(m_strTitle, rtTitle+CPoint(3,3), DT_LEFT);
pDC->SetTextColor(::GetSysColor(COLOR_3DHILIGHT));
pDC->DrawText(m_strTitle, rtTitle, DT_LEFT);
pDC->SetBkMode(nOldMode);
pDC->SetTextColor(clOldText);
//zwh Adding,2002.6.20
if (pOldFont != NULL)
{
pDC->SelectObject(pOldFont);
m_captionFont.DeleteObject();
}
//zwh Modifing,2002.6.20
//ReleaseDC(pDisplayMemDC);
pDisplayMemDC->DeleteDC();
delete pDisplayMemDC;
delete pBitmap;
}
}
////////////////////////
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -