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

📄 wacmenu.cpp

📁 一个DOS下的菜单
💻 CPP
📖 第 1 页 / 共 2 页
字号:
// wacmenu.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include <stdio.h>
#include "wacmenu.h"
#include "resource.h"

BUTTON	g_Button[BUTTON_COUNT];
WINDOW	g_Window;
BOOL g_bExit = FALSE;
DWORD g_TimerId;
//char	g_ExePath[MAX_PATH];

void InitButtonData()
{
	HANDLE Handle = ConOutputHandle();
	if(GetConsoleScreenBufferInfo(Handle, &g_Buffer)){
		if(g_Buffer.dwSize.Y > 60)
			g_Buffer.dwSize.Y = 60;
		g_PosX = g_Buffer.dwSize.X/2-40;
		g_PosY = g_Buffer.dwSize.Y/2-12;
		g_StepX = g_Buffer.dwSize.X/4-12;
		g_StepY = (g_Buffer.dwSize.Y - 1)/(BUTTON_COUNT/2+2);
		g_PosY = ((g_Buffer.dwSize.Y - 1)-(BUTTON_COUNT/2+2)*g_StepY)/3-1;
	}
    ConClearScreen(0,0,g_Buffer.dwSize.X-1,g_Buffer.dwSize.Y-1,0);
	ConDrawPanel(0,0,g_Buffer.dwSize.X-1,g_Buffer.dwSize.Y-1,BASIC_COLOR);
	g_Button[0].m_ButtonName = new char[20];
	memset(g_Button[0].m_ButtonName, 0, 20*sizeof(char));
	for(int i=1; i < BUTTON_COUNT; i++){
		g_Button[i].m_ButtonName = new char[15];
		memset(g_Button[i].m_ButtonName, 0, 15*sizeof(char));
		g_Button[i].m_Remark = new char[80];
		memset(g_Button[i].m_Remark, 0, 80*sizeof(char));
	}
	g_Button[0].m_ButtonName = "WAC Explorer";
	g_Button[1].m_ButtonName = "Registry Editor";
	g_Button[2].m_ButtonName = "Text Editor";
	g_Button[3].m_ButtonName = "Mail Inbox";
	g_Button[4].m_ButtonName = "Chat Tool";
	g_Button[5].m_ButtonName = "Configurations";
	g_Button[6].m_ButtonName = "Service Manager";
	g_Button[7].m_ButtonName = "Event Viewer";
	g_Button[8].m_ButtonName = "Binary Editor";
	g_Button[9].m_ButtonName = "Process Viewer";
	g_Button[10].m_ButtonName = "Session Manager";
	g_Button[11].m_ButtonName = "User Manager";
	g_Button[12].m_ButtonName = "System Information";
	g_Button[13].m_ButtonName = "Quit";

	g_Button[0].m_Remark = "Exploring server's local files or network neighborhoods       ";
	g_Button[1].m_Remark = "View and edit Windows registry                                ";
	g_Button[2].m_Remark = "A much powerful text editor than the old DOS edit tool        ";
	g_Button[3].m_Remark = "A tool that let you view your email inbox messages            ";
	g_Button[4].m_Remark = "A chat tool between WAC users                                 ";
	g_Button[5].m_Remark = "Configurations WAC Server for this user                       ";
	g_Button[6].m_Remark = "Managing all Windows services                                 ";
	g_Button[7].m_Remark = "Windows event viewer                                          ";
	g_Button[8].m_Remark = "An editor for binary files                                    ";
	g_Button[9].m_Remark = "Windows process viewer                                        ";
	g_Button[10].m_Remark = "Managing all the user sessions of WAC server                  ";
	g_Button[11].m_Remark = "Managing local users and user groups on your server           ";
	g_Button[12].m_Remark = "Displaying system general information and device list         ";
	g_Button[13].m_Remark = "Quit this program                                             ";

	g_Button[0].m_HighKey = 6;
	g_Button[1].m_HighKey = 4;
	g_Button[2].m_HighKey = 6;
	g_Button[3].m_HighKey = 7;
	g_Button[4].m_HighKey = 7;
	g_Button[5].m_HighKey = 10;
	g_Button[6].m_HighKey = 4;
	g_Button[7].m_HighKey = 6;
	g_Button[8].m_HighKey = 5;
	g_Button[9].m_HighKey = 5;
	g_Button[10].m_HighKey = 10;
	g_Button[11].m_HighKey = 6;
	g_Button[12].m_HighKey = 10;
	g_Button[13].m_HighKey = 10;

	for(i=0; i<BUTTON_COUNT/2; i++){
		if(i==0){
			g_Button[0].m_ButtonY = 2*g_PosY + 2 * g_StepY + 1;//5 + g_PosY;
			g_Button[0].m_ButtonX = g_StepX;//6 + g_PosX;
			g_Button[0].m_ButtonLen = 24;
		}else{
			g_Button[i].m_ButtonY = g_Button[i-1].m_ButtonY + g_StepY;//3 ;
			g_Button[i].m_ButtonX = g_Button[i-1].m_ButtonX;
			g_Button[i].m_ButtonLen = g_Button[i-1].m_ButtonLen;
		}
		g_Button[i+BUTTON_COUNT/2].m_ButtonY = g_Button[i].m_ButtonY;
		g_Button[i+BUTTON_COUNT/2].m_ButtonX = g_Button[i].m_ButtonX + g_Buffer.dwSize.X/2;
		g_Button[i+BUTTON_COUNT/2].m_ButtonLen = g_Button[i].m_ButtonLen;
	}
	g_Window.SetDefaultButton(0);
}

BOOL WINDOW::SetDefaultButton(int SelectID)
{
	if(SelectID<0 || SelectID>=BUTTON_COUNT) 
		return FALSE;
	static int bFirst = 0;
	if(bFirst){
		m_OldDefaultButton = m_NewDefaultButton;
		m_NewDefaultButton = SelectID;
	}else{
		bFirst = 1;
		m_NewDefaultButton = 0;
		m_OldDefaultButton = -1;
	}
	return TRUE;
}

// 处理鼠标移动事件
void ProcTimer(int x, int y, BOOL bLButtonDown)
{
	if(bLButtonDown)
		return;
	int ButtonID = g_Window.GetButtonID(x,y);
	g_Window.DrawRemark(ButtonID);
}

void InitScreen()
{
	ConDrawPanel(0,0,g_Buffer.dwSize.X-1,0,TITLE_COLOR);
	ConWriteText(14+g_PosX,0,"Welcome to Windows Access Server from Foxit Software",TITLE_COLOR);
	ConWriteText(2+g_PosX,g_PosY+g_StepY,"WAC Server integrates a collection of great tools for remote administration.",BASIC_COLOR);
	ConWriteText(2+g_PosX,g_PosY + 1+g_StepY,"Please click on any of the following buttons or press the highlighted key:",BASIC_COLOR);

	for(int i=0; i<BUTTON_COUNT; i++){
		g_Window.RedrawButton(i);
	}

	ConWriteText(2+g_PosX, g_Buffer.dwSize.Y-1, "Foxit Software WAC Server 2.0              Copyright (C) Foxit Software 2003", STATUS_COLOR);
	ConDrawPanel(0,g_Buffer.dwSize.Y-1,g_Buffer.dwSize.X-1,g_Buffer.dwSize.Y-1,STATUS_COLOR);

	g_Window.DrawRemark(0);
}

int WINDOW::GetButtonID(int PosX,int PosY)
{
	for(int i=0; i<BUTTON_COUNT; i++){
		if(PosY == g_Button[i].m_ButtonY && PosX >= g_Button[i].m_ButtonX && 
			PosX < g_Button[i].m_ButtonX + g_Button[i].m_ButtonLen)
			return i;
	}
	return -1;
}

void WINDOW::RedrawButton(int SelectID)
{
	if(SelectID<0 || SelectID>=BUTTON_COUNT) 
		return ;
	char* str = new char[g_Button[SelectID].m_ButtonLen+1];
	memset(str,'\x20',g_Button[SelectID].m_ButtonLen);
	str[g_Button[SelectID].m_ButtonLen] = 0;
	memcpy(str+(g_Button[SelectID].m_ButtonLen-strlen(g_Button[SelectID].m_ButtonName))/2
		,g_Button[SelectID].m_ButtonName,strlen(g_Button[SelectID].m_ButtonName));

	if(g_Window.m_bPushed){
		// 去掉两边默认标志
		ConWriteText(g_Button[m_OldDefaultButton].m_ButtonX,
			g_Button[m_OldDefaultButton].m_ButtonY," ",BUTTON_COLOR);
		ConWriteText(g_Button[m_OldDefaultButton].m_ButtonX+g_Button[m_OldDefaultButton].m_ButtonLen-1,
						g_Button[m_OldDefaultButton].m_ButtonY," ",BUTTON_COLOR);

		ConScrollText(g_Button[SelectID].m_ButtonX,g_Button[SelectID].m_ButtonY
						,g_Button[SelectID].m_ButtonX + g_Button[SelectID].m_ButtonLen
						,g_Button[SelectID].m_ButtonY,1,0,BASIC_COLOR);
		// 去掉底下阴影
		memset(str, '\x20', g_Button[SelectID].m_ButtonLen);
		str[g_Button[SelectID].m_ButtonLen] = 0;

		ConWriteText(g_Button[SelectID].m_ButtonX+1,g_Button[SelectID].m_ButtonY+1,
						str, BUTTON_BORDER_COLOR);		// Button下边的阴影

	}else{
		ConWriteText(g_Button[SelectID].m_ButtonX,g_Button[SelectID].m_ButtonY
							,str,BUTTON_COLOR);	// 写上名字
		ConDrawPanel(g_Button[SelectID].m_ButtonX+g_Button[SelectID].m_HighKey,g_Button[SelectID].m_ButtonY,
			g_Button[SelectID].m_ButtonX+g_Button[SelectID].m_HighKey,g_Button[SelectID].m_ButtonY,HIGHKEY_COLOR);
		if(SelectID==m_NewDefaultButton)
			if(m_NewDefaultButton>=0 && m_NewDefaultButton<BUTTON_COUNT){
				if(m_OldDefaultButton>=0 && m_OldDefaultButton<BUTTON_COUNT){
				// 去掉两边默认标志
					ConWriteText(g_Button[m_OldDefaultButton].m_ButtonX,
						g_Button[m_OldDefaultButton].m_ButtonY," ",BUTTON_COLOR);
					ConWriteText(g_Button[m_OldDefaultButton].m_ButtonX+g_Button[m_OldDefaultButton].m_ButtonLen-1,
								g_Button[m_OldDefaultButton].m_ButtonY," ",BUTTON_COLOR);

//					ConScrollText(g_Button[SelectID].m_ButtonX,g_Button[SelectID].m_ButtonY
//								,g_Button[SelectID].m_ButtonX + g_Button[SelectID].m_ButtonLen
//								,g_Button[SelectID].m_ButtonY,1,0,BASIC_COLOR);
				}
				// 写上新的默认标志
				ConWriteText(g_Button[SelectID].m_ButtonX ,g_Button[SelectID].m_ButtonY,
							"\x10", BUTTON_COLOR);		// DefaultButton左边的标志
				ConWriteText(g_Button[SelectID].m_ButtonX+g_Button[SelectID].m_ButtonLen-1,
							g_Button[SelectID].m_ButtonY,"\x11", BUTTON_COLOR);
														// DefaultButton右边的标志
			}
		ConWriteText(g_Button[SelectID].m_ButtonX + g_Button[SelectID].m_ButtonLen,g_Button[SelectID].m_ButtonY,
						"\xdc", BUTTON_BORDER_COLOR);	// Button右边的阴影

		memset(str, '\xdf', g_Button[SelectID].m_ButtonLen);
		str[g_Button[SelectID].m_ButtonLen] = 0;

		ConWriteText(g_Button[SelectID].m_ButtonX+1,g_Button[SelectID].m_ButtonY+1,
						str, BUTTON_BORDER_COLOR);		// Button下边的阴影
		
	}
	delete str;
}
void SaveScreen()
{
	if (g_pScrBuf == NULL) {
		// Allocate buffer
		g_hStdOut= CreateFile("CONOUT$",GENERIC_WRITE | GENERIC_READ,0,NULL,OPEN_EXISTING,0,NULL);
		g_pScrBuf = new BYTE[sizeof(CHAR_INFO) * g_Buffer.dwSize.X * g_Buffer.dwSize.Y];
	}
	COORD size;
	size.X = g_Buffer.dwSize.X;
	size.Y = g_Buffer.dwSize.Y;
	COORD pos;
	pos.X = 0;
	pos.Y = 0;
	SMALL_RECT rect;
	rect.Left = 0;
	rect.Top = 0;
	rect.Right = g_Buffer.dwSize.X-1;
	rect.Bottom = g_Buffer.dwSize.Y-1;
	ReadConsoleOutputW(g_hStdOut, (PCHAR_INFO)g_pScrBuf, size, pos, &rect);
}

void RestoreScreen()
{
	COORD size;
	size.X = g_Buffer.dwSize.X;
	size.Y = g_Buffer.dwSize.Y;
	COORD pos;
	pos.X = 0;
	pos.Y = 0;
	SMALL_RECT rect;
	rect.Left = 0;
	rect.Top = 0;
	rect.Right = g_Buffer.dwSize.X-1;
	rect.Bottom = g_Buffer.dwSize.Y-1;
	WriteConsoleOutputW(g_hStdOut, (PCHAR_INFO)g_pScrBuf, size, pos, &rect);
}

BOOL StartApp(LPCSTR AppName)
{
	char AppPath[MAX_PATH];
	strcpy(AppPath, g_ExePath);
	strcat(AppPath, "\\");
	strcat(AppPath, AppName);

	ConLockInput();
	SaveScreen();
	STARTUPINFO si;
	memset(&si, 0, sizeof si);
	si.cb = sizeof si;
	PROCESS_INFORMATION pi;
	BOOL bRet = CreateProcess(AppPath, (char*)AppName, NULL, NULL, FALSE, 0, NULL, NULL,
			&si, &pi);
	if (!bRet) {
		ConUnlockInput();
		ConMessageBox("Sorry, can't start the application, please check your\n"
			"WAC installation directory.", "Application Error");
		return FALSE;
	}
	WaitForSingleObject(pi.hProcess, INFINITE);
	RestoreScreen();
	ConUnlockInput();
	ConSetCursorInfo(15,FALSE);
	return TRUE;
}

void WINDOW::DrawRemark(int SelectID)
{
	if(SelectID == -1)
		return;
	static RemarkPosY = g_Button[BUTTON_COUNT/2-1].m_ButtonY + g_StepY;
	if(RemarkPosY >=g_Buffer.dwSize.Y-1){
		RemarkPosY = g_Buffer.dwSize.Y-3;
	}
	if(RemarkPosY <= g_Button[BUTTON_COUNT/2-1].m_ButtonY + 1){
		RemarkPosY = g_Button[BUTTON_COUNT/2-1].m_ButtonY + 2;
	}
	if(SelectID==-1){
		ConClearScreen(0,g_Button[BUTTON_COUNT/2-1].m_ButtonY+g_StepY+2*g_PosY-1,
			g_Buffer.dwSize.X-1,g_Button[BUTTON_COUNT/2-1].m_ButtonY+g_StepY+2*g_PosY-1,BASIC_COLOR);
//		ConClearScreen(0,g_Button[BUTTON_COUNT/2-1].m_ButtonY+g_StepY+2*g_PosY,
//			g_Buffer.dwSize.X-1,g_Button[BUTTON_COUNT/2-1].m_ButtonY+g_StepY+2*g_PosY,BASIC_COLOR);
//		ConWriteText(6+g_PosX,22+g_PosY,"                                                                   ",REMARK_COLOR);
		return;
	}
	if(SelectID < 0 && SelectID >= BUTTON_COUNT)
		return;
//	ConClearScreen(0,22,79,23,REMARK_COLOR);
	char* str = new char[g_Buffer.dwSize.X];
	memcpy(str,g_Button[SelectID].m_Remark,g_Buffer.dwSize.X-5);
	str[g_Buffer.dwSize.X-5] = 0;
	ConWriteText(6+g_PosX,RemarkPosY,str,REMARK_COLOR);
	if(strlen(g_Button[SelectID].m_Remark)>g_Buffer.dwSize.X-5){
		memcpy(str,g_Button[SelectID].m_Remark + g_Buffer.dwSize.X-5,g_Buffer.dwSize.X-5);
		str[g_Buffer.dwSize.X-5] = 0;
		ConWriteText(6+g_PosX,RemarkPosY+1,str,REMARK_COLOR);
	}
	delete str;
}

BOOL WINDOW::SetCheckButton(int SelectID)
{
	if(SelectID<0 || SelectID>=BUTTON_COUNT){
		m_CheckButton = -1;
		m_bPushed = FALSE;
		return FALSE;
	}
	m_CheckButton = SelectID;
	m_bPushed = TRUE;
	return TRUE;
}

BOOL WINDOW::SetMousePosButton(int SelectID)
{
	if(SelectID<0 || SelectID>=BUTTON_COUNT) 
		return FALSE;
	static int bFirst = 0;
	if(bFirst){
		m_OldMousePosButton = m_NewDefaultButton;
		m_NewMousePosButton = SelectID;
	}else{
		bFirst = 1;
		m_NewMousePosButton = 0;

⌨️ 快捷键说明

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