home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
OS/2 Shareware BBS: 10 Tools
/
10-Tools.zip
/
mnod.zip
/
mnodsamp.cpp
< prev
Wrap
Text File
|
1994-03-14
|
4KB
|
175 lines
// ICLUI sample
// Create a Menubar dynamically (ie. not from .rc file)
// Manipulate the system menu using ISystemMenu
// Create a Menu drawItem
#define INCL_WIN
#define INCL_GPIPRIMITIVES // for owner draw menuitem
extern "C" {
#include <os2.h>
#include <stdio.h>
}
#include <iapp.hpp>
#include <imenubar.hpp>
#include <isysmenu.hpp>
#include <icmdhdr.hpp>
#include <iframe.hpp>
#include <istattxt.hpp>
#include <istring.hpp>
#include <imnitem.hpp>
#include <imndihdr.hpp>
#define ID_OWNERDRAW1 201
#define ID_OWNERDRAW2 202
class TMenuDraw : public IMenuDrawItemHandler
{
protected:
Boolean
// NOTE: interface to setSize() was changed in the first CSD for 2.1 of CSet++.
// The IMenuDrawItemEvent parm was added at that time.
setSize(IMenuDrawItemEvent& evt, ISize& newSize),
draw(IMenuDrawItemEvent& evt, DrawFlag& flag);
highlight(IMenuDrawItemEvent& evt);
unhighlight(IMenuDrawItemEvent& evt);
};
//
// Overrides for the Menu Draw Handler
//
Boolean TMenuDraw :: setSize(IMenuDrawItemEvent& evt, ISize& newSize)
{
int height;
// Make the height of the draw items slightly different
if (evt.itemId() == ID_OWNERDRAW1) {
height = 24;
} else {
height = 32;
} /* endif */
newSize.setWidth(162).setHeight(height);
return true;
}
Boolean TMenuDraw :: highlight(IMenuDrawItemEvent& evt)
{
// You can supply your own rotine to hightlight here.
// return true to prevent PM from doing the highlight
// Same applies to unhighlight() below
return false;
}
Boolean TMenuDraw :: unhighlight(IMenuDrawItemEvent& evt)
{
return false;
}
Boolean TMenuDraw :: draw(IMenuDrawItemEvent& evt, DrawFlag& flag)
{
IString testString;
switch (evt.itemId()) {
case ID_OWNERDRAW1:
testString = "Owner Draw Item 1";
break;
case ID_OWNERDRAW2:
testString = "Owner Draw Item 2";
break;
default:
testString = "unexpected Draw Item";
} /* endswitch */
POINTL drawPoint = evt.itemRect().bottomLeft().asPOINTL();
RECTL drawRect = evt.itemRect().asRECTL();
GpiCharStringPosAt(evt.itemPresSpaceHandle(), &drawPoint, &drawRect,
CHS_CLIP,
testString.length(), (char *)testString,
0);
return true;
}
//
// End of Owner Draw Handler
//
class TMenuWindow : public IFrameWindow,
public ICommandHandler
{
public:
TMenuWindow();
Boolean command( ICommandEvent& cmdEvent );
private:
IMenuBar menu;
ISystemMenu sysMenu;
IStaticText status;
TMenuDraw menuDraw;
};
void main()
{
TMenuWindow window;
IApplication::current().run();
}
TMenuWindow::TMenuWindow()
: IFrameWindow("Menu Test"),
status( 100, this, this),
menu(this,IMenuBar::empty), // empty style needed
sysMenu(this),
menuDraw()
{
ICommandHandler::handleEventsFor(this);
menuDraw.handleEventsFor(&menu);
setClient(&status);
// populate the empty menu bar
menu.addText(20, "Item1");
// NOTE: under version 2.0 then following function name was
// addSubMenu - ie. the "M" is uppercase
menu.addSubmenu(20);
menu.addText(21, "Item1.1", 20);
menu.addText(22, "Item1.2", 20);
menu.addSubmenu(22);
menu.addText(23,"Item1.2.2", 22);
menu.addText(30, "Owner draw items");
menu.addSubmenu(30);
IMenuItem::setDefaultStyle(IMenuItem::drawItem);
IMenuItem od1(ID_OWNERDRAW1);
IMenuItem od2(ID_OWNERDRAW2);
menu.addItem(od1, 30);
menu.addItem(od2, 30);
// Add a submenu to the system menu
sysMenu.addText(20, "Item1", ISystemMenu::idPulldown);
sysMenu.addSubmenu(20);
sysMenu.addText(21, "Item1.1", 20);
sysMenu.addText(22, "Item1.2", 20);
show();
setFocus();
}
Boolean TMenuWindow::command( ICommandEvent& cmdEvent )
{
unsigned long id = cmdEvent.commandId();
if(id == ID_OWNERDRAW1 || id == ID_OWNERDRAW2)
status.setText("A draw item was selected");
else
// This won't get the "text" of the drawItems
status.setText(menu.menuItem(id).text());
return true;
}