void InitMenuFont(VOID)
{
- NONCLIENTMETRICS ncm;
+ NONCLIENTMETRICS ncm;
ncm.cbSize = sizeof(NONCLIENTMETRICS);
- if(!SystemParametersInfo(SPI_GETNONCLIENTMETRICS, sizeof(ncm), &ncm, 0))
+ if (!SystemParametersInfo(SPI_GETNONCLIENTMETRICS, sizeof(ncm), &ncm, 0))
{
- return ;
+ return;
}
hMenuFont = CreateFontIndirect(&ncm.lfMenuFont);
ncm.lfMenuFont.lfWeight = max(ncm.lfMenuFont.lfWeight + 300, 1000);
hMenuFontBold = CreateFontIndirect(&ncm.lfMenuFont);
-
}
static BOOL
return FALSE;
if (Style & WS_THICKFRAME)
return TRUE;
+ Style &= WS_CAPTION;
if (Style == WS_DLGFRAME || Style == WS_CAPTION)
return TRUE;
return FALSE;
}
-HICON
-UserGetWindowIcon(HWND hwnd)
+static HICON
+UserGetWindowIcon(PDRAW_CONTEXT pcontext)
{
- HICON hIcon = 0;
+ HICON hIcon = NULL;
- SendMessageTimeout(hwnd, WM_GETICON, ICON_SMALL2, 0, SMTO_ABORTIFHUNG, 1000, (PDWORD_PTR)&hIcon);
+ SendMessageTimeout(pcontext->hWnd, WM_GETICON, ICON_SMALL2, 0, SMTO_ABORTIFHUNG, 1000, (PDWORD_PTR)&hIcon);
if (!hIcon)
- SendMessageTimeout(hwnd, WM_GETICON, ICON_SMALL, 0, SMTO_ABORTIFHUNG, 1000, (PDWORD_PTR)&hIcon);
+ SendMessageTimeout(pcontext->hWnd, WM_GETICON, ICON_SMALL, 0, SMTO_ABORTIFHUNG, 1000, (PDWORD_PTR)&hIcon);
if (!hIcon)
- SendMessageTimeout(hwnd, WM_GETICON, ICON_BIG, 0, SMTO_ABORTIFHUNG, 1000, (PDWORD_PTR)&hIcon);
+ SendMessageTimeout(pcontext->hWnd, WM_GETICON, ICON_BIG, 0, SMTO_ABORTIFHUNG, 1000, (PDWORD_PTR)&hIcon);
if (!hIcon)
- hIcon = (HICON)GetClassLong(hwnd, GCL_HICONSM);
+ hIcon = (HICON)GetClassLong(pcontext->hWnd, GCL_HICONSM);
if (!hIcon)
- hIcon = (HICON)GetClassLong(hwnd, GCL_HICON);
+ hIcon = (HICON)GetClassLong(pcontext->hWnd, GCL_HICON);
- if(!hIcon)
+ // See also win32ss/user/ntuser/nonclient.c!NC_IconForWindow
+ if (!hIcon && !(pcontext->wi.dwExStyle & WS_EX_DLGMODALFRAME))
hIcon = LoadIconW(NULL, (LPCWSTR)IDI_WINLOGO);
return hIcon;
oldTextColor = SetTextColor(hdc, textColor);
oldBkMode = SetBkMode(hdc, TRANSPARENT);
- DrawTextW(hdc, pszText, iCharCount, &rt, dwTextFlags);
+ DrawThemeText(hTheme, hdc, iPartId, iStateId, pszText, iCharCount, dwTextFlags, dwTextFlags, pRect);
SetBkMode(hdc, oldBkMode);
SetTextColor(hdc, oldTextColor);
ThemeGetButtonState(HTHELP, htHot, htDown, pcontext->Active));
}
-/* Used from WM_NCPAINT and WM_NCACTIVATE handlers*/
+/* Used from WM_NCPAINT and WM_NCACTIVATE handlers */
static void
ThemeDrawCaption(PDRAW_CONTEXT pcontext, RECT* prcCurrent)
{
HICON hIcon;
WCHAR *CaptionText;
- hIcon = UserGetWindowIcon(pcontext->hWnd);
+ // See also win32ss/user/ntuser/nonclient.c!UserDrawCaptionBar
+ // and win32ss/user/ntuser/nonclient.c!UserDrawCaption
+ if ((pcontext->wi.dwStyle & WS_SYSMENU) && !(pcontext->wi.dwExStyle & WS_EX_TOOLWINDOW))
+ hIcon = UserGetWindowIcon(pcontext);
+ else
+ hIcon = NULL;
+
CaptionText = UserGetWindowCaption(pcontext->hWnd);
/* Get the caption part and state id */
iState = pcontext->Active ? FS_ACTIVE : FS_INACTIVE;
- /* Draw the caption background*/
+ /* Draw the caption background */
rcPart = *prcCurrent;
rcPart.bottom = rcPart.top + pcontext->CaptionHeight;
prcCurrent->top = rcPart.bottom;
rcPart.top += 3 ;
/* Draw the icon */
- if(hIcon && !(pcontext->wi.dwExStyle & WS_EX_TOOLWINDOW))
+ if (hIcon)
{
int IconHeight = GetSystemMetrics(SM_CYSMICON);
int IconWidth = GetSystemMetrics(SM_CXSMICON);
rcPart.right -= 4;
/* Draw the caption */
- if(CaptionText)
+ if (CaptionText)
{
- /*FIXME: Use DrawThemeTextEx*/
+ /* FIXME: Use DrawThemeTextEx */
ThemeDrawCaptionText(pcontext->theme,
pcontext->hDC,
iPart,
lstrlenW(CaptionText),
DT_VCENTER | DT_SINGLELINE | DT_END_ELLIPSIS,
0,
- &rcPart ,
+ &rcPart,
pcontext->Active);
HeapFree(GetProcessHeap(), 0, CaptionText);
}
prcCurrent->right - prcCurrent->left, Height, PATCOPY);
PatBlt(context->hDC, prcCurrent->left, prcCurrent->top,
Width, prcCurrent->bottom - prcCurrent->top, PATCOPY);
- PatBlt(context->hDC, prcCurrent->left, prcCurrent->bottom,
+ PatBlt(context->hDC, prcCurrent->left, prcCurrent->bottom - 1,
prcCurrent->right - prcCurrent->left, -Height, PATCOPY);
- PatBlt(context->hDC, prcCurrent->right, prcCurrent->top,
+ PatBlt(context->hDC, prcCurrent->right - 1, prcCurrent->top,
-Width, prcCurrent->bottom - prcCurrent->top, PATCOPY);
InflateRect(prcCurrent, -Width, -Height);
}
/* Now the other bit of the frame */
- if (context->wi.dwStyle & (WS_DLGFRAME | WS_BORDER) || context->wi.dwExStyle & WS_EX_DLGMODALFRAME)
+ if (context->wi.dwStyle & (WS_DLGFRAME | WS_BORDER) || (context->wi.dwExStyle & WS_EX_DLGMODALFRAME))
{
INT Width = GetSystemMetrics(SM_CXBORDER);
INT Height = GetSystemMetrics(SM_CYBORDER);
prcCurrent->right - prcCurrent->left, Height, PATCOPY);
PatBlt(context->hDC, prcCurrent->left, prcCurrent->top,
Width, prcCurrent->bottom - prcCurrent->top, PATCOPY);
- PatBlt(context->hDC, prcCurrent->left, prcCurrent->bottom,
+ PatBlt(context->hDC, prcCurrent->left, prcCurrent->bottom - 1,
prcCurrent->right - prcCurrent->left, -Height, PATCOPY);
- PatBlt(context->hDC, prcCurrent->right, prcCurrent->top,
+ PatBlt(context->hDC, prcCurrent->right - 1, prcCurrent->top,
-Width, prcCurrent->bottom - prcCurrent->top, PATCOPY);
InflateRect(prcCurrent, -Width, -Height);
GetMenuItemRect(pcontext->hWnd, Menu, imenu, &Rect);
-#ifdef __REACTOS__
- OffsetRect(&Rect, -pcontext->wi.rcClient.left, -pcontext->wi.rcClient.top);
-#else
OffsetRect(&Rect, -pcontext->wi.rcWindow.left, -pcontext->wi.rcWindow.top);
-#endif
SetBkColor(pcontext->hDC, GetSysColor(flat_menu ? COLOR_MENUBAR : COLOR_MENU));
SetTextColor(pcontext->hDC, GetSysColor(Item.fState & MF_GRAYED ? COLOR_GRAYTEXT : COLOR_MENUTEXT));
Rect = MenuBarInfo.rcBar;
OffsetRect(&Rect, -pcontext->wi.rcWindow.left, -pcontext->wi.rcWindow.top);
- /* Draw a line under the menu*/
+ /* Draw a line under the menu */
oldPen = (HPEN)SelectObject(pcontext->hDC, GetStockObject(DC_PEN));
SetDCPenColor(pcontext->hDC, GetSysColor(COLOR_3DFACE));
MoveToEx(pcontext->hDC, Rect.left, Rect.bottom, NULL);
SelectObject(pcontext->hDC, FontOld);
- /* Fill the menu background area that isn't painted yet*/
+ /* Fill the menu background area that isn't painted yet */
FillRect(pcontext->hDC, &Rect, GetSysColorBrush(flat_menu ? COLOR_MENUBAR : COLOR_MENU));
}
static void
-ThemePaintWindow(PDRAW_CONTEXT pcontext, RECT* prcCurrent)
+ThemePaintWindow(PDRAW_CONTEXT pcontext, RECT* prcCurrent, BOOL bDoDoubleBuffering)
{
if(!(pcontext->wi.dwStyle & WS_VISIBLE))
return;
if((pcontext->wi.dwStyle & WS_CAPTION)==WS_CAPTION)
{
- ThemeStartBufferedPaint(pcontext, prcCurrent->right, pcontext->CaptionHeight);
+ if (bDoDoubleBuffering)
+ ThemeStartBufferedPaint(pcontext, prcCurrent->right, pcontext->CaptionHeight);
ThemeDrawCaption(pcontext, prcCurrent);
- ThemeEndBufferedPaint(pcontext, 0, 0, prcCurrent->right, pcontext->CaptionHeight);
+ if (bDoDoubleBuffering)
+ ThemeEndBufferedPaint(pcontext, 0, 0, prcCurrent->right, pcontext->CaptionHeight);
ThemeDrawBorders(pcontext, prcCurrent);
}
else
}
/*
- Message handlers
+ * Message handlers
*/
static LRESULT
rcCurrent = context.wi.rcWindow;
OffsetRect( &rcCurrent, -context.wi.rcWindow.left, -context.wi.rcWindow.top);
- ThemePaintWindow(&context, &rcCurrent);
+ ThemePaintWindow(&context, &rcCurrent, TRUE);
ThemeCleanupDrawContext(&context);
return 0;
TrackMouseEvent(&tme);
}
- /* Dont do any drawing if the hit test wasn't changed */
- if (ht == pcontext->lastHitTest)
- return 0;
-
ThemeInitDrawContext(&context, hWnd, 0);
if (context.wi.dwStyle & WS_SYSMENU)
{
POINT ClientPoint;
WINDOWINFO wi;
+ wi.cbSize = sizeof(wi);
GetWindowInfo(hWnd, &wi);
if (!PtInRect(&wi.rcWindow, Point))
if (!PtInRect(&WindowRect, Point))
{
-
INT ButtonWidth;
if (wi.dwExStyle & WS_EX_TOOLWINDOW)
ButtonWidth = GetSystemMetrics(SM_CXSIZE);
ButtonWidth -= 4;
- ButtonWidth+= BUTTON_GAP_SIZE;
+ ButtonWidth += BUTTON_GAP_SIZE;
if (wi.dwStyle & WS_SYSMENU)
{
}
else
{
- if(!(wi.dwExStyle & WS_EX_DLGMODALFRAME))
+ // if(!(wi.dwExStyle & WS_EX_DLGMODALFRAME))
+ // FIXME: The real test should check whether there is
+ // an icon for the system window, and if so, do the
+ // rect.left increase.
+ // See win32ss/user/user32/windows/nonclient.c!DefWndNCHitTest
+ // and win32ss/user/ntuser/nonclient.c!GetNCHitEx which does
+ // the test better.
WindowRect.left += ButtonWidth;
WindowRect.right -= ButtonWidth;
}
{
case WM_NCPAINT:
return ThemeHandleNCPaint(hWnd, (HRGN)wParam);
+ //
+ // WM_NCUAHDRAWCAPTION : wParam are DC_* flags.
+ //
case WM_NCUAHDRAWCAPTION:
+ //
+ // WM_NCUAHDRAWFRAME : wParam is HDC, lParam are DC_ACTIVE and or DC_REDRAWHUNGWND.
+ //
case WM_NCUAHDRAWFRAME:
case WM_NCACTIVATE:
+
+ if ((GetWindowLongW(hWnd, GWL_STYLE) & WS_CAPTION) != WS_CAPTION)
+ return TRUE;
+
ThemeHandleNCPaint(hWnd, (HRGN)1);
return TRUE;
case WM_NCMOUSEMOVE:
return DefWndProc(hWnd, Msg, wParam, lParam);
}
}
+
+HRESULT WINAPI DrawNCPreview(HDC hDC,
+ DWORD DNCP_Flag,
+ LPRECT prcPreview,
+ LPCWSTR pszThemeFileName,
+ LPCWSTR pszColorName,
+ LPCWSTR pszSizeName,
+ PNONCLIENTMETRICSW pncMetrics,
+ COLORREF* lpaRgbValues)
+{
+ WNDCLASSEXW DummyPreviewWindowClass;
+ HWND hwndDummy;
+ HRESULT hres;
+ HTHEMEFILE hThemeFile;
+ DRAW_CONTEXT context;
+ RECT rcCurrent;
+
+ /* FIXME: We also need to implement drawing the rest of the preview windows
+ * and make use of the ncmetrics and colors passed as parameters */
+
+ /* Create a dummy window that will be used to trick the paint funtions */
+ memset(&DummyPreviewWindowClass, 0, sizeof(DummyPreviewWindowClass));
+ DummyPreviewWindowClass.cbSize = sizeof(DummyPreviewWindowClass);
+ DummyPreviewWindowClass.lpszClassName = L"DummyPreviewWindowClass";
+ DummyPreviewWindowClass.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
+ DummyPreviewWindowClass.hInstance = hDllInst;
+ DummyPreviewWindowClass.lpfnWndProc = DefWindowProcW;
+ if (!RegisterClassExW(&DummyPreviewWindowClass))
+ return E_FAIL;
+
+ hwndDummy = CreateWindowExW(0, L"DummyPreviewWindowClass", L"Active window", WS_OVERLAPPEDWINDOW,30,30,300,150,0,0,hDllInst,NULL);
+ if (!hwndDummy)
+ return E_FAIL;
+
+ hres = OpenThemeFile(pszThemeFileName, pszColorName, pszSizeName, &hThemeFile,0);
+ if (FAILED(hres))
+ return hres;
+
+ /* Initialize the special draw context for the preview */
+ context.hDC = hDC;
+ context.hWnd = hwndDummy;
+ context.theme = OpenThemeDataFromFile(hThemeFile, hwndDummy, L"WINDOW", 0);
+ if (!context.theme)
+ return E_FAIL;
+ context.scrolltheme = OpenThemeDataFromFile(hThemeFile, hwndDummy, L"SCROLLBAR", 0);
+ if (!context.theme)
+ return E_FAIL;
+ context.Active = TRUE;
+ context.wi.cbSize = sizeof(context.wi);
+ if (!GetWindowInfo(hwndDummy, &context.wi))
+ return E_FAIL;
+ context.wi.dwStyle |= WS_VISIBLE;
+ context.CaptionHeight = context.wi.cyWindowBorders;
+ context.CaptionHeight += GetSystemMetrics(context.wi.dwExStyle & WS_EX_TOOLWINDOW ? SM_CYSMCAPTION : SM_CYCAPTION );
+ context.hRgn = CreateRectRgnIndirect(&context.wi.rcWindow);
+
+ /* Paint the window on the preview hDC */
+ rcCurrent = context.wi.rcWindow;
+ ThemePaintWindow(&context, &rcCurrent, FALSE);
+ context.hDC = NULL;
+ ThemeCleanupDrawContext(&context);
+
+ /* Cleanup */
+ DestroyWindow(hwndDummy);
+ UnregisterClassW(L"DummyPreviewWindowClass", hDllInst);
+
+ return S_OK;
+}