📄 mainfrm.cpp
字号:
//////////////////////////////////////////////////////////////////////////////
//类名:CMainFrame
//功能:主框架操作类
//
/////////////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "XPEasterEgg.h"
#include "MainFrm.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CMainFrame
IMPLEMENT_DYNCREATE(CMainFrame, CNewFrameWnd); //更换新的XP菜单框架
//IMPLEMENT_MENUXP(CMainFrame, CFrameWnd, true); //实现XP风格菜单映射
BEGIN_MESSAGE_MAP(CMainFrame, CNewFrameWnd) //更换新的XP菜单框架
//{{AFX_MSG_MAP(CMainFrame)
// NOTE - the ClassWizard will add and remove mapping macros here.
// DO NOT EDIT what you see in these blocks of generated code !
ON_WM_CREATE()
ON_WM_NCLBUTTONDOWN() //非客户区左键按下时消息,jingzhou xu
ON_WM_NCMOUSEMOVE() //非客户区鼠标移动时消息,jingzhou xu
//}}AFX_MSG_MAP
// ON_MENUXP_MESSAGES() //XP风格菜单映射
END_MESSAGE_MAP()
static UINT indicators[] =
{
ID_SEPARATOR, // status line indicator
ID_INDICATOR_CAPS,
ID_INDICATOR_NUM,
ID_INDICATOR_SCRL,
};
/////////////////////////////////////////////////////////////////////////////
// CMainFrame construction/destruction
CMainFrame::CMainFrame()
{
// TODO: add member initialization code here
}
CMainFrame::~CMainFrame()
{
}
// ---------------------------------------------------------------------------
// 名称: OnCreate
// 功能: 创建窗体
//
// ---------------------------------------------------------------------------
int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CNewFrameWnd::OnCreate(lpCreateStruct) == -1) //更换新的XP菜单框架
return -1;
if (!m_wndToolBar.CreateEx(this, TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE | CBRS_TOP
| CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC) ||
!m_wndToolBar.LoadToolBar(IDR_MAINFRAME))
{
TRACE0("Failed to create toolbar\n");
return -1; // fail to create
}
if (!m_wndStatusBar.Create(this) ||
!m_wndStatusBar.SetIndicators(indicators,
sizeof(indicators)/sizeof(UINT)))
{
TRACE0("Failed to create status bar\n");
return -1; // fail to create
}
m_wndToolBar.EnableDocking(CBRS_ALIGN_ANY);
EnableDocking(CBRS_ALIGN_ANY);
DockControlBar(&m_wndToolBar);
//设置XP风格菜单显示
static UINT uToolBars[] = { IDR_MAINFRAME,
};
m_DefaultNewMenu.LoadToolBars(uToolBars, sizeof(uToolBars)/sizeof(UINT) );
m_SystemNewMenu.SetMenuTitle(_T("王超作品"),MFT_LINE|MFT_CENTER|MFT_ROUND);
return 0;
}
// ---------------------------------------------------------
// 名称: PreCreateWindow
// 功能: 去掉系统菜单,用XP风格框架显示
// 变量: cs -- 结构风格
// 返回: BOOL -- 成功,FALSE -- 失败
//
// ---------------------------------------------------------
BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs)
{
cs.style &= ~WS_SYSMENU; //去掉系统菜单,避免XP风格窗体下,在98/2000下鼠标点击标题或菜单时,系统按钮暴露问题,jingzhou xu
if( !CNewFrameWnd::PreCreateWindow(cs) ) //更换新的XP菜单框架
return FALSE;
return TRUE;
}
/////////////////////////////////////////////////////////////////////////////
// CMainFrame diagnostics
#ifdef _DEBUG
void CMainFrame::AssertValid() const
{
CNewFrameWnd::AssertValid(); //更换新的XP菜单框架
}
void CMainFrame::Dump(CDumpContext& dc) const
{
CNewFrameWnd::Dump(dc); //更换新的XP菜单框架
}
#endif //_DEBUG
/////////////////////////////////////////////////////////////////////////////
// CMainFrame message handlers
// ---------------------------------------------------------
// 名称: DrawXPBmp
// 功能: 绘制XP风格的背景位图
// 变量: pDC -- 设备指针,ID -- 资源ID,pt1, pt2 -- 点位置
// 返回: 无
//
// ---------------------------------------------------------
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;
}
// ---------------------------------------------------------
// 名称: DrawTitleBar
// 功能: 绘制具有XP风格的窗体框架
// 变量: pDC -- 设备指针
// 返回: 无
//
// ---------------------------------------------------------
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;
}
}
// ---------------------------------------------------------
// 名称: OnNcLButtonDown
// 功能: 绘制XP风格窗体的消息
// 变量: nHitTest -- 点在哪里,point -- 点信息
// 返回: 无
//
// ---------------------------------------------------------
void CMainFrame::OnNcLButtonDown(UINT nHitTest, CPoint point)
{
//检测各按钮是否按到
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();
}
// ---------------------------------------------------------
// 名称: OnNcMouseMove
// 功能: 绘制XP风格窗体的消息
// 变量: nHitTest -- 点在哪里,point -- 点信息
// 返回: 无
//
// ---------------------------------------------------------
void CMainFrame::OnNcMouseMove(UINT nHitTest, CPoint point)
{
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;
CNewFrameWnd::OnNcMouseMove(nHitTest, point); //更换新的XP菜单框架
}
// ---------------------------------------------------------
// 名称: DefWindowProc
// 功能: 在此设置横排、竖排消息及框架XP风格绘制
// 变量: message -- 消息,wParam, lParam -- 消息参数
// 返回: 无
//
// ---------------------------------------------------------
LRESULT CMainFrame::DefWindowProc(UINT message, WPARAM wParam, LPARAM lParam)
{
//加入绘制XP风格窗体的消息
LRESULT lrst=CNewFrameWnd::DefWindowProc(message, wParam, lParam); //更换新的XP菜单框架
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;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -