home *** CD-ROM | disk | FTP | other *** search
/ WarCraft 2000 - Nuclear Epidemic / W2000.nrg / SOURCE.War2000 / menu.cpp < prev    next >
C/C++ Source or Header  |  1998-04-18  |  3KB  |  152 lines

  1. #include "ddini.h"
  2. #include "ResFile.h"
  3. #include "FastDraw.h"
  4. #include "mgraph.h"
  5. #include "mouse.h"
  6. #include "mode.h"
  7. #include "event.h"
  8. extern int SCRSizeX;
  9. extern int SCRSizeY;
  10. extern int RSCRSizeX;
  11. extern int RSCRSizeY;
  12. extern int COPYSizeX;
  13. typedef void fnc(void);
  14. struct AZone{
  15.     int x,y,x1,y1;
  16. };
  17. class Menu{
  18. public:
  19.     Menu(void);
  20.     bool    Active:1;
  21.     bool    MakeShift:1;
  22.     bool    ChangeFont:1;
  23.     bool    EraseOnChoose:1;
  24.     LPCSTR  items;
  25.     int        MenuLy;
  26.     int        ItemLy;
  27.     int        NItems;
  28.     int        StartY;
  29.     fnc*    RedrawBackground;
  30.     AZone    Zone[16];
  31.     int        NZones;
  32.     int        choose;;
  33.     lpRLCFont font;
  34.     lpRLCFont font1;
  35.     int        evHandler;
  36.     void    CreateMenu(LPCSTR s,lpRLCFont f,lpRLCFont f1,fnc* ff,int style);
  37.     void    Show(int n);
  38.     int        GetAmount();
  39.     LPCSTR  GetNstr(int n);
  40.     int        GetLen(LPCSTR s);
  41.     void    ShowModal();
  42.     void    Close();
  43.  
  44. };
  45. Menu::Menu(){
  46.     items=NULL;
  47.     NZones=0;
  48. };
  49.  
  50. void MouseHandle(void* par){
  51.     int j=-1;
  52.     Menu* mn=(Menu*)par;
  53.     for(int i=0;i<(*mn).NZones;i++) 
  54.         if(mouseX>=(*mn).Zone[i].x && mouseY>=(*mn).Zone[i].y && 
  55.            mouseX<(*mn).Zone[i].x1 && mouseY<(*mn).Zone[i].y1) j=i;
  56.     (*mn).Show(j);
  57.     if(Lpressed && j!=-1){
  58.         if(mn->EraseOnChoose){
  59.             CloseEventHandler((*mn).evHandler);
  60.             mn->Active=false;
  61.         };
  62.         (*mn).choose=j;
  63.     }else (*mn).choose=-1;
  64.     return;
  65. };
  66. //"Item1|Item2|Item3"
  67. char tmpstr[1000];
  68. int Menu::GetAmount(){
  69.     int j=0;
  70.     int    i;
  71.     if(!int(items)) return 0;
  72.     for(i=0;items[i]!=0;i++)if(items[i]=='|')j++;
  73.     return j+1;
  74. };
  75. LPCSTR Menu::GetNstr(int n){
  76.     int j=0;
  77.     int i;
  78.     tmpstr[0]=0;
  79.     if(!int(items))return LPCSTR(&tmpstr);
  80.     for(i=0;j<n&&items[i]!=0;i++)
  81.     {
  82.         if(items[i]=='|')j++;
  83.     };
  84.     if(j!=n)return LPCSTR(&tmpstr);
  85.     for(int k=0;items[i]!=0&&items[i]!='|';i++,k++)
  86.         tmpstr[k]=items[i];
  87.     tmpstr[k]=0;
  88.     return LPCSTR(&tmpstr);
  89. };
  90. int Menu::GetLen(LPCSTR s){
  91.     if(!int(s))return 0;
  92.     int x=0;
  93.     for(int i=0;s[i]!=0;i++)
  94.         x+=GetRLCWidth(font->RLC,font->FirstSymbol+s[i]);
  95.     return x;
  96. };
  97. void Menu::CreateMenu(LPCSTR s,lpRLCFont f,lpRLCFont f1,fnc* ff,int style){
  98.     if(!int(items))delete((void*)items);
  99.     items=new(char[strlen(s)+1]);
  100.     memcpy((void*)items,s,strlen(s)+1);
  101.     NItems=GetAmount();
  102.     font=f;
  103.     font1=f1;
  104.     NZones=NItems;
  105.     ItemLy=GetRLCHeight(font->RLC,font->FirstSymbol+'W');
  106.     MenuLy=ItemLy*NItems;
  107.     StartY=(RSCRSizeY-MenuLy)/2;
  108.     int Ly=0;
  109.     for(int i=0;i<NItems;i++){
  110.         LPCSTR ss=GetNstr(i);
  111.         int Lx=GetLen(ss);
  112.         Zone[i].x=(COPYSizeX-Lx)/2+100;
  113.         Zone[i].y=StartY+i*ItemLy;
  114.         Zone[i].x1=Zone[i].x+Lx;
  115.         Zone[i].y1=Zone[i].y+ItemLy;
  116.     };
  117.     
  118.     RedrawBackground=ff;
  119.     Active=style&1?true:false;
  120.     MakeShift=style&2?true:false;
  121.     ChangeFont=style&4?true:false;
  122.     EraseOnChoose=style&8?true:false;
  123. };
  124. void Menu::Show(int n){
  125.     if(!int(items)) return;
  126.     if(int(RedrawBackground))(*RedrawBackground)();
  127.     for(int i=0;i<NItems;i++){
  128.         LPCSTR s=GetNstr(i);
  129.         int x=Zone[i].x;
  130.         int y=Zone[i].y;
  131.         lpRLCFont ff=font;
  132.         if(i==n){
  133.             if(MakeShift){x+=2;y+=2;}
  134.             if(ChangeFont)ff=font1;
  135.         };
  136.         ShowString(x,y,s,ff);
  137.     };
  138. };
  139.  
  140. void Menu::ShowModal(){
  141.     if(!Active){
  142.         evHandler=RegisterEventHandler(&MouseHandle,21,this);
  143.         choose=-1;
  144.         Active=true;
  145.     };
  146. };
  147. void Menu::Close(){
  148.     CloseEventHandler(evHandler);
  149.     Active=false;
  150. };
  151.  
  152.