1
0
mirror of https://github.com/UzixLS/KernelEx.git synced 2025-07-18 23:11:19 +03:00
Files
KernelEx/apilibs/kexbases/User32/Menu.c
2018-11-03 16:22:49 +03:00

100 lines
3.1 KiB
C
Executable File

/*
* KernelEx
* Copyright (C) 2010, Tihiy
*
* This file is part of KernelEx source code.
*
* KernelEx is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published
* by the Free Software Foundation; version 2 of the License.
*
* KernelEx is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with GNU Make; see the file COPYING. If not, write to
* the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
*
*/
#include "common.h"
#define MF_TYPEMASK (MF_STRING | MF_OWNERDRAW | MF_BITMAP | MF_SEPARATOR)
/* MAKE_EXPORT LoadMenuIndirectA=LoadMenuIndirectW */
/* MAKE_EXPORT LoadMenuA_fix=LoadMenuA */
HMENU WINAPI LoadMenuA_fix(HINSTANCE hInstance, LPCSTR lpMenuName)
{
//9x can't load resources from mmaped libraries (LOAD_LIBRARY_AS_DATAFILE)
HMENU ret = NULL;
//in case of mmaped dll the lowest bit in hInstance will be set to 1
if ((DWORD) hInstance & 1)
{
HRSRC fnd = FindResource(hInstance, lpMenuName,RT_MENU);
if (fnd)
{
LPMENUTEMPLATE lpMenuTemplate = LoadResource(hInstance, fnd);
if (lpMenuTemplate)
ret = LoadMenuIndirect(lpMenuTemplate);
}
}
else
ret = LoadMenuA(hInstance, lpMenuName);
return ret;
}
/* MAKE_EXPORT LoadMenuW_new=LoadMenuW */
HMENU WINAPI LoadMenuW_new(HINSTANCE hInstance, LPCWSTR lpMenuNameW)
{
LPSTR lpMenuNameA;
STACK_WtoA(lpMenuNameW, lpMenuNameA);
return LoadMenuA_fix(hInstance, lpMenuNameA);
}
//Append/Insert/Modify are not handled right by MSLU
/* MAKE_EXPORT InsertMenuW_new=InsertMenuW */
BOOL WINAPI InsertMenuW_new(HMENU hMenu, UINT uPosition, UINT uFlags,
UINT_PTR uIDNewItem, LPCWSTR lpNewItemW)
{
LPSTR lpNewItemA = (LPSTR)lpNewItemW;
if ((uFlags & MF_TYPEMASK) == MF_STRING)
{
STACK_WtoA(lpNewItemW, lpNewItemA);
}
return InsertMenuA(hMenu, uPosition, uFlags, uIDNewItem, lpNewItemA);
}
/* MAKE_EXPORT AppendMenuW_new=AppendMenuW */
BOOL WINAPI AppendMenuW_new(HMENU hMenu, UINT uFlags,
UINT_PTR uIDNewItem, LPCWSTR lpNewItem)
{
return InsertMenuW_new(hMenu, -1, uFlags | MF_BYPOSITION, uIDNewItem, lpNewItem);
}
/* MAKE_EXPORT ChangeMenuW_new=ChangeMenuW */
BOOL WINAPI ChangeMenuW_new(HMENU hMenu, UINT cmd, LPCWSTR lpNewItemW,
UINT uIDNewItem, UINT uFlags)
{
LPSTR lpNewItemA = (LPSTR) lpNewItemW;
if ((uFlags & MF_TYPEMASK) == MF_STRING)
{
STACK_WtoA(lpNewItemW, lpNewItemA);
}
return ChangeMenuA(hMenu, cmd, lpNewItemA, uIDNewItem, uFlags);
}
/* MAKE_EXPORT ModifyMenuW_new=ModifyMenuW */
BOOL WINAPI ModifyMenuW_new(HMENU hMenu, UINT uPosition, UINT uFlags,
UINT_PTR uIDNewItem, LPCWSTR lpNewItemW)
{
LPSTR lpNewItemA = (LPSTR) lpNewItemW;
if ((uFlags & MF_TYPEMASK) == MF_STRING)
{
STACK_WtoA(lpNewItemW, lpNewItemA);
}
return ModifyMenuA(hMenu, uPosition, uFlags, uIDNewItem, lpNewItemA);
}