📄 helpbox.c
字号:
*cp++ =
(wnd->WindowColors [DF_HILITE_COLOR] [DF_FG] & 255) | 0x80;
*cp++ =
(wnd->WindowColors [DF_HILITE_COLOR] [DF_BG] & 255) | 0x80;
cp1 = cp;
if ((cp = strchr(cp, ']')) != NULL) {
if (thisword != NULL)
thisword->off3 =
thisword->off2 + (int) (cp - cp1);
*cp++ = DF_RESETCOLOR;
}
if ((cp = strchr(cp, '<')) != NULL) {
char *cp1 = strchr(cp, '>');
if (cp1 != NULL) {
int len = (int) ((int)cp1 - (int)cp);
thisword->hname = DfCalloc(1, len);
strncpy(thisword->hname, cp+1, len-1);
memmove(cp, cp1+1, strlen(cp1));
}
}
}
}
DfPutItemText(wnd, DF_ID_HELPTEXT, hline);
/* -- display help text as soon as window is full -- */
if (++linectr == DfClientHeight(cwnd))
DfSendMessage(cwnd, DFM_PAINT, 0, 0);
if (linectr > DfClientHeight(cwnd) &&
!DfTestAttribute(cwnd, DF_VSCROLLBAR)) {
DfAddAttribute(cwnd, DF_VSCROLLBAR);
DfSendMessage(cwnd, DFM_BORDER, 0, 0);
}
}
}
/* ---- compute the displayed length of a help text line --- */
static int HelpLength(char *s)
{
int len = strlen(s);
char *cp = strchr(s, '[');
while (cp != NULL) {
len -= 4;
cp = strchr(cp+1, '[');
}
cp = strchr(s, '<');
while (cp != NULL) {
char *cp1 = strchr(cp, '>');
if (cp1 != NULL)
len -= (int) (cp1-cp)+1;
cp = strchr(cp1, '<');
}
return len;
}
/* ----------- load the help text file ------------ */
void DfLoadHelpFile()
{
char *cp;
if (Helping)
return;
DfUnLoadHelpFile();
if ((helpfp = DfOpenHelpFile()) == NULL)
return;
*hline = '\0';
while (*hline != '<') {
if (DfGetHelpLine(hline) == NULL) {
fclose(helpfp);
return;
}
}
while (*hline == '<') {
if (strncmp(hline, "<end>", 5) == 0)
break;
/* -------- parse the help window's text name ----- */
if ((cp = strchr(hline, '>')) != NULL) {
ThisHelp = DfCalloc(1, sizeof(struct helps));
if (FirstHelp == NULL)
FirstHelp = ThisHelp;
*cp = '\0';
ThisHelp->hname=DfMalloc(strlen(hline+1)+1);
strcpy(ThisHelp->hname, hline+1);
DfHelpFilePosition(&ThisHelp->hptr, &ThisHelp->bit);
if (DfGetHelpLine(hline) == NULL)
break;
/* ------- build the help linked list entry --- */
while (*hline == '[') {
DfHelpFilePosition(&ThisHelp->hptr,
&ThisHelp->bit);
/* ---- parse the <<prev button pointer ---- */
if (strncmp(hline, "[<<]", 4) == 0) {
char *cp = strchr(hline+4, '<');
if (cp != NULL) {
char *cp1 = strchr(cp, '>');
if (cp1 != NULL) {
int len = (int) (cp1-cp);
ThisHelp->PrevName=DfCalloc(1,len);
strncpy(ThisHelp->PrevName,
cp+1,len-1);
}
}
if (DfGetHelpLine(hline) == NULL)
break;
continue;
}
/* ---- parse the next>> button pointer ---- */
else if (strncmp(hline, "[>>]", 4) == 0) {
char *cp = strchr(hline+4, '<');
if (cp != NULL) {
char *cp1 = strchr(cp, '>');
if (cp1 != NULL) {
int len = (int) (cp1-cp);
ThisHelp->NextName=DfCalloc(1,len);
strncpy(ThisHelp->NextName,
cp+1,len-1);
}
}
if (DfGetHelpLine(hline) == NULL)
break;
continue;
}
else
break;
}
ThisHelp->hheight = 0;
ThisHelp->hwidth = 0;
ThisHelp->NextHelp = NULL;
/* ------ append entry to the linked list ------ */
if (LastHelp != NULL)
LastHelp->NextHelp = ThisHelp;
LastHelp = ThisHelp;
}
/* -------- move to the next <helpname> token ------ */
if (DfGetHelpLine(hline) == NULL)
strcpy(hline, "<end>");
while (*hline != '<') {
ThisHelp->hwidth =
max(ThisHelp->hwidth, HelpLength(hline));
ThisHelp->hheight++;
if (DfGetHelpLine(hline) == NULL)
strcpy(hline, "<end>");
}
}
fclose(helpfp);
}
/* ------ free the memory used by the help file table ------ */
void DfUnLoadHelpFile(void)
{
while (FirstHelp != NULL) {
ThisHelp = FirstHelp;
if (ThisHelp->hname != NULL)
free(ThisHelp->hname);
if (ThisHelp->PrevName != NULL)
free(ThisHelp->PrevName);
if (ThisHelp->NextName != NULL)
free(ThisHelp->NextName);
FirstHelp = ThisHelp->NextHelp;
free(ThisHelp);
}
ThisHelp = LastHelp = NULL;
free(DfHelpTree);
DfHelpTree = NULL;
}
/* ---------- display a specified help text ----------- */
BOOL DfDisplayHelp(DFWINDOW wnd, char *Help)
{
BOOL rtn = FALSE;
if (Helping)
return TRUE;
wnd->isHelping++;
FindHelp(Help);
if (ThisHelp != NULL) {
if (LastStack == NULL ||
stricmp(Help, LastStack->hname)) {
/* ---- add the window to the history stack ---- */
ThisStack = DfCalloc(1,sizeof(struct HelpStack));
ThisStack->hname = DfMalloc(strlen(Help)+1);
if (ThisStack->hname != NULL)
strcpy(ThisStack->hname, Help);
ThisStack->PrevStack = LastStack;
LastStack = ThisStack;
}
if ((helpfp = DfOpenHelpFile()) != NULL) {
DF_DBOX *db;
int offset, i;
db = DfCalloc(1,sizeof HelpBox);
memcpy(db, &HelpBox, sizeof HelpBox);
/* -- seek to the first line of the help text -- */
DfSeekHelpLine(ThisHelp->hptr, ThisHelp->bit);
/* ----- read the title ----- */
DfGetHelpLine(hline);
hline[strlen(hline)-1] = '\0';
db->dwnd.title = DfMalloc(strlen(hline)+1);
strcpy(db->dwnd.title, hline);
/* ----- set the height and width ----- */
db->dwnd.h = min(ThisHelp->hheight, MAXHEIGHT)+7;
db->dwnd.w = max(45, ThisHelp->hwidth+6);
/* ------ position the help window ----- */
BestFit(wnd, &db->dwnd);
/* ------- position the command buttons ------ */
db->ctl[0].dwnd.w = max(40, ThisHelp->hwidth+2);
db->ctl[0].dwnd.h =
min(ThisHelp->hheight, MAXHEIGHT)+2;
offset = (db->dwnd.w-40) / 2;
for (i = 1; i < 5; i++) {
db->ctl[i].dwnd.y =
min(ThisHelp->hheight, MAXHEIGHT)+3;
db->ctl[i].dwnd.x += offset;
}
/* ---- disable ineffective buttons ---- */
if (ThisStack != NULL)
if (ThisStack->PrevStack == NULL)
DfDisableButton(db, DF_ID_BACK);
if (ThisHelp->NextName == NULL)
DfDisableButton(db, DF_ID_NEXT);
if (ThisHelp->PrevName == NULL)
DfDisableButton(db, DF_ID_PREV);
/* ------- display the help window ----- */
DfDialogBox(NULL, db, TRUE, DfHelpBoxProc);
free(db);
fclose(helpfp);
rtn = TRUE;
}
}
--wnd->isHelping;
return rtn;
}
/* ------- display a definition window --------- */
static void DisplayDefinition(DFWINDOW wnd, char *def)
{
DFWINDOW dwnd;
DFWINDOW hwnd = wnd;
int y;
if (DfGetClass(wnd) == DF_POPDOWNMENU)
hwnd = DfGetParent(wnd);
y = DfGetClass(hwnd) == DF_MENUBAR ? 2 : 1;
FindHelp(def);
if (ThisHelp != NULL) {
if ((helpfp = DfOpenHelpFile()) != NULL) {
dwnd = DfDfCreateWindow(
DF_TEXTBOX,
NULL,
DfGetClientLeft(hwnd),
DfGetClientTop(hwnd)+y,
min(ThisHelp->hheight, MAXHEIGHT)+3,
ThisHelp->hwidth+2,
NULL,
wnd,
NULL,
DF_HASBORDER | DF_NOCLIP | DF_SAVESELF);
if (dwnd != NULL) {
/* ----- read the help text ------- */
DfSeekHelpLine(ThisHelp->hptr, ThisHelp->bit);
while (TRUE) {
if (DfGetHelpLine(hline) == NULL)
break;
if (*hline == '<')
break;
hline[strlen(hline)-1] = '\0';
DfSendMessage(dwnd,DFM_ADDTEXT,(DF_PARAM)hline,0);
}
DfSendMessage(dwnd, DFM_SHOW_WINDOW, 0, 0);
DfSendMessage(NULL, DFM_WAITKEYBOARD, 0, 0);
DfSendMessage(NULL, DFM_WAITMOUSE, 0, 0);
DfSendMessage(dwnd, DFM_CLOSE_WINDOW, 0, 0);
}
fclose(helpfp);
}
}
}
/* ------ compare help names with wild cards ----- */
static BOOL wildcmp(char *s1, char *s2)
{
while (*s1 || *s2) {
if (tolower(*s1) != tolower(*s2))
if (*s1 != '?' && *s2 != '?')
return TRUE;
s1++, s2++;
}
return FALSE;
}
/* --- ThisHelp = the help window matching specified name --- */
static void FindHelp(char *Help)
{
ThisHelp = FirstHelp;
while (ThisHelp != NULL) {
if (wildcmp(Help, ThisHelp->hname) == FALSE)
break;
ThisHelp = ThisHelp->NextHelp;
}
}
/* --- ThisHelp = the help window matching specified wnd --- */
static void FindHelpWindow(DFWINDOW wnd)
{
ThisHelp = FirstHelp;
while (ThisHelp != NULL) {
if (wnd == ThisHelp->hwnd)
break;
ThisHelp = ThisHelp->NextHelp;
}
}
static int OverLap(int a, int b)
{
int ov = a - b;
if (ov < 0)
ov = 0;
return ov;
}
/* ----- compute the best location for a help dialogbox ----- */
static void BestFit(DFWINDOW wnd, DF_DIALOGWINDOW *dwnd)
{
int above, below, right, left;
if (DfGetClass(wnd) == DF_MENUBAR ||
DfGetClass(wnd) == DF_APPLICATION) {
dwnd->x = dwnd->y = -1;
return;
}
/* --- compute above overlap ---- */
above = OverLap(dwnd->h, DfGetTop(wnd));
/* --- compute below overlap ---- */
below = OverLap(DfGetBottom(wnd), DfGetScreenHeight()-dwnd->h);
/* --- compute right overlap ---- */
right = OverLap(DfGetRight(wnd), DfGetScreenWidth()-dwnd->w);
/* --- compute left overlap ---- */
left = OverLap(dwnd->w, DfGetLeft(wnd));
if (above < below)
dwnd->y = max(0, DfGetTop(wnd)-dwnd->h-2);
else
dwnd->y = min(DfGetScreenHeight()-dwnd->h, DfGetBottom(wnd)+2);
if (right < left)
dwnd->x = min(DfGetRight(wnd)+2, DfGetScreenWidth()-dwnd->w);
else
dwnd->x = max(0, DfGetLeft(wnd)-dwnd->w-2);
if (dwnd->x == DfGetRight(wnd)+2 ||
dwnd->x == DfGetLeft(wnd)-dwnd->w-2)
dwnd->y = -1;
if (dwnd->y ==DfGetTop(wnd)-dwnd->h-2 ||
dwnd->y == DfGetBottom(wnd)+2)
dwnd->x = -1;
}
/* EOF */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -