273 lines
6.1 KiB
C++
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;
|
|
}
|