void OnDropFile (DWORD wParam) { TCHAR FileName [FilePathLen + 1] ; LPTSTR pFileNameStart ; HANDLE hFindFile ; WIN32_FIND_DATA FindFileInfo ; int NameOffset ; int NumOfFiles = 0 ; NumOfFiles = DragQueryFile ((HDROP) wParam, 0xffffffff, NULL, 0) ; if (NumOfFiles > 0) { // we only open the first file for now DragQueryFile((HDROP) wParam, 0, FileName, FilePathLen) ; pFileNameStart = ExtractFileName (FileName) ; NameOffset = pFileNameStart - FileName ; // convert short filename to long NTFS filename if necessary hFindFile = FindFirstFile (FileName, &FindFileInfo) ; if (hFindFile && hFindFile != INVALID_HANDLE_VALUE) { // append the file name back to the path name lstrcpy (&FileName[NameOffset], FindFileInfo.cFileName) ; FindClose (hFindFile) ; } FileOpen (hWndMain, (int)0, (LPTSTR)FileName) ; PrepareMenu (GetMenu (hWndMain)); } DragFinish ((HDROP) wParam) ; }
LRESULT CFloatingWindow::OnContextMenu(WORD wNotifyCode, WORD wID, HWND hWndCtl) { if (!IsWindowEnabled()) return 0; CMenu TrayMenu; TrayMenu.CreatePopupMenu(); if (!m_bIsUploading) { // Inserting menu items int i = 0; MyInsertMenu(TrayMenu, i++, IDM_UPLOADFILES, TR("Загрузить файлы") + CString(_T("..."))); MyInsertMenu(TrayMenu, i++, IDM_ADDFOLDERS, TR("Загрузить папку") + CString(_T("..."))); MyInsertMenu(TrayMenu, i++, 0, 0); bool IsClipboard = false; if (OpenClipboard()) { IsClipboard = IsClipboardFormatAvailable(CF_BITMAP) != 0; CloseClipboard(); } if (IsClipboard) { MyInsertMenu(TrayMenu, i++, IDM_PASTEFROMCLIPBOARD, TR("Вставить из буфера")); MyInsertMenu(TrayMenu, i++, 0, 0); } MyInsertMenu(TrayMenu, i++, IDM_IMPORTVIDEO, TR("Импорт видео")); MyInsertMenu(TrayMenu, i++, 0, 0); MyInsertMenu(TrayMenu, i++, IDM_SCREENSHOTDLG, TR("Скриншот") + CString(_T("..."))); MyInsertMenu(TrayMenu, i++, IDM_REGIONSCREENSHOT, TR("Снимок выделенной области")); MyInsertMenu(TrayMenu, i++, IDM_FULLSCREENSHOT, TR("Снимок всего экрана")); MyInsertMenu(TrayMenu, i++, IDM_WINDOWSCREENSHOT, TR("Снимок активного окна")); MyInsertMenu(TrayMenu, i++, IDM_WINDOWHANDLESCREENSHOT, TR("Снимок выбранного элемента")); MyInsertMenu(TrayMenu, i++, IDM_FREEFORMSCREENSHOT, TR("Снимок произвольной формы")); CMenu SubMenu; SubMenu.CreatePopupMenu(); SubMenu.InsertMenu( 0, MFT_STRING | MFT_RADIOCHECK | (Settings.TrayIconSettings.TrayScreenshotAction == TRAY_SCREENSHOT_OPENINEDITOR ? MFS_CHECKED : 0), IDM_SCREENTSHOTACTION_OPENINEDITOR, TR("Открыть в редакторе")); SubMenu.InsertMenu( 0, MFT_STRING | MFT_RADIOCHECK | (Settings.TrayIconSettings.TrayScreenshotAction == TRAY_SCREENSHOT_UPLOAD ? MFS_CHECKED : 0), IDM_SCREENTSHOTACTION_UPLOAD, TR("Загрузить на сервер")); SubMenu.InsertMenu( 1, MFT_STRING | MFT_RADIOCHECK | (Settings.TrayIconSettings.TrayScreenshotAction == TRAY_SCREENSHOT_CLIPBOARD ? MFS_CHECKED : 0), IDM_SCREENTSHOTACTION_TOCLIPBOARD, TR("Копировать в буфер обмена")); SubMenu.InsertMenu( 2, MFT_STRING | MFT_RADIOCHECK | (Settings.TrayIconSettings.TrayScreenshotAction == TRAY_SCREENSHOT_SHOWWIZARD ? MFS_CHECKED : 0), IDM_SCREENTSHOTACTION_SHOWWIZARD, TR("Открыть в окне мастера")); SubMenu.InsertMenu( 3, MFT_STRING | MFT_RADIOCHECK | (Settings.TrayIconSettings.TrayScreenshotAction == TRAY_SCREENSHOT_ADDTOWIZARD ? MFS_CHECKED : 0), IDM_SCREENTSHOTACTION_ADDTOWIZARD, TR("Добавить в мастер")); MENUITEMINFO mi; mi.cbSize = sizeof(mi); mi.fMask = MIIM_TYPE | MIIM_ID | MIIM_SUBMENU; mi.fType = MFT_STRING; mi.hSubMenu = SubMenu; mi.wID = 10000; mi.dwTypeData = TR("Действие со снимком"); TrayMenu.InsertMenuItem(i++, true, &mi); SubMenu.Detach(); MyInsertMenu(TrayMenu, i++, 0, 0); MyInsertMenu(TrayMenu, i++, IDM_SHORTENURL, TR("Сократить ссылку")); MyInsertMenu(TrayMenu, i++, 0, 0); MyInsertMenu(TrayMenu, i++, IDM_SHOWAPPWINDOW, TR("Показать окно программы")); MyInsertMenu(TrayMenu, i++, 0, 0); MyInsertMenu(TrayMenu, i++, IDM_SETTINGS, TR("Настройки") + CString(_T("..."))); MyInsertMenu(TrayMenu, i++, 0, 0); MyInsertMenu(TrayMenu, i++, IDM_EXIT, TR("Выход")); if (Settings.Hotkeys[Settings.TrayIconSettings.LeftDoubleClickCommand].commandId) { SetMenuDefaultItem(TrayMenu, Settings.Hotkeys[Settings.TrayIconSettings.LeftDoubleClickCommand].commandId, FALSE); } } else MyInsertMenu(TrayMenu, 0, IDM_STOPUPLOAD, TR("Прервать загрузку")); m_hTrayIconMenu = TrayMenu; CMenuHandle oPopup(m_hTrayIconMenu); PrepareMenu(oPopup); CPoint pos; GetCursorPos(&pos); SetForegroundWindow(m_hWnd); oPopup.TrackPopupMenu(TPM_LEFTALIGN, pos.x, pos.y, m_hWnd); // BUGFIX: See "PRB: Menus for Notification Icons Don't Work Correctly" PostMessage(WM_NULL); return 0; }
LRESULT APIENTRY MainWndProc (HWND hWnd, UINT message, DWORD wParam, LONG lParam) { LONG lRetCode = 0L ; BOOL bCallDefWinProc = FALSE ; switch (LOWORD (message)) { // switch case WM_LBUTTONDBLCLK: ShowPerfmonMenu (!Options.bMenubar) ; if (Options.bMenubar) { PrepareMenu (GetMenu (hWnd)) ; } break ; case WM_COMMAND: if (PerfmonCommand (hWnd,wParam,lParam)) return(0); else bCallDefWinProc = TRUE ; break; case WM_MENUSELECT: MenuBarHit (wParam) ; break ; case WM_NCHITTEST: /* if we have no title/menu bar, clicking and dragging the client * area moves the window. To do this, return HTCAPTION. * Note dragging not allowed if window maximized, or if caption * bar is present. */ wParam = DefWindowProc(hWnd, message, wParam, lParam); if (!Options.bMenubar && (wParam == HTCLIENT) && !IsZoomed (hWndMain)) return HTCAPTION ; else return wParam ; break ; case WM_SHOWWINDOW: PrepareMenu (GetMenu (hWnd)) ; break ; case WM_SIZE: OnSize (hWnd, LOWORD (lParam), HIWORD (lParam)) ; break ; case WM_GETMINMAXINFO: { MINMAXINFO *pMinMax ; pMinMax = (MINMAXINFO *) lParam ; pMinMax->ptMinTrackSize.x = MinimumSize ; pMinMax->ptMinTrackSize.y = MinimumSize ; } break ; case WM_NOTIFY: { LPTOOLTIPTEXT lpTTT = (LPTOOLTIPTEXT)lParam; if (lpTTT->hdr.code == TTN_NEEDTEXT) { LoadString (hInstance, lpTTT->hdr.idFrom, lpTTT->szText, sizeof(lpTTT->szText)/sizeof(TCHAR)); return TRUE; } else { bCallDefWinProc = FALSE ; break; } } case WM_F1DOWN: if (dwCurrentDlgID) { CallWinHelp (dwCurrentDlgID) ; } else if (dwCurrentMenuID) { CallWinHelp (dwCurrentMenuID) ; dwCurrentMenuID = 0 ; } break ; case WM_CREATE: OnCreate (hWnd) ; ViewChart (hWnd) ; PrepareMenu (GetMenu (hWnd)) ; break ; case WM_DESTROY: WinHelp (hWndMain, pszHelpFile, HELP_QUIT, 0) ; PostQuitMessage (0); break ; case WM_QUERYENDSESSION: // please shut it down return (1) ; break ; case WM_ENDSESSION: if (wParam == TRUE) { // close any log file before closing down PerfmonClose (hWnd) ; return (1) ; } else bCallDefWinProc = TRUE ; break ; case WM_CLOSE: PerfmonClose (hWnd) ; break ; case WM_ACTIVATE: { int fActivate = LOWORD (wParam) ; bPerfmonIconic = (BOOL) HIWORD (wParam) ; if (bPerfmonIconic == 0 && fActivate != WA_INACTIVE) { // set focus on the Legend window if (iPerfmonView == IDM_VIEWCHART) { SetFocus (hWndGraphLegend) ; } else if (iPerfmonView == IDM_VIEWALERT) { SetFocus (hWndAlertLegend) ; } else if (iPerfmonView == IDM_VIEWLOG) { SetFocus (hWndLogEntries) ; } else if (iPerfmonView == IDM_VIEWREPORT) { SetFocus (hWndReport) ; } } } break ; case WM_SYSCOLORCHANGE: DeletePerfmonSystemObjects () ; CreatePerfmonSystemObjects () ; WindowInvalidate (PerfmonViewWindow()) ; break ; case WM_WININICHANGE: if (!lParam || strsamei((LPTSTR)lParam, szInternational)) { GetDateTimeFormats () ; } break ; case WM_DROPFILES: OnDropFile (wParam) ; return (0) ; break ; default: bCallDefWinProc = TRUE ; break; } // switch if (bCallDefWinProc) { lRetCode = DefWindowProc (hWnd, message, wParam, lParam) ; } return (lRetCode); } // MainWndProc