Rein Klazes : user32: Refine the size calculations for menu items with HBMMENU_POPUP magic bitmaps with some conformance tests .
Alexandre Julliard
julliard at winehq.org
Wed Feb 25 09:22:36 CST 2009
Module: wine
Branch: master
Commit: bdb770e10e03485737cca5d6a82b5e3c26dd2703
URL: http://source.winehq.org/git/wine.git/?a=commit;h=bdb770e10e03485737cca5d6a82b5e3c26dd2703
Author: Rein Klazes <wijn at online.nl>
Date: Tue Feb 24 19:10:29 2009 +0100
user32: Refine the size calculations for menu items with HBMMENU_POPUP magic bitmaps with some conformance tests.
---
dlls/user32/menu.c | 11 +++++++----
dlls/user32/tests/menu.c | 44 ++++++++++++++++++++++++++++++++++++--------
2 files changed, 43 insertions(+), 12 deletions(-)
diff --git a/dlls/user32/menu.c b/dlls/user32/menu.c
index 1df3675..d285ef2 100644
--- a/dlls/user32/menu.c
+++ b/dlls/user32/menu.c
@@ -423,6 +423,7 @@ static HMENU MENU_CopySysPopup(void)
MENUITEMINFOW miteminfo;
POPUPMENU* menu = MENU_GetMenu(hMenu);
menu->wFlags |= MF_SYSMENU | MF_POPUP;
+ /* decorate the menu with bitmaps */
minfo.cbSize = sizeof( MENUINFO);
minfo.dwStyle = MNS_CHECKORBMP;
minfo.fMask = MIM_STYLE;
@@ -835,8 +836,8 @@ static void MENU_GetBitmapItemSize( MENUITEM *lpitem, SIZE *size,
case (INT_PTR)HBMMENU_POPUP_RESTORE:
case (INT_PTR)HBMMENU_POPUP_MAXIMIZE:
case (INT_PTR)HBMMENU_POPUP_MINIMIZE:
- size->cx = GetSystemMetrics( SM_CYMENU ) - 4; /* FIXME: test */
- size->cy = size->cx;
+ size->cx = GetSystemMetrics( SM_CXMENUSIZE);
+ size->cy = GetSystemMetrics( SM_CYMENUSIZE);
return;
}
if (GetObjectW(bmp, sizeof(bm), &bm ))
@@ -945,15 +946,17 @@ static void MENU_DrawBitmapItem( HDC hdc, MENUITEM *lpitem, const RECT *rect,
}
if (bmchr)
{
+ /* draw the magic bitmaps using marlett font characters */
+ /* FIXME: fontsize and the position (x,y) could probably be better */
HFONT hfont, hfontsav;
LOGFONTW logfont = { 0, 0, 0, 0, FW_NORMAL,
0, 0, 0, SYMBOL_CHARSET, 0, 0, 0, 0,
{ 'M','a','r','l','e','t','t',0 } };
- logfont.lfHeight = min( h, w) - 2 ;
+ logfont.lfHeight = min( h, w) - 5 ;
TRACE(" height %d rect %s\n", logfont.lfHeight, wine_dbgstr_rect( rect));
hfont = CreateFontIndirectW( &logfont);
hfontsav = SelectObject(hdc, hfont);
- TextOutW( hdc, rect->left, rect->top, &bmchr, 1);
+ TextOutW( hdc, rect->left, rect->top + 2, &bmchr, 1);
SelectObject(hdc, hfontsav);
DeleteObject( hfont);
}
diff --git a/dlls/user32/tests/menu.c b/dlls/user32/tests/menu.c
index 4d0e7d4..f5d2bdc 100644
--- a/dlls/user32/tests/menu.c
+++ b/dlls/user32/tests/menu.c
@@ -433,7 +433,7 @@ static void test_mbs_help( int ispop, int hassub, int mnuopt,
sprintf( buf,"%d text \"%s\" mnuopt %d", count, text ? text: "(nil)", mnuopt);
FillRect( hdc, &rc, (HBRUSH) COLOR_WINDOW);
- TextOut( hdc, 100, 50, buf, strlen( buf));
+ TextOut( hdc, 10, 50, buf, strlen( buf));
ReleaseDC( hwnd, hdc);
}
if(ispop)
@@ -445,13 +445,17 @@ static void test_mbs_help( int ispop, int hassub, int mnuopt,
}
ret = GetMenuItemRect( hwnd, hmenu, 0, &rc);
if (0) /* comment out menu size checks, behavior is different in almost every Windows version */
+ /* the tests should however succeed on win2000, XP and Wine (at least upto 1.1.15) */
+ /* with a variety of dpi's and desktop font sizes */
{
/* check menu width */
if( ispop)
expect = ( text || hbmp ?
4 + (mnuopt != 1 ? GetSystemMetrics(SM_CXMENUCHECK) : 0)
: 0) +
- arrowwidth + MOD_avec + (hbmp ? bmpsize.cx + 2 : 0) +
+ arrowwidth + MOD_avec + (hbmp ?
+ ((int)hbmp<0||(int)hbmp>12 ? bmpsize.cx + 2 : GetSystemMetrics( SM_CXMENUSIZE) + 2)
+ : 0) +
(text && hastab ? /* TAB space */
MOD_avec + ( hastab==2 ? sc_size.cx : 0) : 0) +
(text ? 2 + (text[0] ? size.cx :0): 0) ;
@@ -466,7 +470,11 @@ static void test_mbs_help( int ispop, int hassub, int mnuopt,
if( ispop)
expect = max( ( !(text || hbmp) ? GetSystemMetrics( SM_CYMENUSIZE)/2 : 0),
max( (text ? max( 2 + size.cy, MOD_hic + 4) : 0),
- (hbmp ? bmpsize.cy + 2 : 0)));
+ (hbmp ?
+ ((int)hbmp<0||(int)hbmp>12 ?
+ bmpsize.cy + 2
+ : GetSystemMetrics( SM_CYMENUSIZE) + 2)
+ : 0)));
else
expect = ( !(text || hbmp) ? GetSystemMetrics( SM_CYMENUSIZE)/2 :
max( GetSystemMetrics( SM_CYMENU) - 1, (hbmp ? bmpsize.cy : 0)));
@@ -497,8 +505,8 @@ static void test_mbs_help( int ispop, int hassub, int mnuopt,
}
/* if there was a failure, report details */
if( failed) {
- trace("*** count %d text \"%s\" bitmap %p bmsize %d,%d textsize %d+%d,%d mnuopt %d hastab %d\n",
- count, text ? text: "(nil)", hbmp, bmpsize.cx, bmpsize.cy,
+ trace("*** count %d %s text \"%s\" bitmap %p bmsize %d,%d textsize %d+%d,%d mnuopt %d hastab %d\n",
+ count, (ispop? "POPUP": "MENUBAR"),text ? text: "(nil)", hbmp, bmpsize.cx, bmpsize.cy,
size.cx, size.cy, sc_size.cx, mnuopt, hastab);
trace(" check %d,%d arrow %d avechar %d\n",
GetSystemMetrics(SM_CXMENUCHECK ),
@@ -523,6 +531,9 @@ static void test_menu_bmp_and_string(void)
BITMAP bm;
INT arrowwidth;
HWND hwnd;
+ HMENU hsysmenu;
+ MENUINFO mi= {sizeof(MENUINFO)};
+ MENUITEMINFOA mii= {sizeof(MENUITEMINFOA)};
int count, szidx, txtidx, bmpidx, hassub, mnuopt, ispop;
if( !pGetMenuInfo)
@@ -532,15 +543,28 @@ static void test_menu_bmp_and_string(void)
}
memset( bmfill, 0xcc, sizeof( bmfill));
- hwnd = CreateWindowEx(0, MAKEINTATOM(atomMenuCheckClass), NULL,
+ hwnd = CreateWindowEx(0, MAKEINTATOM(atomMenuCheckClass), NULL, WS_SYSMENU |
WS_VISIBLE, CW_USEDEFAULT, CW_USEDEFAULT, 200, 200,
NULL, NULL, NULL, NULL);
hbm_arrow=LoadBitmap( 0, (CHAR*)OBM_MNARROW);
GetObject( hbm_arrow, sizeof(bm), &bm);
arrowwidth = bm.bmWidth;
-
ok(hwnd != NULL, "CreateWindowEx failed with error %d\n", GetLastError());
if( !hwnd) return;
+ /* test system menu */
+ hsysmenu = GetSystemMenu( hwnd, FALSE);
+ ok( hsysmenu != NULL, "GetSystemMenu failed with error %d\n", GetLastError());
+ mi.fMask = MIM_STYLE;
+ mi.dwStyle = 0;
+ ok( pGetMenuInfo( hsysmenu, &mi), "GetMenuInfo failed gle=%d\n", GetLastError());
+ ok( MNS_CHECKORBMP == mi.dwStyle, "System Menu Style is %08x, without the bit %08x\n",
+ mi.dwStyle, MNS_CHECKORBMP);
+ mii.fMask = MIIM_BITMAP;
+ mii.hbmpItem = NULL;
+ ok( GetMenuItemInfoA( hsysmenu, SC_CLOSE, FALSE, &mii), "GetMenuItemInfoA failed gle=%d\n", GetLastError());
+ ok( HBMMENU_POPUP_CLOSE == mii.hbmpItem, "Item info did not get the right hbitmap: got %p expected %p\n",
+ mii.hbmpItem, HBMMENU_POPUP_CLOSE);
+
SetWindowLongPtr( hwnd, GWLP_WNDPROC, (LONG_PTR)menu_ownerdraw_wnd_proc);
if( winetest_debug)
@@ -554,7 +578,7 @@ static void test_menu_bmp_and_string(void)
{10,10},{38,38},{1,30},{55,5}};
for( szidx=0; szidx < sizeof( bmsizes) / sizeof( SIZE); szidx++) {
HBITMAP hbm = CreateBitmap( bmsizes[szidx].cx, bmsizes[szidx].cy,1,1,bmfill);
- HBITMAP bitmaps[] = { HBMMENU_CALLBACK, hbm, NULL };
+ HBITMAP bitmaps[] = { HBMMENU_CALLBACK, hbm, HBMMENU_POPUP_CLOSE, NULL };
ok( hbm != 0, "CreateBitmap failed err %d\n", GetLastError());
for( txtidx = 0; txtidx < sizeof(MOD_txtsizes)/sizeof(MOD_txtsizes[0]); txtidx++) {
for( hassub = 0; hassub < 2 ; hassub++) { /* add submenu item */
@@ -562,6 +586,10 @@ static void test_menu_bmp_and_string(void)
for( bmpidx = 0; bmpidx <sizeof(bitmaps)/sizeof(HBITMAP); bmpidx++) {
/* no need to test NULL bitmaps of several sizes */
if( !bitmaps[bmpidx] && szidx > 0) continue;
+ /* the HBMMENU_POPUP not to test for menu bars */
+ if( !ispop &&
+ bitmaps[bmpidx] >= HBMMENU_POPUP_CLOSE &&
+ bitmaps[bmpidx] <= HBMMENU_POPUP_MINIMIZE) continue;
if( !ispop && hassub) continue;
test_mbs_help( ispop, hassub, mnuopt,
hwnd, arrowwidth, ++count,
More information about the wine-cvs
mailing list