home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
WarCraft 2000 - Nuclear Epidemic
/
W2000.nrg
/
SOURCE.War2000
/
menu.cpp
< prev
next >
Wrap
C/C++ Source or Header
|
1998-04-18
|
3KB
|
152 lines
#include "ddini.h"
#include "ResFile.h"
#include "FastDraw.h"
#include "mgraph.h"
#include "mouse.h"
#include "mode.h"
#include "event.h"
extern int SCRSizeX;
extern int SCRSizeY;
extern int RSCRSizeX;
extern int RSCRSizeY;
extern int COPYSizeX;
typedef void fnc(void);
struct AZone{
int x,y,x1,y1;
};
class Menu{
public:
Menu(void);
bool Active:1;
bool MakeShift:1;
bool ChangeFont:1;
bool EraseOnChoose:1;
LPCSTR items;
int MenuLy;
int ItemLy;
int NItems;
int StartY;
fnc* RedrawBackground;
AZone Zone[16];
int NZones;
int choose;;
lpRLCFont font;
lpRLCFont font1;
int evHandler;
void CreateMenu(LPCSTR s,lpRLCFont f,lpRLCFont f1,fnc* ff,int style);
void Show(int n);
int GetAmount();
LPCSTR GetNstr(int n);
int GetLen(LPCSTR s);
void ShowModal();
void Close();
};
Menu::Menu(){
items=NULL;
NZones=0;
};
void MouseHandle(void* par){
int j=-1;
Menu* mn=(Menu*)par;
for(int i=0;i<(*mn).NZones;i++)
if(mouseX>=(*mn).Zone[i].x && mouseY>=(*mn).Zone[i].y &&
mouseX<(*mn).Zone[i].x1 && mouseY<(*mn).Zone[i].y1) j=i;
(*mn).Show(j);
if(Lpressed && j!=-1){
if(mn->EraseOnChoose){
CloseEventHandler((*mn).evHandler);
mn->Active=false;
};
(*mn).choose=j;
}else (*mn).choose=-1;
return;
};
//"Item1|Item2|Item3"
char tmpstr[1000];
int Menu::GetAmount(){
int j=0;
int i;
if(!int(items)) return 0;
for(i=0;items[i]!=0;i++)if(items[i]=='|')j++;
return j+1;
};
LPCSTR Menu::GetNstr(int n){
int j=0;
int i;
tmpstr[0]=0;
if(!int(items))return LPCSTR(&tmpstr);
for(i=0;j<n&&items[i]!=0;i++)
{
if(items[i]=='|')j++;
};
if(j!=n)return LPCSTR(&tmpstr);
for(int k=0;items[i]!=0&&items[i]!='|';i++,k++)
tmpstr[k]=items[i];
tmpstr[k]=0;
return LPCSTR(&tmpstr);
};
int Menu::GetLen(LPCSTR s){
if(!int(s))return 0;
int x=0;
for(int i=0;s[i]!=0;i++)
x+=GetRLCWidth(font->RLC,font->FirstSymbol+s[i]);
return x;
};
void Menu::CreateMenu(LPCSTR s,lpRLCFont f,lpRLCFont f1,fnc* ff,int style){
if(!int(items))delete((void*)items);
items=new(char[strlen(s)+1]);
memcpy((void*)items,s,strlen(s)+1);
NItems=GetAmount();
font=f;
font1=f1;
NZones=NItems;
ItemLy=GetRLCHeight(font->RLC,font->FirstSymbol+'W');
MenuLy=ItemLy*NItems;
StartY=(RSCRSizeY-MenuLy)/2;
int Ly=0;
for(int i=0;i<NItems;i++){
LPCSTR ss=GetNstr(i);
int Lx=GetLen(ss);
Zone[i].x=(COPYSizeX-Lx)/2+100;
Zone[i].y=StartY+i*ItemLy;
Zone[i].x1=Zone[i].x+Lx;
Zone[i].y1=Zone[i].y+ItemLy;
};
RedrawBackground=ff;
Active=style&1?true:false;
MakeShift=style&2?true:false;
ChangeFont=style&4?true:false;
EraseOnChoose=style&8?true:false;
};
void Menu::Show(int n){
if(!int(items)) return;
if(int(RedrawBackground))(*RedrawBackground)();
for(int i=0;i<NItems;i++){
LPCSTR s=GetNstr(i);
int x=Zone[i].x;
int y=Zone[i].y;
lpRLCFont ff=font;
if(i==n){
if(MakeShift){x+=2;y+=2;}
if(ChangeFont)ff=font1;
};
ShowString(x,y,s,ff);
};
};
void Menu::ShowModal(){
if(!Active){
evHandler=RegisterEventHandler(&MouseHandle,21,this);
choose=-1;
Active=true;
};
};
void Menu::Close(){
CloseEventHandler(evHandler);
Active=false;
};