📄 applicat.c
字号:
/* ------------- applicat.c ------------- */
#include "dflat.h"
static int ScreenHeight;
static BOOL DisplayModified=FALSE;
WINDOW ApplicationWindow;
extern DBOX Display;
#ifdef INCLUDE_MULTI_WINDOWS
extern DBOX Windows;
#endif
#ifdef INCLUDE_LOGGING
extern DBOX Log;
#endif
#ifdef INCLUDE_SHELLDOS
static void ShellDOS(WINDOW);
#endif
static void CreateMenu(WINDOW);
static void CreateStatusBar(WINDOW);
static void SelectColors(WINDOW);
static void SetScreenHeight(int);
static void SelectLines(WINDOW);
static void SelectLoadBlank(void);
#ifdef INCLUDE_WINDOWOPTIONS
static void SelectTexture(void);
static void SelectBorder(WINDOW);
static void SelectTitle(WINDOW);
static void SelectStatusBar(WINDOW);
#endif
static WINDOW oldFocus;
#ifdef INCLUDE_MULTI_WINDOWS
static void CloseAll(WINDOW, int);
static void MoreWindows(WINDOW);
static void ChooseWindow(WINDOW, int);
static int WindowSel;
static char *Menus[9]={
"~1. ",
"~2. ",
"~3. ",
"~4. ",
"~5. ",
"~6. ",
"~7. ",
"~8. ",
"~9. "
};
#endif
static char Cwd[65];
#ifdef ENABLEGLOBALARGV
char **Argv;
#endif
/* --------------- CREATE_WINDOW Message -------------- */
static int CreateWindowMsg(WINDOW wnd)
{
int rtn;
ApplicationWindow=wnd;
ScreenHeight=SCREENHEIGHT;
getcwd(Cwd, 64);
if (!DisplayModified)
{
int i;
CTLWINDOW *ct, *ct1;
ct=FindCommand(&Display, ID_SNOWY, CHECKBOX);
if (!isVGA())
{
/* ---- Modify Display Dialog Box for EGA, CGA ---- */
if (isEGA())
ct1=FindCommand(&Display,ID_50LINES,RADIOBUTTON);
else
{
CTLWINDOW *ct2;
ct2=FindCommand(&Display,ID_COLOR,RADIOBUTTON)-1;
if (ct2)
{
ct2->dwnd.w++;
for (i=0;i<7;i++)
(ct2+i)->dwnd.x += 8;
}
ct1=FindCommand(&Display,ID_25LINES,RADIOBUTTON)-1;
}
if (ct && ct1)
for (i=0;i<6;i++)
*ct1++ = *ct++;
}
if (isVGA() || isEGA())
{
/* Eliminate the snowy check box */
ct=FindCommand(&Display, ID_SNOWY, CHECKBOX);
if (ct != NULL)
for (i=0;i<4;i++)
*(ct+i) = *(ct+2+i);
}
DisplayModified=TRUE;
}
#ifdef INCLUDE_WINDOWOPTIONS
if (cfg.Border)
SetCheckBox(&Display, ID_BORDER);
if (cfg.Title)
SetCheckBox(&Display, ID_TITLE);
if (cfg.StatusBar)
SetCheckBox(&Display, ID_STATUSBAR);
if (cfg.Texture)
SetCheckBox(&Display, ID_TEXTURE);
#endif
if (cfg.mono==1)
PushRadioButton(&Display, ID_MONO);
else if (cfg.mono==2)
PushRadioButton(&Display, ID_REVERSE);
else
PushRadioButton(&Display, ID_COLOR);
if (cfg.ScreenLines==25)
PushRadioButton(&Display, ID_25LINES);
else if (cfg.ScreenLines==43)
PushRadioButton(&Display, ID_43LINES);
else if (cfg.ScreenLines==50)
PushRadioButton(&Display, ID_50LINES);
if (cfg.snowy)
SetCheckBox(&Display, ID_SNOWY);
if (cfg.loadblank)
SetCheckBox(&Display, ID_LOADBLANK);
if (SCREENHEIGHT != cfg.ScreenLines)
{
SetScreenHeight(cfg.ScreenLines);
if (WindowHeight(wnd)==ScreenHeight || SCREENHEIGHT-1 < GetBottom(wnd))
{
WindowHeight(wnd)=SCREENHEIGHT;
GetBottom(wnd)=GetTop(wnd)+WindowHeight(wnd)-1;
wnd->RestoredRC=WindowRect(wnd);
}
}
SelectColors(wnd);
#ifdef INCLUDE_WINDOWOPTIONS
SelectBorder(wnd);
SelectTitle(wnd);
SelectStatusBar(wnd);
#endif
rtn=BaseWndProc(APPLICATION, wnd, CREATE_WINDOW, 0, 0);
if (wnd->extension != NULL)
CreateMenu(wnd);
CreateStatusBar(wnd);
SendMessage(NULL, SHOW_MOUSE, 0, 0);
return rtn;
}
/* --------- ADDSTATUS Message ---------- */
static void AddStatusMsg(WINDOW wnd, PARAM p1)
{
if (wnd->StatusBar != NULL)
{
if (p1 && *(char *)p1)
SendMessage(wnd->StatusBar, SETTEXT, p1, 0);
else
SendMessage(wnd->StatusBar, CLEARTEXT, 0, 0);
SendMessage(wnd->StatusBar, PAINT, 0, 0);
}
}
/* -------- SETFOCUS Message -------- */
static void SetFocusMsg(WINDOW wnd, BOOL p1)
{
if (p1)
SendMessage(inFocus, SETFOCUS, FALSE, 0);
inFocus=p1 ? wnd : NULL;
SendMessage(NULL, HIDE_CURSOR, 0, 0);
if (isVisible(wnd))
SendMessage(wnd, BORDER, 0, 0);
else
SendMessage(wnd, SHOW_WINDOW, 0, 0);
}
/* ------- SIZE Message -------- */
static void SizeMsg(WINDOW wnd, PARAM p1, PARAM p2)
{
BOOL WasVisible;
WasVisible=isVisible(wnd);
if (WasVisible)
SendMessage(wnd, HIDE_WINDOW, 0, 0);
if (p1-GetLeft(wnd) < 30)
p1=GetLeft(wnd)+30;
BaseWndProc(APPLICATION, wnd, SIZE, p1, p2);
CreateMenu(wnd);
CreateStatusBar(wnd);
if (WasVisible)
SendMessage(wnd, SHOW_WINDOW, 0, 0);
}
/* ----------- KEYBOARD Message ------------ */
static int KeyboardMsg(WINDOW wnd, PARAM p1, PARAM p2)
{
if (WindowMoving || WindowSizing || (int) p1==F1)
return BaseWndProc(APPLICATION, wnd, KEYBOARD, p1, p2);
switch ((int) p1)
{
case ALT_F4:
if (TestAttribute(wnd, CONTROLBOX))
PostMessage(wnd, CLOSE_WINDOW, 0, 0);
return TRUE;
#ifdef INCLUDE_MULTI_WINDOWS
case ALT_F6:
SetNextFocus();
return TRUE;
#endif
case ALT_HYPHEN:
if (TestAttribute(wnd, CONTROLBOX))
BuildSystemMenu(wnd);
return TRUE;
default:
break;
}
PostMessage(wnd->MenuBarWnd, KEYBOARD, p1, p2);
return TRUE;
}
/* --------- SHIFT_CHANGED Message -------- */
static void ShiftChangedMsg(WINDOW wnd, PARAM p1)
{
extern BOOL AltDown;
if ((int)p1 & ALTKEY)
AltDown=TRUE;
else if (AltDown)
{
AltDown=FALSE;
if (wnd->MenuBarWnd != inFocus)
SendMessage(NULL, HIDE_CURSOR, 0, 0);
SendMessage(wnd->MenuBarWnd, KEYBOARD, F10, 0);
}
}
/* -------- COMMAND Message ------- */
static void CommandMsg(WINDOW wnd, PARAM p1, PARAM p2)
{
switch ((int)p1)
{
case ID_HELP:
DisplayHelp(wnd, DFlatApplication);
break;
case ID_HELPHELP:
DisplayHelp(wnd, "HelpHelp");
break;
case ID_EXTHELP:
DisplayHelp(wnd, "ExtHelp");
break;
case ID_KEYSHELP:
DisplayHelp(wnd, "KeysHelp");
break;
case ID_HELPINDEX:
DisplayHelp(wnd, "HelpIndex");
break;
#ifdef INCLUDE_LOGGING
case ID_LOG:
MessageLog(wnd);
break;
#endif
#ifdef INCLUDE_SHELLDOS
case ID_DOS:
ShellDOS(wnd);
break;
#endif
case ID_EXIT:
case ID_SYSCLOSE:
PostMessage(wnd, CLOSE_WINDOW, 0, 0);
break;
case ID_DISPLAY:
if (DialogBox(wnd, &Display, TRUE, NULL))
{
if (inFocus==wnd->MenuBarWnd || inFocus==wnd->StatusBar)
oldFocus=ApplicationWindow;
else
oldFocus=inFocus;
SendMessage(wnd, HIDE_WINDOW, 0, 0);
SelectColors(wnd);
SelectLines(wnd);
SelectLoadBlank();
#ifdef INCLUDE_WINDOWOPTIONS
SelectBorder(wnd);
SelectTitle(wnd);
SelectStatusBar(wnd);
SelectTexture();
#endif
CreateMenu(wnd);
CreateStatusBar(wnd);
SendMessage(wnd, SHOW_WINDOW, 0, 0);
SendMessage(oldFocus, SETFOCUS, TRUE, 0);
}
break;
case ID_SAVEOPTIONS:
SaveConfig();
break;
#ifdef INCLUDE_MULTI_WINDOWS
case ID_WINDOW:
ChooseWindow(wnd, CurrentMenuSelection-2);
break;
case ID_CLOSEALL:
CloseAll(wnd, FALSE);
break;
case ID_MOREWINDOWS:
MoreWindows(wnd);
break;
#endif
#ifdef INCLUDE_RESTORE
case ID_SYSRESTORE:
#endif
case ID_SYSMOVE:
case ID_SYSSIZE:
#ifdef INCLUDE_MINIMIZE
case ID_SYSMINIMIZE:
#endif
#ifdef INCLUDE_MAXIMIZE
case ID_SYSMAXIMIZE:
#endif
BaseWndProc(APPLICATION, wnd, COMMAND, p1, p2);
break;
default:
if (inFocus != wnd->MenuBarWnd && inFocus != wnd)
PostMessage(inFocus, COMMAND, p1, p2);
break;
}
}
/* --------- CLOSE_WINDOW Message -------- */
static int CloseWindowMsg(WINDOW wnd)
{
int rtn;
#ifdef INCLUDE_MULTI_WINDOWS
CloseAll(wnd, TRUE);
WindowSel=0;
#endif
PostMessage(NULL, STOP, 0, 0);
rtn=BaseWndProc(APPLICATION, wnd, CLOSE_WINDOW, 0, 0);
if (ScreenHeight != SCREENHEIGHT)
SetScreenHeight(ScreenHeight);
UnLoadHelpFile();
DisplayModified=FALSE;
ApplicationWindow=NULL;
setdisk(toupper(*Cwd) - 'A');
chdir(Cwd+2);
return rtn;
}
/* --- APPLICATION Window Class window processing module --- */
int ApplicationProc(WINDOW wnd, MESSAGE msg, PARAM p1, PARAM p2)
{
switch (msg)
{
case CREATE_WINDOW:
return CreateWindowMsg(wnd);
case HIDE_WINDOW:
if (wnd==inFocus)
inFocus=NULL;
break;
case ADDSTATUS:
AddStatusMsg(wnd, p1);
return TRUE;
case SETFOCUS:
if ((int)p1==(inFocus != wnd))
{
SetFocusMsg(wnd, (BOOL) p1);
return TRUE;
}
break;
case SIZE:
SizeMsg(wnd, p1, p2);
return TRUE;
#ifdef INCLUDE_MINIMIZE
case MINIMIZE:
return TRUE;
#endif
case KEYBOARD:
return KeyboardMsg(wnd, p1, p2);
case SHIFT_CHANGED:
ShiftChangedMsg(wnd, p1);
return TRUE;
case PAINT:
if (isVisible(wnd))
{
int cl=cfg.Texture ? APPLCHAR : ' ';
ClearWindow(wnd, (RECT *)p1, cl);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -