[ros-diffs] [jimtabor] 23304: - Part 2, Menu.c, cosmetic fixes. Fixed most of all the drawing issues. One outstanding needed fix is Lazarus. There maybe some tweaking needed, over all menus look nice.
jimtabor at svn.reactos.org
jimtabor at svn.reactos.org
Thu Jul 27 03:21:22 CEST 2006
Author: jimtabor
Date: Thu Jul 27 05:21:21 2006
New Revision: 23304
URL: http://svn.reactos.org/svn/reactos?rev=23304&view=rev
Log:
- Part 2, Menu.c, cosmetic fixes. Fixed most of all the drawing issues. One outstanding needed fix is Lazarus. There maybe some tweaking needed, over all menus look nice.
Modified:
trunk/reactos/dll/win32/user32/windows/menu.c
Modified: trunk/reactos/dll/win32/user32/windows/menu.c
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/user32/windows/menu.c?rev=23304&r1=23303&r2=23304&view=diff
==============================================================================
--- trunk/reactos/dll/win32/user32/windows/menu.c (original)
+++ trunk/reactos/dll/win32/user32/windows/menu.c Thu Jul 27 05:21:21 2006
@@ -116,6 +116,8 @@
static HBITMAP StdMnArrow = NULL;
static HBITMAP BmpSysMenu = NULL;
+
+static SIZE MenuCharSize;
/***********************************************************************
* MenuGetRosMenuInfo
@@ -768,7 +770,9 @@
SelectObject(DcMem, OrigBitmap);
DeleteDC(DcMem);
}
- Rect.left += CheckBitmapWidth;
+ Rect.left += 4;
+ if( !(MenuInfo->dwStyle & MNS_NOCHECK))
+ Rect.left += CheckBitmapWidth;
Rect.right -= ArrowBitmapWidth;
}
else if (Item->hbmpItem) /* Draw the bitmap */
@@ -785,6 +789,9 @@
UINT uFormat = MenuBar ? DT_CENTER | DT_VCENTER | DT_SINGLELINE
: DT_LEFT | DT_VCENTER | DT_SINGLELINE;
+ if( !(MenuInfo->dwStyle & MNS_CHECKORBMP))
+ Rect.left += MenuInfo->maxBmpSize.cx;
+
if (0 != (Item->fState & MFS_DEFAULT))
{
FontOld = SelectObject(Dc, hMenuFontBold);
@@ -837,6 +844,7 @@
}
else
{
+ Rect.right = Item->XTab;
uFormat = DT_RIGHT | DT_VCENTER | DT_SINGLELINE;
}
@@ -1178,7 +1186,7 @@
INT OrgX, INT OrgY, BOOL MenuBar)
{
PWCHAR p;
- SIZE MenuCharSize;
+ INT itemheight = 0;
UINT CheckBitmapWidth = GetSystemMetrics(SM_CXMENUCHECK);
DPRINT("dc=%x owner=%x (%d,%d)\n", Dc, WndOwner, OrgX, OrgY);
@@ -1231,83 +1239,114 @@
ItemInfo->Rect.right += ArrowBitmapWidth + MenuCharSize.cx;
return;
}
-
+
+ ItemInfo->XTab = 0;
+
if (ItemInfo->hbmpItem)
- {
+ {
SIZE Size;
- if (!MenuBar)
+ if (!MenuBar) /* hbmpItem */
{
MenuGetBitmapItemSize(ItemInfo, &Size, WndOwner );
- /* Keep the size of the bitmap in callback mode to be able
- * to draw it correctly */
- ItemInfo->Rect.right = ItemInfo->Rect.left + Size.cx;
- if (MenuInfo->maxBmpSize.cx < abs(Size.cx) + MENU_ITEM_HBMP_SPACE ||
- MenuInfo->maxBmpSize.cy < abs(Size.cy))
- {
- MenuInfo->maxBmpSize.cx = abs(Size.cx) + MENU_ITEM_HBMP_SPACE;
- MenuInfo->maxBmpSize.cy = abs(Size.cy);
- }
- MenuSetRosMenuInfo(MenuInfo);
-
- ItemInfo->Rect.right += 2 * CheckBitmapWidth;
- if (0 != (ItemInfo->fType & MF_POPUP))
- {
- ItemInfo->Rect.right += ArrowBitmapWidth;
- }
+ /* Keep the size of the bitmap in callback mode to be able
+ * to draw it correctly */
+ ItemInfo->Rect.right = ItemInfo->Rect.left + Size.cx;
+ if (MenuInfo->maxBmpSize.cx < abs(Size.cx) + MENU_ITEM_HBMP_SPACE ||
+ MenuInfo->maxBmpSize.cy < abs(Size.cy))
+ {
+ MenuInfo->maxBmpSize.cx = abs(Size.cx) + MENU_ITEM_HBMP_SPACE;
+ MenuInfo->maxBmpSize.cy = abs(Size.cy);
+ }
+ MenuSetRosMenuInfo(MenuInfo);
+ ItemInfo->Rect.right += Size.cx + 2;
+ itemheight = Size.cy + 2;
+
+ if( !(MenuInfo->dwStyle & MNS_NOCHECK))
+ ItemInfo->Rect.right += 2 * CheckBitmapWidth;
+ ItemInfo->Rect.right += 4 + MenuCharSize.cx;
+ ItemInfo->XTab = ItemInfo->Rect.right;
+ ItemInfo->Rect.right += ArrowBitmapWidth;
}
- else
+ else /* hbmpItem & MenuBar */
{
MenuGetBitmapItemSize(ItemInfo, &Size, WndOwner );
ItemInfo->Rect.right += Size.cx;
- ItemInfo->Rect.bottom += Size.cy;
-
- /* Leave space for the sunken border */
- ItemInfo->Rect.right += 2;
- ItemInfo->Rect.bottom += 2;
+ if( ItemInfo->Text) ItemInfo->Rect.right += 2;
+ itemheight = Size.cy;
/* Special case: Minimize button doesn't have a space behind it. */
if (ItemInfo->hbmpItem == (HBITMAP)HBMMENU_MBAR_MINIMIZE ||
ItemInfo->hbmpItem == (HBITMAP)HBMMENU_MBAR_MINIMIZE_D)
ItemInfo->Rect.right -= 1;
}
- }
+ }
+ else if (!MenuBar)
+ {
+ if( !(MenuInfo->dwStyle & MNS_NOCHECK))
+ ItemInfo->Rect.right += CheckBitmapWidth;
+ ItemInfo->Rect.right += 4 + MenuCharSize.cx;
+ ItemInfo->XTab = ItemInfo->Rect.right;
+ ItemInfo->Rect.right += ArrowBitmapWidth;
+ }
/* it must be a text item - unless it's the system menu */
if (0 == (ItemInfo->fType & MF_SYSMENU) && ItemInfo->Text)
- {
- SIZE Size;
-
- GetTextExtentPoint32W(Dc, (LPWSTR) ItemInfo->dwTypeData,
- strlenW((LPWSTR) ItemInfo->dwTypeData), &Size);
-
- ItemInfo->Rect.right += Size.cx;
- ItemInfo->Rect.bottom += max(Size.cy, GetSystemMetrics(SM_CYMENU) - 1);
- ItemInfo->XTab = 0;
-
- if (MenuBar)
- {
- ItemInfo->Rect.right += MENU_BAR_ITEMS_SPACE;
- }
- else if ((p = wcschr((LPWSTR) ItemInfo->dwTypeData, L'\t' )) != NULL)
- {
- /* Item contains a tab (only meaningful in popup menus) */
- GetTextExtentPoint32W(Dc, (LPWSTR) ItemInfo->dwTypeData,
- (int)(p - (LPWSTR) ItemInfo->dwTypeData), &Size);
- ItemInfo->XTab = CheckBitmapWidth + MENU_TAB_SPACE + Size.cx;
- ItemInfo->Rect.right += MENU_TAB_SPACE;
- }
- else
- {
- if (NULL != wcschr((LPWSTR) ItemInfo->dwTypeData, L'\b'))
- {
- ItemInfo->Rect.right += MENU_TAB_SPACE;
- }
- ItemInfo->XTab = ItemInfo->Rect.right - CheckBitmapWidth
- - ArrowBitmapWidth;
- }
- }
-
+ {
+ HFONT hfontOld = NULL;
+ RECT rc = ItemInfo->Rect;
+ LONG txtheight, txtwidth;
+
+ if ( ItemInfo->fState & MFS_DEFAULT )
+ {
+ hfontOld = SelectObject( Dc, hMenuFontBold );
+ }
+ if (MenuBar)
+ {
+ txtheight = DrawTextW( Dc, ItemInfo->dwTypeData, -1, &rc,
+ DT_SINGLELINE|DT_CALCRECT);
+ ItemInfo->Rect.right += rc.right - rc.left;
+ itemheight = max( max( itemheight, txtheight),
+ GetSystemMetrics( SM_CYMENU) - 1);
+ ItemInfo->Rect.right += 2 * MenuCharSize.cx;
+ }
+ else
+ {
+ if ((p = strchrW( ItemInfo->dwTypeData, '\t' )) != NULL)
+ {
+ RECT tmprc = rc;
+ LONG tmpheight;
+ int n = (int)( p - ItemInfo->dwTypeData);
+ /* Item contains a tab (only meaningful in popup menus) */
+ /* get text size before the tab */
+ txtheight = DrawTextW( Dc, ItemInfo->dwTypeData, n, &rc,
+ DT_SINGLELINE|DT_CALCRECT);
+ txtwidth = rc.right - rc.left;
+ p += 1; /* advance past the Tab */
+ /* get text size after the tab */
+ tmpheight = DrawTextW( Dc, p, -1, &tmprc, DT_SINGLELINE|DT_CALCRECT);
+ ItemInfo->XTab += txtwidth;
+ txtheight = max( txtheight, tmpheight);
+ txtwidth += MenuCharSize.cx + /* space for the tab */
+ tmprc.right - tmprc.left; /* space for the short cut */
+ }
+ else
+ {
+ txtheight = DrawTextW( Dc, ItemInfo->dwTypeData, -1, &rc,
+ DT_SINGLELINE|DT_CALCRECT);
+ txtwidth = rc.right - rc.left;
+ ItemInfo->XTab += txtwidth;
+ }
+ ItemInfo->Rect.right += 2 + txtwidth;
+ itemheight = max( itemheight, max( txtheight + 2, MenuCharSize.cy + 4));
+ }
+ if (hfontOld) SelectObject (Dc, hfontOld);
+ }
+ else if( MenuBar)
+ {
+ itemheight = max( itemheight, GetSystemMetrics(SM_CYMENU)-1);
+ }
+ ItemInfo->Rect.bottom += itemheight;
DPRINT("(%ld,%ld)-(%ld,%ld)\n", ItemInfo->Rect.left, ItemInfo->Rect.top, ItemInfo->Rect.right, ItemInfo->Rect.bottom);
}
@@ -1336,6 +1375,9 @@
Start = 0;
MaxX = 2 + 1;
+
+ MenuInfo->maxBmpSize.cx = 0;
+ MenuInfo->maxBmpSize.cy = 0;
MenuInitRosMenuItemInfo(&ItemInfo);
while (Start < MenuInfo->MenuItemCount)
@@ -1441,6 +1483,9 @@
Start = 0;
HelpPos = -1;
+ MenuInfo->maxBmpSize.cx = 0;
+ MenuInfo->maxBmpSize.cy = 0;
+
MenuInitRosMenuItemInfo(&ItemInfo);
while (Start < MenuInfo->MenuItemCount)
{
@@ -1467,7 +1512,6 @@
DPRINT("calling MENU_CalcItemSize org=(%d, %d)\n", OrgX, OrgY);
MenuCalcItemSize(Dc, &ItemInfo, MenuInfo, WndOwner, OrgX, OrgY, TRUE);
-
if (! MenuSetRosMenuItemInfo(MenuInfo->Self, i, &ItemInfo))
{
MenuCleanupRosMenuItemInfo(&ItemInfo);
@@ -1770,7 +1814,7 @@
if (GetSystemMetrics(SM_CXSCREEN ) < X + Width)
{
- if (0 != XAnchor)
+ if (0 != XAnchor && X >= Width - XAnchor)
{
X -= Width - XAnchor;
}
@@ -1786,7 +1830,7 @@
if (GetSystemMetrics(SM_CYSCREEN) < Y + Height)
{
- if (0 != YAnchor)
+ if (0 != YAnchor && Y >= Height + YAnchor)
{
Y -= Height + YAnchor;
}
@@ -2201,9 +2245,10 @@
if (0 != (MenuInfo->Flags & MF_POPUP))
{
Rect.left += ItemInfo.Rect.right - GetSystemMetrics(SM_CXBORDER);
- Rect.top += ItemInfo.Rect.top;
+ Rect.top += ItemInfo.Rect.top - 3;
Rect.right = ItemInfo.Rect.left - ItemInfo.Rect.right + GetSystemMetrics(SM_CXBORDER);
- Rect.bottom = ItemInfo.Rect.top - ItemInfo.Rect.bottom;
+ Rect.bottom = ItemInfo.Rect.top - ItemInfo.Rect.bottom - 3 - 2
+ - GetSystemMetrics(SM_CYBORDER);
}
else
{
More information about the Ros-diffs
mailing list