Click here to Skip to main content
15,886,199 members
Articles / Mobile Apps / Windows Mobile

CmenuModifier - An Owner Draw Image Menu

Rate me:
Please Sign up or sign in to vote.
3.92/5 (10 votes)
3 Jun 2008CPOL6 min read 48.8K   1.8K   23  
CmenuModifier - an owner draw image menu
// ZDlg.cpp : implementation file
//

#include "stdafx.h"
#include "Step.h"
#include "ZDlg.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// ZDlg dialog

ZDlg::ZDlg(CWnd* pParent /*=NULL*/)
	: CDialog(ZDlg::IDD, pParent)
{
	//{{AFX_DATA_INIT(ZDlg)
	i_AtImageStyle = 0;
	b_ChkUseObmCheck = 1;
	//}}AFX_DATA_INIT
}

void ZDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(ZDlg)
	DDX_Radio(pDX, AT_STYLE0, i_AtImageStyle);
	DDX_Check(pDX, CHK_USEOBMCHECK, b_ChkUseObmCheck);
	//}}AFX_DATA_MAP
}

BEGIN_MESSAGE_MAP(ZDlg, CDialog)
	//{{AFX_MSG_MAP(ZDlg)
	ON_BN_CLICKED(IDOK, On_IDOK)
	ON_WM_DRAWITEM()
	ON_WM_MEASUREITEM()
	ON_WM_LBUTTONDBLCLK()
	ON_WM_RBUTTONDOWN()
	ON_WM_PAINT()
	ON_BN_CLICKED(AT_STYLE0, On_ImageStyle)
	ON_BN_CLICKED(AT_STYLE1, On_ImageStyle)
	ON_BN_CLICKED(AT_STYLE2, On_ImageStyle)
	ON_BN_CLICKED(AT_STYLE3, On_ImageStyle)
	ON_BN_CLICKED(AT_STYLE4, On_ImageStyle)
	ON_BN_CLICKED(AT_STYLE5, On_ImageStyle)
	ON_BN_CLICKED(AT_STYLE6, On_ImageStyle)
	ON_BN_CLICKED(CHK_USEOBMCHECK, On_ChkUseObmCheck)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////

void ZDlg::On_IDOK() 
{
}

void ZDlg::OnPaint() 
{
	CPaintDC dc(this); // device context for painting
	
	CFont*pFt=dc.SelectObject(CFont::FromHandle((HFONT)::GetStockObject(ANSI_FIXED_FONT)));
	int iBkMode=dc.SetBkMode(TRANSPARENT);

	CRect rc;	
	GetClientRect(&rc);
	rc.DeflateRect(40,80,0,0);

	//==================================================
	CString cs=	"Right click and double click to show 2 popup menus.\n"
				"Visit Help for help-contents.\n\n"
				"Don't forget:\n"
				"First pixel of tool bar stands for transparent color.\n\n";
	dc.DrawText(cs,&rc,0);

	//==================================================
	dc.SetBkMode(iBkMode);
	dc.SelectObject(pFt);
}

BOOL ZDlg::OnInitDialog()
{
	CDialog::OnInitDialog();


	On_ImageStyle();
	return 1;
}


void ZDlg::OnDrawItem(int nIDCtl, LPDRAWITEMSTRUCT lpDrawItemStruct) 
{
	md_Popup.OnDrawItem(nIDCtl,lpDrawItemStruct);
	md_Main.OnDrawItem(nIDCtl,lpDrawItemStruct);
	
	CDialog::OnDrawItem(nIDCtl, lpDrawItemStruct);
}

void ZDlg::OnMeasureItem(int nIDCtl, LPMEASUREITEMSTRUCT lpMeasureItemStruct) 
{
	md_Popup.OnMeasureItem(nIDCtl,lpMeasureItemStruct);
	md_Main.OnMeasureItem(nIDCtl,lpMeasureItemStruct);
	
	CDialog::OnMeasureItem(nIDCtl, lpMeasureItemStruct);
}

void ZDlg::OnLButtonDblClk(UINT nFlags, CPoint pt) 
{
	CDialog::OnLButtonDblClk(nFlags, pt);
	P_ShowPopupMenu(MU_EDIT,pt);
}

void ZDlg::OnRButtonDown(UINT nFlags, CPoint pt) 
{
	CDialog::OnRButtonDown(nFlags, pt);
	P_ShowPopupMenu(MU_FILE,pt);
}

void ZDlg::P_ShowPopupMenu(UINT uMenuID, CPoint pt)
{
	CMenu mu;
	if(mu.LoadMenu(uMenuID)==0)	return;

	const UINT uBarID=(uMenuID==MU_EDIT)?BAR_EDIT:BAR_MAIN;
	COLORREF clrVert=(uMenuID==MU_EDIT)?RGB(192,192,0):RGB(0,192,192);

	CToolBar    bar;
	BOOL b=bar.CreateEx(this,TBSTYLE_FLAT,WS_CHILD);
	if(b) b=bar.LoadToolBar(uBarID);
	if(b==0)	return;

	int iStyle=P_GetImageStyle();
	md_Popup.SetOwnerDraw(&mu,1,&bar,iStyle,0,&clrVert);
//	md_Popup.SetOwnerDraw(&mu,1,0,iStyle,0,&clrVert);
	md_Popup.SetChechedItemStyle(b_ChkUseObmCheck);

	CMenu*pMu=mu.GetSubMenu(0);
	if(pMu==0)	return;

	::MapWindowPoints(m_hWnd,0,&pt,1);
	UINT uCmd=pMu->TrackPopupMenu(TPM_RETURNCMD,pt.x,pt.y,this);
	if(uCmd==0)	return;

	CString cs;
	cs.Format("ID of the clicked menu item is 0x%X",uCmd);
	MessageBox(cs);
}

void ZDlg::On_ChkUseObmCheck() 
{
	On_ImageStyle();
}

void ZDlg::On_ImageStyle() 
{
	int iStyle=P_GetImageStyle();

	CToolBar    bar;
	bar.CreateEx(this, TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE | CBRS_TOP
		| CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC);
	bar.LoadToolBar(BAR_MAIN);

	CMenu*pMenu=GetMenu();
	md_Main.SetOwnerDraw(pMenu,1,&bar,iStyle);
	md_Main.SetChechedItemStyle(b_ChkUseObmCheck);
}

int ZDlg::P_GetImageStyle()
{
	UpdateData(1);
	
	int iStyle=CMenuModifier::FLAT;
	switch(i_AtImageStyle)
	{
	case 0: iStyle=CMenuModifier::FLAT;			break;
	case 1: iStyle=CMenuModifier::SUNKEN_WHITE;	break;
	case 2: iStyle=CMenuModifier::SUNKEN_BLACK;	break;
	case 3: iStyle=CMenuModifier::SUNKEN_BOTH;	break;
	case 4: iStyle=CMenuModifier::RAISED_WHITE;	break;
	case 5: iStyle=CMenuModifier::RAISED_BLACK;	break;
	case 6: iStyle=CMenuModifier::RAISED_BOTH;	break;
	}
	return iStyle;
}

By viewing downloads associated with this article you agree to the Terms of Service and the article's licence.

If a file you wish to view isn't highlighted, and is a text file (not binary), please let us know and we'll add colourisation support for it.

License

This article, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)


Written By
Web Developer
Australia Australia

Please visit our Download Home to obtain many interesting software for free ...


Comments and Discussions