Доброго времени суток нам всем!
В "версии" WTL 7.5 для Windows CE у класса CMenuT не реализованы следующие методы:
int GetMenuItemCount() const;
UINT GetMenuItemID(int nPos) const;
UINT GetMenuState(UINT nID, UINT nFlags) const;
int GetMenuString(UINT nIDItem, LPTSTR lpString, int nMaxCount, UINT nFlags) const;
BOOL ModifyMenu(UINT nPosition, UINT nFlags, UINT_PTR nIDNewItem = 0, LPCTSTR lpszNewItem = NULL);
Соответствующих функций действительно нет в Windows CE API, однако они реализованы в ATL 8.0 — см. файл <atlosapice.h>. Таким образом, мы можем внести соответствующие дополнения в файл <atluser.h>:
#ifndef _WIN32_WCE
BOOL HiliteMenuItem(HWND hWnd, UINT uIDHiliteItem, UINT uHilite)
...
#else if (_ATL_VER >= 0x0800)
int GetMenuItemCount() const
{
ATLASSERT(::IsMenu(m_hMenu));
return ATL::GetMenuItemCount(m_hMenu);
}
UINT GetMenuItemID(int nPos) const
{
ATLASSERT(::IsMenu(m_hMenu));
return ATL::GetMenuItemID(m_hMenu, nPos);
}
UINT GetMenuState(UINT nID, UINT nFlags) const
{
ATLASSERT(::IsMenu(m_hMenu));
return ATL::GetMenuState(m_hMenu, nID, nFlags);
}
int GetMenuString(UINT nIDItem, LPTSTR lpString, int nMaxCount, UINT nFlags) const
{
ATLASSERT(::IsMenu(m_hMenu));
return ATL::GetMenuStringW(m_hMenu, nIDItem, lpString, nMaxCount, nFlags);
}
#endif // !_WIN32_WCE
...
#ifndef _WIN32_WCE
BOOL InsertMenu(UINT nPosition, UINT nFlags, UINT_PTR nIDNewItem, HBITMAP hBmp)
...
#else if (_ATL_VER >= 0x0800)
BOOL ModifyMenu(UINT nPosition, UINT nFlags, UINT_PTR nIDNewItem = 0, LPCTSTR lpszNewItem = NULL)
{
ATLASSERT(::IsMenu(m_hMenu));
return ATL::ModifyMenuW(m_hMenu, nPosition, nFlags, nIDNewItem, lpszNewItem);
}
#endif // !_WIN32_WCE
"Дистрибутив" WTL, содержащий также исправления проблем, описанных в
[PRB] WTL 7.5 + WinCE + CString + no automatic namespacesАвтор: SchweinDeBurg
Дата: 08.12.05
и
[PRB] WTL 7.5 + WinCE + _WTL_NO_AUTOMATIC_NAMESPACEАвтор: SchweinDeBurg
Дата: 08.12.05
, можно взять
здесь (663 KB).
[ posted via RSDN@Home 1.1.4 stable SR1 r568, accompanied by silence ]
Еще при использовании ATL 8.0 можно реализовать метод GetMenuStringLen():
#else if (_ATL_VER >= 0x0800)
int GetMenuItemCount() const
...
int GetMenuStringLen(UINT nIDItem, UINT nFlags) const
{
ATLASSERT(::IsMenu(m_hMenu));
return ATL::GetMenuStringW(m_hMenu, nIDItem, NULL, 0, nFlags);
}
#endif // !_WIN32_WCE
[ posted via RSDN@Home 1.1.4 stable SR1 r568, accompanied by silence ]