mirror of
https://github.com/reactos/reactos.git
synced 2024-10-20 08:01:05 +00:00
changed menu code to use UNICODE_STRING
svn path=/trunk/; revision=5889
This commit is contained in:
parent
22f4e1ae9e
commit
9cfd31e787
|
@ -16,7 +16,7 @@
|
||||||
* along with this program; if not, write to the Free Software
|
* along with this program; if not, write to the Free Software
|
||||||
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||||
*/
|
*/
|
||||||
/* $Id: menu.c,v 1.29 2003/08/23 17:06:07 weiden Exp $
|
/* $Id: menu.c,v 1.30 2003/08/27 22:58:12 weiden Exp $
|
||||||
*
|
*
|
||||||
* PROJECT: ReactOS user32.dll
|
* PROJECT: ReactOS user32.dll
|
||||||
* FILE: lib/user32/windows/menu.c
|
* FILE: lib/user32/windows/menu.c
|
||||||
|
@ -318,7 +318,7 @@ MenuDrawMenuBar(HDC hDC, LPRECT Rect, HWND hWnd, BOOL Draw)
|
||||||
/* FIXME cache menu bar items using NtUserDrawMenuBarTemp() */
|
/* FIXME cache menu bar items using NtUserDrawMenuBarTemp() */
|
||||||
|
|
||||||
/* FIXME select menu font first */
|
/* FIXME select menu font first */
|
||||||
|
SetTextColor(hDC, COLOR_MENUTEXT);
|
||||||
DrawTextW(hDC, L"FIXME: Draw Menubar", -1, Rect, DT_SINGLELINE | DT_VCENTER);
|
DrawTextW(hDC, L"FIXME: Draw Menubar", -1, Rect, DT_SINGLELINE | DT_VCENTER);
|
||||||
|
|
||||||
return(Rect->bottom - Rect->top);
|
return(Rect->bottom - Rect->top);
|
||||||
|
@ -750,26 +750,26 @@ InsertMenuA(
|
||||||
mii.cbSize = sizeof(MENUITEMINFOA);
|
mii.cbSize = sizeof(MENUITEMINFOA);
|
||||||
mii.fMask = MIIM_FTYPE | MIIM_STRING;
|
mii.fMask = MIIM_FTYPE | MIIM_STRING;
|
||||||
mii.fType = 0;
|
mii.fType = 0;
|
||||||
|
|
||||||
if(uFlags & MF_BITMAP)
|
if(uFlags & MF_BITMAP)
|
||||||
|
{
|
||||||
mii.fType |= MFT_BITMAP;
|
mii.fType |= MFT_BITMAP;
|
||||||
else
|
|
||||||
{
|
|
||||||
if(uFlags & MF_STRING)
|
|
||||||
{
|
|
||||||
mii.fType |= MFT_STRING;
|
|
||||||
}
|
}
|
||||||
else if(uFlags & MF_OWNERDRAW)
|
else if(uFlags & MF_OWNERDRAW)
|
||||||
{
|
{
|
||||||
mii.fType |= MFT_OWNERDRAW;
|
mii.fType |= MFT_OWNERDRAW;
|
||||||
}
|
}
|
||||||
|
mii.dwTypeData = (LPSTR)lpNewItem;
|
||||||
|
if(uFlags & MF_POPUP)
|
||||||
|
{
|
||||||
|
mii.fMask |= MIIM_SUBMENU;
|
||||||
|
mii.hSubMenu = (HMENU)uIDNewItem;
|
||||||
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
SetLastError(ERROR_INVALID_PARAMETER);
|
mii.fMask |= MIIM_ID;
|
||||||
return FALSE;
|
mii.wID = (UINT)uIDNewItem;
|
||||||
}
|
}
|
||||||
}
|
|
||||||
mii.dwTypeData = (LPSTR)lpNewItem;
|
|
||||||
|
|
||||||
return InsertMenuItemA(hMenu, uPosition, (WINBOOL)!(MF_BYPOSITION & uFlags), &mii);
|
return InsertMenuItemA(hMenu, uPosition, (WINBOOL)!(MF_BYPOSITION & uFlags), &mii);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -786,6 +786,7 @@ InsertMenuItemA(
|
||||||
LPCMENUITEMINFOA lpmii)
|
LPCMENUITEMINFOA lpmii)
|
||||||
{
|
{
|
||||||
MENUITEMINFOW mi;
|
MENUITEMINFOW mi;
|
||||||
|
UNICODE_STRING MenuText;
|
||||||
WINBOOL res = FALSE;
|
WINBOOL res = FALSE;
|
||||||
BOOL CleanHeap = FALSE;
|
BOOL CleanHeap = FALSE;
|
||||||
NTSTATUS Status;
|
NTSTATUS Status;
|
||||||
|
@ -805,6 +806,8 @@ InsertMenuItemA(
|
||||||
SetLastError (RtlNtStatusToDosError(Status));
|
SetLastError (RtlNtStatusToDosError(Status));
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
RtlInitUnicodeString(&MenuText, (PWSTR)mi.dwTypeData);
|
||||||
|
mi.dwTypeData = (LPWSTR)&MenuText;
|
||||||
CleanHeap = TRUE;
|
CleanHeap = TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -828,9 +831,9 @@ InsertMenuItemW(
|
||||||
LPCMENUITEMINFOW lpmii)
|
LPCMENUITEMINFOW lpmii)
|
||||||
{
|
{
|
||||||
MENUITEMINFOW mi;
|
MENUITEMINFOW mi;
|
||||||
|
UNICODE_STRING MenuText;
|
||||||
WINBOOL res = FALSE;
|
WINBOOL res = FALSE;
|
||||||
BOOL CleanHeap = FALSE;
|
BOOL CleanHeap = FALSE;
|
||||||
ULONG len = 0;
|
|
||||||
HANDLE hHeap = RtlGetProcessHeap();
|
HANDLE hHeap = RtlGetProcessHeap();
|
||||||
mi.hbmpItem = (HBITMAP)0;
|
mi.hbmpItem = (HBITMAP)0;
|
||||||
|
|
||||||
|
@ -849,16 +852,14 @@ InsertMenuItemW(
|
||||||
{
|
{
|
||||||
if(lpmii->cch > 0)
|
if(lpmii->cch > 0)
|
||||||
{
|
{
|
||||||
len = lstrlenW(lpmii->dwTypeData);
|
if(!RtlCreateUnicodeString(&MenuText, (PWSTR)lpmii->dwTypeData))
|
||||||
mi.dwTypeData = RtlAllocateHeap(hHeap, 0, (len + 1) * sizeof(WCHAR));
|
|
||||||
if(!mi.dwTypeData)
|
|
||||||
{
|
{
|
||||||
SetLastError (RtlNtStatusToDosError(STATUS_NO_MEMORY));
|
SetLastError (RtlNtStatusToDosError(STATUS_NO_MEMORY));
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
memcpy(&mi.dwTypeData, &lpmii->dwTypeData, len);
|
mi.dwTypeData = (LPWSTR)&MenuText;
|
||||||
|
mi.cch = MenuText.Length / sizeof(WCHAR);
|
||||||
CleanHeap = TRUE;
|
CleanHeap = TRUE;
|
||||||
mi.cch = len;
|
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -895,14 +896,17 @@ InsertMenuW(
|
||||||
{
|
{
|
||||||
mii.fType |= MFT_OWNERDRAW;
|
mii.fType |= MFT_OWNERDRAW;
|
||||||
}
|
}
|
||||||
else if(uFlags & MF_POPUP)
|
mii.dwTypeData = (LPWSTR)lpNewItem;
|
||||||
|
if(uFlags & MF_POPUP)
|
||||||
{
|
{
|
||||||
mii.fMask |= MIIM_SUBMENU;
|
mii.fMask |= MIIM_SUBMENU;
|
||||||
mii.hSubMenu = (HMENU)uIDNewItem;
|
mii.hSubMenu = (HMENU)uIDNewItem;
|
||||||
mii.wID = 0;
|
|
||||||
}
|
}
|
||||||
mii.dwTypeData = (LPWSTR)lpNewItem;
|
else
|
||||||
|
{
|
||||||
|
mii.fMask |= MIIM_ID;
|
||||||
|
mii.wID = (UINT)uIDNewItem;
|
||||||
|
}
|
||||||
return InsertMenuItemW(hMenu, uPosition, (WINBOOL)!(MF_BYPOSITION & uFlags), &mii);
|
return InsertMenuItemW(hMenu, uPosition, (WINBOOL)!(MF_BYPOSITION & uFlags), &mii);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -24,8 +24,7 @@ typedef struct _MENU_ITEM
|
||||||
HBITMAP hbmpChecked;
|
HBITMAP hbmpChecked;
|
||||||
HBITMAP hbmpUnchecked;
|
HBITMAP hbmpUnchecked;
|
||||||
ULONG_PTR dwItemData;
|
ULONG_PTR dwItemData;
|
||||||
LPWSTR dwTypeData;
|
UNICODE_STRING Text;
|
||||||
UINT cch;
|
|
||||||
HBITMAP hbmpItem;
|
HBITMAP hbmpItem;
|
||||||
} MENU_ITEM, *PMENU_ITEM;
|
} MENU_ITEM, *PMENU_ITEM;
|
||||||
|
|
||||||
|
|
|
@ -16,7 +16,7 @@
|
||||||
* along with this program; if not, write to the Free Software
|
* along with this program; if not, write to the Free Software
|
||||||
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||||
*/
|
*/
|
||||||
/* $Id: menu.c,v 1.27 2003/08/22 16:01:01 weiden Exp $
|
/* $Id: menu.c,v 1.28 2003/08/27 22:58:12 weiden Exp $
|
||||||
*
|
*
|
||||||
* COPYRIGHT: See COPYING in the top level directory
|
* COPYRIGHT: See COPYING in the top level directory
|
||||||
* PROJECT: ReactOS kernel
|
* PROJECT: ReactOS kernel
|
||||||
|
@ -75,11 +75,8 @@
|
||||||
#define FreeMenuText(MenuItem) \
|
#define FreeMenuText(MenuItem) \
|
||||||
{ \
|
{ \
|
||||||
if((MENU_ITEM_TYPE((MenuItem)->fType) == MF_STRING) && \
|
if((MENU_ITEM_TYPE((MenuItem)->fType) == MF_STRING) && \
|
||||||
(MenuItem)->dwTypeData) { \
|
(MenuItem)->Text.Length) { \
|
||||||
if((MenuItem)->cch) \
|
RtlFreeUnicodeString(&(MenuItem)->Text); \
|
||||||
ExFreePool((MenuItem)->dwTypeData); \
|
|
||||||
(MenuItem)->dwTypeData = 0; \
|
|
||||||
(MenuItem)->cch = 0; \
|
|
||||||
} \
|
} \
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -95,17 +92,17 @@ CleanupMenuImpl(VOID)
|
||||||
return(STATUS_SUCCESS);
|
return(STATUS_SUCCESS);
|
||||||
}
|
}
|
||||||
|
|
||||||
#if 1
|
#if 0
|
||||||
void FASTCALL
|
void FASTCALL
|
||||||
DumpMenuItemList(PMENU_ITEM MenuItem)
|
DumpMenuItemList(PMENU_ITEM MenuItem)
|
||||||
{
|
{
|
||||||
UINT cnt = 0;
|
UINT cnt = 0;
|
||||||
while(MenuItem)
|
while(MenuItem)
|
||||||
{
|
{
|
||||||
if(MenuItem->dwTypeData)
|
if(MenuItem->Text.Length)
|
||||||
DbgPrint(" %d. %ws\n", ++cnt, (LPWSTR)MenuItem->dwTypeData);
|
DbgPrint(" %d. %wZ\n", ++cnt, &MenuItem->Text);
|
||||||
else
|
else
|
||||||
DbgPrint(" %d. NO TEXT dwTypeData==%d\n", ++cnt, MenuItem->dwTypeData);
|
DbgPrint(" %d. NO TEXT dwTypeData==%d\n", ++cnt, (DWORD)MenuItem->Text.Buffer);
|
||||||
DbgPrint(" fType=");
|
DbgPrint(" fType=");
|
||||||
if(MFT_BITMAP & MenuItem->fType) DbgPrint("MFT_BITMAP ");
|
if(MFT_BITMAP & MenuItem->fType) DbgPrint("MFT_BITMAP ");
|
||||||
if(MFT_MENUBARBREAK & MenuItem->fType) DbgPrint("MFT_MENUBARBREAK ");
|
if(MFT_MENUBARBREAK & MenuItem->fType) DbgPrint("MFT_MENUBARBREAK ");
|
||||||
|
@ -315,31 +312,29 @@ IntCloneMenuItems(PMENU_OBJECT Destination, PMENU_OBJECT Source)
|
||||||
NewMenuItem->hbmpChecked = MenuItem->hbmpChecked;
|
NewMenuItem->hbmpChecked = MenuItem->hbmpChecked;
|
||||||
NewMenuItem->hbmpUnchecked = MenuItem->hbmpUnchecked;
|
NewMenuItem->hbmpUnchecked = MenuItem->hbmpUnchecked;
|
||||||
NewMenuItem->dwItemData = MenuItem->dwItemData;
|
NewMenuItem->dwItemData = MenuItem->dwItemData;
|
||||||
NewMenuItem->dwTypeData = MenuItem->dwTypeData;
|
|
||||||
if((MENU_ITEM_TYPE(NewMenuItem->fType) == MF_STRING))
|
if((MENU_ITEM_TYPE(NewMenuItem->fType) == MF_STRING))
|
||||||
{
|
{
|
||||||
if(MenuItem->cch && NewMenuItem->dwTypeData)
|
if(MenuItem->Text.Length)
|
||||||
{
|
{
|
||||||
NewMenuItem->dwTypeData = (LPWSTR)ExAllocatePool(PagedPool, (MenuItem->cch + 1) * sizeof(WCHAR));
|
NewMenuItem->Text.Length = 0;
|
||||||
if(!NewMenuItem->dwTypeData)
|
NewMenuItem->Text.MaximumLength = MenuItem->Text.MaximumLength;
|
||||||
|
NewMenuItem->Text.Buffer = (PWSTR)ExAllocatePool(PagedPool, MenuItem->Text.MaximumLength);
|
||||||
|
if(!NewMenuItem->Text.Buffer)
|
||||||
{
|
{
|
||||||
ExFreePool(NewMenuItem);
|
ExFreePool(NewMenuItem);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
memcpy(NewMenuItem->dwTypeData, MenuItem->dwTypeData, (MenuItem->cch + 1) * sizeof(WCHAR));
|
RtlCopyUnicodeString(&NewMenuItem->Text, &MenuItem->Text);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
NewMenuItem->cch = MenuItem->cch;
|
NewMenuItem->Text.Buffer = MenuItem->Text.Buffer;
|
||||||
NewMenuItem->dwTypeData = MenuItem->dwTypeData;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
NewMenuItem->cch = MenuItem->cch;
|
NewMenuItem->Text.Buffer = MenuItem->Text.Buffer;
|
||||||
NewMenuItem->dwTypeData = MenuItem->dwTypeData;
|
|
||||||
}
|
}
|
||||||
NewMenuItem->cch = MenuItem->cch;
|
|
||||||
NewMenuItem->hbmpItem = MenuItem->hbmpItem;
|
NewMenuItem->hbmpItem = MenuItem->hbmpItem;
|
||||||
|
|
||||||
NewMenuItem->Next = NULL;
|
NewMenuItem->Next = NULL;
|
||||||
|
@ -566,7 +561,7 @@ IntGetMenuItemInfo(PMENU_OBJECT MenuObject, PMENU_ITEM MenuItem, LPMENUITEMINFOW
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
lpmii->cch = MenuItem->cch;
|
lpmii->cch = MenuItem->Text.Length;
|
||||||
|
|
||||||
if(lpmii->fMask & MIIM_BITMAP)
|
if(lpmii->fMask & MIIM_BITMAP)
|
||||||
{
|
{
|
||||||
|
@ -604,23 +599,15 @@ IntGetMenuItemInfo(PMENU_OBJECT MenuObject, PMENU_ITEM MenuItem, LPMENUITEMINFOW
|
||||||
BOOL FASTCALL
|
BOOL FASTCALL
|
||||||
IntSetMenuItemInfo(PMENU_OBJECT MenuObject, PMENU_ITEM MenuItem, LPCMENUITEMINFOW lpmii)
|
IntSetMenuItemInfo(PMENU_OBJECT MenuObject, PMENU_ITEM MenuItem, LPCMENUITEMINFOW lpmii)
|
||||||
{
|
{
|
||||||
|
PUNICODE_STRING Source;
|
||||||
|
UINT copylen = 0;
|
||||||
|
|
||||||
if(!MenuItem || !MenuObject || !lpmii)
|
if(!MenuItem || !MenuObject || !lpmii)
|
||||||
{
|
{
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*if((MenuItem->fMask & (MIIM_TYPE | MIIM_STRING)) &&
|
|
||||||
(MENU_ITEM_TYPE(MenuItem->fType) == MF_STRING) &&
|
|
||||||
MenuItem->dwTypeData)
|
|
||||||
{
|
|
||||||
// delete old string
|
|
||||||
ExFreePool(MenuItem->dwTypeData);
|
|
||||||
MenuItem->dwTypeData = 0;
|
|
||||||
MenuItem->cch = 0;
|
|
||||||
}*/
|
|
||||||
|
|
||||||
MenuItem->fType = lpmii->fType;
|
MenuItem->fType = lpmii->fType;
|
||||||
MenuItem->cch = lpmii->cch;
|
|
||||||
|
|
||||||
if(lpmii->fMask & MIIM_BITMAP)
|
if(lpmii->fMask & MIIM_BITMAP)
|
||||||
{
|
{
|
||||||
|
@ -662,28 +649,32 @@ IntSetMenuItemInfo(PMENU_OBJECT MenuObject, PMENU_ITEM MenuItem, LPCMENUITEMINFO
|
||||||
{
|
{
|
||||||
if(lpmii->dwTypeData && lpmii->cch)
|
if(lpmii->dwTypeData && lpmii->cch)
|
||||||
{
|
{
|
||||||
|
Source = (PUNICODE_STRING)lpmii->dwTypeData;
|
||||||
FreeMenuText(MenuItem);
|
FreeMenuText(MenuItem);
|
||||||
MenuItem->dwTypeData = (LPWSTR)ExAllocatePool(PagedPool, (lpmii->cch + 1) * sizeof(WCHAR));
|
copylen = min((UINT)Source->MaximumLength, (lpmii->cch + 1) * sizeof(WCHAR));
|
||||||
if(!MenuItem->dwTypeData)
|
MenuItem->Text.Buffer = (PWSTR)ExAllocatePool(PagedPool, copylen);
|
||||||
|
if(MenuItem->Text.Buffer)
|
||||||
{
|
{
|
||||||
MenuItem->cch = 0;
|
MenuItem->Text.Length = 0;
|
||||||
/* FIXME Set last error code? */
|
MenuItem->Text.MaximumLength = copylen;
|
||||||
SetLastWin32Error(STATUS_NO_MEMORY);
|
RtlCopyUnicodeString(&MenuItem->Text, Source);
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
MenuItem->cch = lpmii->cch;
|
|
||||||
memcpy(MenuItem->dwTypeData, lpmii->dwTypeData, (lpmii->cch + 1) * sizeof(WCHAR));
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
MenuItem->Text.Length = 0;
|
||||||
|
MenuItem->Text.MaximumLength = 0;
|
||||||
|
MenuItem->Text.Buffer = NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
FreeMenuText(MenuItem);
|
||||||
MenuItem->fType = MF_SEPARATOR;
|
MenuItem->fType = MF_SEPARATOR;
|
||||||
MenuItem->dwTypeData = NULL;
|
|
||||||
MenuItem->cch = 0;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
MenuItem->dwTypeData = NULL;
|
RtlInitUnicodeString(&MenuItem->Text, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
return TRUE;
|
return TRUE;
|
||||||
|
@ -729,8 +720,8 @@ IntInsertMenuItem(PMENU_OBJECT MenuObject, UINT uItem, WINBOOL fByPosition,
|
||||||
MenuItem->hSubMenu = (HMENU)0;
|
MenuItem->hSubMenu = (HMENU)0;
|
||||||
MenuItem->hbmpChecked = (HBITMAP)0;
|
MenuItem->hbmpChecked = (HBITMAP)0;
|
||||||
MenuItem->hbmpUnchecked = (HBITMAP)0;
|
MenuItem->hbmpUnchecked = (HBITMAP)0;
|
||||||
MenuItem->dwItemData = (ULONG_PTR)NULL;
|
MenuItem->dwItemData = 0;
|
||||||
MenuItem->cch = 0;
|
RtlInitUnicodeString(&MenuItem->Text, NULL);
|
||||||
MenuItem->hbmpItem = (HBITMAP)0;
|
MenuItem->hbmpItem = (HBITMAP)0;
|
||||||
|
|
||||||
if(!IntSetMenuItemInfo(MenuObject, MenuItem, lpmii))
|
if(!IntSetMenuItemInfo(MenuObject, MenuItem, lpmii))
|
||||||
|
|
Loading…
Reference in a new issue