📄 gnomeframe.cpp
字号:
// GnomeFrame.cpp : implementation file
//
#include "stdafx.h"
#include "GUI_Gnome.h"
#include "GnomeFrame.h"
#include "GnomeTheme.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CGnomeFrame
IMPLEMENT_DYNCREATE(CGnomeFrame, CFrameWnd)
CGnomeFrame::CGnomeFrame()
{
m_rcBorders.SetRect(4, 4, 4, 4);
m_nButtonDown = 0;
}
CGnomeFrame::~CGnomeFrame()
{
}
BEGIN_MESSAGE_MAP(CGnomeFrame, CFrameWnd)
//{{AFX_MSG_MAP(CGnomeFrame)
ON_WM_CREATE()
ON_WM_NCPAINT()
ON_WM_NCCALCSIZE()
ON_WM_NCHITTEST()
ON_WM_NCLBUTTONDOWN()
ON_WM_NCLBUTTONUP()
ON_WM_SIZE()
ON_WM_WINDOWPOSCHANGING()
ON_WM_LBUTTONUP()
ON_WM_CAPTURECHANGED()
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CGnomeFrame message handlers
int CGnomeFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CFrameWnd::OnCreate(lpCreateStruct) == -1)
return -1;
SetMenu(0);
ModifyStyle(WS_BORDER, 0);
CRect m_rcBorders(0, 0, 0, 0);
AdjustWindowRectEx(m_rcBorders, GetStyle(), FALSE, GetExStyle());
m_rcBorders.SetRect(-m_rcBorders.left, -m_rcBorders.top, m_rcBorders.right, m_rcBorders.bottom);
VERIFY(m_bmpBottomLeft.LoadBitmap(IDB_GNOME_BOTTOMLEFT));
VERIFY(m_bmpBottomRight.LoadBitmap(IDB_GNOME_BOTTOMRIGHT));
VERIFY(m_bmpMenuNormal.LoadBitmap(IDB_GNOME_MENU_NORMAL));
VERIFY(m_bmpCaption.LoadBitmap(IDB_GNOME_CAPTION));
VERIFY(m_bmpCloseNormal.LoadBitmap(IDB_GNOME_CLOSE_NORMAL));
VERIFY(m_bmpMaximizeNormal.LoadBitmap(IDB_GNOME_MAXIMIZE_NORMAL));
VERIFY(m_bmpMinimizeNormal.LoadBitmap(IDB_GNOME_MINIMIZE_NORMAL));
VERIFY(m_bmpClosePushed.LoadBitmap(IDB_GNOME_CLOSE_PUSHED));
VERIFY(m_bmpMaximizePushed.LoadBitmap(IDB_GNOME_MAXIMIZE_PUSHED));
VERIFY(m_bmpMinimizePushed.LoadBitmap(IDB_GNOME_MINIMIZE_PUSHED));
MoveWindow(CXTPWindowRect(this));
NONCLIENTMETRICS ncm;
ZeroMemory(&ncm, sizeof(NONCLIENTMETRICS));
ncm.cbSize = sizeof(NONCLIENTMETRICS);
VERIFY(::SystemParametersInfo(SPI_GETNONCLIENTMETRICS, sizeof(NONCLIENTMETRICS), &ncm, 0));
m_fntTitle.CreateFontIndirect(&ncm.lfCaptionFont);
return 0;
}
/////////////////////////////////////////////////////////////////////////////
// CGnomeFrame message handlers
#define GNOMECAPTION_HEIGHT 20
void CGnomeFrame::OnNcPaint()
{
CWindowDC dcWindow(this);
CXTPWindowRect rc(this);
CXTPClientRect rcClient(this);
ClientToScreen(&rcClient);
rcClient.OffsetRect(-rc.TopLeft());
rc.OffsetRect(-rc.TopLeft());
CRgn rgnClient;
rgnClient.CreateRectRgnIndirect(rcClient);
CRgn rgnWindow;
rgnWindow.CreateRoundRectRgn(rc.left, rc.top, rc.right, rc.bottom, 11, 11);
dcWindow.SelectClipRgn(&rgnWindow);
dcWindow.SelectClipRgn(&rgnClient, RGN_XOR );
{
CXTPBufferDC dc(dcWindow, rc);
CXTPPenDC pen(dc, 0);
CXTPBrushDC brush(dc, GNOMECOLOR_3DFACE);
dc.FillSolidRect(0, 0, rc.Width(), rc.Height(), 0);
dc.RoundRect(0, 0, rc.Width() - 1, rc.Height() - 1, 14, 14);
dc.FillSolidRect(0, GNOMECAPTION_HEIGHT - 1, rc.Width(), 1, RGB(11, 11, 12));
dc.FillSolidRect(1, GNOMECAPTION_HEIGHT, 1, rc.Height() - GNOMECAPTION_HEIGHT - 6, RGB(0xFF, 0xFF, 0xFF));
dc.FillSolidRect(5, GNOMECAPTION_HEIGHT, 1, rc.Height() - GNOMECAPTION_HEIGHT - 6, RGB(161, 161, 161));
dc.FillSolidRect(rc.Width() - 3, GNOMECAPTION_HEIGHT, 1, rc.Height() - GNOMECAPTION_HEIGHT - 6, RGB(196, 196, 196));
dc.FillSolidRect(rc.Width() - 6, GNOMECAPTION_HEIGHT, 1, rc.Height() - GNOMECAPTION_HEIGHT - 6, RGB(255, 255, 255));
dc.FillSolidRect(rc.Width() - 7, GNOMECAPTION_HEIGHT, 1, rc.Height() - GNOMECAPTION_HEIGHT - 6, RGB(161, 161, 161));
dc.FillSolidRect(5, rc.Height() - 3, rc.Width() - 11, 1, RGB(184, 184, 184));
dc.FillSolidRect(5, rc.Height() - 6, rc.Width() - 11, 1, RGB(255, 255, 255));
dc.FillSolidRect(5, rc.Height() - 7, rc.Width() - 11, 1, RGB(161, 161, 161));
dc.FillSolidRect(10, 1, rc.Width() - 20, 1, RGB(149, 169, 214));
for (int nCaption = 23; nCaption < rc.Width() - 33; nCaption += 30)
{
dc.DrawState(CPoint(nCaption, 2), CSize(30, 17), m_bmpCaption, DST_BITMAP|DSS_NORMAL);
}
dc.DrawState(CPoint(1, rc.Height() - 23), CSize(21, 21), m_bmpBottomLeft, DST_BITMAP|DSS_NORMAL);
dc.DrawState(CPoint(rc.Width() - 23, rc.Height() - 23), CSize(21, 21), m_bmpBottomRight, DST_BITMAP|DSS_NORMAL);
dc.DrawState(CPoint(1, 1), CSize(22, 19), m_bmpMenuNormal, DST_BITMAP|DSS_NORMAL);
dc.DrawState(CPoint(rc.Width() - 23, 1), CSize(21, 19), m_nButtonDown == GNOME_HTCLOSE? m_bmpClosePushed: m_bmpCloseNormal, DST_BITMAP|DSS_NORMAL);
dc.DrawState(CPoint(rc.Width() - 23 - 21, 1), CSize(21, 19), m_nButtonDown == GNOME_HTMAXIMIZE? m_bmpMaximizePushed: m_bmpMaximizeNormal, DST_BITMAP|DSS_NORMAL);
dc.DrawState(CPoint(rc.Width() - 23 - 21*2, 1), CSize(21, 19), m_nButtonDown == GNOME_HTMINIMIZE? m_bmpMinimizePushed: m_bmpMinimizeNormal, DST_BITMAP|DSS_NORMAL);
CRect rcTitle(rc.left + 30, rc.top, rc.right - 70, rc.top + GNOMECAPTION_HEIGHT);
dc.SetBkMode(TRANSPARENT);
dc.SetTextColor(RGB(255, 255, 255));
CString strTitle;
GetWindowText(strTitle);
CXTPFontDC font(&dc, &m_fntTitle);
dc.DrawText(strTitle, rcTitle, DT_VCENTER|DT_SINGLELINE|DT_END_ELLIPSIS|DT_NOCLIP);
}
dcWindow.SelectClipRgn(NULL);
}
void CGnomeFrame::OnNcCalcSize(BOOL bCalcValidRects, NCCALCSIZE_PARAMS FAR* lpncsp)
{
lpncsp->rgrc[0].top += GNOMECAPTION_HEIGHT - m_rcBorders.top;
lpncsp->rgrc[0].left += 6 - m_rcBorders.left;
lpncsp->rgrc[0].right -= 6 - m_rcBorders.right + 1;
lpncsp->rgrc[0].bottom -= 6 - m_rcBorders.bottom + 1;
CFrameWnd::OnNcCalcSize(bCalcValidRects, lpncsp);
}
UINT CGnomeFrame::OnNcHitTest(CPoint point)
{
int nHit = CFrameWnd::OnNcHitTest(point);
CRect rcWindow;
GetWindowRect(&rcWindow);
if (point.y < rcWindow.top + GNOMECAPTION_HEIGHT && nHit == HTNOWHERE)
{
//if (point.x < rcWindow.right - 23 * 3)
// return HTCAPTION;
return HTCAPTION;
}
return nHit;
}
void CGnomeFrame::OnSize(UINT nType, int cx, int cy)
{
CFrameWnd::OnSize(nType, cx, cy);
}
void CGnomeFrame::OnWindowPosChanging(WINDOWPOS* lpwndpos)
{
CFrameWnd::OnWindowPosChanging(lpwndpos);
if ((lpwndpos->flags & SWP_NOSIZE) == 0 )
{
CRgn rgnResult;
rgnResult.CreateRoundRectRgn(0, 0, lpwndpos->cx, lpwndpos->cy, 11, 11);
SetWindowRgn((HRGN)rgnResult.Detach(), TRUE);
}
}
int CGnomeFrame::GetSysButtonsHitTest(CPoint point)
{
CRect rcWindow;
GetWindowRect(&rcWindow);
if (point.y < rcWindow.top + GNOMECAPTION_HEIGHT && (point.x > rcWindow.right - 23))
return GNOME_HTCLOSE;
if (point.y < rcWindow.top + GNOMECAPTION_HEIGHT && (point.x > rcWindow.right - 23 - 21))
return GNOME_HTMAXIMIZE;
if (point.y < rcWindow.top + GNOMECAPTION_HEIGHT && (point.x > rcWindow.right - 23 - 21 - 21))
return GNOME_HTMINIMIZE;
return 0;
}
void CGnomeFrame::OnNcLButtonDown(UINT nHitTest, CPoint point)
{
if (nHitTest == HTCAPTION)
{
int nHit = GetSysButtonsHitTest(point);
if (nHit > 0)
{
SetCapture();
m_nButtonDown = nHit;
RedrawWindow(0, 0, RDW_FRAME|RDW_INVALIDATE );
}
}
CFrameWnd::OnNcLButtonDown(nHitTest, point);
}
void CGnomeFrame::OnNcLButtonUp(UINT nHitTest, CPoint point)
{
CFrameWnd::OnNcLButtonUp(nHitTest, point);
}
void CGnomeFrame::OnLButtonUp(UINT nFlags, CPoint point)
{
if (m_nButtonDown > 0)
{
int nButtonDown = m_nButtonDown;
m_nButtonDown = 0;
RedrawWindow(0, 0, RDW_FRAME|RDW_INVALIDATE );
ReleaseCapture();
ClientToScreen(&point);
if (GetSysButtonsHitTest(point) == nButtonDown)
{
switch (nButtonDown)
{
case GNOME_HTCLOSE: SendMessage(WM_SYSCOMMAND, SC_CLOSE); break;
case GNOME_HTMAXIMIZE:
SendMessage(WM_SYSCOMMAND, (GetStyle() & WS_MAXIMIZE) != 0? SC_RESTORE: SC_MAXIMIZE ); break;
case GNOME_HTMINIMIZE: SendMessage(WM_SYSCOMMAND, SC_MINIMIZE); break;
}
}
return;
}
CFrameWnd::OnLButtonUp(nFlags, point);
}
void CGnomeFrame::OnCaptureChanged(CWnd *pWnd)
{
if (m_nButtonDown > 0)
{
m_nButtonDown = 0;
RedrawWindow(0, 0, RDW_FRAME|RDW_INVALIDATE );
}
CFrameWnd::OnCaptureChanged(pWnd);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -