EZMenu-Self Drawing Menu

Environment: VC6 SP2,98

With this self drawing menu, replicating the Windows start
menu is a snap. It can draw True color icons, a bitmap menu title
and progress bars. The usage is similar to (if not simpler than MFC’s
CMenu class). If there is a pop up menu named IDR_MYPOPUP, the
items can be made owner drawn with the following statements:

CEZMenu ezmenu;
CMenu* pmenu;
pmenu->LoadMenu(IDR_MYPOPUP);
ezmenu.Attach(pmenu->GetSubMenu(0)->GetSafeHmenu());
//for all items->call ezmenu.InsertOwnerDrawnMenu.

Various functions available for inserting menu items
are,

void
InsertOwnerDrawnMenuItem
(
UINT nID/*The Id of the menu item*/
,LPEZMENUITEMDATA lpez/*Data->Explained below*/
,int nPos=0/*Insert Where?*/
);

void AppendOwnerDrawnItem(UINT nID,LPEZMENUITEMDATA lpez);


void ModifyOwnerDrawnMenuItem(int nPos,UINT nID,int nTotalCheck,LPEZMENUITEMDATA
lpez);//Doubtful->suggestions welcome

Menu Item Data->The properties of the menu item
are received by a class called CEZMenuItemData whose members are
self explainatory.

class
CEZMenuItemData
{
public:
CEZMenuItemData();
HICON hItemIconLarge;//Large Icon Handle
HICON hItemIconSmall;//Small Icon Handle
CString strItemText;//Menu string
BOOL bChecked;//Is item checked?
BOOL bSeperator;.
//Why do you need an Owner drawn menu to draw a **seperator**?
BOOL bProgress;//Progressbar needed?
int nProgress; //if bProgress what is the percentage?
};
//Useful typedef
typedef CEZMenuItemData* LPEZMENUITEMDATA;

If a bitmap is needed, then there is a hitch. The number of
items that would lay beside the bitmap should be specified as
well as the size of the bitmap.

void
SetTotalItems(int nItems);//necessary.
void SetMenuBitmap(HBITMAP hBitmap);
void SetBitmapDimension(CSize sz);
void SetExtensionColor(COLORREF clrExtend);
//if bitmap is shorter than menu height a rectangle whose width
is same as that of the bitmap
//and whose height compensates for a shor bitmap is painted in
clrExtend

It is fairly simple to modify the code to paint gradient rect
by getting two colors from the user.In case a progressbar is
needed the percentage unfilled part should be specified. I’ve done
this because more often than not, we only have the unfilled
percent rather than the filled ones.

Though the code works fine and I did not encounter any
problems with it, there is a major bug which to my surprise does’nt
show at all. I have not deleted objects and didn’t free resource
handles (I was unable to do it). I would like Codeguru regulars
to clarify this point.

I think the demo project and comments in the code would do the
rest of the explaination.

Downloads

Download demo project – 27 Kb
Download source – 4 Kb

More by Author

Get the Free Newsletter!

Subscribe to Developer Insider for top news, trends & analysis

Must Read