📄 normal.c
字号:
RectTop(rc) = DfGetScreenHeight()-ICONHEIGHT;
RectRight(rc) = DfGetScreenWidth()-1;
RectBottom(rc) = DfGetScreenHeight()-1;
if (pwnd != NULL) {
DFRECT prc = WindowRect(pwnd);
DFWINDOW cwnd = FirstWindow(pwnd);
rc = LowerRight(prc);
/* - search for icon available location - */
while (cwnd != NULL) {
if (cwnd->condition == ISMINIMIZED) {
DFRECT rc1;
rc1 = WindowRect(cwnd);
if (RectLeft(rc1) == RectLeft(rc) &&
RectTop(rc1) == RectTop(rc)) {
RectLeft(rc) -= ICONWIDTH;
RectRight(rc) -= ICONWIDTH;
if (RectLeft(rc) < RectLeft(prc)+1) {
RectLeft(rc) =
RectRight(prc)-ICONWIDTH;
RectRight(rc) =
RectLeft(rc)+ICONWIDTH-1;
RectTop(rc) -= ICONHEIGHT;
RectBottom(rc) -= ICONHEIGHT;
if (RectTop(rc) < RectTop(prc)+1)
return LowerRight(prc);
}
break;
}
}
cwnd = NextWindow(cwnd);
}
}
return rc;
}
#endif
/* ----- terminate the move or size operation ----- */
static void TerminateMoveSize(void)
{
px = py = -1;
diff = 0;
DfSendMessage(&dwnd, RELEASE_MOUSE, TRUE, 0);
DfSendMessage(&dwnd, RELEASE_KEYBOARD, TRUE, 0);
RestoreBorder(dwnd.rc);
WindowMoving = WindowSizing = FALSE;
}
/* ---- build a dummy window border for moving or sizing --- */
static void dragborder(DFWINDOW wnd, int x, int y)
{
RestoreBorder(dwnd.rc);
/* ------- build the dummy window -------- */
dwnd.rc.lf = x;
dwnd.rc.tp = y;
dwnd.rc.rt = dwnd.rc.lf+WindowWidth(wnd)-1;
dwnd.rc.bt = dwnd.rc.tp+WindowHeight(wnd)-1;
dwnd.ht = WindowHeight(wnd);
dwnd.wd = WindowWidth(wnd);
dwnd.parent = GetParent(wnd);
dwnd.attrib = VISIBLE | HASBORDER | NOCLIP;
InitWindowColors(&dwnd);
SaveBorder(dwnd.rc);
RepaintBorder(&dwnd, NULL);
}
/* ---- write the dummy window border for sizing ---- */
static void sizeborder(DFWINDOW wnd, int rt, int bt)
{
int leftmost = GetLeft(wnd)+10;
int topmost = GetTop(wnd)+3;
int bottommost = DfGetScreenHeight()-1;
int rightmost = DfGetScreenWidth()-1;
if (GetParent(wnd)) {
bottommost = min(bottommost,
GetClientBottom(GetParent(wnd)));
rightmost = min(rightmost,
GetClientRight(GetParent(wnd)));
}
rt = min(rt, rightmost);
bt = min(bt, bottommost);
rt = max(rt, leftmost);
bt = max(bt, topmost);
if (rt != px || bt != py)
RestoreBorder(dwnd.rc);
/* ------- change the dummy window -------- */
dwnd.ht = bt-dwnd.rc.tp+1;
dwnd.wd = rt-dwnd.rc.lf+1;
dwnd.rc.rt = rt;
dwnd.rc.bt = bt;
if (rt != px || bt != py) {
px = rt;
py = bt;
SaveBorder(dwnd.rc);
RepaintBorder(&dwnd, NULL);
}
}
#ifdef INCLUDE_MULTI_WINDOWS
/* ----- adjust a rectangle to include the shadow ----- */
static DFRECT adjShadow(DFWINDOW wnd)
{
DFRECT rc;
rc = wnd->rc;
if (TestAttribute(wnd, SHADOW)) {
if (RectRight(rc) < DfGetScreenWidth()-1)
RectRight(rc)++;
if (RectBottom(rc) < DfGetScreenHeight()-1)
RectBottom(rc)++;
}
return rc;
}
/* --- repaint a rectangular subsection of a window --- */
static void PaintOverLap(DFWINDOW wnd, DFRECT rc)
{
if (isVisible(wnd)) {
int isBorder, isTitle, isData;
isBorder = isTitle = FALSE;
isData = TRUE;
if (TestAttribute(wnd, HASBORDER)) {
isBorder = RectLeft(rc) == 0 &&
RectTop(rc) < WindowHeight(wnd);
isBorder |= RectLeft(rc) < WindowWidth(wnd) &&
RectRight(rc) >= WindowWidth(wnd)-1 &&
RectTop(rc) < WindowHeight(wnd);
isBorder |= RectTop(rc) == 0 &&
RectLeft(rc) < WindowWidth(wnd);
isBorder |= RectTop(rc) < WindowHeight(wnd) &&
RectBottom(rc) >= WindowHeight(wnd)-1 &&
RectLeft(rc) < WindowWidth(wnd);
}
else if (TestAttribute(wnd, HASTITLEBAR))
isTitle = RectTop(rc) == 0 &&
RectRight(rc) > 0 &&
RectLeft(rc)<WindowWidth(wnd)-BorderAdj(wnd);
if (RectLeft(rc) >= WindowWidth(wnd)-BorderAdj(wnd))
isData = FALSE;
if (RectTop(rc) >= WindowHeight(wnd)-BottomBorderAdj(wnd))
isData = FALSE;
if (TestAttribute(wnd, HASBORDER)) {
if (RectRight(rc) == 0)
isData = FALSE;
if (RectBottom(rc) == 0)
isData = FALSE;
}
if (TestAttribute(wnd, SHADOW))
isBorder |= RectRight(rc) == WindowWidth(wnd) ||
RectBottom(rc) == WindowHeight(wnd);
if (isData)
DfSendMessage(wnd, PAINT, (PARAM) &rc, TRUE);
if (isBorder)
DfSendMessage(wnd, BORDER, (PARAM) &rc, 0);
else if (isTitle)
DisplayTitle(wnd, &rc);
}
}
/* ------ paint the part of a window that is overlapped
by another window that is being hidden ------- */
static void PaintOver(DFWINDOW wnd)
{
DFRECT wrc, rc;
wrc = adjShadow(HiddenWindow);
rc = adjShadow(wnd);
rc = subRectangle(rc, wrc);
if (ValidRect(rc))
PaintOverLap(wnd, RelativeWindowRect(wnd, rc));
}
/* --- paint the overlapped parts of all children --- */
static void PaintOverChildren(DFWINDOW pwnd)
{
DFWINDOW cwnd = FirstWindow(pwnd);
while (cwnd != NULL) {
if (cwnd != HiddenWindow) {
PaintOver(cwnd);
PaintOverChildren(cwnd);
}
cwnd = NextWindow(cwnd);
}
}
/* -- recursive overlapping paint of parents -- */
static void PaintOverParents(DFWINDOW wnd)
{
DFWINDOW pwnd = GetParent(wnd);
if (pwnd != NULL) {
PaintOverParents(pwnd);
PaintOver(pwnd);
PaintOverChildren(pwnd);
}
}
/* - paint the parts of all windows that a window is over - */
static void PaintOverLappers(DFWINDOW wnd)
{
HiddenWindow = wnd;
PaintOverParents(wnd);
}
/* --- paint those parts of a window that are overlapped --- */
static void PaintUnderLappers(DFWINDOW wnd)
{
DFWINDOW hwnd = NextWindow(wnd);
while (hwnd != NULL) {
/* ------- test only at document window level ------ */
DFWINDOW pwnd = GetParent(hwnd);
/* if (pwnd == NULL || GetClass(pwnd) == APPLICATION) */ {
/* ---- don't bother testing self ----- */
if (isVisible(hwnd) && hwnd != wnd) {
/* --- see if other window is descendent --- */
while (pwnd != NULL) {
if (pwnd == wnd)
break;
pwnd = GetParent(pwnd);
}
/* ----- don't test descendent overlaps ----- */
if (pwnd == NULL) {
/* -- see if other window is ancestor --- */
pwnd = GetParent(wnd);
while (pwnd != NULL) {
if (pwnd == hwnd)
break;
pwnd = GetParent(pwnd);
}
/* --- don't test ancestor overlaps --- */
if (pwnd == NULL) {
HiddenWindow = GetAncestor(hwnd);
ClearVisible(HiddenWindow);
PaintOver(wnd);
SetVisible(HiddenWindow);
}
}
}
}
hwnd = NextWindow(hwnd);
}
/* --------- repaint all children of this window
the same way ----------- */
hwnd = FirstWindow(wnd);
while (hwnd != NULL) {
PaintUnderLappers(hwnd);
hwnd = NextWindow(hwnd);
}
}
#endif /* #ifdef INCLUDE_MULTI_WINDOWS */
/* --- save video area to be used by dummy window border --- */
static void SaveBorder(DFRECT rc)
{
Bht = RectBottom(rc) - RectTop(rc) + 1;
Bwd = RectRight(rc) - RectLeft(rc) + 1;
Bsave = DFrealloc(Bsave, Bht * Bwd * sizeof(CHAR_INFO));
GetVideo(rc,Bsave);
}
/* ---- restore video area used by dummy window border ---- */
static void RestoreBorder(DFRECT rc)
{
if (Bsave != NULL)
{
StoreVideo(rc, Bsave);
free(Bsave);
Bsave = NULL;
}
}
/* ----- test if screen coordinates are in a window ---- */
static BOOL InsideWindow(DFWINDOW wnd, int x, int y)
{
DFRECT rc;
rc = WindowRect(wnd);
if (!TestAttribute(wnd, NOCLIP))
{
DFWINDOW pwnd = GetParent(wnd);
while (pwnd != NULL)
{
rc = subRectangle(rc, ClientRect(pwnd));
pwnd = GetParent(pwnd);
}
}
return InsideRect(x, y, rc);
}
BOOL isDerivedFrom(DFWINDOW wnd, DFCLASS class)
{
DFCLASS tclass = GetClass(wnd);
while (tclass != -1) {
if (tclass == class)
return TRUE;
tclass = (classdefs[tclass].base);
}
return FALSE;
}
/* -- find the oldest document window ancestor of a window -- */
DFWINDOW GetAncestor(DFWINDOW wnd)
{
if (wnd != NULL) {
while (GetParent(wnd) != NULL) {
if (GetClass(GetParent(wnd)) == APPLICATION)
break;
wnd = GetParent(wnd);
}
}
return wnd;
}
BOOL isVisible(DFWINDOW wnd)
{
while (wnd != NULL) {
if (isHidden(wnd))
return FALSE;
wnd = GetParent(wnd);
}
return TRUE;
}
/* -- adjust a window's rectangle to clip it to its parent - */
static DFRECT ClipRect(DFWINDOW wnd)
{
DFRECT rc;
rc = WindowRect(wnd);
if (TestAttribute(wnd, SHADOW)) {
RectBottom(rc)++;
RectRight(rc)++;
}
return ClipRectangle(wnd, rc);
}
/* -- get the video memory that is to be used by a window -- */
static void GetVideoBuffer(DFWINDOW wnd)
{
DFRECT rc;
int ht;
int wd;
rc = ClipRect(wnd);
ht = RectBottom(rc) - RectTop(rc) + 1;
wd = RectRight(rc) - RectLeft(rc) + 1;
wnd->videosave = DFrealloc(wnd->videosave, (ht * wd * sizeof(CHAR_INFO)));
GetVideo(rc, wnd->videosave);
}
/* -- put the video memory that is used by a window -- */
static void PutVideoBuffer(DFWINDOW wnd)
{
if (wnd->videosave != NULL)
{
DFRECT rc;
rc = ClipRect(wnd);
StoreVideo(rc, wnd->videosave);
free(wnd->videosave);
wnd->videosave = NULL;
}
}
/* ------- return TRUE if awnd is an ancestor of wnd ------- */
BOOL isAncestor(DFWINDOW wnd, DFWINDOW awnd)
{
while (wnd != NULL) {
if (wnd == awnd)
return TRUE;
wnd = GetParent(wnd);
}
return FALSE;
}
/* EOF */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -