void PopupOtherMenu(){ POINT pos; MENUITEMINFO info, separator; HMENU hMenu; DWORD dwID; hMenu = CreatePopupMenu(); memset(&separator, 0, sizeof(MENUITEMINFO)); separator.cbSize = sizeof(MENUITEMINFO); separator.fMask = MIIM_ID | MIIM_TYPE; separator.fType = MFT_SEPARATOR; separator.wID = 8000; memset(&info, 0, sizeof(MENUITEMINFO)); info.cbSize = sizeof(MENUITEMINFO); info.fMask = MIIM_ID | MIIM_TYPE; info.fType = MFT_STRING; info.wID = 1107; info.dwTypeData = "非リレー中のチャンネルを削除"; InsertMenuItem(hMenu, -1, true, &info); InsertMenuItem(hMenu, -1, true, &separator); if (!gbDispTop){ info.wID = 1101; info.dwTypeData = "最前面表示"; InsertMenuItem(hMenu, -1, true, &info); } else { info.wID = 1102; info.dwTypeData = "最前面解除"; InsertMenuItem(hMenu, -1, true, &info); } InsertMenuItem(hMenu, -1, true, &separator); if (!gbAllOpen){ info.wID = 1103; info.dwTypeData = "全直下展開"; InsertMenuItem(hMenu, -1, true, &info); } else { info.wID = 1104; info.dwTypeData = "全直下隠蔽"; InsertMenuItem(hMenu, -1, true, &info); } InsertMenuItem(hMenu, -1, true, &separator); if (!servMgr->autoServe){ info.wID = 1105; info.dwTypeData = "有効"; InsertMenuItem(hMenu, -1, true, &info); } else { info.wID = 1106; info.dwTypeData = "無効"; InsertMenuItem(hMenu, -1, true, &info); } GetCursorPos(&pos); dwID = TrackPopupMenu(hMenu, TPM_LEFTALIGN|TPM_RETURNCMD, pos.x, pos.y, 0, guiWnd, NULL); DestroyMenu(hMenu); ChannelData *cd = channelDataTop; switch(dwID){ case 1101: // 最前面表示 gbDispTop = true; ::SetWindowPos(guiWnd, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE|SWP_NOSIZE); break; case 1102: // 最前面解除 gbDispTop = false; ::SetWindowPos(guiWnd, HWND_NOTOPMOST, 0, 0, 0, 0, SWP_NOMOVE|SWP_NOSIZE); break; case 1103: // 全直下展開 gbAllOpen = true; while(cd){ cd->setOpenFlg(true); cd = cd->getNextData(); } break; case 1104: // 全直下隠蔽 gbAllOpen = false; while(cd){ cd->setOpenFlg(false); cd = cd->getNextData(); } break; case 1105: // 有効 servMgr->autoServe = true; break; case 1106: // 無効 servMgr->autoServe = false; break; case 1107: // 非リレー中のチャンネル情報を全て削除 { LOG_DEBUG("Start cleaning up unused channels"); while (cd) { if (cd->getStatus() == Channel::S_NOTFOUND || cd->getStatus() == Channel::S_IDLE) { Channel *c = chanMgr->findChannelByChannelID(cd->getChannelId()); if (c && !c->bumped) { c->thread.active = false; c->thread.finish = true; } } cd = cd->getNextData(); } LOG_DEBUG("Finish a cleanup of unused channels"); } break; } }
void PopupChannelMenu(int channel_id){ POINT pos; MENUITEMINFO info, separator; HMENU hMenu; DWORD dwID; hMenu = CreatePopupMenu(); memset(&separator, 0, sizeof(MENUITEMINFO)); separator.cbSize = sizeof(MENUITEMINFO); separator.fMask = MIIM_ID | MIIM_TYPE; separator.fType = MFT_SEPARATOR; separator.wID = 8000; memset(&info, 0, sizeof(MENUITEMINFO)); info.cbSize = sizeof(MENUITEMINFO); info.fMask = MIIM_ID | MIIM_TYPE; info.fType = MFT_STRING; ChannelData *cd = findChannelData(channel_id); if (cd == NULL){ return; } info.wID = 1001; info.dwTypeData = "切断"; InsertMenuItem(hMenu, -1, true, &info); InsertMenuItem(hMenu, -1, true, &separator); info.wID = 1000; info.dwTypeData = "再生"; InsertMenuItem(hMenu, -1, true, &info); InsertMenuItem(hMenu, -1, true, &separator); info.wID = 1002; info.dwTypeData = "再接続"; InsertMenuItem(hMenu, -1, true, &info); info.wID = 1003; info.dwTypeData = "キープ"; InsertMenuItem(hMenu, -1, true, &info); InsertMenuItem(hMenu, -1, true, &separator); if (!cd->getOpenFlg()){ info.wID = 1004; info.dwTypeData = "直下表示"; InsertMenuItem(hMenu, -1, true, &info); } else { info.wID = 1005; info.dwTypeData = "直下隠蔽"; InsertMenuItem(hMenu, -1, true, &info); } GetCursorPos(&pos); dwID = TrackPopupMenu(hMenu, TPM_LEFTALIGN|TPM_RETURNCMD, pos.x, pos.y, 0, guiWnd, NULL); DestroyMenu(hMenu); cd = findChannelData(channel_id); if (cd == NULL){ return; } Channel *c = chanMgr->findChannelByChannelID(channel_id); if (c == NULL){ return; } switch(dwID){ case 1000: // 再生 chanMgr->playChannel(c->info); break; case 1001: // 切断 // bump中は切断しない if (!c->bumped) { c->thread.active = false; c->thread.finish = true; } break; case 1002: // 再接続 // 直下かつ受信中であれば確認メッセージ表示 if (cd->isTracker() && cd->getStatus() == Channel::S_RECEIVING) { int id; id = MessageBox(guiWnd, "直下ですが再接続しますか?", "直下警告", MB_YESNO|MB_ICONQUESTION|MB_DEFBUTTON2); if (id != IDYES) break; } c->bump = true; break; case 1003: // キープ if (!c->stayConnected){ c->stayConnected = true; } else { c->stayConnected = false; } break; case 1004: // 直下表示 cd->setOpenFlg(TRUE); MakeBack(guiWnd); break; case 1005: // 直下隠蔽 cd->setOpenFlg(FALSE); MakeBack(guiWnd); break; } }