void CDuiAddFrame::SetInfo(int Type, LPWSTR lpFilePath, CDuiFrameWnd* pWnd) { m_pImage = static_cast<CButtonUI*>( m_PaintManager.FindControl(_T("DUI_BTN_IMAGE")) ); m_pPath = static_cast<CTextUI*>( m_PaintManager.FindControl(_T("DUI_TXT_PATH")) ); m_pType = static_cast<CComboUI*>( m_PaintManager.FindControl(_T("DUI_COMB_TYPE")) ); m_pShortCut = static_cast<CComboUI*>( m_PaintManager.FindControl(_T("DUI_TXT_SHORTCUT"))); if(m_pPath){ m_pPath->SetText(lpFilePath); } m_Type = Type; m_pWnd = pWnd; m_pType->SelectItem(m_Type - 1); ModifyShortCutComo(); HBITMAP hBitmap; // 获取图片 if(m_pImageList != NULL){ SHFILEINFOW sfi = {0}; SHGetFileInfo(lpFilePath, -1, &sfi, sizeof(sfi), SHGFI_SYSICONINDEX); HICON hIcon; HRESULT hResult = ((IImageList*)m_pImageList)->GetIcon(sfi.iIcon, ILD_TRANSPARENT, &hIcon); if(hResult == S_OK){ hBitmap = ConvertIconToBitmap(hIcon); if(SaveBitmapToFile(hBitmap, m_ImagePath.GetData())){ m_pImage->SetBkImage(m_ImagePath); } } } }
static HMENU BuildRecursiveMenu(HMENU hMenu, TMO_IntMenuItem *pRootMenu, WPARAM wParam, LPARAM lParam) { if (pRootMenu == NULL) return NULL; TIntMenuObject *pmo = pRootMenu->parent; if (pRootMenu->mi.root == NULL) while (GetMenuItemCount(hMenu) > 0) DeleteMenu(hMenu, 0, MF_BYPOSITION); for (TMO_IntMenuItem *pmi = pRootMenu; pmi != NULL; pmi = pmi->next) { TMO_MenuItem *mi = &pmi->mi; if (mi->flags & CMIF_HIDDEN) continue; if (pmo->CheckService != NULL) { TCheckProcParam CheckParam; CheckParam.wParam = wParam; CheckParam.lParam = lParam; CheckParam.MenuItemOwnerData = pmi->pUserData; CheckParam.MenuItemHandle = pmi; if (CallService(pmo->CheckService, (WPARAM)&CheckParam, 0) == false) continue; } // if we have to check & apply database settings if (!(mi->flags & CMIF_SYSTEM) && pmo->m_bUseUserDefinedItems) { char szModule[256], szSetting[256]; mir_snprintf(szModule, "%s_Items", pmo->pszName); char menuItemName[256]; GetMenuItemName(pmi, menuItemName, sizeof(menuItemName)); // check if it visible mir_snprintf(szSetting, "%s_visible", menuItemName); if (!db_get_b(NULL, szModule, szSetting, 1)) continue; // mi.name.t mir_snprintf(szSetting, "%s_name", menuItemName); TCHAR *tszCustomName = db_get_tsa(NULL, szModule, szSetting); if (tszCustomName != NULL) { mir_free(pmi->CustomName); pmi->CustomName = tszCustomName; } mir_snprintf(szSetting, "%s_pos", menuItemName); int pos = db_get_dw(NULL, szModule, szSetting, -1); if (pos == -1) { db_set_dw(NULL, szModule, szSetting, mi->position); if (pmi->submenu.first) mi->position = 0; } else mi->position = pos; } int i = WhereToPlace(hMenu, mi); MENUITEMINFO mii = { 0 }; mii.cbSize = sizeof(mii); mii.dwItemData = (LPARAM)pmi; mii.fMask = MIIM_DATA | MIIM_ID | MIIM_STRING; if (pmi->iconId != -1) { mii.fMask |= MIIM_BITMAP; if (IsWinVerVistaPlus() && IsThemeActive()) { if (pmi->hBmp == NULL) pmi->hBmp = ConvertIconToBitmap(pmi->parent->m_hMenuIcons, pmi->iconId); mii.hbmpItem = pmi->hBmp; } else mii.hbmpItem = HBMMENU_CALLBACK; } mii.fMask |= MIIM_STATE; mii.fState = ((pmi->mi.flags & CMIF_GRAYED) ? MFS_GRAYED : MFS_ENABLED); mii.fState |= ((pmi->mi.flags & CMIF_CHECKED) ? MFS_CHECKED : MFS_UNCHECKED); if (pmi->mi.flags & CMIF_DEFAULT) mii.fState |= MFS_DEFAULT; mii.dwTypeData = (pmi->CustomName) ? pmi->CustomName : mi->name.t; // it's a submenu if (pmi->submenu.first) { mii.fMask |= MIIM_SUBMENU; mii.hSubMenu = CreatePopupMenu(); #ifdef PUTPOSITIONSONMENU if (GetKeyState(VK_CONTROL) & 0x8000) { TCHAR str[256]; mir_sntprintf(str, _T("%s (%d, id %x)"), mi->name.a, mi->position, mii.dwItemData); mii.dwTypeData = str; } #endif InsertMenuItemWithSeparators(hMenu, i, &mii); BuildRecursiveMenu(mii.hSubMenu, pmi->submenu.first, wParam, lParam); } else { mii.wID = pmi->iCommand; #ifdef PUTPOSITIONSONMENU if (GetKeyState(VK_CONTROL) & 0x8000) { TCHAR str[256]; mir_sntprintf(str, _T("%s (%d, id %x)"), mi->name.a, mi->position, mii.dwItemData); mii.dwTypeData = str; } #endif if (pmo->onAddService != NULL) if (CallService(pmo->onAddService, (WPARAM)&mii, (LPARAM)pmi) == FALSE) continue; InsertMenuItemWithSeparators(hMenu, i, &mii); } } return hMenu; }
INT_PTR StatusMenuCheckService(WPARAM wParam, LPARAM) { PCheckProcParam pcpp = (PCheckProcParam)wParam; if (!pcpp) return TRUE; PMO_IntMenuItem timi = MO_GetIntMenuItem(pcpp->MenuItemHandle); if (!timi) return TRUE; StatusMenuExecParam *smep = (StatusMenuExecParam*)pcpp->MenuItemOwnerData; if (smep && !smep->status && smep->custom) { if (wildcmp(smep->svc, "*XStatus*")) { int XStatus; CUSTOM_STATUS cs = { sizeof(cs) }; cs.flags = CSSF_MASK_STATUS; cs.status = &XStatus; if (CallProtoServiceInt(NULL, smep->proto, PS_GETCUSTOMSTATUSEX, 0, (LPARAM)&cs) != 0) XStatus = 0; char buf[255]; mir_snprintf(buf, SIZEOF(buf), "*XStatus%d", XStatus); bool check = wildcmp(smep->svc, buf) != 0; bool reset = wildcmp(smep->svc, "*XStatus0") != 0; if (check) timi->mi.flags |= CMIF_CHECKED; else timi->mi.flags &= ~CMIF_CHECKED; if (reset || check) { PMO_IntMenuItem timiParent = MO_GetIntMenuItem(timi->mi.root); if (timiParent) { CLISTMENUITEM mi2 = { sizeof(mi2) }; mi2.flags = CMIM_NAME | CMIF_TCHAR; mi2.ptszName = TranslateTH(timi->mi.hLangpack, timi->mi.hIcon ? timi->mi.ptszName : LPGENT("Custom status")); timiParent = MO_GetIntMenuItem(timi->mi.root); MenuItemData it = { 0 }; if (FindMenuHandleByGlobalID(hStatusMenu, timiParent, &it)) { MENUITEMINFO mi = { 0 }; TCHAR d[100]; GetMenuString(it.OwnerMenu, it.position, d, SIZEOF(d), MF_BYPOSITION); mi.cbSize = sizeof(mi); mi.fMask = MIIM_STRING | MIIM_STATE; if (timi->iconId != -1) { mi.fMask |= MIIM_BITMAP; if (IsWinVerVistaPlus() && IsThemeActive()) { if (timi->hBmp == NULL) timi->hBmp = ConvertIconToBitmap(NULL, timi->parent->m_hMenuIcons, timi->iconId); mi.hbmpItem = timi->hBmp; } else mi.hbmpItem = HBMMENU_CALLBACK; } mi.fState |= (check && !reset ? MFS_CHECKED : MFS_UNCHECKED); mi.dwTypeData = mi2.ptszName; SetMenuItemInfo(it.OwnerMenu, it.position, TRUE, &mi); } Menu_ModifyItem(timi->mi.root, &mi2); timiParent->iconId = timi->iconId; if (timiParent->hBmp) DeleteObject(timiParent->hBmp); timiParent->hBmp = NULL; } } } } else if (smep && smep->status && !smep->custom) { int curProtoStatus = (smep->proto) ? CallProtoServiceInt(NULL, smep->proto, PS_GETSTATUS, 0, 0) : cli.pfnGetAverageMode(NULL); if (smep->status == curProtoStatus) timi->mi.flags |= CMIF_CHECKED; else timi->mi.flags &= ~CMIF_CHECKED; } else if ((!smep || smep->proto) && timi->mi.pszName) { int curProtoStatus = 0; BOOL IconNeedDestroy = FALSE; char* prot; if (smep) prot = smep->proto; else { char *prn = mir_u2a(timi->mi.ptszName); prot = NEWSTR_ALLOCA(prn); if (prn) mir_free(prn); } if (Proto_GetAccount(prot) == NULL) return TRUE; if ((curProtoStatus = CallProtoServiceInt(NULL, prot, PS_GETSTATUS, 0, 0)) == CALLSERVICE_NOTFOUND) curProtoStatus = 0; if (curProtoStatus >= ID_STATUS_OFFLINE && curProtoStatus < ID_STATUS_IDLE) timi->mi.hIcon = LoadSkinProtoIcon(prot, curProtoStatus); else { timi->mi.hIcon = (HICON)CallProtoServiceInt(NULL, prot, PS_LOADICON, PLI_PROTOCOL | PLIF_SMALL, 0); if (timi->mi.hIcon == (HICON)CALLSERVICE_NOTFOUND) timi->mi.hIcon = NULL; else IconNeedDestroy = TRUE; } if (timi->mi.hIcon) { timi->mi.flags |= CMIM_ICON; MO_ModifyMenuItem(timi, &timi->mi); if (IconNeedDestroy) { DestroyIcon(timi->mi.hIcon); timi->mi.hIcon = NULL; } else IcoLib_ReleaseIcon(timi->mi.hIcon, 0); } } return TRUE; }
HMENU BuildRecursiveMenu(HMENU hMenu, PMO_IntMenuItem pRootMenu, ListParam *param) { if ( param == NULL || pRootMenu == NULL ) return NULL; TIntMenuObject* pmo = pRootMenu->parent; int rootlevel = ( param->rootlevel == -1 ) ? 0 : param->rootlevel; ListParam localparam = *param; while ( rootlevel == 0 && GetMenuItemCount( hMenu ) > 0 ) DeleteMenu( hMenu, 0, MF_BYPOSITION ); for ( PMO_IntMenuItem pmi = pRootMenu; pmi != NULL; pmi = pmi->next ) { PMO_MenuItem mi = &pmi->mi; if ( mi->cbSize != sizeof( TMO_MenuItem )) continue; if ( mi->flags & CMIF_HIDDEN ) continue; if ( pmo->CheckService != NULL ) { TCheckProcParam CheckParam; CheckParam.lParam = param->lParam; CheckParam.wParam = param->wParam; CheckParam.MenuItemOwnerData = mi->ownerdata; CheckParam.MenuItemHandle = pmi; if ( CallService( pmo->CheckService, ( WPARAM )&CheckParam, 0 ) == FALSE ) continue; } /**************************************/ if ( rootlevel == 0 && mi->root == NULL && pmo->m_bUseUserDefinedItems ) { char DBString[256]; DBVARIANT dbv = { 0 }; int pos; char MenuNameItems[256]; mir_snprintf(MenuNameItems, SIZEOF(MenuNameItems), "%s_Items", pmo->Name); char menuItemName[256]; GetMenuItemName( pmi, menuItemName, sizeof( menuItemName )); // check if it visible mir_snprintf( DBString, SIZEOF(DBString), "%s_visible", menuItemName ); if ( DBGetContactSettingByte( NULL, MenuNameItems, DBString, -1 ) == -1 ) DBWriteContactSettingByte( NULL, MenuNameItems, DBString, 1 ); pmi->OverrideShow = TRUE; if ( !DBGetContactSettingByte( NULL, MenuNameItems, DBString, 1 )) { pmi->OverrideShow = FALSE; continue; // find out what value to return if not getting added } // mi.pszName mir_snprintf( DBString, SIZEOF(DBString), "%s_name", menuItemName ); if ( !DBGetContactSettingTString( NULL, MenuNameItems, DBString, &dbv )) { if ( _tcslen( dbv.ptszVal ) > 0 ) { if ( pmi->CustomName ) mir_free( pmi->CustomName ); pmi->CustomName = mir_tstrdup( dbv.ptszVal ); } DBFreeVariant( &dbv ); } mir_snprintf( DBString, SIZEOF(DBString), "%s_pos", menuItemName ); if (( pos = DBGetContactSettingDword( NULL, MenuNameItems, DBString, -1 )) == -1 ) { DBWriteContactSettingDword( NULL, MenuNameItems, DBString, mi->position ); if ( pmi->submenu.first ) mi->position = 0; } else mi->position = pos; } /**************************************/ if ( rootlevel != (int)pmi->mi.root ) continue; MENUITEMINFO mii = { 0 }; mii.dwItemData = ( LPARAM )pmi; int i = WhereToPlace( hMenu, mi ); if ( !IsWinVer98Plus()) { mii.cbSize = MENUITEMINFO_V4_SIZE; mii.fMask = MIIM_DATA | MIIM_TYPE | MIIM_ID; mii.fType = MFT_STRING; } else { mii.cbSize = sizeof( mii ); mii.fMask = MIIM_DATA | MIIM_ID | MIIM_STRING; if ( pmi->iconId != -1 ) { mii.fMask |= MIIM_BITMAP; if (IsWinVerVistaPlus() && isThemeActive()) { if (pmi->hBmp == NULL) pmi->hBmp = ConvertIconToBitmap(NULL, pmi->parent->m_hMenuIcons, pmi->iconId); mii.hbmpItem = pmi->hBmp; } else mii.hbmpItem = HBMMENU_CALLBACK; } } mii.fMask |= MIIM_STATE; mii.fState = (( pmi->mi.flags & CMIF_GRAYED ) ? MFS_GRAYED : MFS_ENABLED ); mii.fState |= (( pmi->mi.flags & CMIF_CHECKED) ? MFS_CHECKED : MFS_UNCHECKED ); if ( pmi->mi.flags & CMIF_DEFAULT ) mii.fState |= MFS_DEFAULT; mii.dwTypeData = ( pmi->CustomName ) ? pmi->CustomName : mi->ptszName; // it's a submenu if ( pmi->submenu.first ) { mii.fMask |= MIIM_SUBMENU; mii.hSubMenu = CreatePopupMenu(); #ifdef PUTPOSITIONSONMENU if ( GetKeyState(VK_CONTROL) & 0x8000) { TCHAR str[256]; mir_sntprintf( str, SIZEOF(str), _T( "%s (%d,id %x)" ), mi->pszName, mi->position, mii.dwItemData ); mii.dwTypeData = str; } #endif InsertMenuItemWithSeparators( hMenu, i, &mii); localparam.rootlevel = LPARAM( pmi ); BuildRecursiveMenu( mii.hSubMenu, pmi->submenu.first, &localparam ); } else { mii.wID = pmi->iCommand; #ifdef PUTPOSITIONSONMENU if ( GetKeyState(VK_CONTROL) & 0x8000) { TCHAR str[256]; mir_sntprintf( str, SIZEOF(str), _T("%s (%d,id %x)"), mi->pszName, mi->position, mii.dwItemData ); mii.dwTypeData = str; } #endif if ( pmo->onAddService != NULL ) if ( CallService( pmo->onAddService, ( WPARAM )&mii, ( LPARAM )pmi ) == FALSE ) continue; InsertMenuItemWithSeparators( hMenu, i, &mii ); } } return hMenu; }