DragonNest/Third/XTToolkitPro/Source/SkinFramework/XTPSkinObjectMenu.cpp
2024-12-19 09:48:26 +08:00

273 lines
6.1 KiB
C++

// XTPSkinObjectMDI.cpp: implementation of the CXTPSkinObjectMDI class.
//
// This file is a part of the XTREME SKINFRAMEWORK MFC class library.
// (c)1998-2008 Codejock Software, All Rights Reserved.
//
// THIS SOURCE FILE IS THE PROPERTY OF CODEJOCK SOFTWARE AND IS NOT TO BE
// RE-DISTRIBUTED BY ANY MEANS WHATSOEVER WITHOUT THE EXPRESSED WRITTEN
// CONSENT OF CODEJOCK SOFTWARE.
//
// THIS SOURCE CODE CAN ONLY BE USED UNDER THE TERMS AND CONDITIONS OUTLINED
// IN THE XTREME TOOLKIT PRO LICENSE AGREEMENT. CODEJOCK SOFTWARE GRANTS TO
// YOU (ONE SOFTWARE DEVELOPER) THE LIMITED RIGHT TO USE THIS SOFTWARE ON A
// SINGLE COMPUTER.
//
// CONTACT INFORMATION:
// support@codejock.com
// http://www.codejock.com
//
/////////////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "Common/XTPDrawHelpers.h"
#include "XTPSkinObjectMenu.h"
#include "XTPSkinManager.h"
#include "XTPSkinDrawTools.h"
#define MN_SELECTITEM 0x01E5
#define MN_GETHMENU 0x01E1
POINT CXTPSkinObjectFrame::m_sMenuOffset = {0, 0};
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
IMPLEMENT_DYNCREATE(CXTPSkinObjectMenu, CXTPSkinObjectFrame)
CXTPSkinObjectMenu::CXTPSkinObjectMenu()
{
}
CXTPSkinObjectMenu::~CXTPSkinObjectMenu()
{
}
BEGIN_MESSAGE_MAP(CXTPSkinObjectMenu, CXTPSkinObjectFrame)
//{{AFX_MSG_MAP(CXTPSkinObjectMenu)
ON_WM_NCPAINT()
ON_WM_PAINT()
ON_WM_ERASEBKGND()
ON_MESSAGE(WM_PRINT, OnPrint)
ON_MESSAGE(WM_PRINTCLIENT, OnPrintClient)
ON_MESSAGE(MN_SELECTITEM, OnSelectItem)
ON_MESSAGE(WM_KEYDOWN, OnKeyDown)
ON_MESSAGE(WM_SYSKEYDOWN, OnKeyDown)
ON_MESSAGE(WM_CHAR, OnChar)
ON_WM_WINDOWPOSCHANGING()
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
void CXTPSkinObjectMenu::OnWindowPosChanging(WINDOWPOS FAR* lpwndpos)
{
lpwndpos->y += m_sMenuOffset.y;
lpwndpos->x += m_sMenuOffset.x;
CXTPSkinObjectFrame::OnWindowPosChanging(lpwndpos);
}
void CXTPSkinObjectMenu::OnPaint()
{
CXTPSkinObjectPaintDC dc(this); // device context for painting
OnDraw(&dc);
}
#define MIIM_BITMAP 0x00000080
struct MENUITEMINFO98
{
UINT cbSize;
UINT fMask;
UINT fType; // used if MIIM_TYPE (4.0) or MIIM_FTYPE (>4.0)
UINT fState; // used if MIIM_STATE
UINT wID; // used if MIIM_ID
HMENU hSubMenu; // used if MIIM_SUBMENU
HBITMAP hbmpChecked; // used if MIIM_CHECKMARKS
HBITMAP hbmpUnchecked; // used if MIIM_CHECKMARKS
DWORD dwItemData; // used if MIIM_DATA
LPWSTR dwTypeData; // used if MIIM_TYPE (4.0) or MIIM_STRING (>4.0)
UINT cch; // used if MIIM_TYPE (4.0) or MIIM_STRING (>4.0)
HBITMAP hbmpItem; // used if MIIM_BITMAP
};
void CXTPSkinObjectMenu::OnDraw(CDC* pDC)
{
/*NONCLIENTMETRICS nm;
::ZeroMemory(&nm, sizeof(NONCLIENTMETRICS));
nm.cbSize = sizeof(NONCLIENTMETRICS);
VERIFY(::SystemParametersInfo(SPI_GETNONCLIENTMETRICS,
sizeof(NONCLIENTMETRICS), &nm, 0));
CFont fnt;
fnt.CreateFontIndirect(&nm.lfMenuFont);
CXTPFontDC fntDc(pDC, &fnt);
TEXTMETRIC tm;
pDC->GetTextMetrics(&tm);
CXTPClientRect rc(this);
pDC->FillSolidRect(rc, GetColor(COLOR_MENU));
pDC->SetBkMode(TRANSPARENT);
HMENU hMenu = (HMENU)SendMessage(MN_GETHMENU);
if (!hMenu)
return;
int nCount = GetMenuItemCount(hMenu);
int y = 0;
int x = 0;
for (int i = 0; i < nCount; i++)
{
MENUITEMINFO98 info = { sizeof(MENUITEMINFO98), MIIM_TYPE | MIIM_STATE | MIIM_BITMAP};
::GetMenuItemInfo(hMenu, i, TRUE, (MENUITEMINFO*)&info);
if ((info.fType & MFT_SEPARATOR) == MFT_SEPARATOR)
{
int nHeight = GetSystemMetrics(SM_CYMENUSIZE) / 2;
int yT = y + (nHeight / 2) - 1;
RECT rcItem;
rcItem.left = x + 1;
rcItem.top = yT;
rcItem.right = rc.right - 1;
rcItem.bottom = yT + GetSystemMetrics(SM_CYEDGE);
DrawEdge(pDC->GetSafeHdc(), &rcItem, BDR_SUNKENOUTER, BF_TOP | BF_BOTTOM);
y += nHeight;
}
else
{
int nHeight = 0;
nHeight = max(nHeight, tm.tmHeight + tm.tmExternalLeading + GetSystemMetrics(SM_CYEDGE));
nHeight += 2;
CRect rcItem(0, y, rc.right, y + nHeight);
if (info.fState & MFS_HILITE)
{
pDC->FillSolidRect(rcItem, GetColor(COLOR_HIGHLIGHT));
}
y += nHeight;
}
}*/
CXTPClientRect rc(this);
CXTPBufferDC dc(pDC->GetSafeHdc(), rc);
dc.FillSolidRect(rc, GetColor(COLOR_MENU));
dc.SetBkMode(TRANSPARENT);
DefWindowProc(WM_PRINTCLIENT, (WPARAM)dc.GetSafeHdc(), 0);
//GetMenuBarInfo();
}
void CXTPSkinObjectMenu::OnDrawNonCLient(CDC* pDC)
{
CRect rcBorders = m_rcBorders;
CXTPWindowRect rc(this);
rc.OffsetRect(-rc.TopLeft());
XTPSkinFrameworkDrawFrame(pDC->GetSafeHdc(), rc, 1, GetColor(COLOR_3DSHADOW));
rc.DeflateRect(1, 1);
XTPSkinFrameworkDrawFrame(pDC->GetSafeHdc(), rc, rcBorders.left - 1, GetColor(COLOR_MENU));
}
BOOL CXTPSkinObjectMenu::OnEraseBkgnd(CDC* /*pDC*/)
{
return TRUE;
}
void CXTPSkinObjectMenu::OnNcPaint()
{
CWindowDC dc(this);
OnDrawNonCLient(&dc);
}
LRESULT CXTPSkinObjectMenu::OnPrint(WPARAM wParam, LPARAM lParam)
{
CDC* pDC = CDC::FromHandle((HDC)wParam);
if (lParam & PRF_NONCLIENT)
{
OnDrawNonCLient(pDC);
}
if (lParam & PRF_CLIENT)
{
CPoint pt = pDC->SetWindowOrg(-m_rcBorders.left, -m_rcBorders.top);
OnDraw(pDC);
pDC->SetWindowOrg(pt);
}
return 1;
}
LRESULT CXTPSkinObjectMenu::OnPrintClient(WPARAM wParam, LPARAM /*lParam*/)
{
CDC* pDC = CDC::FromHandle((HDC)wParam);
OnDraw(pDC);
return 1;
}
LRESULT CXTPSkinObjectMenu::OnSelectItem(WPARAM /*wParam*/, LPARAM /*lParam*/)
{
SetRedraw(FALSE);
LRESULT lResult = Default();
SetRedraw(TRUE);
Invalidate(FALSE);
return lResult;
}
LRESULT CXTPSkinObjectMenu::OnKeyDown(WPARAM wParam, LPARAM /*lParam*/)
{
if (wParam == VK_UP || wParam == VK_DOWN)
{
SetRedraw(FALSE);
LRESULT lResult = Default();
if (IsWindow(m_hWnd))
{
SetRedraw(TRUE);
Invalidate(FALSE);
}
return lResult;
}
else
{
return Default();
}
}
LRESULT CXTPSkinObjectMenu::OnChar(WPARAM /*wParam*/, LPARAM /*lParam*/)
{
LRESULT lResult = Default();
if (IsWindow(m_hWnd))
{
Invalidate(FALSE);
}
return lResult;
}