⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 menu.bak

📁 完整的在DOS下生成菜单条(Menu Item)功能的代码
💻 BAK
字号:
/*            Generic menu generator          */
#include <conio.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <assert.h>
#include <process.h>
#include <dos.h>

#include "..\wba\gw\custype.h"

//#define ENCRYPT

#define ERROR_SUCCESS 0
//void HideCursor(int flag);
int readini(BYTE * section,BYTE * entry,BYTE * value,BYTE * filename,INT nCount);
void IniError(int r);
void Status(BYTE * info);
void DisplayTime();
/*
void HideCursor(int flag)
{
  if(flag)
  {
	asm{
	mov ah,01h
	mov ch,00011011b
	mov cl,00001100b
	int 10h
       }
  }
  else
  {
	asm{
	mov ah,01h
	mov ch,00001011b
	mov cl,00001100b
	int 10h
	   }
  }
}
*/
int readini(BYTE * section,BYTE * entry,BYTE * value,BYTE * filename,INT nCount)
{
  FILE * fp;
  if((fp=fopen(filename,"rt"))==NULL)
	return -1;  //file open error.
  BYTE ch;
  BYTE * se = new BYTE[128];
  BYTE * en = new BYTE[2048];
  BYTE * temp = new BYTE[2048];
  while(!feof(fp))
  {
	ch = fgetc(fp);
	if(ch=='[')
	{
      fgets(se,128-1,fp);
      BYTE * c;
      if ((c=strchr(se,']'))==NULL)
      {
	fclose(fp);
	delete [] se; delete [] en; delete [] temp;
	return 1;   //'[' and ']' is not patch.
      }
      * c = '\0';
	  if (strcmp(se,section)==0) break;
	}
  }
  if(!feof(fp))
  {
Continue:
	while(TRUE)
	{
		if(fgets(en,2048-1,fp) == NULL) break;
		if(!strchr(en,'[')) break;
		//!strchr(fgets(en,2048-1,fp),'[')&&!feof(fp);
		if(strstr(en,entry)!=NULL)
		{
			for(int i=strlen(en);i>0;--i)
			{
				if(en[i-1]!='\r'&&en[i-1]!='\n'&&en[i-1]!=' ')
				{
					en[i]='\0';
					break;
				}
			}
			int canread = 0;
			for(int n=0;n<strlen(en);n++)
			{
				if (en[n]=='=') canread = 1;
				if (canread)
				{
					if (en[n+1]!=' ')
					{
					   //strcpy(value,&en[n+1]);
					   INT nMinLen = nCount<strlen(en)-n?nCount:strlen(en)-n;
					   memcpy(value,&en[n+1],nMinLen);
					   * (value+nMinLen) = '\0';
					   fclose(fp);
					   delete [] se; delete [] en; delete [] temp;
					   return 0;  //success
					}
				}
			}
	  }
	}
  }
  fclose(fp);
  delete [] se; delete [] en; delete [] temp;
  return 2;  //not found entry point.
}

void IniError(int r)
{
  switch(r)
  {
	case 1: Status("<menu.ini>'[' and ']' is not match."); getch();
	    exit(EXIT_FAILURE); break;
	case 2: Status("<menu.ini>Not found entry point."); getch();
		exit(EXIT_FAILURE); break;
	case -1:Status("<menu.ini>Not found menu.ini."); getch();
	    exit(EXIT_FAILURE); break;
  }
}

void Status(BYTE * info)
{
  textattr((BLACK<<4)+WHITE);
  gotoxy(1,25);
  clreol();
  cprintf(info);
}

void DisplayTime()
{
  static struct time tcOld,tcNew;
  gettime(&tcNew);
  if(tcOld.ti_sec != tcNew.ti_sec)
  {
    int xOld = wherex(),yOld = wherey();
    gotoxy(73,1);
    printf("%02d:%02d:%02d",tcNew.ti_hour,tcNew.ti_min,tcNew.ti_sec);
    gotoxy(xOld,yOld);
	tcOld = tcNew;
  }
}

int main(int argc,char * argv[])
{
  int rv/*The return value of functions*/;
  #ifdef ENCRYPT
	/*-- Authentication --*/
	rv = spawnl(P_WAIT,"checkdog.dll","","xiaorq","rqxiao","logon",NULL);
	if(rv == -1)
	{
	  printf("\nNot found DLL(\"checkdog.dll\")!");
	  return -1;
	}
	if(rv != 0x79)
	{
	  printf("\nUnavailable DLL(\"checkdog.dll\")!");
	  return -1;
	}

	rv = spawnl(P_WAIT,"checkdog.dll","","xiaorq","rqxiao",NULL);
	//if(rv == -1) printf("\nNot found DLL(\"checkdog.dll\")!");
	if(rv != ERROR_SUCCESS) return -1;
  #endif
  clrscr();
  //HideCursor(1);
  //Determine the config file
  char * pIniFile = "Menu.ini";
  if(argc==2) pIniFile = argv[1];

  BYTE * title = new BYTE[80+1];
  assert(title);
  IniError(readini("MenuInfo","Title",title,pIniFile,80));

  BYTE pwd[8+1];
  IniError(readini("MenuInfo","PWD",pwd,pIniFile,8));

  int MenuItemCount;  BYTE * temp = new BYTE[80+1]; assert(temp);
  IniError(readini("MenuInfo","MenuItemCount",temp,pIniFile,32));
  sscanf(temp,"%d",&MenuItemCount); assert(MenuItemCount < 80+1);
  BYTE * Name = new BYTE [20*MenuItemCount+1];
  BYTE line[3], Barline[7];
  BYTE * pCmdArr = new BYTE[(80+1)*MenuItemCount+1]; assert(pCmdArr);
  for(int i =0;i<MenuItemCount;i++)
  {
    strcpy(Barline,"Bar");
    sprintf(line,"%1d",i+1);  strcat(Barline,line);
	IniError(readini(Barline,"Name",temp,pIniFile,19));
    temp[20] = NULL;
    strcpy((Name+20*i),temp);
	IniError(readini(Barline,"RunCommand",pCmdArr+81*i,pIniFile,80));
  }

  int id=0;
Redraw:
  clrscr();
  system("cls");
  textattr((BLUE<<4)+WHITE);
  gotoxy(1,2);
  cprintf("哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪");
  gotoxy(1,24);
  clreol();
  cprintf("哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪");
  gotoxy((80-strlen(title))/2,1);
  cprintf(title);

  int px,py; px=1; py=3;
  textattr((BLACK<<4)+WHITE);
  for(i=0;i<MenuItemCount;i++)
  {
    if(i>20)
    {
      px=20*(i/21)+1;  py=i%21+3;
      gotoxy(px,py);
    }
    else
    {
      gotoxy(px,py);
      py++;
    }
    if(i==id)
    {
      textattr((GREEN<<4)+WHITE);
    }
    else textattr((BLACK<<4)+WHITE);
    cprintf(Name+20*i);
  }
  Status(pCmdArr+81*id);

  BYTE key; int Loopflag/*,ReturnValue*/; Loopflag = 1;
  while(Loopflag)
  {
    while(TRUE)
    {
      if(kbhit()) break;
      DisplayTime();
    }
    key = getch();
    if(!key) key = getch();

    if(key==0x2d)  //Alt+X
    {
      system("cls");
      if(strlen(pwd)!=0)
      {
	char * pPWD = getpass("Password:");
	if(!strcmp(pPWD,pwd)) Loopflag = 0;
	else goto Redraw;
      }
      else
	Loopflag = 0;
    }

    if(key == '\x5')  //Ctrl+E for editing config file
    {
      strcpy(temp,pCmdArr+(80+1)*id);
      int nLen = strlen(temp); BYTE ini[4],inifile[40];
      if(temp[nLen-1]==';') temp[nLen-1]='\0';
      strcpy(ini,temp+nLen-3);
      if(strcmp(strupr(ini),"INI")==0)
      {
	strcpy(inifile,"edit ");
	strcat(inifile,strrchr(temp,' ')?strrchr(temp,' ')+1:"");
	if(strrchr(temp,';'))
	{
	  *strrchr(temp,';') = '\0';

	  BYTE cmd[40+1]; int n=0;
	  for(int i = 0;i<=strlen(temp);i++)
	  {
	    if(temp[i]!=';'&&temp[i]!='\0')
	    {
	      cmd[i-n]=temp[i];
	    }
	    else
	    {
	      cmd[i-n]='\0';
	      textcolor(WHITE);
	      if(strlen(cmd)!=0) system(cmd);
	      n = i+1;
	    }
	  }
	}
	system(inifile);
	goto Redraw;
      }
    }

    if(key==0x50||key==0x48||key==0x47||key==0x4f||key==0x4b||key==0x4d)  //Down arrow,Up arrow,Home,End,Left arrow,Right arrow
    {
      textattr((BLACK<<4)+WHITE);
      px=20*(id/21)+1;  py=id%21+3;
      gotoxy(px,py);
      cprintf(Name+20*id);
      textattr((GREEN<<4)+WHITE);
      if(key==0x50)
      {
	id++;
	if(id==MenuItemCount) id = 0;
      }
      else if(key==0x48)
      {
	id--;
	if(id<0) id = MenuItemCount-1;
      }
      else if(key==0x47) id=0;
      else if(key==0x4f) id=MenuItemCount-1;
      else if(key==0x4b) id=id-21<0?id:id-21;
      else if(key==0x4d) id=id+21>MenuItemCount-1?id:id+21;
      px=20*(id/21)+1;  py=id%21+3;
      gotoxy(px,py);
      cprintf(Name+20*id);
      Status(pCmdArr+81*id);
    }
    if(key==0x0d)
    {
      BYTE cmd[40+1]; int n=0;
      strcpy(temp,pCmdArr+(80+1)*id);
      for(int i = 0;i<=strlen(temp);i++)
      {
	if(temp[i]!=';'&&temp[i]!='\0')
	{
	  cmd[i-n]=temp[i];
	}
	else
	{
	  cmd[i-n]='\0';
	  textcolor(WHITE);
	  if(strlen(cmd)!=0) system(cmd);
	  n = i+1;
	}
      }
      goto Redraw;
    }
  }
  delete [] title; delete []temp; delete [] Name; delete pCmdArr;
  //HideCursor(0);
  system("cls");

  return 0;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -