mirror of
https://github.com/reactos/wine.git
synced 2024-11-26 05:00:30 +00:00
comctl32: statusbar: WM_SETFONT should change the bar height.
This commit is contained in:
parent
f7cda904cd
commit
9aee00e8fa
@ -148,6 +148,7 @@ HWND COMCTL32_CreateToolTip (HWND);
|
||||
VOID COMCTL32_RefreshSysColors(void);
|
||||
void COMCTL32_DrawInsertMark(HDC hDC, const RECT *lpRect, COLORREF clrInsertMark, BOOL bHorizontal);
|
||||
void COMCTL32_EnsureBitmapSize(HBITMAP *pBitmap, int cxMinWidth, int cyMinHeight, COLORREF crBackground);
|
||||
void COMCTL32_GetFontMetrics(HFONT hFont, TEXTMETRICW *ptm);
|
||||
INT Str_GetPtrWtoA (LPCWSTR lpSrc, LPSTR lpDest, INT nMaxLen);
|
||||
INT Str_GetPtrAtoW (LPCSTR lpSrc, LPWSTR lpDest, INT nMaxLen);
|
||||
BOOL Str_SetPtrAtoW (LPWSTR *lppDest, LPCSTR lpSrc);
|
||||
|
@ -1561,6 +1561,17 @@ void COMCTL32_EnsureBitmapSize(HBITMAP *pBitmap, int cxMinWidth, int cyMinHeight
|
||||
return;
|
||||
}
|
||||
|
||||
void COMCTL32_GetFontMetrics(HFONT hFont, TEXTMETRICW *ptm)
|
||||
{
|
||||
HDC hdc = GetDC(NULL);
|
||||
HFONT hOldFont;
|
||||
|
||||
hOldFont = SelectObject(hdc, hFont);
|
||||
GetTextMetricsW(hdc, ptm);
|
||||
SelectObject(hdc, hOldFont);
|
||||
ReleaseDC(NULL, hdc);
|
||||
}
|
||||
|
||||
/***********************************************************************
|
||||
* MirrorIcon [COMCTL32.414]
|
||||
*
|
||||
|
@ -108,6 +108,35 @@ static inline LPCSTR debugstr_t(LPCWSTR text, BOOL isW)
|
||||
return isW ? debugstr_w(text) : debugstr_a((LPCSTR)text);
|
||||
}
|
||||
|
||||
static UINT
|
||||
STATUSBAR_ComputeHeight(STATUS_INFO *infoPtr)
|
||||
{
|
||||
HTHEME theme;
|
||||
UINT height;
|
||||
TEXTMETRICW tm;
|
||||
|
||||
COMCTL32_GetFontMetrics(infoPtr->hFont ? infoPtr->hFont : infoPtr->hDefaultFont, &tm);
|
||||
height = tm.tmHeight + 4 + infoPtr->verticalBorder;
|
||||
|
||||
if ((theme = GetWindowTheme(infoPtr->Self)))
|
||||
{
|
||||
/* Determine bar height from theme such that the content area is
|
||||
* textHeight pixels large */
|
||||
HDC hdc = GetDC(infoPtr->Self);
|
||||
RECT r;
|
||||
memset (&r, 0, sizeof (r));
|
||||
r.bottom = tm.tmHeight;
|
||||
if (SUCCEEDED(GetThemeBackgroundExtent(theme, hdc, SP_PANE, 0, &r, &r)))
|
||||
{
|
||||
height = r.bottom - r.top;
|
||||
}
|
||||
ReleaseDC(infoPtr->Self, hdc);
|
||||
}
|
||||
|
||||
TRACE(" textHeight=%d+%d, final height=%d\n", tm.tmHeight, tm.tmInternalLeading, height);
|
||||
return height;
|
||||
}
|
||||
|
||||
static void
|
||||
STATUSBAR_DrawSizeGrip (HTHEME theme, HDC hdc, LPRECT lpRect)
|
||||
{
|
||||
@ -913,8 +942,7 @@ STATUSBAR_WMCreate (HWND hwnd, const CREATESTRUCTA *lpCreate)
|
||||
NONCLIENTMETRICSW nclm;
|
||||
DWORD dwStyle;
|
||||
RECT rect;
|
||||
int len, textHeight = 0;
|
||||
HDC hdc;
|
||||
int len;
|
||||
|
||||
TRACE("\n");
|
||||
infoPtr = (STATUS_INFO*)Alloc (sizeof(STATUS_INFO));
|
||||
@ -971,17 +999,7 @@ STATUSBAR_WMCreate (HWND hwnd, const CREATESTRUCTA *lpCreate)
|
||||
dwStyle &= ~WS_BORDER;
|
||||
SetWindowLongW (hwnd, GWL_STYLE, dwStyle);
|
||||
|
||||
if ((hdc = GetDC (hwnd))) {
|
||||
TEXTMETRICW tm;
|
||||
HFONT hOldFont;
|
||||
|
||||
hOldFont = SelectObject (hdc, infoPtr->hDefaultFont);
|
||||
GetTextMetricsW (hdc, &tm);
|
||||
textHeight = tm.tmHeight;
|
||||
SelectObject (hdc, hOldFont);
|
||||
ReleaseDC (hwnd, hdc);
|
||||
}
|
||||
TRACE(" textHeight=%d\n", textHeight);
|
||||
infoPtr->height = STATUSBAR_ComputeHeight(infoPtr);
|
||||
|
||||
if (dwStyle & SBT_TOOLTIPS) {
|
||||
infoPtr->hwndToolTip =
|
||||
@ -1002,28 +1020,6 @@ STATUSBAR_WMCreate (HWND hwnd, const CREATESTRUCTA *lpCreate)
|
||||
}
|
||||
}
|
||||
|
||||
if (!(dwStyle & CCS_NORESIZE)) { /* don't resize wnd if it doesn't want it ! */
|
||||
HTHEME theme;
|
||||
infoPtr->height = textHeight + 4 + infoPtr->verticalBorder;
|
||||
|
||||
if ((theme = GetWindowTheme (hwnd)))
|
||||
{
|
||||
/* Determine bar height from theme such that the content area is
|
||||
* textHeight pixels large */
|
||||
HDC hdc = GetDC (hwnd);
|
||||
RECT r;
|
||||
memset (&r, 0, sizeof (r));
|
||||
r.bottom = textHeight;
|
||||
if (SUCCEEDED(GetThemeBackgroundExtent (theme, hdc, SP_PANE, 0, &r, &r)))
|
||||
{
|
||||
infoPtr->height = r.bottom - r.top;
|
||||
}
|
||||
ReleaseDC (hwnd, hdc);
|
||||
}
|
||||
|
||||
STATUSBAR_SetPartBounds (infoPtr);
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
||||
create_fail:
|
||||
@ -1099,6 +1095,9 @@ STATUSBAR_WMSetFont (STATUS_INFO *infoPtr, HFONT font, BOOL redraw)
|
||||
{
|
||||
infoPtr->hFont = font;
|
||||
TRACE("%p\n", infoPtr->hFont);
|
||||
|
||||
infoPtr->height = STATUSBAR_ComputeHeight(infoPtr);
|
||||
SendMessageW(infoPtr->Self, WM_SIZE, 0, 0); /* update size */
|
||||
if (redraw)
|
||||
InvalidateRect(infoPtr->Self, NULL, FALSE);
|
||||
|
||||
|
@ -24,6 +24,8 @@
|
||||
|
||||
#include "wine/test.h"
|
||||
|
||||
#define SUBCLASS_NAME "MyStatusBar"
|
||||
|
||||
#define expect(expected,got) ok (expected == got,"Expected %d, got %d\n",expected,got)
|
||||
#define expect_rect(_left,_top,_right,_bottom,got) do { RECT _rcExp = {_left, _top, _right, _bottom}; \
|
||||
ok(memcmp(&_rcExp, &(got), sizeof(RECT)) == 0, "Expected rect {%d,%d, %d,%d}, got {%d,%d, %d,%d}\n", \
|
||||
@ -34,6 +36,7 @@ static HINSTANCE hinst;
|
||||
static WNDPROC g_status_wndproc;
|
||||
static RECT g_rcCreated;
|
||||
static HWND g_hMainWnd;
|
||||
static int g_wmsize_count = 0;
|
||||
|
||||
static HWND create_status_control(DWORD style, DWORD exstyle)
|
||||
{
|
||||
@ -51,34 +54,46 @@ static HWND create_status_control(DWORD style, DWORD exstyle)
|
||||
|
||||
static LRESULT WINAPI create_test_wndproc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
|
||||
{
|
||||
LRESULT ret;
|
||||
|
||||
if (msg == WM_CREATE)
|
||||
{
|
||||
CREATESTRUCT *cs = (CREATESTRUCT *)lParam;
|
||||
LRESULT ret = CallWindowProc(g_status_wndproc, hwnd, msg, wParam, lParam);
|
||||
ret = CallWindowProc(g_status_wndproc, hwnd, msg, wParam, lParam);
|
||||
GetWindowRect(hwnd, &g_rcCreated);
|
||||
MapWindowPoints(HWND_DESKTOP, g_hMainWnd, (LPPOINT)&g_rcCreated, 2);
|
||||
ok(cs->x == g_rcCreated.left, "CREATESTRUCT.x modified\n");
|
||||
ok(cs->y == g_rcCreated.top, "CREATESTRUCT.y modified\n");
|
||||
return ret;
|
||||
} else if (msg == WM_SIZE)
|
||||
{
|
||||
g_wmsize_count++;
|
||||
ret = CallWindowProc(g_status_wndproc, hwnd, msg, wParam, lParam);
|
||||
}
|
||||
return CallWindowProc(g_status_wndproc, hwnd, msg, wParam, lParam);
|
||||
else
|
||||
ret = CallWindowProc(g_status_wndproc, hwnd, msg, wParam, lParam);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static void test_create()
|
||||
static void register_subclass()
|
||||
{
|
||||
WNDCLASSEX cls;
|
||||
RECT rc;
|
||||
HWND hwnd;
|
||||
|
||||
cls.cbSize = sizeof(WNDCLASSEX);
|
||||
GetClassInfoEx(NULL, STATUSCLASSNAME, &cls);
|
||||
g_status_wndproc = cls.lpfnWndProc;
|
||||
cls.lpfnWndProc = create_test_wndproc;
|
||||
cls.lpszClassName = "MyStatusBar";
|
||||
cls.lpszClassName = SUBCLASS_NAME;
|
||||
cls.hInstance = NULL;
|
||||
ok(RegisterClassEx(&cls), "RegisterClassEx failed\n");
|
||||
}
|
||||
|
||||
ok((hwnd = CreateWindowA("MyStatusBar", "", WS_CHILD|WS_VISIBLE|SBARS_SIZEGRIP, 0, 0, 100, 100,
|
||||
static void test_create()
|
||||
{
|
||||
RECT rc;
|
||||
HWND hwnd;
|
||||
|
||||
ok((hwnd = CreateWindowA(SUBCLASS_NAME, "", WS_CHILD|WS_VISIBLE|SBARS_SIZEGRIP, 0, 0, 100, 100,
|
||||
g_hMainWnd, NULL, NULL, 0)) != NULL, "CreateWindowA failed\n");
|
||||
MapWindowPoints(HWND_DESKTOP, g_hMainWnd, (LPPOINT)&rc, 2);
|
||||
GetWindowRect(hwnd, &rc);
|
||||
@ -91,6 +106,35 @@ static void test_create()
|
||||
DestroyWindow(hwnd);
|
||||
}
|
||||
|
||||
static void test_setfont()
|
||||
{
|
||||
HFONT hFont;
|
||||
RECT rc1, rc2;
|
||||
HWND hwndStatus = CreateWindow(SUBCLASS_NAME, NULL, WS_CHILD|WS_VISIBLE,
|
||||
0, 0, 300, 20, g_hMainWnd, NULL, NULL, NULL);
|
||||
|
||||
GetClientRect(hwndStatus, &rc1);
|
||||
hFont = CreateFont(32, 0, 0, 0, FW_DONTCARE, FALSE, FALSE, FALSE, ANSI_CHARSET,
|
||||
OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY, FF_DONTCARE, "Tahoma");
|
||||
|
||||
g_wmsize_count = 0;
|
||||
SendMessage(hwndStatus, WM_SETFONT, (WPARAM)hFont, TRUE);
|
||||
ok(g_wmsize_count > 0, "WM_SETFONT should issue WM_SIZE\n");
|
||||
|
||||
GetClientRect(hwndStatus, &rc2);
|
||||
todo_wine expect_rect(0, 0, 672, 42, rc2);
|
||||
|
||||
g_wmsize_count = 0;
|
||||
SendMessage(hwndStatus, WM_SETFONT, (WPARAM)hFont, TRUE);
|
||||
ok(g_wmsize_count > 0, "WM_SETFONT should issue WM_SIZE\n");
|
||||
|
||||
GetClientRect(hwndStatus, &rc2);
|
||||
todo_wine expect_rect(0, 0, 672, 42, rc2);
|
||||
|
||||
DestroyWindow(hwndStatus);
|
||||
DeleteObject(hFont);
|
||||
}
|
||||
|
||||
static void test_status_control(void)
|
||||
{
|
||||
HWND hWndStatus;
|
||||
@ -246,6 +290,9 @@ START_TEST(status)
|
||||
|
||||
InitCommonControls();
|
||||
|
||||
register_subclass();
|
||||
|
||||
test_status_control();
|
||||
test_create();
|
||||
test_setfont();
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user