>>882 これで許してくれ。 ウィンドウメニューの最初のポップアップを昇順降順交互に並べ替える。
struct MenuItem { MENUITEMINFO mi; char name[256]; };
int CompareMenuItemA(const void *elem1, const void *elem2)
{
return strcmp((*(MenuItem**)elem1)->name, (*(MenuItem**)elem2)->name);
}
int CompareMenuItemD(const void *elem1, const void *elem2)
{
return strcmp((*(MenuItem**)elem2)->name, (*(MenuItem**)elem1)->name);
}
void ProcessMenu(HWND hWnd)
{
static BOOL ToAscend = false; int i;
HMENU hMenu = GetSubMenu(GetMenu(hWnd), 0); int MenuCnt = GetMenuItemCount(hMenu);
MenuItem *Items = (MenuItem*)malloc(MenuCnt * sizeof(MenuItem)), **ItemIdx = (MenuItem**)malloc(MenuCnt * sizeof(MenuItem*));
for(i = 0; i < MenuCnt; i++)
{
memset(&Items[i], 0x00, sizeof(Items[i]));
Items[i].mi.cbSize = sizeof(Items[i].mi);
Items[i].mi.fMask = MIIM_CHECKMARKS | MIIM_DATA | MIIM_ID | MIIM_STATE | MIIM_SUBMENU | MIIM_TYPE;
Items[i].mi.dwTypeData = Items[i].name;
GetMenuItemInfo(hMenu, i, TRUE, &Items[i].mi);
GetMenuString(hMenu, i, Items[i].name, sizeof(Items[i].name), MF_BYPOSITION);
ItemIdx[i] = &Items[i];
}
if(ToAscend = !ToAscend) qsort(ItemIdx, MenuCnt, sizeof(*ItemIdx), CompareMenuItemD);
else qsort(ItemIdx, MenuCnt, sizeof(*ItemIdx), CompareMenuItemA);
for(i = MenuCnt; i > 0; i--) RemoveMenu(hMenu, i - 1, MF_BYPOSITION);
for(i = 0; i < MenuCnt; i++) InsertMenuItem(hMenu, i, TRUE, &ItemIdx[i]->mi);
DrawMenuBar(hWnd);
free(Items); free(ItemIdx);
}