R
moin meisters ...
Also hier mal mein Code:
ich habe mir da ne Klasse gebaut, damits danach einfacher geht
#define IDC_CURSOR 1001
#define IDC_ICON1 101
#define IDC_ICON2 102
#define IDM_WEBLINK 102
#define CM_WEBLINK 0x0001
#define CM_ICON 0x0002
#define CM_CURSOR 0x0004
typedef struct t_CCustomMenu
{
UINT id;
char* pText;
HICON hIcon1;
HICON hIcon2;
HCURSOR hCursor;
UINT style;
}t_CCustomMenu;
class CCustomMenu
{
public:
CCustomMenu::CCustomMenu(HINSTANCE hInst, HWND hwnd);
CCustomMenu::~CCustomMenu();
private:
HINSTANCE hInst;
HWND hwnd;
unsigned int ui_count;
t_CCustomMenu* pItems;
public:
int InitItem(UINT submenu_no, UINT menu_id, char* szText, UINT icon_id1, UINT icon_id2, UINT cursor_id, UINT menu_style);
void MeasureItem(LPMEASUREITEMSTRUCT pmis);
void DrawItem(LPDRAWITEMSTRUCT pdis);
};
CCustomMenu::CCustomMenu(HINSTANCE hInst, HWND hwnd)
{
CCustomMenu::hInst = hInst;
CCustomMenu::hwnd = hwnd;
ui_count = 0;
pItems = NULL;
}
CCustomMenu::~CCustomMenu()
{
for(unsigned int i=0; i<ui_count; i++)
{
if(pItems[i].pText!=NULL)
delete [] pItems[i].pText;
}
delete [] pItems;
}
int CCustomMenu::InitItem(UINT submenu_no, UINT menu_id, char* szText, UINT icon_id1, UINT icon_id2, UINT cursor_id, UINT menu_style)
{
MENUITEMINFO mii;
HMENU hMenu = GetSubMenu(GetMenu(hwnd), submenu_no);
if(hMenu == NULL)
return (1);
mii.cbSize = sizeof(mii);
mii.fMask = MIIM_TYPE;
GetMenuItemInfo(hMenu, menu_id, FALSE, &mii);
mii.fType |= MFT_OWNERDRAW;
SetMenuItemInfo(hMenu, menu_id, FALSE, &mii);
ui_count++;
if(ui_count == 1)
pItems = (t_CCustomMenu*) malloc (ui_count * sizeof(t_CCustomMenu));
else
pItems = (t_CCustomMenu*) realloc (pItems, ui_count * sizeof(t_CCustomMenu));
pItems[ui_count-1].id = menu_id;
pItems[ui_count-1].pText = (char*) new char[strlen(szText)+1];
strcpy(pItems[ui_count-1].pText, szText);
pItems[ui_count-1].hIcon1 = LoadIcon(hInst, MAKEINTRESOURCE(icon_id1));
pItems[ui_count-1].hIcon2 = LoadIcon(hInst, MAKEINTRESOURCE(icon_id2));
pItems[ui_count-1].hCursor = LoadCursor(hInst, MAKEINTRESOURCE(cursor_id));
if( pItems[ui_count-1].hCursor == NULL)
menu_style &= ~CM_CURSOR;
else
menu_style |= CM_CURSOR;
if( (pItems[ui_count-1].hIcon1 == NULL) && (pItems[ui_count-1].hIcon2 == NULL) )
menu_style &= ~CM_ICON;
else
menu_style |= CM_ICON;
pItems[ui_count-1].style = menu_style;
return (0);
}
void CCustomMenu::MeasureItem(LPMEASUREITEMSTRUCT pmis)
{
SIZE s;
for(unsigned int i=0; i<ui_count; i++)
{
if( pmis->itemID == pItems[i].id)
{
pmis->itemHeight = GetSystemMetrics(SM_CYMENUSIZE);
HDC hDC = GetWindowDC(hwnd);
GetTextExtentPoint32(hDC, pItems[i].pText, strlen(pItems[i].pText), &s);
pmis->itemWidth = s.cx;// - 30;
ReleaseDC(hwnd, hDC);
}
}
}
void CCustomMenu::DrawItem(LPDRAWITEMSTRUCT pdis)
{
HFONT hFont, hOldFont;
LOGFONT lFont;
DWORD cxBitmap, cyBitmap, cyBitmapAdd;
for(unsigned int i=0; i<ui_count; i++)
if( pdis->itemID == pItems[i].id )
{
DrawEdge(pdis->hDC, &pdis->rcItem, 0, BF_MIDDLE);
pdis->itemAction |= ODA_SELECT;
cyBitmap = GetSystemMetrics(SM_CYMENUSIZE);
if ( cyBitmap > 16)
{
cyBitmapAdd = (cyBitmap - 16)/2;
cyBitmap = 16;
}
else
cyBitmapAdd = cyBitmap;
cxBitmap = GetSystemMetrics(SM_CXMENUSIZE);
if ( cxBitmap > 16 )
cxBitmap = 16;
if ( pdis->itemAction & ODA_SELECT )
{
hFont = (HFONT)GetCurrentObject(pdis->hDC, OBJ_FONT);
GetObject(hFont, sizeof(lFont), &lFont);
// hOver
if ( pdis->itemState & ODS_SELECTED)
{
if( pItems[i].style & CM_WEBLINK )
{
lFont.lfUnderline = TRUE;
SetTextColor(pdis->hDC, 0x00A00000);
}
if( pItems[i].style & CM_ICON )
{
if(pItems[i].hIcon2!=NULL)
DrawIconEx(pdis->hDC, pdis->rcItem.left+1, pdis->rcItem.top+cyBitmapAdd, (HICON)pItems[i].hIcon2, cxBitmap, cyBitmap, 0, NULL, DI_NORMAL);
else
DrawIconEx(pdis->hDC, pdis->rcItem.left+1, pdis->rcItem.top+cyBitmapAdd, (HICON)pItems[i].hIcon1, cxBitmap, cyBitmap, 0, NULL, DI_NORMAL);
}
if( pItems[i].style & CM_CURSOR )
SetCursor((HCURSOR)pItems[i].hCursor);
}
else
{
if(pItems[i].style & CM_WEBLINK)
{
lFont.lfUnderline = FALSE;
SetTextColor( pdis->hDC, GetSysColor(COLOR_WINDOWTEXT));
}
if( pItems[i].style & CM_ICON )
if(pItems[i].hIcon1!=NULL)
DrawIconEx(pdis->hDC, pdis->rcItem.left+1, pdis->rcItem.top+cyBitmapAdd, (HICON)pItems[i].hIcon1, cxBitmap, cyBitmap, 0, NULL, DI_NORMAL);
if( pItems[i].style & CM_CURSOR )
SetCursor( LoadCursor(NULL, IDC_ARROW) );
}
hOldFont = (HFONT)SelectObject(pdis->hDC, CreateFontIndirect(&lFont) );
pdis->rcItem.left += (cyBitmap+5);
DrawText(pdis->hDC, pItems[i].pText, strlen(pItems[i].pText), &pdis->rcItem, DT_VCENTER + DT_SINGLELINE);
pdis->rcItem.left -= (cyBitmap+5);
SelectObject(pdis->hDC, hOldFont);
}
}
}
im Programm steht dann:
LRESULT CALLBACK
WindowProcedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
PAINTSTRUCT ps;
HDC hdc;
static CCustomMenu* pccm = NULL;
switch (message) /* handle the messages */
{
case WM_CREATE:
pccm = (CCustomMenu*) new CCustomMenu(g_hInst, hwnd);
pccm->InitItem(0, IDM_WEBLINK, "123456789012345678901234567890123456789",
IDC_ICON1, IDC_ICON2, IDC_CURSOR, CM_WEBLINK);
pccm->InitItem(0, 103, "WebLink",
IDC_ICON1, IDC_ICON2, IDC_CURSOR, CM_WEBLINK);
pccm->InitItem(1, 1002, "CustomItem_FIRSTSECOND\0",
IDC_ICON1, 0, 0, 0);
pccm->InitItem(1, (UINT)GetSubMenu(GetSubMenu(GetMenu(hwnd), 1), 0), "Test",
IDC_ICON1, IDC_ICON2, 0, 0);
break;
case WM_MEASUREITEM:
if ( wParam == 0 ) // menu
pccm->MeasureItem((LPMEASUREITEMSTRUCT)lParam);
break;
case WM_DRAWITEM:
if ( wParam == 0 ) // menu
pccm->DrawItem((LPDRAWITEMSTRUCT)lParam);
break;
case WM_DESTROY:
delete pccm;
PostQuitMessage (0); /* send a WM_QUIT to the message queue */
break;
default: /* for messages that we don't deal with */
return DefWindowProc (hwnd, message, wParam, lParam);
}
return 0;
}
in der Methode CCustomMenu::MeasureItem steht da
pmis->itemWidth = s.cx;// - 30;
und genau da liegt mein Problem.
Erst ermittle ich wie breit der Eintrag ist und weise diesen Wert dann
pmis->itemWidth zu.
Was zur Folge hat, dass der rechte Rand des Eintrags z.B "123456789012345678901234567890123456789"
sehr viel Breiter ist als der von normalen Menüeinträgen.
Also ziehe ich mal nach gut dünken 30 Pixel ab (ist Kommentiert noch) doch
gibts wieder ein Problem, dass jetzt im zweiten Menü der Eintrag "TEST" welcher ein POPUP darstellt und somit einen schwarzen "Rechts gehts weiter Pfeil" hat,
dass ebend dieser Pfeil noch direkt über dem letzten Buchstaben des darunterliegenden Eintrags ist.
Also direkt über dem "D" von "FIRSTSECOND"
UND DAS SIEHT NICHT NUR S****** aus sondern ist es auch.
BITTE HILFE
DANKE ANKE
mfg
RB
PS: das ResourcenScript gabs ja ein paar Threads weiter oben schon ...