Проблема с отображением CMenu
От: DanDi Россия  
Дата: 11.10.05 09:21
Оценка:
Добрый день.

Буду благодарен за помощь в решении следующей проблемы:
При работе с меню, а точнее при замене пунктов меню на Bitmap и последующим изменением в Windows языка и региональных стандартов с русского на английский у меня все измененные пункты меню не корректно отображают наименования пунктов меню. Привожу исходный код, может кто подскажет, что не так?

pSubMenu — указатель на подменю в котором изменяю подпункты.
pmenupunct — указатель на структуру содержащую следующую информацию:

typedef struct MenuPunct
{
UINT nId; //идентификатор пункта
UINT nBmpId; //идентификатор картинки меню
} MenuPunct;

void CMyApp::CreateMenuItemBitmap(CMenu *pSubMenu, const MenuPunct *pmenupunct)
{
CBitmap *pbitmap;

if (pbitmap=new CBitmap)
{
CBitmap bitmap;
BITMAP bitmapInfo;

if (bitmap.LoadBitmap(pmenupunct->nBmpId) && bitmap.GetBitmap(&bitmapInfo))
{
CDC *pdc,dcMem,dcMem4Source;

if (pdc=AfxGetApp()->m_pMainWnd->GetDC())
{
if (dcMem.CreateCompatibleDC(pdc) &&
dcMem4Source.CreateCompatibleDC(pdc))
{
NONCLIENTMETRICS ncm;
CString sCaption;
CSize size;
CFont font;

pSubMenu->GetMenuString(pmenupunct->nId,sCaption,MF_BYCOMMAND);
ncm.cbSize=sizeof(NONCLIENTMETRICS);
::SystemParametersInfo(SPI_GETNONCLIENTMETRICS,sizeof(NONCLIENTMETRICS),&ncm,0);
ncm.lfMenuFont.lfCharSet = RUSSIAN_CHARSET;

font.CreateFontIndirect(&ncm.lfMenuFont);

dcMem4Source.SelectObject(&font);
size=pdc->GetTextExtent(sCaption);
if (size.cy<bitmapInfo.bmHeight) size.cy=bitmapInfo.bmHeight;
if (pbitmap->CreateCompatibleBitmap(pdc,size.cx+=bitmapInfo.bmWidth,size.cy))
{
COLORREF colorTransparent,colorBack;

dcMem4Source.SelectObject(bitmap);
if ((colorTransparent=dcMem4Source.GetPixel(0,0))!=
(colorBack=::GetSysColor(COLOR_MENU)))

for (int i=bitmapInfo.bmWidth;i--;)
for (int j=bitmapInfo.bmHeight;j--;)
if (dcMem4Source.GetPixel(i,j)==colorTransparent)
dcMem4Source.SetPixelV(i,j,colorBack);
dcMem.SelectObject(pbitmap);
dcMem.FillSolidRect(0,0,size.cx,size.cy,colorBack);
dcMem.BitBlt(0,0,bitmapInfo.bmWidth,bitmapInfo.bmHeight,&dcMem4Source,0,0,SRCCOPY);
dcMem4Source.DeleteDC();
dcMem.SetBkColor(colorBack);
dcMem.SetTextColor(::GetSysColor(COLOR_MENUTEXT));
dcMem.SelectObject(&font);
dcMem.TextOut(bitmapInfo.bmWidth,0,sCaption);
pSubMenu->ModifyMenu(pmenupunct->nId,MF_BYCOMMAND,pmenupunct->nId,pbitmap);
dcMem.DeleteDC();
}
}
AfxGetApp()->m_pMainWnd->ReleaseDC(pdc);
}
}
else delete pbitmap;
}
}

Заранее благодарю за конструктивные предложения.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.