/****************************** Module Header ******************************\ * Module Name: drawfrm.c * * Copyright (c) 1985 - 1999, Microsoft Corporation * * Window Frame Drawing Routines. (aka wmframe.c) * * History: * 10-22-90 MikeHar Ported functions from Win 3.0 sources. * 13-Feb-1991 mikeke Added Revalidation code \***************************************************************************/ #include "precomp.h" #pragma hdrstop /***************************************************************************\ * BitBltSysBmp * \***************************************************************************/ BOOL FAR BitBltSysBmp( HDC hdc, int x, int y, UINT i ) { BOOL bRet; POEMBITMAPINFO pOem = gpsi->oembmi + i; bRet = GreBitBlt(hdc, x, y, pOem->cx, pOem->cy, HDCBITS(), pOem->x, pOem->y, SRCCOPY, 0); /* * If the UI language is Hebrew we do not want to mirror the ? mark only * Then redraw ? with out the button frame. */ if (HEBREW_UI_LANGID() && MIRRORED_HDC(hdc)) { if ((i >= OBI_HELP) && (i <= OBI_HELP_H)) { if (i == OBI_HELP_D) { x = x + SYSMET(CXEDGE); } bRet = GreBitBlt(hdc, x, y+SYSMET(CXEDGE), pOem->cx-SYSMET(CXEDGE)*2, pOem->cy-SYSMET(CXEDGE)*2, HDCBITS(), pOem->x+SYSMET(CXEDGE), pOem->y+SYSMET(CXEDGE), SRCCOPY|NOMIRRORBITMAP, 0); } } return bRet; } /***************************************************************************\ * xxxDrawWindowFrame * * History: * 10-24-90 MikeHar Ported from WaWaWaWindows. \***************************************************************************/ void xxxDrawWindowFrame( PWND pwnd, HDC hdc, UINT wFlags) { RECT rcClip; int cxFrame, cyFrame; UINT wDCFlags = DC_NC; CheckLock(pwnd); /* * If we are minimized, or if a parent is minimized or invisible, * we've got nothing to draw. */ if (!IsVisible(pwnd) || (TestWF(pwnd, WFNONCPAINT) && !TestWF(pwnd, WFMENUDRAW)) || EqualRect(&pwnd->rcWindow, &pwnd->rcClient)) { return; } /* * If the update rgn is not NULL, we may have to invalidate the bits saved. */ // if (TRUE) { if (pwnd->hrgnUpdate > NULL || GreGetClipBox(hdc, &rcClip, TRUE) != NULLREGION) { RECT rcWindow; int cBorders; if (TestWF(pwnd, WFMINIMIZED) && !TestWF(pwnd, WFNONCPAINT)) { if (TestWF(pwnd, WFFRAMEON)) wDCFlags |= DC_ACTIVE; if (wFlags & DF_HUNGREDRAW) wDCFlags |= DC_NOSENDMSG; xxxDrawCaptionBar(pwnd, hdc, wDCFlags); return; } cxFrame = cyFrame = cBorders = GetWindowBorders(pwnd->style, pwnd->ExStyle, TRUE, FALSE); cxFrame *= SYSMET(CXBORDER); cyFrame *= SYSMET(CYBORDER); GetRect(pwnd, &rcWindow, GRECT_WINDOW | GRECT_WINDOWCOORDS); InflateRect(&rcWindow, -cxFrame, -cyFrame); /* * If the menu style is present, draw it. */ if (TestWF(pwnd, WFMPRESENT) && !(wFlags & DF_HUNGREDRAW)) { rcWindow.top += xxxMenuBarDraw(pwnd, hdc, cxFrame, cyFrame); } /* * Draw the title bar if the window has a caption or any window * borders. Punt if the NONCPAINT bit is set, because that means * we're going to draw the frame a little bit later. */ if ((TestWF(pwnd, WFBORDERMASK) != 0 || TestWF(pwnd, WEFDLGMODALFRAME)) || TestWF(pwnd, WFSIZEBOX) || TestWF(pwnd, WEFWINDOWEDGE) || TestWF(pwnd, WEFSTATICEDGE) && !TestWF(pwnd, WFNONCPAINT)) { if (wFlags & DF_HUNGREDRAW) wDCFlags |= DC_NOSENDMSG; if (wFlags & DF_ACTIVE) wDCFlags |= DC_ACTIVE; xxxDrawCaptionBar(pwnd, hdc, wDCFlags | DC_NOVISIBLE); } // // Subtract out caption if present. // rcWindow.top += GetCaptionHeight(pwnd); // // Draw client edge // if (TestWF(pwnd, WFCEPRESENT)) { cxFrame += SYSMET(CXEDGE); cyFrame += SYSMET(CYEDGE); DrawEdge(hdc, &rcWindow, EDGE_SUNKEN, BF_RECT | BF_ADJUST); } // // Since scrolls don't have to use tricks to overlap the window // border anymore, we don't have to worry about borders. // if (TestWF(pwnd, WFVPRESENT) && !(wFlags & DF_HUNGREDRAW)) { if (TestWF(pwnd, WFHPRESENT)) { // This accounts for client borders. DrawSize(pwnd, hdc, cxFrame, cyFrame); } xxxDrawScrollBar(pwnd, hdc, TRUE); } if (TestWF(pwnd, WFHPRESENT) && !(wFlags & DF_HUNGREDRAW)) xxxDrawScrollBar(pwnd, hdc, FALSE); } } /***************************************************************************\ * xxxRedrawFrame * * Called by scrollbars and menus to redraw a windows scroll bar or menu. * * History: * 10-24-90 MikeHar Ported from WaWaWaWindows. \***************************************************************************/ void xxxRedrawFrame( PWND pwnd) { CheckLock(pwnd); /* * We always want to call xxxSetWindowPos, even if invisible or iconic, * because we need to make sure the WM_NCCALCSIZE message gets sent. */ xxxSetWindowPos(pwnd, NULL, 0, 0, 0, 0, SWP_NOZORDER | SWP_NOSIZE | SWP_NOMOVE | SWP_NOACTIVATE | SWP_DRAWFRAME); } void xxxRedrawFrameAndHook( PWND pwnd) { CheckLock(pwnd); /* * We always want to call xxxSetWindowPos, even if invisible or iconic, * because we need to make sure the WM_NCCALCSIZE message gets sent. */ xxxSetWindowPos(pwnd, NULL, 0, 0, 0, 0, SWP_NOZORDER | SWP_NOSIZE | SWP_NOMOVE | SWP_NOACTIVATE | SWP_DRAWFRAME); if ( IsTrayWindow(pwnd) ) { HWND hw = HWq(pwnd); xxxCallHook(HSHELL_REDRAW, (WPARAM)hw, 0L, WH_SHELL); PostShellHookMessages(HSHELL_REDRAW, (LPARAM)hw); } }