Ok..dorwalem wlasnie ten kod ktory pisalem, wkleje tutaj czesc - moze ktos, kto zna sie lepiej podpowie mi co przeoczylem... a wiec oto jak to dziala:
//Zmienne globalne
int ilosc; //ilosc itemow w popupie
MenuItem *items; //tablica z itemami popupa
MenuParams p; //parametry menu do wyswietlenia
W komunikacie WM_INITMENUPOPUP jest pobierane info o itemach, a nastepnie jest ustawiany styl OwnerDraw w taki sposob:
//Funkcja wyznaczająca tablicę itemów z wybranego popupa i ustawiajaca styl OwnerDraw
void handle_InitPopup(WPARAM wParam, LPARAM lParam)
{
if((BOOL) HIWORD(lParam)) //Nie ruszamy menu systemowego okna
return;
HMENU sub = (HMENU) wParam;
ilosc = GetMenuItemCount(sub);
//Allokacja tablicy itemów
MenuItem *menuItems = (MenuItem *)calloc(ilosc,sizeof(MenuItem));
MENUITEMINFO mi; //do pobrania info o menu
mi.cbSize = sizeof(MENUITEMINFO);
mi.fMask = MIIM_TYPE | MIIM_ID | MIIM_STATE;
mi.dwTypeData = "";
for(int i=0;i<ilosc;i++)
{
GetMenuItemInfo(sub,i,TRUE,&mi);
menuItems[i].ID = mi.wID;
GetMenuString(sub,menuItems[i].ID,&menuItems[i].Caption,256,MF_BYCOMMAND);
mi.fType = mi.fType | MFT_OWNERDRAW;
SetMenuItemInfo(sub,i,TRUE,&mi); //Ustawianie OwnerDraw
menuItems[i].isSep = mi.fType&MFT_SEPARATOR; //Sprawdzanie czy item jest separatorem
menuItems[i].isGrayed = mi.fState&MFS_GRAYED;
}
items = menuItems;
}
Jak widac, wszystko bardzo prosto, nie ma co wiecej komentowac
Dalej, rysowanie itemow, czyli obsluga WM_DRAWITEM:
void handle_DrawItem(LPARAM lParam)
{
DRAWITEMSTRUCT *dis = (LPDRAWITEMSTRUCT) lParam;
HICON pasek = LoadIcon(GetModuleHandle(NULL),MAKEINTRESOURCE(p.backIconID));
SelectObject(dis->hDC,GetMenuFont());
if(dis->CtlType==ODT_MENU)
{
FillRect(dis->hDC,&dis->rcItem,CreateSolidBrush(p.BACK_COLOR)); //ustawienie koloru tla menu
DrawIconEx(dis->hDC,0,dis->rcItem.top,pasek,22,25,0,NULL,DI_NORMAL);
//Ustawienie koloru tla tekstu
SetBkColor(dis->hDC,p.BACK_COLOR);
//Wyswietlenie tekstu menu
//PodpiszMenu(dis,GetMenu(hwnd),items,ilosc);
PodpiszMenu(dis,dis->hwndItem,items,ilosc);
if(dis->itemAction==ODA_SELECT)
{
if(dis->itemState==zaznaczone)
{
//wybieranie koloru zaznaczenia
SelectObject(dis->hDC,CreateSolidBrush(p.SEL_COLOR));
//wybieranie koloru ramki zaznaczenia
SelectObject(dis->hDC,CreatePen(PS_SOLID,0,p.SEL_FRAME_COLOR));
//wyswietlanie zaznaczenia
Rectangle(dis->hDC,dis->rcItem.left,dis->rcItem.top,dis->rcItem.right,dis->rcItem.bottom);
//wybranie koloru zaznaczenia
SetBkColor(dis->hDC,p.SEL_COLOR);
//Wyswietlenie tekstu menu
PodpiszMenu(dis,dis->hwndItem,items,ilosc);
if(dis->itemState==nie_zaznaczone)
{FillRect(dis->hDC,&dis->rcItem,CreateSolidBrush(p.BACK_COLOR)); //powrot do koloru tla jesli menu nie jest zaznaczone
}
}
}
}
}
No i to w zasadzie wszystko (prawie) - co moglem przeoczyc? Jezeli bedzie trzeba podac wiecej kodu, to wkleje wiecej, nie chcialem pokazywac niepotrzebnych rzeczy.