📄 applicat.cpp
字号:
///////////////////////////////////////////////////////////////
///////// 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 (¤t_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 + -