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

📄 applicat.cpp

📁 DOS下的图形界面开发包
💻 CPP
📖 第 1 页 / 共 3 页
字号:
///////////////////////////////////////////////////////////////
///////// Note::: ONLY SLOWTIMER_MSG  DISHIBITED  5/27/1994
///////////////////////////////////////////////////////////////

// 1993 (c) ALL RIGHTS RESERVED
// AUTHOR:  XuYongYong

/*      applicat.cpp
*/
#include "applicat.h"
#include "yyxmain.h"
#include "msgbox.h"
#include <process.h>
#include <dos.h>
#include <alloc.h>
#include "mouse.h"

#include <malloc.h>
#include <string.h>
#include <fcntl.h>
#include <stdio.h>

extern "C" far _selectVGABitPlane ( int planeNo, int cmd );
enum dosErr { dosInvalidFuncCode = 1, dosFileNotFound, dosPathNotFound,
	dosTooManyOpenFiles, dosAccessDenied, dosInvalidHandle,
	dosMemCtrlBkDestryed, dosInsufficientMem, dosInvalidMemBkAddr,
	dosInvalidEnvir, dosInvalidFormat, dosInvalidAccessCode,
	dosInvalidDate, dosUnKnownErr, dosInvalidDrv, dosAttemptRDCurDir,
	dosNotSameDevice, dosNoMoreFiles, dosDiskIsWriteProtected,
	dosBadDiskUnit, dosDriveNotReady, dosInvalidDiskCom, dosCRCErr,
	dosInvalidLeninDiskOp, dosSeekErr, dosNotDosDisk, dosSectorNotFound,
	dosOutofPaper, dosWriteFault, dosReadFault, dosGeneralFailt,
	dosSharingViolation, dosLockViolation, dosWrongDisk };


application_class::application_class (int menu_num,char *title)
{ int i;
	this->menu_num =menu_num;
	if (this->menu_num<40) this->menu_num=40;
	my_menu=(Tmenu **) farmalloc( (sizeof (Tmenu*)) * (menu_num+1) );
	for (i=0;i<menu_num;i++ ) my_menu[i]=NULL;
	for (i=0;i<=5;i++ )  sub_sysmenu[i]=NULL;
	for (i=0;i<=5;i++ )  sub_win_sysmenu[i]=NULL;
	start_menu =NULL;

	this->title =title;
// /interrupt/interrupt/interrupt/interrupt/interrupt/interrupt/interrupt
//      timer_active =FALSE;
//      kb_active=FALSE;
//      TIMER_COUNT =10;
//      SLOW_TIMER_COUNT =20;

	init_msg();     //MUST DO IT FIRST,in case clock send msg

	old_timer =getvect (TIMER_VECTOR);
	setvect (TIMER_VECTOR,application_class::timer);

	key_code =0;
	old_key =getvect (KEY_VECTOR);
	setvect (KEY_VECTOR,application_class::key  );

	old_dos_error =getvect (DOS_ERROR_VECTOR );
	setvect (DOS_ERROR_VECTOR ,application_class::dos_error  );

	old_mouse =getvect (MOUSE_VECTOR);              //MUST INIT LATER
//      setvect (MOUSE_VECTOR,application_class::mouse  );
}

BOOL application_class::timer_active =FALSE;
BOOL application_class::kb_active=FALSE;
BOOL application_class::mouse_active=FALSE;
BOOL application_class::dos_error_active=FALSE;

int      application_class::TIMER_COUNT =20;
int  application_class::SLOW_TIMER_COUNT =40;
//int  application_class::key_code =0;
int  application_class::time_counter =0;
int  application_class::slow_time_counter =0;

application_class::~application_class ()
{ int i;
//      my_menu[0]->dispose_all_submenus();
//      delete (my_menu[0]);
	for (i=0;i<menu_num;i++ ) if (my_menu[i]!=NULL ) delete (my_menu[i]);
//      delete (my_menu[39]);
	delete (sysmenu);
	for (i=0;i<=5;i++ ) if (sub_sysmenu[i]!=NULL )delete (sub_sysmenu[i]);
	delete (win_sysmenu);
	for (i=0;i<=5;i++ )if(sub_win_sysmenu[i]!=NULL )delete (sub_win_sysmenu[i]);
//
	if (start_menu !=NULL) delete (start_menu);
	farfree (my_menu);

//   restore old int1c
	if (getvect(TIMER_VECTOR)==application_class::timer )
	setvect (TIMER_VECTOR,old_timer);
	if (getvect(KEY_VECTOR)==application_class::key )
	setvect (KEY_VECTOR,old_key);
	if (getvect(MOUSE_VECTOR)==application_class::mouse)
	setvect (MOUSE_VECTOR,old_mouse);
	if (getvect(DOS_ERROR_VECTOR)==application_class::dos_error)
	setvect (DOS_ERROR_VECTOR,old_dos_error);

	if (sysmouse) delete sysmouse;
}


void application_class::get_my_menu()
{
	my_menu[0] =new Tmenu (0,title,main_help_text,NULL );

	sysmenu =new Tsysmenu (101,"& ","ALT_SPACE",my_menu[0]); {
		sysmenu->bounds.left =my_menu[0]->bounds.left+1;
		sysmenu->bounds.top =my_menu[0]->bounds.top+1;
		sysmenu->bounds.right=sysmenu->bounds.left+bar_height-2;
		sysmenu->bounds.bottom =my_menu[0]->bounds.bottom-1;
	}
	sub_sysmenu[0]=new Tmenu(SYS_RESTOREID,"&Restore","Restore windnow ",sysmenu);
	sub_sysmenu[1]=new Tmenu(SYS_MOVEID,"&Move","Move window",sysmenu);
	sub_sysmenu[2]=new Tmenu(SYS_SIZEID,"&Size","Change window size",sysmenu);
	sub_sysmenu[3]=new Tmenu(SYS_MINIMIZEID,"Mi&nimize","Iconinize window",sysmenu);
	sub_sysmenu[4]=new Tmenu(SYS_MAXIMIZEID,"Ma&ximize","Streatch window",sysmenu);
	sub_sysmenu[5]=new Tmenu(SYS_CLOSEID,"Close","Close window",sysmenu);
 int i;
	for (i=0;i<5;i++) sub_sysmenu[i]->status |= DISABLE;
// the order is important
	win_sysmenu =new Tsysmenu (100,"","",my_menu[0]); {
		win_sysmenu->bounds.left =my_menu[0]->bounds.left+1;
		win_sysmenu->bounds.top =my_menu[0]->bounds.top+1;
		win_sysmenu->bounds.right=win_sysmenu->bounds.left+bar_height-LINE_WIDTH+1;
		win_sysmenu->bounds.bottom =my_menu[0]->bounds.bottom-1;
//              OffsetRect (&win_sysmenu->bounds ,100,100 );
		win_sysmenu->status =INVISIBLE;
	}
	sub_win_sysmenu[0]=new Tmenu(WIN_SYS_RESTOREID,"&Restore","Restore windnow to ",win_sysmenu);
	sub_win_sysmenu[1]=new Tmenu(WIN_SYS_MOVEID,"&Move","Move window",win_sysmenu);
	sub_win_sysmenu[2]=new Tmenu(WIN_SYS_SIZEID,"&Size","Change window size",win_sysmenu);
	sub_win_sysmenu[3]=new Tmenu(WIN_SYS_MINIMIZEID,"Mi&nimize","Iconinize window",win_sysmenu);
	sub_win_sysmenu[4]=new Tmenu(WIN_SYS_MAXIMIZEID,"Ma&ximize","Streatch window",win_sysmenu);
	sub_win_sysmenu[5]=new Tmenu(WIN_SYS_CLOSEID,"Close","Close window",win_sysmenu);

//  Set Imme_key
	Imme_Menu_ID[0]= SYS_CLOSEID ;  Immediate_key[0]=ALT_F4; Imme_Menu_fptr[0]=sub_win_sysmenu[5];
	Max_Imme_key_nums=2;
}

BOOL application_class::echo_to_menu(long menu_ID)      // utter virtual
{
	switch (menu_ID ){
		case SYS_CLOSEID    :thequeue.SendMessage(0
				,SysQuitMSG,NULL );
			break;
		case WIN_SYS_CLOSEID :
			thequeue.SendMessage(pcurrent_selected_win->ID
				,WinSysCloseMSG,pcurrent_selected_win );
			break;
		case DOSSHELL           : DosShell (); break;
		case WIN_SYS_MOVEID :
		case WIN_SYS_SIZEID     :
			key_code=CTRL_F5;
			thequeue.SendMessage(0, KeyPressedMSG,NULL);
			break;
		default :return FALSE;
	}
	return TRUE;    // handled
}

/* ********************************************************************* */
/* ****************************   KEY    ******************************* */
/* ********************************************************************* */
int  application_class::key_pressed_handler ( int key_scan_num )
{
		return FALSE;
}

/* ********************************************************************* */
/* ****************************   MSG    ******************************* */
/* ********************************************************************* */
void application_class::show_status(int kind)
{// disable();
	getviewsettings (&current_viewport );
	setport (menu_viewport);
	setcolor (HELP_TEXT_COLOR);
	switch ( kind ) {
		case SYS_STATUS:
			FillRect ( sys_status_rect,HELP_RECT_COLOR );
			outtextxy(sys_status_rect.left+10,sys_status_rect.top,sys_status_string);
			break;
		case STATUS:
			FillRect ( status_rect,HELP_RECT_COLOR );
			outtextxy(status_rect.left+10,status_rect.top,status_string);
			break;
		case HELP_STATUS:
			FillRect ( on_line_help_rect,HELP_RECT_COLOR );
			outtextxy( on_line_help_rect.left+10,on_line_help_rect.top,main_help_text);
			break;
	}
//      disable();
	setport (current_viewport );
//      enable();
}

int application_class::first_class_msg_handler ( MSG& message )
{
	switch ( message .Action){
//              case MouseLButtonDownMSG:
//                      break;
		case MenuActionMSG:
			return echo_to_menu(sysmsg.ID);
		case DlgOkedMSG:
			return Dlg_OK;
		case DlgCanceledMSG:
			return Dlg_CANCEL;
/*              case TimerMSG:
  static unsigned int i=0;
			switch (i++ %8) {
			case 0:
				sprintf (status_string,"_stklen:%ux",_stklen);
				break;
			case 2:
				sprintf (status_string,"s:%up:%ux",stackavail(),_SP);
				break;
			case 4:
				sprintf(status_string,"heaptop:%lux", (unsigned long) coreleft());
				break;
			case 6:
				sprintf(status_string,"Fhtop:%lux", (unsigned long) farcoreleft());
				break;
			}
			show_status(STATUS);
			return FALSE;
 */             case SlowTimerMSG:
  static int heap;
			switch (slow_timer_click ++ %4) {
/*                      case 0:
				if (getvect(MOUSE_VECTOR) !=application_class:: mouse ){
					strcpy (sys_status_string,"MOUSE UNOK");
					if (!sysmouse) strcat (sys_status_string," !!");
					else {
						setvect (MOUSE_VECTOR,application_class::mouse );
						sysmouse->on(0);
					}
				}
				else strcpy (sys_status_string,"MOUSE OK");
				break;
			case 1:
//~                             if      ((heap=heapcheckfree(0xff)) == _HEAPOK ) strcpy (sys_status_string,"HEAP OK");
//~                                     else if (heap==_BADVALUE) strcpy (sys_status_string,"BAD VALUE");
//~                                     else strcpy (sys_status_string,"HEAP CORRUPT");
				if      ((heap=heapfillfree(0xff)) == _HEAPOK ) strcpy (sys_status_string,"HEAP OK");
					else if (heap==_HEAPEMPTY) strcpy (sys_status_string,"EMPTY");
					else strcpy (sys_status_string,"HEAP CORRUPT");
				break;
			case 2:
				if      ((heap=farheapfillfree(0x88)) == _HEAPOK ) strcpy (sys_status_string,"FARH OK");
					else if (heap==_HEAPEMPTY) strcpy (sys_status_string,"EM FARH");
					else strcpy (sys_status_string,"FARH RUPT");
				break;
			default:return FALSE;
*/                      }
//                      show_status(SYS_STATUS);
			return FALSE;
		case SysQuitMSG:
			return Sys_QUIT;
		case KeyPressedMSG:
			return key_pressed_handler( key_code );
		case WinMovingSizingMSG: //for mouse only
			pcurrent_selected_win-> draw_size_rect();
			if (in_win_moving ==TRUE)       //moving
				OffsetRect (&pcurrent_selected_win->newbounds,
				 mouse_x-old_mouse_x,mouse_y-old_mouse_y );
			else {  //sizing
				pcurrent_selected_win->newbounds.right +=mouse_x-old_mouse_x;
				pcurrent_selected_win->newbounds.bottom +=mouse_y-old_mouse_y;
			}
			if (pcurrent_selected_win->newbounds.right>
				win_living_viewport.right-win_living_viewport.left-2)
				pcurrent_selected_win->newbounds.right
					=win_living_viewport.right-win_living_viewport.left-2;
			if (pcurrent_selected_win->newbounds.bottom>
				win_living_viewport.bottom-win_living_viewport.top-2)
				pcurrent_selected_win->newbounds.bottom
					=win_living_viewport.bottom-win_living_viewport.top-2;
			if (pcurrent_selected_win->newbounds.left<2)
				pcurrent_selected_win->newbounds.left=2;
			if (pcurrent_selected_win->newbounds.top<2)
				pcurrent_selected_win->newbounds.top=2;

			old_mouse_x=mouse_x;
			old_mouse_y=mouse_y;
			pcurrent_selected_win-> draw_size_rect();
			return TRUE;
		case WinSysCloseMSG:
			if (! (((Twin*)message.fptr)->canclose||
				  (((Twin*)message.fptr)->func_canclose()) ))  return FALSE;
  int x,y;
			if (((Twin*)(message.fptr)) !=pcurrent_selected_win)
				((Twin*)(message.fptr))->select();
	x=((Twin*)message.fptr)->bounds.left+win_living_viewport.left-menu_viewport.left+LINE_WIDTH;
	y=((Twin*)message.fptr)->bounds.top+win_living_viewport.top -menu_viewport.top+LINE_WIDTH;
				win_sysmenu->offsetmenu(-x,-y);
				win_sysmenu->status |=INVISIBLE;
			delete ((Twin*)message.fptr );
//                      delete message.fptr;
			return TRUE ;
		case CtrlBreakMSG:
			error ("Ctrl  Break Pressed");
			break;
		default: ;//thequeue.GetMessage(sysmsg);
		}
	return FALSE;
}

int application_class::second_class_msg_handler ( MSG& message )
{
	return FALSE;
}


int application_class::main_message_loop()
{ int ret_value=FALSE;
	while ( thequeue.GetMessage(sysmsg) )
	{
		if ((ret_value =first_class_msg_handler(sysmsg))!=FALSE) return ret_value;
// This is the messages MUST be handled; && No more msg should
// converted to the menu && dialog && win moving
// && including messages must be shown in ret_value;
		if ( ( pcurrent_selected_win ==NULL )||
			 ((!in_win_moving)&&(!(pcurrent_selected_win->type & DIALOG_WIN)))
		   )
			ret_value =pcurrent_menu->msg_handler(sysmsg);
		if ( (in_menu_trap)||(ret_value!=FALSE) ) return ret_value;

⌨️ 快捷键说明

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