static LRESULT CALLBACK FrameWndProc(HWND hwndFrame, UINT msg, WPARAM wParam, LPARAM lParam) { CountdownFrameWndData *dat = (CountdownFrameWndData*)GetWindowLongPtr(hwndFrame, GWLP_USERDATA); switch (msg) { case WM_NCCREATE: /* init window data */ dat = (struct CountdownFrameWndData*)mir_calloc(sizeof(*dat)); SetWindowLongPtr(hwndFrame, GWLP_USERDATA, (LONG_PTR)dat); if (dat == NULL) return FALSE; /* creation failed */ dat->fTimeFlags = *(WORD*)((CREATESTRUCT*)lParam)->lpCreateParams; dat->flags = FWPDF_COUNTDOWNINVALID; break; case WM_CREATE: /* create childs */ { CREATESTRUCT *params = (CREATESTRUCT*)lParam; dat->hwndIcon = CreateWindowEx(WS_EX_NOPARENTNOTIFY, _T("Static"), NULL, WS_CHILD | WS_VISIBLE | SS_ICON | SS_CENTERIMAGE | SS_NOTIFY, 3, 0, GetSystemMetrics(SM_CXICON), GetSystemMetrics(SM_CYICON), hwndFrame, NULL, params->hInstance, NULL); dat->hwndProgress = CreateWindowEx(WS_EX_NOPARENTNOTIFY, PROGRESS_CLASS, (dat->fTimeFlags&SDWTF_ST_TIME) ? TranslateT("Shutdown at:") : TranslateT("Time left:"), WS_CHILD | WS_VISIBLE | PBS_SMOOTH, GetSystemMetrics(SM_CXICON) + 5, 5, 90, (GetSystemMetrics(SM_CXICON) / 2) - 5, hwndFrame, NULL, params->hInstance, NULL); if (dat->hwndProgress == NULL) return -1; /* creation failed, calls WM_DESTROY */ SendMessage(dat->hwndProgress, PBM_SETSTEP, 1, 0); mir_subclassWindow(dat->hwndProgress, ProgressBarSubclassProc); dat->hwndDesc = CreateWindowEx(WS_EX_NOPARENTNOTIFY, _T("Static"), (dat->fTimeFlags&SDWTF_ST_TIME) ? TranslateT("Shutdown at:") : TranslateT("Time left:"), WS_CHILD | WS_VISIBLE | SS_LEFTNOWORDWRAP | SS_NOTIFY, GetSystemMetrics(SM_CXICON) + 5, (GetSystemMetrics(SM_CXICON) / 2), 75, (GetSystemMetrics(SM_CXICON) / 2), hwndFrame, NULL, params->hInstance, NULL); dat->hwndTime = CreateWindowEx(WS_EX_NOPARENTNOTIFY, _T("Static"), NULL, WS_CHILD | WS_VISIBLE | SS_RIGHT | SS_NOTIFY | SS_ENDELLIPSIS, (GetSystemMetrics(SM_CXICON) + 80), (GetSystemMetrics(SM_CXICON) / 2), 35, (GetSystemMetrics(SM_CXICON) / 2), hwndFrame, NULL, params->hInstance, NULL); if (dat->hwndTime == NULL) return -1; /* creation failed, calls WM_DESTROY */ // create tooltips TTTOOLINFO ti; dat->hwndToolTip = CreateWindowEx(WS_EX_TOPMOST, TOOLTIPS_CLASS, NULL, WS_POPUP | TTS_ALWAYSTIP | TTS_NOPREFIX, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, hwndFrame, NULL, params->hInstance, NULL); if (dat->hwndToolTip != NULL) { SetWindowPos(dat->hwndToolTip, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE | SWP_NOACTIVATE); memset(&ti, 0, sizeof(ti)); ti.cbSize = sizeof(ti); ti.hwnd = hwndFrame; ti.uFlags = TTF_IDISHWND | TTF_SUBCLASS | TTF_TRANSPARENT; ti.lpszText = LPSTR_TEXTCALLBACK; /* commctl 4.70+ */ ti.uId = (UINT_PTR)dat->hwndTime; /* in-place tooltip */ SendMessage(dat->hwndToolTip, TTM_ADDTOOL, 0, (LPARAM)&ti); ti.uFlags &= ~TTF_TRANSPARENT; ti.uId = (UINT_PTR)dat->hwndProgress; SendMessage(dat->hwndToolTip, TTM_ADDTOOL, 0, (LPARAM)&ti); if (dat->hwndDesc != NULL) { ti.uId = (UINT_PTR)dat->hwndDesc; SendMessage(dat->hwndToolTip, TTM_ADDTOOL, 0, (LPARAM)&ti); } if (dat->hwndIcon != NULL) { ti.uId = (UINT_PTR)dat->hwndIcon; SendMessage(dat->hwndToolTip, TTM_ADDTOOL, 0, (LPARAM)&ti); } } /* init layout */ dat->hHookColorsChanged = HookEventMessage(ME_COLOUR_RELOAD, hwndFrame, M_REFRESH_COLORS); dat->hHookFontsChanged = HookEventMessage(ME_FONT_RELOAD, hwndFrame, M_REFRESH_FONTS); dat->hHookIconsChanged = HookEventMessage(ME_SKIN2_ICONSCHANGED, hwndFrame, M_REFRESH_ICONS); SendMessage(hwndFrame, M_REFRESH_COLORS, 0, 0); SendMessage(hwndFrame, M_REFRESH_FONTS, 0, 0); SendMessage(hwndFrame, M_REFRESH_ICONS, 0, 0); SendMessage(hwndFrame, M_SET_COUNTDOWN, 0, 0); SendMessage(hwndFrame, M_UPDATE_COUNTDOWN, 0, 0); if (!SetTimer(hwndFrame, 1, 1000, NULL)) return -1; /* creation failed, calls WM_DESTROY */ } return 0; case WM_DESTROY: if (dat == NULL) return 0; UnhookEvent(dat->hHookColorsChanged); UnhookEvent(dat->hHookFontsChanged); UnhookEvent(dat->hHookIconsChanged); /* other childs are destroyed automatically */ if (dat->hwndToolTip != NULL) DestroyWindow(dat->hwndToolTip); break; case WM_NCDESTROY: if (dat == NULL) return 0; if (dat->hFont != NULL) DeleteObject(dat->hFont); if (dat->hbrBackground != NULL) DeleteObject(dat->hbrBackground); mir_free(dat); SetWindowLongPtr(hwndFrame, GWLP_USERDATA, 0); break; case WM_SIZE: { RECT rc; UINT defflg = SWP_NOZORDER | SWP_NOOWNERZORDER | SWP_NOACTIVATE; SetRect(&rc, 0, 0, LOWORD(lParam), HIWORD(lParam)); /* width,height */ /* workaround: reduce flickering of frame in clist */ InvalidateRect(hwndFrame, &rc, FALSE); HDWP hdwp = BeginDeferWindowPos(3); /* progress */ LONG width = rc.right - GetSystemMetrics(SM_CXICON) - 10; LONG height = rc.bottom - (GetSystemMetrics(SM_CYICON) / 2) - 5; if (NULL != dat->hwndProgress) /* Wine fix. */ hdwp = DeferWindowPos(hdwp, dat->hwndProgress, NULL, 0, 0, width, height, SWP_NOMOVE | defflg); /* desc */ if (dat->hwndDesc != NULL) /* Wine fix. */ hdwp = DeferWindowPos(hdwp, dat->hwndDesc, NULL, GetSystemMetrics(SM_CXICON) + 5, 5 + height, 0, 0, SWP_NOSIZE | defflg); /* time */ if (NULL != dat->hwndTime) /* Wine fix. */ hdwp = DeferWindowPos(hdwp, dat->hwndTime, NULL, GetSystemMetrics(SM_CXICON) + 85, 5 + height, width - 80, (GetSystemMetrics(SM_CXICON) / 2), defflg); EndDeferWindowPos(hdwp); } PostMessage(hwndFrame, M_CHECK_CLIPPED, 0, 0); return 0; case M_REFRESH_COLORS: COLORREF clrBar; if (FontService_GetColor(_T("Automatic Shutdown"), _T("Progress Bar"), &clrBar)) clrBar = GetDefaultColor(FRAMEELEMENT_BAR); if (FontService_GetColor(_T("Automatic Shutdown"), _T("Background"), &dat->clrBackground)) dat->clrBackground = GetDefaultColor(FRAMEELEMENT_BKGRND); if (dat->hbrBackground != NULL) DeleteObject(dat->hbrBackground); dat->hbrBackground = CreateSolidBrush(dat->clrBackground); SendMessage(dat->hwndProgress, PBM_SETBARCOLOR, 0, (LPARAM)clrBar); SendMessage(dat->hwndProgress, PBM_SETBKCOLOR, 0, (LPARAM)dat->clrBackground); InvalidateRect(hwndFrame, NULL, TRUE); return 0; case M_REFRESH_ICONS: return 0; case M_REFRESH_FONTS: { LOGFONT lf; if (!FontService_GetFont(_T("Automatic Shutdown"), _T("Countdown on Frame"), &dat->clrText, &lf)) { if (dat->hFont != NULL) DeleteObject(dat->hFont); dat->hFont = CreateFontIndirect(&lf); } else { dat->clrText = GetDefaultColor(FRAMEELEMENT_TEXT); if (GetDefaultFont(&lf) != NULL) { if (dat->hFont != NULL) DeleteObject(dat->hFont); dat->hFont = CreateFontIndirect(&lf); } } } if (dat->hwndDesc != NULL) SendMessage(dat->hwndDesc, WM_SETFONT, (WPARAM)dat->hFont, FALSE); SendMessage(dat->hwndTime, WM_SETFONT, (WPARAM)dat->hFont, FALSE); InvalidateRect(hwndFrame, NULL, FALSE); return 0; case WM_SYSCOLORCHANGE: SendMessage(hwndFrame, M_REFRESH_COLORS, 0, 0); break; case WM_SETTINGCHANGE: /* colors depend on windows settings */ SendMessage(hwndFrame, M_REFRESH_COLORS, 0, 0); SendMessage(hwndFrame, M_REFRESH_FONTS, 0, 0); SendMessage(hwndFrame, M_UPDATE_COUNTDOWN, 0, 0); RedrawWindow(hwndFrame, NULL, NULL, RDW_INVALIDATE | RDW_ALLCHILDREN | RDW_ERASE); break; case WM_TIMECHANGE: /* windows system clock changed */ SendMessage(hwndFrame, M_SET_COUNTDOWN, 0, 0); PostMessage(hwndFrame, M_UPDATE_COUNTDOWN, 0, 0); break; case WM_CTLCOLORDLG: case WM_CTLCOLORSTATIC: SetTextColor((HDC)wParam, dat->clrText); SetBkColor((HDC)wParam, dat->clrBackground); return (INT_PTR)dat->hbrBackground; case WM_ERASEBKGND: { RECT rc; if (dat->hbrBackground != NULL && GetClientRect(hwndFrame, &rc)) { FillRect((HDC)wParam, &rc, dat->hbrBackground); return TRUE; } return FALSE; } case M_SET_COUNTDOWN: if (dat->fTimeFlags&SDWTF_ST_TIME) { dat->settingLastTime = (time_t)db_get_dw(NULL, "AutoShutdown", "TimeStamp", SETTING_TIMESTAMP_DEFAULT); dat->countdown = time(NULL); if (dat->settingLastTime > dat->countdown) dat->countdown = dat->settingLastTime - dat->countdown; else dat->countdown = 0; } else if (dat->flags&FWPDF_COUNTDOWNINVALID) { dat->countdown = (time_t)db_get_dw(NULL, "AutoShutdown", "Countdown", SETTING_COUNTDOWN_DEFAULT); dat->countdown *= (time_t)db_get_dw(NULL, "AutoShutdown", "CountdownUnit", SETTING_COUNTDOWNUNIT_DEFAULT); } dat->flags &= ~FWPDF_COUNTDOWNINVALID; /* commctl 4.70+, Win95: 1-100 will work fine (wrap around) */ SendMessage(dat->hwndProgress, PBM_SETRANGE32, 0, (LPARAM)dat->countdown); return 0; case WM_TIMER: if (dat == NULL) return 0; if (dat->countdown != 0 && !(dat->flags&FWPDF_COUNTDOWNINVALID) && !(dat->flags&FWPDF_PAUSED)) { dat->countdown--; PostMessage(dat->hwndProgress, PBM_STEPIT, 0, 0); } if (IsWindowVisible(hwndFrame)) PostMessage(hwndFrame, M_UPDATE_COUNTDOWN, 0, 0); if (dat->countdown == 0) { SendMessage(hwndFrame, M_CLOSE_COUNTDOWN, 0, 0); ServiceShutdown(0, TRUE); ServiceStopWatcher(0, 0); } return 0; case WM_SHOWWINDOW: /* the text is kept unchanged while hidden */ if ((BOOL)wParam) SendMessage(hwndFrame, M_UPDATE_COUNTDOWN, 0, 0); break; case M_UPDATE_COUNTDOWN: if (dat->flags&FWPDF_PAUSED && !(dat->flags&FWPDF_PAUSEDSHOWN)) { SetWindowText(dat->hwndTime, TranslateT("Paused")); dat->flags |= FWPDF_PAUSEDSHOWN; } else { TCHAR szOutput[256]; if (dat->fTimeFlags&SDWTF_ST_TIME) GetFormatedDateTime(szOutput, _countof(szOutput), dat->settingLastTime, TRUE); else GetFormatedCountdown(szOutput, _countof(szOutput), dat->countdown); SetWindowText(dat->hwndTime, szOutput); PostMessage(hwndFrame, M_CHECK_CLIPPED, 0, 0); /* update tooltip text (if shown) */ if (dat->hwndToolTip != NULL && !(dat->flags&FWPDF_PAUSED)) { TTTOOLINFO ti; ti.cbSize = sizeof(ti); if (SendMessage(dat->hwndToolTip, TTM_GETCURRENTTOOL, 0, (LPARAM)&ti) && (HWND)ti.uId != dat->hwndIcon) SendMessage(dat->hwndToolTip, TTM_UPDATE, 0, 0); } else dat->flags &= ~FWPDF_PAUSEDSHOWN; } return 0; case M_CLOSE_COUNTDOWN: KillTimer(hwndFrame, 1); dat->countdown = 0; dat->flags &= ~FWPDF_PAUSED; SendMessage(hwndFrame, M_UPDATE_COUNTDOWN, 0, 0); dat->flags |= FWPDF_COUNTDOWNINVALID; /* step up to upper range */ SendMessage(dat->hwndProgress, PBM_SETPOS, SendMessage(dat->hwndProgress, PBM_GETRANGE, FALSE, 0), 0); SetWindowLongPtr(dat->hwndProgress, GWL_STYLE, GetWindowLongPtr(dat->hwndProgress, GWL_STYLE) | PBM_SETMARQUEE); SendMessage(dat->hwndProgress, PBM_SETMARQUEE, TRUE, 10); /* marquee for rest of time */ return 0; case M_PAUSE_COUNTDOWN: if (dat->flags&FWPDF_PAUSED) { /* unpause */ dat->flags &= ~(FWPDF_PAUSED | FWPDF_PAUSEDSHOWN); SendMessage(hwndFrame, M_SET_COUNTDOWN, 0, 0); SendMessage(dat->hwndProgress, PBM_SETSTATE, PBST_NORMAL, 0); /* WinVista+ */ } else { /* pause */ dat->flags |= FWPDF_PAUSED; SendMessage(dat->hwndProgress, PBM_SETSTATE, PBST_PAUSED, 0); /* WinVista+ */ } SendMessage(hwndFrame, M_UPDATE_COUNTDOWN, 0, 0); return 0; case WM_CONTEXTMENU: { if (dat->flags & FWPDF_COUNTDOWNINVALID) return 0; POINT pt = { GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam) }; if (pt.x == -1 && pt.y == -1) { /* invoked by keyboard */ RECT rc; /* position in middle above rect */ if (!GetWindowRect(hwndFrame, &rc)) return 0; pt.x = rc.left + ((int)(rc.right - rc.left) / 2); pt.y = rc.top + ((int)(rc.bottom - rc.top) / 2); } HMENU hContextMenu = CreatePopupMenu(); if (hContextMenu != NULL) { AppendMenu(hContextMenu, MF_STRING, MENUITEM_PAUSECOUNTDOWN, (dat->flags&FWPDF_PAUSED) ? TranslateT("&Unpause Countdown") : TranslateT("&Pause Countdown")); SetMenuDefaultItem(hContextMenu, MENUITEM_PAUSECOUNTDOWN, FALSE); AppendMenu(hContextMenu, MF_STRING, MENUITEM_STOPCOUNTDOWN, TranslateT("&Cancel Countdown")); TrackPopupMenuEx(hContextMenu, TPM_LEFTALIGN | TPM_TOPALIGN | TPM_HORPOSANIMATION | TPM_VERPOSANIMATION | TPM_RIGHTBUTTON, pt.x, pt.y, hwndFrame, NULL); DestroyMenu(hContextMenu); } } return 0; case WM_LBUTTONDBLCLK: if (!(dat->flags&FWPDF_COUNTDOWNINVALID)) SendMessage(hwndFrame, M_PAUSE_COUNTDOWN, 0, 0); return 0; case WM_COMMAND: switch (LOWORD(wParam)) { case MENUITEM_STOPCOUNTDOWN: /* close only countdown window when other watcher types running */ if (dat->fTimeFlags&~(SDWTF_SPECIFICTIME | SDWTF_ST_MASK)) CloseCountdownFrame(); /* something else is running */ else ServiceStopWatcher(0, 0); /* calls CloseCountdownFrame() */ return 0; case MENUITEM_PAUSECOUNTDOWN: SendMessage(hwndFrame, M_PAUSE_COUNTDOWN, 0, 0); return 0; } break; case M_CHECK_CLIPPED: /* for in-place tooltip on dat->hwndTime */ { RECT rc; HDC hdc; SIZE size; HFONT hFontPrev = NULL; TCHAR szOutput[256]; dat->flags &= ~FWPDF_TIMEISCLIPPED; if (GetWindowText(dat->hwndTime, szOutput, _countof(szOutput))) if (GetClientRect(dat->hwndTime, &rc)) { hdc = GetDC(dat->hwndTime); if (hdc != NULL) { if (dat->hFont != NULL) hFontPrev = (HFONT)SelectObject(hdc, dat->hFont); if (GetTextExtentPoint32(hdc, szOutput, (int)mir_tstrlen(szOutput), &size)) if (size.cx >= (rc.right - rc.left)) dat->flags &= FWPDF_TIMEISCLIPPED; if (dat->hFont != NULL) SelectObject(hdc, hFontPrev); ReleaseDC(dat->hwndTime, hdc); } } return 0; } case WM_NOTIFY: if (((NMHDR*)lParam)->hwndFrom == dat->hwndToolTip) switch (((NMHDR*)lParam)->code) { case TTN_SHOW: /* 'in-place' tooltip on dat->hwndTime */ if (dat->flags&FWPDF_TIMEISCLIPPED && (HWND)wParam == dat->hwndTime) { RECT rc; if (GetWindowRect(dat->hwndTime, &rc)) { SetWindowLongPtr(dat->hwndToolTip, GWL_STYLE, GetWindowLongPtr(dat->hwndToolTip, GWL_STYLE) | TTS_NOANIMATE); SetWindowLongPtr(dat->hwndToolTip, GWL_EXSTYLE, GetWindowLongPtr(dat->hwndToolTip, GWL_EXSTYLE) | WS_EX_TRANSPARENT); SendMessage(dat->hwndToolTip, TTM_ADJUSTRECT, TRUE, (LPARAM)&rc); SetWindowPos(dat->hwndToolTip, NULL, rc.left, rc.top, 0, 0, SWP_NOSIZE | SWP_NOZORDER | SWP_NOACTIVATE); return TRUE; /* self-defined position */ } } SetWindowLongPtr(dat->hwndToolTip, GWL_STYLE, GetWindowLongPtr(dat->hwndToolTip, GWL_STYLE) & (~TTS_NOANIMATE)); SetWindowLongPtr(dat->hwndToolTip, GWL_EXSTYLE, GetWindowLongPtr(dat->hwndToolTip, GWL_EXSTYLE) & (~WS_EX_TRANSPARENT)); return 0; case TTN_POP: /* workaround #5: frame does not get redrawn after * in-place tooltip hidden on dat->hwndTime */ RedrawWindow(hwndCountdownFrame, NULL, NULL, RDW_INVALIDATE | RDW_ALLCHILDREN | RDW_ERASE); return 0; case TTN_NEEDTEXT: { NMTTDISPINFO *ttdi = (NMTTDISPINFO*)lParam; if (dat->flags&FWPDF_TIMEISCLIPPED && (HWND)wParam == dat->hwndTime) { if (GetWindowText(dat->hwndTime, ttdi->szText, _countof(ttdi->szText))) ttdi->lpszText = ttdi->szText; } else if ((HWND)wParam == dat->hwndIcon) ttdi->lpszText = TranslateT("Automatic Shutdown"); else { TCHAR szTime[_countof(ttdi->szText)]; if (dat->fTimeFlags&SDWTF_ST_TIME) GetFormatedDateTime(szTime, _countof(szTime), dat->settingLastTime, FALSE); else GetFormatedCountdown(szTime, _countof(szTime), dat->countdown); mir_sntprintf(ttdi->szText, _T("%s %s"), (dat->fTimeFlags&SDWTF_ST_TIME) ? TranslateT("Shutdown at:") : TranslateT("Time left:"), szTime); ttdi->lpszText = ttdi->szText; } return 0; } } break; } return DefWindowProc(hwndFrame, msg, wParam, lParam); }
consolewin_info::consolewin_info(debugger_windows_interface &debugger) : disasmbasewin_info(debugger, true, "Debug", NULL), m_devices_menu(NULL) { if ((window() == NULL) || (m_views[0] == NULL)) goto cleanup; // create the views m_views[1].reset(global_alloc(debugview_info(debugger, *this, window(), DVT_STATE))); if (!m_views[1]->is_valid()) goto cleanup; m_views[2].reset(global_alloc(debugview_info(debugger, *this, window(), DVT_CONSOLE))); if (!m_views[2]->is_valid()) goto cleanup; { // Add image menu only if image devices exist image_interface_iterator iter(machine().root_device()); device_image_interface *img = iter.first(); if (img != NULL) { m_devices_menu = CreatePopupMenu(); for ( ; img != NULL; img = iter.next()) { astring temp; temp.format("%s : %s", img->device().name(), img->exists() ? img->filename() : "[no image]"); TCHAR *tc_buf = tstring_from_utf8(temp.c_str()); if (tc_buf != NULL) { AppendMenu(m_devices_menu, MF_ENABLED, 0, tc_buf); osd_free(tc_buf); } } AppendMenu(GetMenu(window()), MF_ENABLED | MF_POPUP, (UINT_PTR)m_devices_menu, TEXT("Images")); } // get the work bounds RECT work_bounds, bounds; SystemParametersInfo(SPI_GETWORKAREA, 0, &work_bounds, 0); // adjust the min/max sizes for the window style bounds.top = bounds.left = 0; bounds.right = bounds.bottom = EDGE_WIDTH + m_views[1]->maxwidth() + (2 * EDGE_WIDTH) + 100 + EDGE_WIDTH; AdjustWindowRectEx(&bounds, DEBUG_WINDOW_STYLE, FALSE, DEBUG_WINDOW_STYLE_EX); set_minwidth(bounds.right - bounds.left); bounds.top = bounds.left = 0; bounds.right = bounds.bottom = EDGE_WIDTH + m_views[1]->maxwidth() + (2 * EDGE_WIDTH) + MAX(m_views[0]->maxwidth(), m_views[2]->maxwidth()) + EDGE_WIDTH; AdjustWindowRectEx(&bounds, DEBUG_WINDOW_STYLE, FALSE, DEBUG_WINDOW_STYLE_EX); set_maxwidth(bounds.right - bounds.left); // position the window at the bottom-right int const bestwidth = MIN(maxwidth(), work_bounds.right - work_bounds.left); int const bestheight = MIN(500, work_bounds.bottom - work_bounds.top); SetWindowPos(window(), HWND_TOP, work_bounds.right - bestwidth, work_bounds.bottom - bestheight, bestwidth, bestheight, SWP_SHOWWINDOW); } // recompute the children set_cpu(*debug_cpu_get_visible_cpu(machine())); // mark the edit box as the default focus and set it set_default_focus(); return; cleanup: m_views[2].reset(); m_views[1].reset(); m_views[0].reset(); }
LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) { static TCHAR szDevice[32], szWindowText[64] ; static int cxChar, cyChar, nCurrentDevice = IDM_SCREEN, nCurrentInfo = IDM_BASIC ; static DWORD dwNeeded, dwReturned ; static PRINTER_INFO_4 * pinfo4 ; static PRINTER_INFO_5 * pinfo5 ; DWORD i ; HDC hdc, hdcInfo ; HMENU hMenu ; HANDLE hPrint ; PAINTSTRUCT ps ; TEXTMETRIC tm ; switch (message) { case WM_CREATE : hdc = GetDC (hwnd) ; SelectObject (hdc, GetStockObject (SYSTEM_FIXED_FONT)) ; GetTextMetrics (hdc, &tm) ; cxChar = tm.tmAveCharWidth ; cyChar = tm.tmHeight + tm.tmExternalLeading ; ReleaseDC (hwnd, hdc) ; // fall through case WM_SETTINGCHANGE: hMenu = GetSubMenu (GetMenu (hwnd), 0) ; while (GetMenuItemCount (hMenu) > 1) DeleteMenu (hMenu, 1, MF_BYPOSITION) ; // Get a list of all local and remote printers // // First, find out how large an array we need; this // call will fail, leaving the required size in dwNeeded // // Next, allocate space for the info array and fill it // // Put the printer names on the menu. if (GetVersion () & 0x80000000) // Windows 98 { EnumPrinters (PRINTER_ENUM_LOCAL, NULL, 5, NULL, 0, &dwNeeded, &dwReturned) ; pinfo5 = malloc (dwNeeded) ; EnumPrinters (PRINTER_ENUM_LOCAL, NULL, 5, (PBYTE) pinfo5, dwNeeded, &dwNeeded, &dwReturned) ; for (i = 0 ; i < dwReturned ; i++) { AppendMenu (hMenu, (i+1) % 16 ? 0 : MF_MENUBARBREAK, i + 1, pinfo5[i].pPrinterName) ; } free (pinfo5) ; } else // Windows NT { EnumPrinters (PRINTER_ENUM_LOCAL, NULL, 4, NULL, 0, &dwNeeded, &dwReturned) ; pinfo4 = malloc (dwNeeded) ; EnumPrinters (PRINTER_ENUM_LOCAL, NULL, 4, (PBYTE) pinfo4, dwNeeded, &dwNeeded, &dwReturned) ; for (i = 0 ; i < dwReturned ; i++) { AppendMenu (hMenu, (i+1) % 16 ? 0 : MF_MENUBARBREAK, i + 1, pinfo4[i].pPrinterName) ; } free (pinfo4) ; } AppendMenu (hMenu, MF_SEPARATOR, 0, NULL) ; AppendMenu (hMenu, 0, IDM_DEVMODE, TEXT ("Properties")) ; wParam = IDM_SCREEN ; // fall through case WM_COMMAND : hMenu = GetMenu (hwnd) ; if (LOWORD (wParam) == IDM_SCREEN || // IDM_SCREEN & Printers LOWORD (wParam) < IDM_DEVMODE) { CheckMenuItem (hMenu, nCurrentDevice, MF_UNCHECKED) ; nCurrentDevice = LOWORD (wParam) ; CheckMenuItem (hMenu, nCurrentDevice, MF_CHECKED) ; } else if (LOWORD (wParam) == IDM_DEVMODE) // Properties selection { GetMenuString (hMenu, nCurrentDevice, szDevice, sizeof (szDevice) / sizeof (TCHAR), MF_BYCOMMAND); if (OpenPrinter (szDevice, &hPrint, NULL)) { PrinterProperties (hwnd, hPrint) ; ClosePrinter (hPrint) ; } } else // info menu items { CheckMenuItem (hMenu, nCurrentInfo, MF_UNCHECKED) ; nCurrentInfo = LOWORD (wParam) ; CheckMenuItem (hMenu, nCurrentInfo, MF_CHECKED) ; } InvalidateRect (hwnd, NULL, TRUE) ; return 0 ; case WM_INITMENUPOPUP : if (lParam == 0) EnableMenuItem (GetMenu (hwnd), IDM_DEVMODE, nCurrentDevice == IDM_SCREEN ? MF_GRAYED : MF_ENABLED) ; return 0 ; case WM_PAINT : lstrcpy (szWindowText, TEXT ("Device Capabilities: ")) ; if (nCurrentDevice == IDM_SCREEN) { lstrcpy (szDevice, TEXT ("DISPLAY")) ; hdcInfo = CreateIC (szDevice, NULL, NULL, NULL) ; } else { hMenu = GetMenu (hwnd) ; GetMenuString (hMenu, nCurrentDevice, szDevice, sizeof (szDevice), MF_BYCOMMAND) ; hdcInfo = CreateIC (NULL, szDevice, NULL, NULL) ; } lstrcat (szWindowText, szDevice) ; SetWindowText (hwnd, szWindowText) ; hdc = BeginPaint (hwnd, &ps) ; SelectObject (hdc, GetStockObject (SYSTEM_FIXED_FONT)) ; if (hdcInfo) { switch (nCurrentInfo) { case IDM_BASIC : DoBasicInfo (hdc, hdcInfo, cxChar, cyChar) ; break ; case IDM_OTHER : DoOtherInfo (hdc, hdcInfo, cxChar, cyChar) ; break ; case IDM_CURVE : case IDM_LINE : case IDM_POLY : case IDM_TEXT : DoBitCodedCaps (hdc, hdcInfo, cxChar, cyChar, nCurrentInfo - IDM_CURVE) ; break ; } DeleteDC (hdcInfo) ; } EndPaint (hwnd, &ps) ; return 0 ; case WM_DESTROY : PostQuitMessage (0) ; return 0 ; } return DefWindowProc (hwnd, message, wParam, lParam) ; }
void Menu::add_separator(){ AppendMenu(handle, MF_SEPARATOR, 0, NULL); }
void Menu::add_separator() { AppendMenu(HMENU(m_handle),MF_SEPARATOR,0,NULL); }
/* Show the window */ int text_create(TW *tw, const char *app_name, int show_cmd) { HMENU sysmenu; HINSTANCE hInstance = GetModuleHandle(NULL); #ifndef WINDOWS_NO_UNICODE wchar_t *app_nameW, *d; const char *s; app_nameW = malloc(strlen(app_name)*2+2); if (app_nameW == NULL) { text_error("Out of memory"); return 1; } d = app_nameW; s = app_name; while ((*d++ = (wchar_t)(unsigned char)(*s++)) != 0); tw->TitleW = app_nameW; #endif tw->Title = app_name; tw->nCmdShow = show_cmd; tw->quitnow = FALSE; /* make sure we have some sensible defaults */ if (tw->KeyBufSize < 256) tw->KeyBufSize = 256; tw->CursorPos.x = tw->CursorPos.y = 0; tw->bFocus = FALSE; tw->bGetCh = FALSE; tw->CaretHeight = 0; /* allocate buffers */ tw->KeyBufIn = tw->KeyBufOut = tw->KeyBuf = malloc(tw->KeyBufSize); if (tw->KeyBuf == NULL) { text_error("Out of memory"); return 1; } tw->ScreenBuffer = malloc(tw->ScreenSize.x * tw->ScreenSize.y * CHARSIZE); if (tw->ScreenBuffer == NULL) { text_error("Out of memory"); return 1; } #ifdef WINDOWS_NO_UNICODE memset(tw->ScreenBuffer, ' ', tw->ScreenSize.x * tw->ScreenSize.y); #else wmemset(tw->ScreenBuffer, ' ', tw->ScreenSize.x * tw->ScreenSize.y); #endif #ifdef WINDOWS_NO_UNICODE tw->hwnd = CreateWindow(TextWinClassName, tw->Title, WS_OVERLAPPEDWINDOW | WS_VSCROLL | WS_HSCROLL, tw->x, tw->y, tw->cx, tw->cy, NULL, NULL, hInstance, tw); #else tw->hwnd = CreateWindowW(TextWinClassName, app_nameW, WS_OVERLAPPEDWINDOW | WS_VSCROLL | WS_HSCROLL, tw->x, tw->y, tw->cx, tw->cy, NULL, NULL, hInstance, tw); #endif if (tw->hwnd == NULL) { MessageBoxA((HWND)NULL,"Couldn't open text window",(LPSTR)NULL, MB_ICONHAND | MB_SYSTEMMODAL); return 1; } ShowWindow(tw->hwnd, tw->nCmdShow); sysmenu = GetSystemMenu(tw->hwnd,0); /* get the sysmenu */ AppendMenu(sysmenu, MF_SEPARATOR, 0, NULL); AppendMenuA(sysmenu, MF_STRING, M_COPY_CLIP, "Copy to Clip&board"); AppendMenuA(sysmenu, MF_STRING, M_PASTE_CLIP, "&Paste"); return 0; }
static int InputMenuPopup(WPARAM, LPARAM lParam) { HMENU hSubMenu = NULL; int i = 0; MessageWindowPopupData * mwpd = (MessageWindowPopupData *)lParam; if (mwpd->uFlags == MSG_WINDOWPOPUP_LOG || !g_bQuickMenu || !QuickList->realCount) return 0; if (mwpd->uType == MSG_WINDOWPOPUP_SHOWING) { hSubMenu = CreatePopupMenu(); InsertMenu((HMENU)mwpd->hMenu, 6, MF_STRING | MF_POPUP | MF_BYPOSITION, (UINT_PTR)hSubMenu, TranslateT("Quick Messages")); InsertMenu((HMENU)mwpd->hMenu, 7, MF_SEPARATOR | MF_BYPOSITION, 0, 0); qsort(QuickList->items, QuickList->realCount, sizeof(QuickData *), sstQuickSortButtons); for (i = 0; i < QuickList->realCount; i++) { QuickData* qd = (QuickData *)QuickList->items[i]; if (qd->fEntryType&QMF_EX_SEPARATOR) AppendMenu(hSubMenu, MF_SEPARATOR, 0, NULL); else AppendMenu(hSubMenu, MF_STRING, qd->dwPos + 254, qd->ptszValueName); } } else if (mwpd->uType == MSG_WINDOWPOPUP_SELECTED&&mwpd->selection >= 254) { for (i = 0; i < QuickList->realCount; i++) { QuickData* qd = (QuickData *)QuickList->items[i]; if ((qd->dwPos + 254) == mwpd->selection) { CHARRANGE cr; UINT textlenght = 0; TCHAR* pszText = NULL; TCHAR* ptszQValue = NULL; TCHAR* pszCBText = NULL; BOOL bIsService = 0; if (IsClipboardFormatAvailable(CF_TEXT)) { if (OpenClipboard(mwpd->hwnd)) { HANDLE hData = NULL; TCHAR* chBuffer = NULL; int textLength = 0; hData = GetClipboardData(CF_UNICODETEXT); chBuffer = (TCHAR*)GlobalLock(hData); textLength = (int)mir_tstrlen(chBuffer); pszCBText = mir_tstrdup(chBuffer); GlobalUnlock(hData); CloseClipboard(); } } SendMessage(mwpd->hwnd, EM_EXGETSEL, 0, (LPARAM)&cr); textlenght = cr.cpMax - cr.cpMin; if (textlenght) { pszText = (TCHAR *)mir_alloc((textlenght + 10)*sizeof(TCHAR)); memset(pszText, 0, ((textlenght + 10) * sizeof(TCHAR))); SendMessage(mwpd->hwnd, EM_GETSELTEXT, 0, (LPARAM)pszText); } if (qd->ptszValue) { ptszQValue = ParseString(mwpd->hContact, qd->ptszValue, pszText ? pszText : _T(""), pszCBText ? pszCBText : _T(""), (int)mir_tstrlen(qd->ptszValue), textlenght, pszCBText ? (int)mir_tstrlen(pszCBText) : 0); if ((bIsService = qd->bIsService) && ptszQValue) CallService(mir_u2a(ptszQValue), (WPARAM)mwpd->hContact, 0); } if (ptszQValue) SendMessage(mwpd->hwnd, EM_REPLACESEL, TRUE, (LPARAM)ptszQValue); if (pszText) mir_free(pszText); if (ptszQValue) free(ptszQValue); if (pszCBText) mir_free(pszCBText); break; } } return 1; } return 0; }
void WindowSystemInit( HINSTANCE hInstance ) { WNDCLASS wc; memset (&wc, 0, sizeof(wc)); wc.style = 0; wc.lpfnWndProc = (WNDPROC)WinProcInstance; wc.cbClsExtra = 0; wc.cbWndExtra = 0; wc.hInstance = hInstance; wc.hIcon = LoadIcon (NULL, IDI_APPLICATION); wc.hCursor = LoadCursor (NULL, IDC_ARROW); wc.hbrBackground = (HBRUSH)(BLACK_BRUSH); wc.lpszMenuName = NULL; wc.lpszClassName = "mainWindow"; RegisterClass(&wc); mainhWnd = CreateWindow ( "mainWindow" , FILENAME, WINDOW_STYLE, 0, 0, 1000, // unfortunately I can't just #ifdef these 2 lines because CreateWindow is also a macro and C can't nest 'em... <sigh> 600, // 0, LoadMenu(hInstance,MAKEINTRESOURCE(IDR_MENU1)), hInstance, NULL); ShowWindow ( mainhWnd, SW_SHOW ); UpdateWindow ( mainhWnd ); hMainMenu = GetMenu(mainhWnd); hMenuUpperAnims = CreateMenu(); hMenuLowerAnims = CreateMenu(); AppendMenu( hMainMenu, // HMENU hMenu, // handle to menu to be changed MF_POPUP|MF_STRING, // UINT uFlags, // menu-item flags (UINT_PTR) hMenuUpperAnims, // UINT_PTR uIDNewItem, // menu-item identifier or handle to drop-down menu or submenu "(Upper Anim Sequences)" // LPCTSTR lpNewItem // menu-item content ); AppendMenu( hMainMenu, // HMENU hMenu, // handle to menu to be changed MF_POPUP|MF_STRING, // UINT uFlags, // menu-item flags (UINT_PTR) hMenuLowerAnims, // UINT_PTR uIDNewItem, // menu-item identifier or handle to drop-down menu or submenu "(Lower Anim Sequences)" // LPCTSTR lpNewItem // menu-item content ); Menu_UpperAnims_Clear(); Menu_LowerAnims_Clear(); DrawMenuBar(mainhWnd); if (getCmdLine() != NULL ) { SysOnCommand(mainhWnd, ID_FILE_OPEN, 0, 0); // if (!loadmdl( getCmdLine() )) { // Debug( "could not load %s", getCmdLine() ); } }
//Invis Dialog LRESULT CALLBACK InvisDialogProcedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) { static UINT s_uTaskbarRestart; switch (message) /* handle the messages */ { case WM_INITDIALOG: SetClassLong(hwnd,GCL_HICON,(long) LoadIcon(thisinstance,"A")); SetClassLong(hwnd,GCL_HICONSM,(long) LoadIcon(thisinstance,"A")); s_uTaskbarRestart = RegisterWindowMessage(TEXT("TaskbarCreated")); return false; break; case WM_NOTIFYICON: if ((UINT)lParam == WM_RBUTTONUP){ POINT cord; GetCursorPos(&cord); HMENU menu; menu = CreatePopupMenu(); AppendMenu(menu,MF_ENABLED|MF_STRING, ID_MENU_ABOUT,"&About"); AppendMenu(menu,MF_ENABLED|MF_STRING, ID_MENU_HELP,"&Help"); AppendMenu(menu,MF_ENABLED|MF_STRING, ID_MENU_SETT,"Se&ttings"); AppendMenu(menu,MF_ENABLED|MF_STRING, ID_MENU_STATUS,"&Status"); AppendMenu(menu,MF_ENABLED|MF_STRING, ID_MENU_EXIT,"&Exit"); SetForegroundWindow(hwnd); TrackPopupMenu(menu,TPM_RIGHTALIGN,cord.x,cord.y,0,hwnd,NULL); DestroyMenu(menu); PostMessage(hwnd, WM_NULL, 0, 0); } else if ((UINT)lParam == WM_LBUTTONDBLCLK) { PostMessage(hwnd,WM_COMMAND,ID_MENU_STATUS,0); } return 0; break; case WM_CLOSE: case WM_RQUIT: Windowlessquit = true; PostQuitMessage(0); break; // /* case WM_ENDSESSION: Windowlessquit = true; PostQuitMessage(0); return 0; // */ case WM_COMMAND: switch(LOWORD(wParam)) { case ID_MENU_EXIT: Windowlessquit = true; PostQuitMessage (0); break; case ID_MENU_STATUS: Stat.Create(); break; case ID_MENU_SETT: Sett.Create(); break; case ID_MENU_HELP: WinHelp(hwnd,"HELP.HLP",HELP_FINDER,0); break; case ID_MENU_ABOUT: if (!IsWindow(Aboutwnd)) { Aboutwnd = CreateDialog(thisinstance,MAKEINTRESOURCE(IDD_ABOUT),NULL,(DLGPROC)AboutDialogProcedure); ShowWindow(Aboutwnd,SW_SHOW); } SetForegroundWindow(Aboutwnd); break; } return 0; break; default: if( message == s_uTaskbarRestart) { hGlobalIcon->Remove(); Sleep(500); hGlobalIcon->Add(); break; } return false; } return 0; }
BOOL CALLBACK gui_MainDialogBoxCallback( HWND hDlg, UINT Message, WPARAM wParam, LPARAM lParam ) { switch ( Message ) { case WM_INITDIALOG: // Load the icon. g_hSmallIcon = (HICON)LoadImage( g_hInst, MAKEINTRESOURCE( IDI_ICON ), IMAGE_ICON, 16, 16, LR_SHARED ); SendMessage( hDlg, WM_SETICON, (WPARAM)ICON_SMALL, (LPARAM)g_hSmallIcon ); SendMessage( hDlg, WM_SETICON, (WPARAM)ICON_BIG, (LPARAM)LoadIcon( g_hInst, MAKEINTRESOURCE( IDI_ICON ))); //======================== // Set up the tab control. //======================== HWND edit; TCITEM tcitem; RECT tabrect, tcrect; LPNMHDR nmhdr; tcitem.mask = TCIF_TEXT | TCIF_PARAM; edit = GetDlgItem( hDlg, IDC_TABC ); GetWindowRect( edit, &tcrect ); ScreenToClient( hDlg, (LPPOINT) &tcrect.left ); ScreenToClient( hDlg, (LPPOINT) &tcrect.right ); TabCtrl_GetItemRect( edit, 0, &tabrect ); // Create the main tab. tcitem.pszText = "Overview"; tcitem.lParam = (LPARAM) CreateDialogParam( g_hInst, MAKEINTRESOURCE( IDD_OVERVIEW ), hDlg, tab_OverviewCallback, (LPARAM) edit ); TabCtrl_InsertItem( edit, 0, &tcitem ); SetWindowPos( (HWND) tcitem.lParam, HWND_TOP, tcrect.left + 3, tcrect.top + tabrect.bottom + 3, tcrect.right - tcrect.left - 8, tcrect.bottom - tcrect.top - tabrect.bottom - 8, 0 ); // Create a tab for each port. for ( unsigned int i = 0; i < NUM_PORTS; i++ ) { tcitem.pszText = g_PortInfo[i].szName; tcitem.lParam = (LPARAM) CreateDialogParam( g_hInst, MAKEINTRESOURCE( IDD_SKULLTAG ), hDlg, tab_PortCallback, (LPARAM) i ); TabCtrl_InsertItem( edit, i + 1, &tcitem ); SetWindowPos( (HWND) tcitem.lParam, HWND_TOP, tcrect.left + 3, tcrect.top + tabrect.bottom + 3, tcrect.right - tcrect.left - 8, tcrect.bottom - tcrect.top - tabrect.bottom - 8, 0 ); } //============================== // Create the notification icon. //============================== ZeroMemory( &g_NotifyIconData, sizeof( g_NotifyIconData )); g_NotifyIconData.cbSize = sizeof( g_NotifyIconData ); g_NotifyIconData.hWnd = hDlg; g_NotifyIconData.uID = 0; g_NotifyIconData.uFlags = NIF_ICON|NIF_MESSAGE|NIF_TIP; g_NotifyIconData.uCallbackMessage = UWM_TRAY_TRAYID; g_NotifyIconData.hIcon = g_hSmallIcon; lstrcpy( g_NotifyIconData.szTip, g_szTooltip ); Shell_NotifyIcon( NIM_ADD, &g_NotifyIconData ); break; case WM_CLOSE: Shell_NotifyIcon( NIM_DELETE, &g_NotifyIconData ); EndDialog( hDlg, -1 ); CloseHandle( g_hThread ); exit( 0 ); break; case WM_DESTROY: Shell_NotifyIcon( NIM_DELETE, &g_NotifyIconData ); PostQuitMessage( 0 ); break; case WM_SYSCOMMAND: if ( wParam == SC_MINIMIZE ) { // Hide the window. ShowWindow( hDlg, SW_HIDE ); break; } DefWindowProc( hDlg, Message, wParam, lParam ); break; case UWM_TRAY_TRAYID: switch ( lParam ) { case WM_LBUTTONDOWN: return TRUE; case WM_LBUTTONDBLCLK: gui_ToggleWindow( hDlg ); return TRUE; case WM_RBUTTONUP: { // Show a little menu. HMENU hMenu = CreatePopupMenu(); POINT pt; AppendMenu( hMenu, MF_STRING, IDR_TOGGLE, "Show/Hide" ); // AppendMenu( hMenu, MF_STRING, IDR_BROWSE, "Browse files" ); AppendMenu( hMenu, MF_SEPARATOR, 0, 0 ); AppendMenu( hMenu, MF_STRING, IDR_EXIT, "Exit" ); // Show it, and get the selected item. GetCursorPos( &pt ); int iSelection = ::TrackPopupMenu( hMenu, TPM_LEFTALIGN | TPM_LEFTBUTTON | TPM_RETURNCMD | TPM_HORIZONTAL, pt.x, pt.y, 0, hDlg, NULL ); DestroyMenu( hMenu ); if ( iSelection == IDR_EXIT ) { Shell_NotifyIcon( NIM_DELETE, &g_NotifyIconData ); PostQuitMessage( 0 ); EndDialog( hDlg, -1 ); CloseHandle( g_hThread ); exit( 0 ); } else if ( iSelection == IDR_TOGGLE ) gui_ToggleWindow( hDlg ); } break; default: break; } return FALSE; case WM_NOTIFY: nmhdr = (LPNMHDR)lParam; // Tab switching. if (nmhdr->idFrom == IDC_TABC) { int i = TabCtrl_GetCurSel( nmhdr->hwndFrom ); tcitem.mask = TCIF_PARAM; TabCtrl_GetItem( nmhdr->hwndFrom, i, &tcitem ); edit = (HWND) tcitem.lParam; // The tab is right about to switch. Hide the current tab pane. if ( nmhdr->code == TCN_SELCHANGING ) { ShowWindow( edit, SW_HIDE ); SetWindowLongPtr( hDlg, DWLP_MSGRESULT, FALSE ); return TRUE; } // The tab has just switched. Show the new tab pane. else if ( nmhdr->code == TCN_SELCHANGE ) { ShowWindow ( edit, SW_SHOW ); return TRUE; } else return FALSE; } break; default: return FALSE; } return TRUE; }
DWORD TrayParse( UINT m_uMsg, LPARAM m_lParam ) { if ( m_uMsg == WM_TRAYIDOL ) { if ( m_lParam == WM_RBUTTONDOWN ) { DWORD dTMR; POINT cPos; HMENU hTPM = CreatePopupMenu(); TCHAR mBuf[ MAX_STRING ]; wsprintf( mBuf, TEXT( "Exit %s" ), &gs_sSH ); gm_hTM = hTPM; AppendMenu( hTPM, MF_STRING, WM_DESTROY, mBuf ); GetCursorPos( &cPos ); SetForegroundWindow( gm_hWnd ); dTMR = TrackPopupMenuEx( hTPM, TS_TRAYIDOL, cPos.x, cPos.y, gm_hWnd, 0 ); DestroyMenu( hTPM ); gm_hTM = 0; if ( dTMR == WM_DESTROY ) { PostMessage( gm_hWnd, WM_CLOSE, 0, 0 ); } } else if ( m_lParam == WM_LBUTTONDBLCLK ) { gm_hAC = !gm_hAC ? gm_hWnd : 0; SetHooks( (DWORD) gm_hAC ); TrayAction( NIM_MODIFY ); } return 0; } else if ( m_uMsg == WM_CREATE ) { WM_TRAYCREA = RegisterWindowMessage( &gm_sTC ); gm_hAC = gm_hWnd; TrayAction( NIM_ADD ); SetHooks( 1 ); } else if ( m_uMsg == WM_TRAYCREA ) { TrayAction( NIM_ADD ); } else if ( m_uMsg == WM_DESTROY ) { gm_hAC = 0; SetHooks( 0 ); TrayAction( NIM_DELETE ); } return 1; }
struct CListEvent* cli_AddEvent(CLISTEVENT *cle) { struct CListEvent* p = corecli.pfnAddEvent(cle); if (p == NULL) return NULL; if (p->cle.hContact != 0 && p->cle.hDbEvent != (HANDLE) 1 && !(p->cle.flags & CLEF_ONLYAFEW)) { MENUITEMINFO mii = { sizeof(mii) }; mii.fMask = MIIM_DATA | MIIM_BITMAP | MIIM_ID; if (p->cle.pszService && (!strncmp("SRMsg/ReadMessage", p->cle.pszService, SIZEOF("SRMsg/ReadMessage")) || !strncmp("GChat/DblClickEvent", p->cle.pszService, SIZEOF("GChat/DblClickEvent")))) { // dup check only for msg events for (int j = 0; j < GetMenuItemCount(g_CluiData.hMenuNotify); j++) { if (GetMenuItemInfo(g_CluiData.hMenuNotify, j, TRUE, &mii) != 0) { NotifyMenuItemExData *nmi = (struct NotifyMenuItemExData *) mii.dwItemData; if (nmi != 0 && (HANDLE) nmi->hContact == (HANDLE) p->cle.hContact && nmi->iIcon == p->imlIconIndex) return p; } } } char *szProto = GetContactProto(p->cle.hContact); TCHAR *szName = pcli->pfnGetContactDisplayName(p->cle.hContact, 0); if (szProto && szName) { NotifyMenuItemExData *nmi = (struct NotifyMenuItemExData *) malloc(sizeof(struct NotifyMenuItemExData)); if (nmi) { TCHAR szBuffer[128]; TCHAR* szStatus = pcli->pfnGetStatusModeDescription(db_get_w(p->cle.hContact, szProto, "Status", ID_STATUS_OFFLINE), 0); TCHAR szwProto[64]; MultiByteToWideChar(CP_ACP, 0, szProto, -1, szwProto, 64); szwProto[63] = 0; mir_sntprintf(szBuffer, SIZEOF(szBuffer), _T("%s: %s (%s)"), szwProto, szName, szStatus); szBuffer[127] = 0; AppendMenu(g_CluiData.hMenuNotify, MF_BYCOMMAND | MF_STRING, g_CluiData.wNextMenuID, szBuffer); mii.hbmpItem = HBMMENU_CALLBACK; nmi->hContact = p->cle.hContact; nmi->iIcon = p->imlIconIndex; nmi->hIcon = p->cle.hIcon; nmi->hDbEvent = p->cle.hDbEvent; mii.dwItemData = (ULONG_PTR) nmi; mii.wID = g_CluiData.wNextMenuID; SetMenuItemInfo(g_CluiData.hMenuNotify, g_CluiData.wNextMenuID, FALSE, &mii); p-> menuId = g_CluiData.wNextMenuID; g_CluiData.wNextMenuID++; if (g_CluiData.wNextMenuID > 0x7fff) g_CluiData.wNextMenuID = 1; g_CluiData.iIconNotify = p->imlIconIndex; } } } else if (p->cle.hContact != 0 && (p->cle.flags & CLEF_ONLYAFEW)) { g_CluiData.iIconNotify = p->imlIconIndex; g_CluiData.hUpdateContact = p->cle.hContact; } if (pcli->events.count > 0) { g_CluiData.bEventAreaEnabled = TRUE; if (g_CluiData.bNotifyActive == FALSE) { g_CluiData.bNotifyActive = TRUE; EventArea_HideShowNotifyFrame(); } } CLUI__cliInvalidateRect(g_CluiData.hwndEventFrame, NULL, FALSE); return p; }
/** * Adds a separator */ void CPopupMenu::addSeparator() { AppendMenu(menuHandle, MF_SEPARATOR, 0, 0); }
void ShowTrayMenu() { POINT pt; GetCursorPos(&pt); WCHAR szBuff[MAX_LANGLEN]; HMENU hmenu = CreatePopupMenu(); for (int i = 0; i <= (IDM_EXIT - IDM_STTRAYNEXT); i++) { LangLoadString(IDS_STTRAYNEXT + i, szBuff, SIZEOF_ARRAY(szBuff)); AppendMenu(hmenu, MF_STRING, IDM_STTRAYNEXT + i, szBuff); } InsertMenu(hmenu, IDM_CONFIG, MF_SEPARATOR | MF_BYCOMMAND, 0, NULL); InsertMenu(hmenu, IDM_EXIT, MF_SEPARATOR | MF_BYCOMMAND, 0, NULL); HMENU hmenuPopup = CreatePopupMenu(); for (int i = 0; i <= (IDM_ABOUT - IDM_DOCUMENTATION); i++) { LangLoadString(IDS_DOCUMENTATION + i, szBuff, SIZEOF_ARRAY(szBuff)); AppendMenu(hmenuPopup, MF_STRING, IDM_DOCUMENTATION + i, szBuff); } LangLoadString(IDS_HELP, szBuff, SIZEOF_ARRAY(szBuff)); InsertMenu(hmenu, IDM_CONFIG, MF_STRING | MF_BYCOMMAND | MF_POPUP, (UINT_PTR)hmenuPopup, szBuff); InsertMenu(hmenu, 4, MF_SEPARATOR | MF_BYPOSITION, 0, NULL); hmenuPopup = CreatePopupMenu(); for (int i = 0; i <= (IDM_NEWEXCLUSION - IDM_HIDE); i++) { LangLoadString(IDS_HIDE + i, szBuff, SIZEOF_ARRAY(szBuff)); AppendMenu(hmenuPopup, MF_STRING, IDM_HIDE + i, szBuff); } InsertMenu(hmenuPopup, IDM_NEWEXCLUSION, MF_SEPARATOR | MF_BYCOMMAND, 0, NULL); InsertMenu(hmenuPopup, IDM_REPLACEALTTAB, MF_SEPARATOR | MF_BYCOMMAND, 0, NULL); CheckMenuItem(hmenuPopup, IDM_REPLACEALTTAB, !(g_dwFlags & TSF_NOREPLACEALTTAB) ? (MF_BYCOMMAND | MF_CHECKED) : (MF_BYCOMMAND | MF_UNCHECKED)); CheckMenuItem(hmenuPopup, IDM_INSTSWITCHER, (g_dwFlags & TSF_INSTSWITCHER) ? (MF_BYCOMMAND | MF_CHECKED) : (MF_BYCOMMAND | MF_UNCHECKED)); CheckMenuItem(hmenuPopup, IDM_STICKYALTTAB, (g_dwFlags & TSF_STICKYALTTAB) ? (MF_BYCOMMAND | MF_CHECKED) : (MF_BYCOMMAND | MF_UNCHECKED)); CheckMenuItem(hmenuPopup, IDM_HOOKALTTAB, (g_dwFlags & TSF_HOOKALTTAB) ? (MF_BYCOMMAND | MF_CHECKED) : (MF_BYCOMMAND | MF_UNCHECKED)); // CheckMenuItem(hmenuPopup, IDM_EXTMOUSE, (g_dwFlags & TSF_EXTMOUSE) // ? (MF_BYCOMMAND | MF_CHECKED) : (MF_BYCOMMAND | MF_UNCHECKED)); LangLoadString(IDS_QUICKCONFIG, szBuff, SIZEOF_ARRAY(szBuff)); InsertMenu(hmenu, IDM_CONFIG, MF_STRING | MF_BYCOMMAND | MF_POPUP, (UINT_PTR)hmenuPopup, szBuff); SetForegroundWindow(g_hwndMain); UINT uMenuID = (UINT)TrackPopupMenu(hmenu, TPM_RIGHTBUTTON | TPM_RIGHTALIGN | TPM_NONOTIFY | TPM_RETURNCMD, pt.x, pt.y, 0, g_hwndMain, NULL); PostMessage(g_hwndMain, WM_NULL, 0, 0); DestroyMenu(hmenu); switch (uMenuID) { case IDM_STTRAYNEXT: ShowTaskSwitchWnd(IDH_STTRAYNEXT); break; case IDM_STITRAYNEXT: ShowTaskSwitchWnd(IDH_STITRAYNEXT); break; case IDM_CONFIG: ConfigTaskSwitchXP(); break; case IDM_HIDE: ShowTrayIcon(FALSE); break; case IDM_REPLACEALTTAB: ReplaceAltTab((g_dwFlags & TSF_NOREPLACEALTTAB) ? (g_dwFlags & ~TSF_NOREPLACEALTTAB) : (g_dwFlags | TSF_NOREPLACEALTTAB)); break; case IDM_INSTSWITCHER: ReplaceAltTab((g_dwFlags & TSF_INSTSWITCHER) ? (g_dwFlags & ~TSF_INSTSWITCHER) : (g_dwFlags | TSF_INSTSWITCHER)); break; case IDM_STICKYALTTAB: g_dwFlags ^= TSF_STICKYALTTAB; break; case IDM_HOOKALTTAB: ReplaceAltTab((g_dwFlags & TSF_HOOKALTTAB) ? (g_dwFlags & ~TSF_HOOKALTTAB) : (g_dwFlags | TSF_HOOKALTTAB)); break; // case IDM_EXTMOUSE: // EnableExtMouse(!(g_dwFlags & TSF_EXTMOUSE), g_dwFlags & TSF_WHEELTAB); // break; case IDM_NEWEXCLUSION: ConfigTaskSwitchXP(L"/newexcl"); break; case IDM_DOCUMENTATION: HelpTaskSwitchXP(); break; case IDM_HOMEPAGE: ShellExecute(NULL, L"open", L"http://www.ntwind.com/taskswitchxp/", NULL, NULL, SW_SHOWNORMAL); break; case IDM_ABOUT: ConfigTaskSwitchXP(L"/about"); break; case IDM_EXIT: DestroyWindow(g_hwndMain); break; } }
CListEvent* AddEvent(CLISTEVENT *cle) { CListEvent *p = coreCli.pfnAddEvent(cle); if (p == NULL) return NULL; if (p->hContact != 0 && p->hDbEvent != 1 && !(p->flags & CLEF_ONLYAFEW)) { MENUITEMINFO mii = { 0 }; mii.cbSize = sizeof(mii); mii.fMask = MIIM_DATA | MIIM_BITMAP | MIIM_ID; if (p->pszService && !strncmp("SRMsg/ReadMessage", p->pszService, 17)) { // dup check only for msg events for (int j = 0; j < GetMenuItemCount(cfg::dat.hMenuNotify); j++) { if (GetMenuItemInfo(cfg::dat.hMenuNotify, j, TRUE, &mii) != 0) { NotifyMenuItemExData *nmi = (NotifyMenuItemExData*)mii.dwItemData; if (nmi != 0 && (HANDLE)nmi->hContact == (HANDLE)p->hContact && nmi->iIcon == p->imlIconIndex) return p; } } } char *szProto = GetContactProto(p->hContact); TCHAR *szName = pcli->pfnGetContactDisplayName(p->hContact, 0); if (szProto && szName) { NotifyMenuItemExData *nmi = (NotifyMenuItemExData*)malloc(sizeof(NotifyMenuItemExData)); if (nmi) { TCHAR szBuffer[128]; TCHAR* szStatus = pcli->pfnGetStatusModeDescription(cfg::getWord(p->hContact, szProto, "Status", ID_STATUS_OFFLINE), 0); TCHAR szwProto[64]; MultiByteToWideChar(CP_ACP, 0, szProto, -1, szwProto, 64); szwProto[63] = 0; mir_sntprintf(szBuffer, _T("%s: %s (%s)"), szwProto, szName, szStatus); szBuffer[127] = 0; AppendMenu(cfg::dat.hMenuNotify, MF_BYCOMMAND | MF_STRING, cfg::dat.wNextMenuID, szBuffer); mii.hbmpItem = HBMMENU_CALLBACK; nmi->hContact = p->hContact; nmi->iIcon = p->imlIconIndex; nmi->hIcon = p->hIcon; nmi->hDbEvent = p->hDbEvent; mii.dwItemData = (ULONG_PTR)nmi; mii.wID = cfg::dat.wNextMenuID; SetMenuItemInfo(cfg::dat.hMenuNotify, cfg::dat.wNextMenuID, FALSE, &mii); p->menuId = cfg::dat.wNextMenuID; cfg::dat.wNextMenuID++; if (cfg::dat.wNextMenuID > 0x7fff) cfg::dat.wNextMenuID = 1; cfg::dat.hIconNotify = p->imlIconIndex; } } } else if (p->hContact != 0 && (p->flags & CLEF_ONLYAFEW)) { cfg::dat.hIconNotify = p->imlIconIndex; cfg::dat.hUpdateContact = p->hContact; } if (cfg::dat.dwFlags & CLUI_STICKYEVENTS) { HANDLE hItem = (HANDLE)SendMessage(pcli->hwndContactTree, CLM_FINDCONTACT, (WPARAM)p->hContact, 0); if (hItem) { SendMessage(pcli->hwndContactTree, CLM_SETSTICKY, (WPARAM)hItem, 1); pcli->pfnClcBroadcast(INTM_PROTOCHANGED, (WPARAM)p->hContact, 0); } } if (pcli->events->getCount() > 0) { cfg::dat.bEventAreaEnabled = TRUE; if (cfg::dat.notifyActive == 0) { cfg::dat.notifyActive = 1; HideShowNotifyFrame(); } } InvalidateRect(hwndEventFrame, NULL, FALSE); return p; }
LRESULT playlist_view::on_message(HWND wnd, UINT msg, WPARAM wp, LPARAM lp) { switch (msg) { case WM_NCCREATE: wnd_playlist = wnd; initialised = true; list_playlist.add_item(this); g_playlist_message_window.add_ref(); break; case WM_CREATE: { pfc::com_ptr_t<IDropTarget_playlist> IDT_playlist = new IDropTarget_playlist(this); RegisterDragDrop(wnd, IDT_playlist.get_ptr()); if (true) { m_theme = IsThemeActive() && IsAppThemed() ? OpenThemeData(wnd, L"ListView") : NULL; SetWindowTheme(wnd, L"Explorer", NULL); } m_always_show_focus = config_object::g_get_data_bool_simple(standard_config_objects::bool_playback_follows_cursor, false); on_playlist_font_change(); create_header(true); drawing_enabled = true; m_cache.initialise(); } return 0; case WM_DESTROY: m_edit_save = false; exit_inline_edit(); m_cache.deinitialise(); RevokeDragDrop(wnd); SendMessage(wnd, WM_SETFONT, 0, 0); SendMessage(wnd_header, WM_SETFONT, 0, 0); { if (m_theme) CloseThemeData(m_theme); m_theme = NULL; } m_selection_holder.release(); break; case WM_NCDESTROY: g_playlist_message_window.release(); wnd_playlist = 0; initialised = false; list_playlist.remove_item(this); m_shown = false; // if (!list_playlist.get_count()) // { // g_playlist_entries.rebuild_all(); // } break; case WM_THEMECHANGED: { if (m_theme) CloseThemeData(m_theme); m_theme = IsThemeActive() && IsAppThemed() ? OpenThemeData(wnd, L"ListView") : 0; } break; case WM_SHOWWINDOW: if (wp == TRUE && lp == 0 && !m_shown) { static_api_ptr_t<playlist_manager> playlist_api; ensure_visible(playlist_api->activeplaylist_get_focus_item()); m_shown = true; } break; case WM_WINDOWPOSCHANGED: { LPWINDOWPOS lpwp = (LPWINDOWPOS)lp; if (!(lpwp->flags & SWP_NOSIZE)) { on_size(lpwp->cx, lpwp->cy); } } break; case WM_ERASEBKGND: return TRUE; break; case WM_PAINT: { PAINTSTRUCT ps; HDC dc_paint = BeginPaint(wnd, &ps); RECT rc_update, rc_playlist; get_playlist_rect(&rc_playlist); rc_update = ps.rcPaint; if (rc_update.top<rc_playlist.top) rc_update.top = rc_playlist.top; if (rc_update.bottom >= rc_update.top) { int item_height = get_item_height(); int start_item = (rc_update.top - rc_playlist.top) / item_height; int end_item = (rc_update.bottom - rc_playlist.top) / item_height; if (((end_item - start_item) + 1)*item_height < rc_update.bottom - rc_update.top) end_item++; { draw_items(dc_paint, start_item, 1 + (end_item - start_item)); } } EndPaint(wnd, &ps); } return 0; case WM_SETREDRAW: drawing_enabled = (wp != 0); return 0; case WM_MOUSEACTIVATE: if (GetFocus() != wnd) m_no_next_edit = true; return MA_ACTIVATE; case WM_UPDATEUISTATE: RedrawWindow(wnd_playlist, 0, 0, RDW_INVALIDATE); break; case WM_KILLFOCUS: RedrawWindow(wnd_playlist, 0, 0, RDW_INVALIDATE | RDW_UPDATENOW); m_selection_holder.release(); break; case WM_SETFOCUS: //if (msg == WM_SETFOCUS && (HWND)wp != wnd) //m_no_next_edit = true; RedrawWindow(wnd_playlist, 0, 0, RDW_INVALIDATE | RDW_UPDATENOW); m_selection_holder = static_api_ptr_t<ui_selection_manager>()->acquire(); m_selection_holder->set_playlist_selection_tracking(); break; case WM_GETDLGCODE: return DLGC_WANTALLKEYS; case WM_KEYDOWN: { static_api_ptr_t<playlist_manager> playlist_api; uie::window_ptr p_this = this; //DWORD vk_slash = VkKeyScan('/'); if (wp == VK_CONTROL) g_drag_lmb = true; if (m_prevent_wm_char_processing = process_keydown(msg, lp, wp, true)) return 0; else { SendMessage(wnd, WM_CHANGEUISTATE, MAKEWPARAM(UIS_CLEAR, UISF_HIDEFOCUS), NULL); if (wp == VK_HOME || wp == VK_DOWN || wp == VK_END || wp == VK_PRIOR || wp == VK_NEXT || wp == VK_UP) { int focus = playlist_api->activeplaylist_get_focus_item(); int total = playlist_api->activeplaylist_get_item_count(); if ((wp == VK_HOME || wp == VK_PRIOR || wp == VK_UP)) { // if (focus == 0) return 0; } if ((wp == VK_END || wp == VK_NEXT || wp == VK_DOWN)) { // if (focus == total - 1) return 0; } SCROLLINFO si; memset(&si, 0, sizeof(si)); si.cbSize = sizeof(si); si.fMask = SIF_PAGE | SIF_POS; GetScrollInfo(wnd_playlist, SB_VERT, &si); int offset = 0; int scroll = scroll_item_offset; if (wp == VK_HOME) scroll = 0; else if (wp == VK_PRIOR && focus == scroll_item_offset) scroll -= si.nPage; else if (wp == VK_UP) { if (focus <= scroll_item_offset) scroll = focus - 1; else if (focus > si.nPos + si.nPage - 1) scroll = focus - 1 - si.nPage + 1; } else if (wp == VK_DOWN) { if (focus < scroll_item_offset) scroll = focus + 1; else if (focus >= si.nPos + si.nPage - 1) scroll = focus + 1 - si.nPage + 1; } else if (wp == VK_END) scroll = total - 1; else if (wp == VK_NEXT && focus == si.nPos + si.nPage - 1) scroll += si.nPage; drawing_enabled = false; si.nPos = scroll; si.fMask = SIF_POS; scroll_item_offset = SetScrollInfo(wnd_playlist, SB_VERT, &si, true); if (wp == VK_HOME) offset = 0 - focus; else if (wp == VK_PRIOR) offset = scroll_item_offset - focus; else if (wp == VK_END) offset = total - focus - 1; else if (wp == VK_NEXT) offset = get_last_viewable_item() - focus; else if (wp == VK_DOWN) offset = 1; else if (wp == VK_UP) offset = -1; //if (offset) process_keydown(offset, ((HIWORD(lp) & KF_ALTDOWN) != 0), drawing_enabled, (HIWORD(lp) & KF_REPEAT) != 0); drawing_enabled = true; RedrawWindow(wnd_playlist, 0, 0, RDW_INVALIDATE | RDW_UPDATENOW); return 0; } else if (wp == VK_SPACE) { int focus = playlist_api->activeplaylist_get_focus_item(); set_sel_single(focus, true, false, false); return 0; } else if (wp == VK_RETURN) { bool ctrl_down = 0 != (GetKeyState(VK_CONTROL) & KF_UP); int focus = playlist_api->activeplaylist_get_focus_item(); unsigned active = playlist_api->get_active_playlist(); if (ctrl_down) { if (active != -1 && focus != -1) playlist_api->queue_add_item_playlist(active, focus); } else { // playlist_api->set_playing_playlist(active); unsigned focus = playlist_api->activeplaylist_get_focus_item(); //unsigned active = playlist_api->get_active_playlist(); //playlist_api->playlist_set_playback_cursor(active, focus); playlist_api->activeplaylist_execute_default_action(focus); //static_api_ptr_t<play_control>()->play_start(play_control::track_command_settrack); } return 0; } else if (wp == VK_SHIFT) { if (!(HIWORD(lp) & KF_REPEAT)) g_shift_item_start = playlist_api->activeplaylist_get_focus_item(); } else if (wp == VK_F2) { unsigned count = g_get_cache().active_column_get_active_count(); if (count) { unsigned focus = playlist_api->activeplaylist_get_focus_item(); if (focus != pfc_infinite) { t_size i, pcount = playlist_api->activeplaylist_get_item_count(); bit_array_bittable sel(pcount); playlist_api->activeplaylist_get_selection_mask(sel); pfc::list_t<t_size> indices; indices.prealloc(32); for (i = 0; i<pcount; i++) if (sel[i]) indices.add_item(i); /*t_size start = focus, end = focus; if (sel[start] && pcount) { while (start>0 && sel[start-1]) start--; while (end<pcount-1 && sel[end+1]) end++; }*/ unsigned count = g_get_cache().active_column_get_active_count(); unsigned column; for (column = 0; column<count; column++) { if (!g_get_columns()[g_get_cache().active_column_active_to_actual(column)]->edit_field.is_empty()) { //create_inline_edit_v2(start, end-start+1, column); create_inline_edit_v2(indices, column); break; } } } } } else if (wp == VK_DELETE) { playlist_api->activeplaylist_undo_backup(); playlist_api->activeplaylist_remove_selection(); } else if (wp == VK_F3) { standard_commands::main_playlist_search(); } /*else if (vk_slash != -1 && wp == LOWORD(vk_slash)) { HWND wnd_search = m_searcher.create(wnd); on_size(); ShowWindow(wnd_search, SW_SHOWNORMAL); ; }*/ } } break; case WM_CHAR: if (!m_prevent_wm_char_processing) { //if (!(HIWORD(lp) & KF_REPEAT)) { if ((GetKeyState(VK_CONTROL) & KF_UP)) { static_api_ptr_t<playlist_manager> playlist_api; if (wp == 1) //Ctrl-A { playlist_api->activeplaylist_set_selection(bit_array_true(), bit_array_true()); return 0; } else if (wp == 26) //Ctrl-Z { playlist_api->activeplaylist_undo_restore(); return 0; } else if (wp == 25) //Ctrl-Y { playlist_api->activeplaylist_redo_restore(); return 0; } else if (wp == 24) //Ctrl-X { playlist_utils::cut(); return 0; } else if (wp == 3) //Ctrl-C { playlist_utils::copy(); return 0; } else if (wp == 6) //Ctrl-F { standard_commands::main_playlist_search(); return 0; } else if (wp == 22) //Ctrl-V { playlist_utils::paste(wnd); return 0; } } } } break; case WM_KEYUP: if (process_keydown(msg, lp, wp, true)) return 0; break; case WM_SYSKEYUP: if (process_keydown(msg, lp, wp, true)) return 0; break; case WM_SYSKEYDOWN: { uie::window_ptr p_this = this; if (m_prevent_wm_char_processing = process_keydown(msg, lp, wp, true)) return 0; } break; case WM_LBUTTONDOWN: { if (0 && g_tooltip) { MSG message; memset(&message, 0, sizeof(MSG)); message.hwnd = wnd; message.message = msg; message.wParam = wp; message.lParam = lp; SendMessage(g_tooltip, TTM_RELAYEVENT, 0, (LPARAM)&message); } bool b_was_focused = GetFocus() == wnd; if (!b_was_focused) m_no_next_edit = true; //#ifdef INLINE_EDIT exit_inline_edit(); // g_no_next_edit = false; //#endif dragged = false; SetFocus(wnd); SetCapture(wnd); static_api_ptr_t<playlist_manager> playlist_api; g_drag_lmb = true; int focus = playlist_api->activeplaylist_get_focus_item(); drag_start_lmb.x = GET_X_LPARAM(lp); drag_start_lmb.y = GET_Y_LPARAM(lp); int item_height = get_item_height(); int idx = hittest_item(GET_X_LPARAM(lp), GET_Y_LPARAM(lp)); // int idx = ((GET_Y_LPARAM(lp) -get_header_height()) / item_height) + scroll_item_offset; // if( idx >= 0 && idx <playlist_api->activeplaylist_get_item_count() && GET_X_LPARAM(lp) < g_playlist_entries.get_total_width_actual()) if (idx >= 0) { // playlist_oper * playlist_api = playlist_api; // playlist_api->set_playback_cursor(idx); //#ifdef INLINE_EDIT m_prev_sel = (playlist_api->activeplaylist_is_item_selected(idx) && !m_wnd_edit && (playlist_api->activeplaylist_get_selection_count(2) == 1)); //#endif if (!is_visible(idx)) SendMessage(wnd_playlist, WM_VSCROLL, MAKEWPARAM(SB_LINEDOWN, 0), 0); if (wp & MK_CONTROL && wp & MK_SHIFT) { playlist_api->activeplaylist_move_selection(idx - focus); dragged = true; drag_type = 0; } else if (wp & MK_SHIFT) { drag_type = 2; dragitem = idx, dragstartitem = idx; int n = (cfg_alternative_sel ? focus : g_shift_item_start), t = idx; bool focus_sel = playlist_api->activeplaylist_is_item_selected(focus); set_sel_range(n, t, (cfg_alternative_sel != 0), (cfg_alternative_sel ? !focus_sel : false)); playlist_api->activeplaylist_set_focus_item(idx); dragged = true; } else if (wp & MK_CONTROL) { /* drag_type = 2; dragitem = idx,dragstartitem=idx; set_sel_single(idx, false, true, false); dragged = true;*/ } else if (playlist_api->activeplaylist_is_item_selected(idx)) { drag_type = 1; dragitem = idx, dragstartitem = idx; playlist_api->activeplaylist_undo_backup(); playlist_api->activeplaylist_set_focus_item(idx); dragged = false; } else { drag_type = 2; dragitem = idx, dragstartitem = idx;//item irrelevant actually; set_sel_single(idx, false, true, true); /* bit_array_bittable mask(playlist_api->activeplaylist_get_item_count()); // playlist_api->activeplaylist_is_item_selected_mask(mask); int n, t = playlist_api->activeplaylist_get_item_count(); for (n = 0;n <t;n++) { if (n==idx) mask.set(n, true); else mask.set(n, false); } console::info("crap"); playlist_api->set_sel_mask(mask); playlist_api->activeplaylist_set_focus_item(idx);*/ dragged = false; } } else { // console::info("wow"); // bit_array_bittable mask(playlist_api->activeplaylist_get_item_count()); playlist_api->activeplaylist_set_selection(bit_array_true(), bit_array_false()); dragged = true; drag_type = 0; } } break; case WM_RBUTTONUP: m_no_next_edit = false; break; case WM_MBUTTONUP: { m_no_next_edit = false; unsigned idx = hittest_item(GET_X_LPARAM(lp), GET_Y_LPARAM(lp)); playlist_mclick_actions::run(cfg_playlist_middle_action, idx != -1, idx); } break; case WM_LBUTTONUP: { if (0 && g_tooltip) { MSG message; memset(&message, 0, sizeof(MSG)); message.hwnd = wnd; message.message = msg; message.wParam = wp; message.lParam = lp; SendMessage(g_tooltip, TTM_RELAYEVENT, 0, (LPARAM)&message); } ReleaseCapture(); g_drag_lmb = false; int idx = hittest_item(GET_X_LPARAM(lp), GET_Y_LPARAM(lp), true); //((GET_Y_LPARAM(lp) -get_header_height()) / get_item_height()) + scroll_item_offset; static_api_ptr_t<playlist_manager> playlist_api; if (!dragged) { if (wp & MK_CONTROL) { // int idx_down = hittest_item(drag_start_lmb.x, drag_start_lmb.y); if (idx >= 0) set_sel_single(idx, true, true, false); } else { // int item_height = get_item_height(); // int idx = ((GET_Y_LPARAM(lp) - get_header_height()) / item_height) + scroll_item_offset; if (idx >= 0 /*&& idx < playlist_api->activeplaylist_get_item_count() && (GET_X_LPARAM(lp) < g_playlist_entries.get_total_width_actual())*/) { if (!m_no_next_edit && cfg_inline_edit && playlist_api->activeplaylist_is_item_selected(idx) && m_prev_sel /*&& !dragged*/) { //if (m_no_next_edit && GetCapture() == wnd) ReleaseCapture(); { exit_inline_edit(); if (main_window::config_get_inline_metafield_edit_mode() != main_window::mode_disabled) { m_edit_index = idx; long width; m_edit_column = hittest_column(GET_X_LPARAM(lp), width); if (m_edit_column >= 0 && !g_get_columns()[g_get_cache().active_column_active_to_actual(m_edit_column)]->edit_field.is_empty()) { m_edit_timer = (SetTimer(wnd, EDIT_TIMER_ID, GetDoubleClickTime(), 0) != 0); } } } } int focus = playlist_api->activeplaylist_get_focus_item(); set_sel_single(focus, false, false, true); } } } dragged = true; drag_type = 0; dragstartitem = 0; dragitem = 0; //#ifdef INLINE_EDIT m_no_next_edit = false; //#endif } break; case WM_MOUSEMOVE: { if (0 && g_tooltip) { MSG message; memset(&message, 0, sizeof(MSG)); message.hwnd = wnd; message.message = msg; message.wParam = wp; message.lParam = lp; SendMessage(g_tooltip, TTM_RELAYEVENT, 0, (LPARAM)&message); } const unsigned cx_drag = (unsigned)abs(GetSystemMetrics(SM_CXDRAG)); const unsigned cy_drag = (unsigned)abs(GetSystemMetrics(SM_CYDRAG)); if (!g_dragging && ((g_dragging1 && wp & MK_RBUTTON && (abs(drag_start.x - GET_X_LPARAM(lp)) > cx_drag || abs(drag_start.y - GET_Y_LPARAM(lp)) > cy_drag)) || (g_drag_lmb && (wp & MK_LBUTTON) && (wp & MK_CONTROL) && (abs(drag_start_lmb.x - GET_X_LPARAM(lp)) > 3 || abs(drag_start_lmb.y - GET_Y_LPARAM(lp)) > 3)))) { static_api_ptr_t<playlist_manager> playlist_api; metadb_handle_list data; playlist_api->activeplaylist_get_selected_items(data); if (data.get_count() > 0) { static_api_ptr_t<playlist_incoming_item_filter> incoming_api; IDataObject * pDataObject = incoming_api->create_dataobject(data); if (pDataObject) { //RegisterClipboardFormat(_T("foo_ui_columns"); if (g_tooltip) { DestroyWindow(g_tooltip); g_tooltip = 0; last_idx = -1; last_column = -1; } DWORD blah; { pfc::com_ptr_t<IDropSource_playlist> p_IDropSource_playlist = new IDropSource_playlist(this); SHDoDragDrop(get_wnd(), pDataObject, p_IDropSource_playlist.get_ptr(), DROPEFFECT_COPY, &blah); } pDataObject->Release(); } } data.remove_all(); g_dragging = false; g_dragging1 = false; g_drag_lmb = false; if (wp & MK_LBUTTON) { dragged = true; drag_type = 0; dragstartitem = 0; dragitem = 0; } } if (cfg_tooltip && (GET_Y_LPARAM(lp) > get_header_height())) { int item_height = get_item_height(); int idx = hittest_item(GET_X_LPARAM(lp), GET_Y_LPARAM(lp)); long cx; int column = hittest_column(GET_X_LPARAM(lp), cx); // unsigned act_col = g_cache.active_column_active_to_actual(column); if (column >= 0 && idx >= 0) { if (last_idx != (idx) || last_column != column) { if (!cfg_tooltips_clipped || is_item_clipped(idx, column)) { pfc::string8 src; g_cache.active_get_display_name(idx, column, src); pfc::string8 temp; titleformat_compiler::remove_color_marks(src, temp); temp.replace_char(9, 0x20); CreateToolTip(temp); } else { DestroyWindow(g_tooltip); g_tooltip = 0; last_idx = -1; last_column = -1; } POINT a; a.x = cx + 3; a.y = (idx - scroll_item_offset) * item_height + get_header_height(); ClientToScreen(wnd_playlist, &a); tooltip.top = a.y; tooltip.bottom = a.y + item_height; tooltip.left = a.x; tooltip.right = a.x + get_column_width(column); } last_idx = idx; last_column = column; } else { DestroyWindow(g_tooltip); g_tooltip = 0; last_idx = -1; last_column = -1; } } if (drag_type && (wp & MK_LBUTTON) && !(GetKeyState(VK_SHIFT) & KF_UP) && !(GetKeyState(VK_CONTROL) & KF_UP)) { RECT rc; get_playlist_rect(&rc); static_api_ptr_t<playlist_manager> playlist_api; int total = playlist_api->activeplaylist_get_item_count(); int item_height = get_item_height(); int valid_idx = hittest_item(GET_X_LPARAM(lp), GET_Y_LPARAM(lp), false); int idx = hittest_item_no_scroll(GET_X_LPARAM(lp), GET_Y_LPARAM(lp), false); // (GET_Y_LPARAM(lp) - get_header_height()) / (item_height); int items_count = ((rc.bottom - rc.top) / item_height) + 1; if ((idx + scroll_item_offset) != dragitem || GET_Y_LPARAM(lp) < get_header_height()) //(idx + scroll_item_offset) < playlist_api->activeplaylist_get_item_count() { if (idx >= items_count - 1) { bool need_redrawing = false; int focus = playlist_api->activeplaylist_get_focus_item(); SCROLLINFO si; memset(&si, 0, sizeof(si)); si.cbSize = sizeof(si); si.fMask = SIF_POS; GetScrollInfo(wnd_playlist, SB_VERT, &si); int old_offset = si.nPos; si.nPos += 3; scroll_item_offset = SetScrollInfo(wnd_playlist, SB_VERT, &si, true); if (old_offset != scroll_item_offset) need_redrawing = true; int t = scroll_item_offset + items_count - 2; //n=dragitem, if (t > total) t = total - 1; if (t != dragitem) { drawing_enabled = false; if (drag_type == 1) playlist_api->activeplaylist_move_selection((rc.bottom - rc.top) / item_height + scroll_item_offset - focus - 1); else if (drag_type == 2) { set_sel_range(dragstartitem, t, false); playlist_api->activeplaylist_set_focus_item(t); } dragitem = t; drawing_enabled = true; need_redrawing = true; } if (need_redrawing) RedrawWindow(wnd_playlist, 0, 0, RDW_INVALIDATE | RDW_UPDATENOW); } else if (idx < 0 || GET_Y_LPARAM(lp) < get_header_height() || GET_Y_LPARAM(lp) < 0) { int focus = playlist_api->activeplaylist_get_focus_item(); bool need_redrawing = false; SCROLLINFO si; memset(&si, 0, sizeof(si)); si.cbSize = sizeof(si); si.fMask = SIF_POS; GetScrollInfo(wnd_playlist, SB_VERT, &si); int old_offset = si.nPos; si.nPos -= 3; scroll_item_offset = SetScrollInfo(wnd_playlist, SB_VERT, &si, true); if (old_offset != scroll_item_offset) need_redrawing = true; if (dragitem != scroll_item_offset) { drawing_enabled = false; if (drag_type == 1) playlist_api->activeplaylist_move_selection(scroll_item_offset - focus); else if (drag_type == 2) { set_sel_range(dragstartitem, scroll_item_offset, false); playlist_api->activeplaylist_set_focus_item(scroll_item_offset); RedrawWindow(wnd_playlist, 0, 0, RDW_INVALIDATE | RDW_UPDATENOW); } dragitem = scroll_item_offset; drawing_enabled = true; need_redrawing = true; } if (need_redrawing) RedrawWindow(wnd_playlist, 0, 0, RDW_INVALIDATE | RDW_UPDATENOW); } else { int focus = playlist_api->activeplaylist_get_focus_item(); if (drag_type == 1) playlist_api->activeplaylist_move_selection(idx + scroll_item_offset - focus); else if (drag_type == 2) { if (valid_idx >= 0) { drawing_enabled = false; set_sel_range(dragstartitem, valid_idx, false); playlist_api->activeplaylist_set_focus_item(valid_idx); drawing_enabled = true; RedrawWindow(wnd_playlist, 0, 0, RDW_INVALIDATE | RDW_UPDATENOW); } } dragitem = valid_idx; dragged = true; } } } else if (!(wp & MK_LBUTTON)) drag_type = 0; } break; case WM_LBUTTONDBLCLK: { int idx = hittest_item(GET_X_LPARAM(lp), GET_Y_LPARAM(lp), true); if (idx >= 0) { //#ifdef INLINE_EDIT exit_inline_edit(); m_no_next_edit = true; //#endif //if (!is_visible(idx)) SendMessage(wnd_playlist, WM_VSCROLL, MAKEWPARAM(SB_LINEDOWN, 0),0); #if 0 // DEATH's code case WM_LBUTTONDBLCLK: { int idx = item_from_point((short)HIWORD(lp)); if (idx >= 0 && idx<(int)m_api->activeplaylist_get_item_count()) { m_api->activeplaylist_set_focus_item(idx); static_api_ptr_t<play_control>()->play_start(play_control::TRACK_COMMAND_SETTRACK); } } return 0; #endif static_api_ptr_t<playlist_manager> playlist_api; //unsigned active = playlist_api->get_active_playlist(); // playlist_api->set_playing_playlist(active); //playlist_api->playlist_set_playback_cursor(active, idx); //playlist_api->queue_flush(); unsigned focus = playlist_api->activeplaylist_get_focus_item(); playlist_api->activeplaylist_execute_default_action(focus); } else if (cfg_playlist_double.get_value().m_command != pfc::guid_null) { mainmenu_commands::g_execute(cfg_playlist_double.get_value().m_command); } dragged = true; } break; case WM_RBUTTONDOWN: { if (wnd_playlist) SetFocus(wnd_playlist); g_dragging1 = true; drag_start.x = GET_X_LPARAM(lp); drag_start.y = GET_Y_LPARAM(lp); static_api_ptr_t<playlist_manager> playlist_api; // int item_height = get_item_height(); // int idx = ((GET_Y_LPARAM(lp) - get_header_height()) / item_height) + scroll_item_offset; int idx = hittest_item(GET_X_LPARAM(lp), GET_Y_LPARAM(lp), true); if (idx != -1 && !is_visible(idx)) SendMessage(wnd_playlist, WM_VSCROLL, MAKEWPARAM(SB_LINEDOWN, 0), 0); if (idx >= 0 /*&& idx < playlist_api->activeplaylist_get_item_count() && (GET_X_LPARAM(lp) < g_playlist_entries.get_total_width_actual())*/) { if (!playlist_api->activeplaylist_is_item_selected(idx) && !(GetKeyState(VK_CONTROL) & KF_UP)) { set_sel_single(idx, false, false, true); } playlist_api->activeplaylist_set_focus_item(idx); } } break; case WM_MOUSEWHEEL: {//GET_WHEEL_DELTA_WPARAM exit_inline_edit(); if (1 || (wp & MK_CONTROL)) { LONG_PTR style = GetWindowLongPtr(wnd_playlist, GWL_STYLE); if (!(style & WS_VSCROLL) || ((wp & MK_CONTROL) && (style & WS_HSCROLL))) { if ((style & WS_HSCROLL)) { SCROLLINFO si; memset(&si, 0, sizeof(SCROLLINFO)); si.fMask = SIF_PAGE; si.cbSize = sizeof(SCROLLINFO); GetScrollInfo(wnd, SB_HORZ, &si); int new_pos = horizontal_offset; int old_pos = horizontal_offset; unsigned scroll_lines = GetNumScrollLines(); int zDelta = short(HIWORD(wp)); if (scroll_lines == -1) { scroll_lines = si.nPage > 1 ? si.nPage - 1 : 1; } else scroll_lines *= 3; int delta = MulDiv(zDelta, scroll_lines, 120); if (!si.nPage) si.nPage++; if (delta < 0 && delta*-1 > si.nPage) { delta = si.nPage*-1; if (delta >1) delta--; } else if (delta > 0 && delta > si.nPage) { delta = si.nPage; if (delta >1) delta--; } scroll(scroll_horizontally, scroll_position_delta, -delta); } return 1; } } SCROLLINFO si; memset(&si, 0, sizeof(SCROLLINFO)); si.fMask = SIF_PAGE; si.cbSize = sizeof(SCROLLINFO); GetScrollInfo(wnd, SB_VERT, &si); int new_pos = scroll_item_offset; int old_pos = scroll_item_offset; unsigned scroll_lines = GetNumScrollLines(); int zDelta = short(HIWORD(wp)); if (scroll_lines == -1) { scroll_lines = si.nPage > 1 ? si.nPage - 1 : 1; } int delta = MulDiv(zDelta, scroll_lines, 120); if (!si.nPage) si.nPage++; if (delta < 0 && delta*-1 > si.nPage) { delta = si.nPage*-1; if (delta >1) delta--; } else if (delta > 0 && delta > si.nPage) { delta = si.nPage; if (delta >1) delta--; } scroll(scroll_vertically, scroll_position_delta, -delta); } return 1; case WM_VSCROLL: { exit_inline_edit(); scroll(scroll_vertically, scroll_sb, LOWORD(wp)); } return 0; case WM_HSCROLL: { exit_inline_edit(); scroll(scroll_horizontally, scroll_sb, LOWORD(wp)); } return 0; case WM_MENUSELECT: { if (HIWORD(wp) & MF_POPUP) { m_status_override.release(); } else { if (g_main_menu_a.is_valid() || g_main_menu_b.is_valid()) { unsigned id = LOWORD(wp); bool set = false; pfc::string8 desc; if (g_main_menu_a.is_valid() && id < MENU_B_BASE) { set = g_main_menu_a->get_description(id - MENU_A_BASE, desc); } else if (g_main_menu_b.is_valid()) { contextmenu_node * node = g_main_menu_b->find_by_id(id - MENU_B_BASE); if (node) set = node->get_description(desc); } service_ptr_t<ui_status_text_override> p_status_override; if (set) { get_host()->override_status_text_create(p_status_override); if (p_status_override.is_valid()) { p_status_override->override_text(desc); } } m_status_override = p_status_override; } } } break; case WM_CONTEXTMENU: { uie::window_ptr p_this_temp = this; if ((HWND)wp == wnd_header) { POINT pt = { (short)LOWORD(lp), (short)HIWORD(lp) }; POINT temp; temp.x = pt.x; temp.y = pt.y; ScreenToClient(wnd_header, &temp); HDHITTESTINFO hittest; hittest.pt.x = temp.x; hittest.pt.y = temp.y; SendMessage(wnd_header, HDM_HITTEST, 0, (LPARAM)&hittest); enum { IDM_ASC = 1, IDM_DES = 2, IDM_SEL_ASC, IDM_SEL_DES, IDM_AUTOSIZE, IDM_PREFS, IDM_EDIT_COLUMN, IDM_CUSTOM_BASE }; HMENU menu = CreatePopupMenu(); HMENU selection_menu = CreatePopupMenu(); if (!(hittest.flags & HHT_NOWHERE)) { uAppendMenu(menu, (MF_STRING), IDM_ASC, "&Sort ascending"); uAppendMenu(menu, (MF_STRING), IDM_DES, "Sort &descending"); uAppendMenu(selection_menu, (MF_STRING), IDM_SEL_ASC, "Sort a&scending"); uAppendMenu(selection_menu, (MF_STRING), IDM_SEL_DES, "Sort d&escending"); uAppendMenu(menu, MF_STRING | MF_POPUP, (UINT)selection_menu, "Se&lection"); uAppendMenu(menu, (MF_SEPARATOR), 0, ""); uAppendMenu(menu, (MF_STRING), IDM_EDIT_COLUMN, "&Edit this column"); uAppendMenu(menu, (MF_SEPARATOR), 0, ""); uAppendMenu(menu, (MF_STRING | (cfg_nohscroll ? MF_CHECKED : MF_UNCHECKED)), IDM_AUTOSIZE, "&Auto-sizing columns"); uAppendMenu(menu, (MF_STRING), IDM_PREFS, "&Preferences"); uAppendMenu(menu, (MF_SEPARATOR), 0, ""); pfc::string8 playlist_name; static_api_ptr_t<playlist_manager> playlist_api; playlist_api->activeplaylist_get_name(playlist_name); pfc::string8_fast_aggressive filter, name; int s, e = columns.get_count(); for (s = 0; s<e; s++) { bool add = false; switch (columns[s]->filter_type) { case FILTER_NONE: { add = true; break; } case FILTER_SHOW: { if (wildcard_helper::test(playlist_name, columns[s]->filter, true)) { add = true; /* g_columns.get_string(s, name, STRING_NAME); uAppendMenu(menu,MF_STRING|MF_CHECKED,IDM_CUSTOM_BASE+s,name);*/ } } break; case FILTER_HIDE: { if (!wildcard_helper::test(playlist_name, columns[s]->filter, true)) { add = true; /* g_columns.get_string(s, name, STRING_NAME); uAppendMenu(menu,MF_STRING|MF_CHECKED,IDM_CUSTOM_BASE+s,name);*/ } } break; } if (add) { uAppendMenu(menu, MF_STRING | (columns[s]->show ? MF_CHECKED : MF_UNCHECKED), IDM_CUSTOM_BASE + s, columns[s]->name); } } } else { uAppendMenu(menu, (MF_STRING | (cfg_nohscroll ? MF_CHECKED : MF_UNCHECKED)), IDM_AUTOSIZE, "&Auto-sizing columns"); uAppendMenu(menu, (MF_STRING), IDM_PREFS, "&Preferences"); } menu_helpers::win32_auto_mnemonics(menu); int cmd = TrackPopupMenu(menu, TPM_RIGHTBUTTON | TPM_NONOTIFY | TPM_RETURNCMD, pt.x, pt.y, 0, wnd, 0); DestroyMenu(menu); if (cmd == IDM_ASC) { g_set_sort(hittest.iItem, false); } else if (cmd == IDM_DES) { g_set_sort(hittest.iItem, true); } else if (cmd == IDM_SEL_ASC) { g_set_sort(hittest.iItem, false, true); } else if (cmd == IDM_SEL_DES) { g_set_sort(hittest.iItem, true, true); } else if (cmd == IDM_EDIT_COLUMN) { g_set_tab("Columns"); cfg_cur_prefs_col = g_cache.active_column_active_to_actual(hittest.iItem); //get_idx static_api_ptr_t<ui_control>()->show_preferences(columns::config_get_playlist_view_guid()); } else if (cmd == IDM_AUTOSIZE) { cfg_nohscroll = cfg_nohscroll == 0; update_all_windows(); pvt::ng_playlist_view_t::g_on_autosize_change(); } else if (cmd == IDM_PREFS) { static_api_ptr_t<ui_control>()->show_preferences(columns::config_get_main_guid()); } else if (cmd >= IDM_CUSTOM_BASE) { if (t_size(cmd - IDM_CUSTOM_BASE) < columns.get_count()) { columns[cmd - IDM_CUSTOM_BASE]->show = !columns[cmd - IDM_CUSTOM_BASE]->show; //g_columns //if (!cfg_nohscroll) g_save_columns(); //g_cache.flush_all(); g_reset_columns(); update_all_windows(); pvt::ng_playlist_view_t::g_on_columns_change(); } } return 0; } else if ((HWND)wp == wnd) { //DWORD mp = GetMessagePos(); POINT px, pt = { GET_X_LPARAM(lp), GET_Y_LPARAM(lp) }; static_api_ptr_t<playlist_manager> playlist_api; if (playlist_api->activeplaylist_get_selection_count(1) > 0 && 1) { if (pt.x == -1 && pt.y == -1) { int focus = playlist_api->activeplaylist_get_focus_item(); unsigned last = get_last_viewable_item(); if (focus == -1 || focus < scroll_item_offset || focus > last) { px.x = 0; px.y = 0; } else { RECT rc; get_playlist_rect(&rc); px.x = 0; unsigned item_height = get_item_height(); px.y = (focus - scroll_item_offset)*(item_height)+item_height / 2 + rc.top; } pt = px; MapWindowPoints(wnd, HWND_DESKTOP, &pt, 1); } else { px = pt; ScreenToClient(wnd, &px); //int idx = hittest_item(px.x, px.y); //if (!is_visible(idx)) // SendMessage(wnd_playlist, WM_VSCROLL, MAKEWPARAM(SB_LINEDOWN, 0),0); } // int idx = hittest_item(px.x, px.y); enum { ID_PLAY = 1, ID_CUT, ID_COPY, ID_PASTE, ID_SELECTION, ID_CUSTOM_BASE = 0x8000 }; HMENU menu = CreatePopupMenu();//LoadMenu(core_api::get_my_instance(),MAKEINTRESOURCE(IDR_TREEPOPUP)); service_ptr_t<mainmenu_manager> p_manager_selection; service_ptr_t<contextmenu_manager> p_manager_context; p_manager_selection = standard_api_create_t<mainmenu_manager>(); contextmenu_manager::g_create(p_manager_context); if (p_manager_selection.is_valid()) { p_manager_selection->instantiate(mainmenu_groups::edit_part2_selection); p_manager_selection->generate_menu_win32(menu, ID_SELECTION, ID_CUSTOM_BASE - ID_SELECTION, standard_config_objects::query_show_keyboard_shortcuts_in_menus() ? contextmenu_manager::FLAG_SHOW_SHORTCUTS : 0); if (GetMenuItemCount(menu) > 0) uAppendMenu(menu, MF_SEPARATOR, 0, ""); } AppendMenu(menu, MF_STRING, ID_CUT, L"Cut"); AppendMenu(menu, MF_STRING, ID_COPY, L"Copy"); if (playlist_utils::check_clipboard()) AppendMenu(menu, MF_STRING, ID_PASTE, L"Paste"); AppendMenu(menu, MF_SEPARATOR, 0, NULL); if (p_manager_context.is_valid()) { const keyboard_shortcut_manager::shortcut_type shortcuts[] = { keyboard_shortcut_manager::TYPE_CONTEXT_PLAYLIST, keyboard_shortcut_manager::TYPE_CONTEXT }; p_manager_context->set_shortcut_preference(shortcuts, tabsize(shortcuts)); p_manager_context->init_context_playlist(standard_config_objects::query_show_keyboard_shortcuts_in_menus() ? contextmenu_manager::FLAG_SHOW_SHORTCUTS : 0); p_manager_context->win32_build_menu(menu, ID_CUSTOM_BASE, -1); } menu_helpers::win32_auto_mnemonics(menu); MENU_A_BASE = ID_SELECTION; MENU_B_BASE = ID_CUSTOM_BASE; g_main_menu_a = p_manager_selection; g_main_menu_b = p_manager_context; int cmd = TrackPopupMenu(menu, TPM_RIGHTBUTTON | TPM_NONOTIFY | TPM_RETURNCMD, pt.x, pt.y, 0, wnd, 0); if (m_status_override.is_valid()) { m_status_override.release(); } DestroyMenu(menu); if (cmd) { if (cmd == ID_CUT) { playlist_utils::cut(); } else if (cmd == ID_COPY) { playlist_utils::copy(); } else if (cmd == ID_PASTE) { playlist_utils::paste(wnd); } else if (cmd >= ID_SELECTION && cmd<ID_CUSTOM_BASE) { if (p_manager_selection.is_valid()) { p_manager_selection->execute_command(cmd - ID_SELECTION); } } else if (cmd >= ID_CUSTOM_BASE) { if (p_manager_context.is_valid()) { p_manager_context->execute_by_id(cmd - ID_CUSTOM_BASE); } } } g_main_menu_a.release(); g_main_menu_b.release(); } // contextmenu_manager::win32_run_menu_context_playlist(wnd, 0, config_object::g_get_data_bool_simple(standard_config_objects::bool_show_keyboard_shortcuts_in_menus, true) ? contextmenu_manager::FLAG_SHOW_SHORTCUTS : 0); } } return 0; //#ifdef INLINE_EDIT case WM_PARENTNOTIFY: { if (wp == WM_DESTROY) { if (m_wnd_edit && (HWND)lp == m_wnd_edit) m_wnd_edit = 0; } } break; case MSG_KILL_INLINE_EDIT: exit_inline_edit(); return 0; #if 1 case WM_COMMAND: switch (wp) { case (EN_CHANGE << 16) | 667: { m_edit_changed = true; } break; } break; #endif case WM_TIMER: { if (wp == EDIT_TIMER_ID) { create_inline_edit_v2(m_edit_index, m_edit_column); if (m_edit_timer) { KillTimer(wnd_playlist, EDIT_TIMER_ID); m_edit_timer = false; } return 0; } } break; //#endif case WM_NOTIFY: switch (((LPNMHDR)lp)->idFrom) { case ID_PLAYLIST_TOOLTIP: switch (((LPNMHDR)lp)->code) { case TTN_SHOW: RECT rc, rc_tt; rc = tooltip; GetWindowRect(g_tooltip, &rc_tt); int offset = MulDiv(get_item_height() - rc_tt.bottom + rc_tt.top, 1, 2); rc.top += offset; SetWindowPos(g_tooltip, NULL, rc.left, rc.top, 0, 0, SWP_NOSIZE | SWP_NOZORDER | SWP_NOACTIVATE); return TRUE; } break; case 5001: switch (((LPNMHDR)lp)->code) { case HDN_BEGINTRACKA: case HDN_BEGINTRACKW: { return (cfg_nohscroll ? TRUE : FALSE); } case HDN_ENDDRAG: { if (((LPNMHEADERA)lp)->iButton == 0) { if (((LPNMHEADERA)lp)->pitem && (((LPNMHEADERA)lp)->pitem->mask & HDI_ORDER)) { int from = ((LPNMHEADERA)lp)->iItem; int to = ((LPNMHEADERA)lp)->pitem->iOrder; if (to >= 0 && from != to) { int act_from = g_cache.active_column_active_to_actual(from), act_to = g_cache.active_column_active_to_actual(to); columns.move(act_from, act_to); //if (!cfg_nohscroll) g_save_columns(); g_reset_columns(); update_all_windows(); pvt::ng_playlist_view_t::g_on_columns_change(); } } else { } } return (TRUE); } case HDN_DIVIDERDBLCLICK: if (!cfg_nohscroll) { static_api_ptr_t<playlist_manager> playlist_api; HDC hdc; hdc = GetDC(wnd_playlist); int size; pfc::string8 text; SelectObject(hdc, g_font); int w = 0, n, t = playlist_api->activeplaylist_get_item_count(); for (n = 0; n<t; n++) { // playlist_api->format_title(n, text, g_playlist_entries.get_display_spec(((LPNMHEADER)lp)->iItem), NULL); g_cache.active_get_display_name(n, ((LPNMHEADER)lp)->iItem, text); size = ui_helpers::get_text_width_color(hdc, text, text.length()); if (size > w) w = size; } // g_playlist_entries.get_column(((LPNMHEADER)lp)->iItem)->_set_width(w+5); columns[g_cache.active_column_active_to_actual(((LPNMHEADER)lp)->iItem)]->width = w + 15; ReleaseDC(wnd_playlist, hdc); update_all_windows(); g_save_columns(); pvt::ng_playlist_view_t::g_on_column_widths_change(); } return 0; case HDN_ITEMCLICK: { bool des = false; static_api_ptr_t<playlist_manager> playlist_api; unsigned col; bool descending; bool sorted = g_cache.active_get_playlist_sort(col, &descending); if (sorted && col == ((LPNMHEADER)lp)->iItem) des = !descending; g_set_sort(((LPNMHEADER)lp)->iItem, des /*, playlist_api->activeplaylist_get_selection_count(1) && cfg_sortsel != 0*/); } break; case HDN_ITEMCHANGED: { if (!cfg_nohscroll) { if (((LPNMHEADER)lp)->pitem->mask & HDI_WIDTH) columns[g_cache.active_column_active_to_actual(((LPNMHEADER)lp)->iItem)]->width = ((LPNMHEADER)lp)->pitem->cxy; update_all_windows(wnd_header); g_save_columns(); pvt::ng_playlist_view_t::g_on_column_widths_change(); } } break; } break; } } return DefWindowProc(wnd, msg, wp, lp); }
BOOL TopMenu::preCallWnd(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam, LRESULT* pRC) { BOOL b; const ULONG_PTR POWER_MENU_ID = 0x50494552; //POWR in ASCII if(message == WM_INITMENUPOPUP) { HMENU hMenu = (HMENU)wParam; DWORD dwStyle = (DWORD)GetWindowLong(hwnd, GWL_STYLE); DWORD dwStyleEx = (DWORD)GetWindowLong(hwnd, GWL_EXSTYLE); if(!(dwStyle & WS_SYSMENU)) { return FALSE; } MENUITEMINFO closeItem; ZeroMemory(&closeItem, sizeof(closeItem)); closeItem.cbSize = sizeof(closeItem); if(GetMenuItemInfo(hMenu, SC_CLOSE, FALSE, &closeItem)) { MENUITEMINFO topMost; ZeroMemory(&topMost, sizeof(topMost)); topMost.cbSize = sizeof(topMost); topMost.fMask = (MIIM_ID | MIIM_STATE | MIIM_TYPE | MIIM_DATA); topMost.fType = MFT_STRING; topMost.fState = (dwStyleEx & WS_EX_TOPMOST) ? MFS_CHECKED : MFS_UNCHECKED; topMost.wID = TM_ALWAYS_ON_TOP; topMost.dwTypeData = "Always On Top"; topMost.dwItemData = POWER_MENU_ID; HMENU hPriorityMenu = CreatePopupMenu(); AppendMenu(hPriorityMenu, MF_BYPOSITION, TM_PRIORITY_IDLE , "4 - Idle" ); AppendMenu(hPriorityMenu, MF_BYPOSITION, TM_PRIORITY_BN , "6 - Below Normal" ); AppendMenu(hPriorityMenu, MF_BYPOSITION, TM_PRIORITY_NORMAL , "8 - Normal" ); AppendMenu(hPriorityMenu, MF_BYPOSITION, TM_PRIORITY_AN , "10 - Above Normal"); AppendMenu(hPriorityMenu, MF_BYPOSITION, TM_PRIORITY_HIGH , "13 - High" ); AppendMenu(hPriorityMenu, MF_BYPOSITION, TM_PRIORITY_RT , "24 - Realtime" ); MENUITEMINFO priority; ZeroMemory(&priority, sizeof(priority)); priority.cbSize = sizeof(priority); priority.fMask = (MIIM_ID | MIIM_TYPE | MIIM_DATA | MIIM_SUBMENU); priority.fType = MFT_STRING; priority.wID = 0; priority.hSubMenu = hPriorityMenu; priority.dwTypeData = "Priority"; priority.dwItemData = POWER_MENU_ID; HMENU hTransparencyMenu = CreatePopupMenu(); AppendMenu(hTransparencyMenu, MF_BYPOSITION, TM_TRANSPARENT_100 , "0% (opaque)" ); AppendMenu(hTransparencyMenu, MF_BYPOSITION, TM_TRANSPARENT_90 , "10%" ); AppendMenu(hTransparencyMenu, MF_BYPOSITION, TM_TRANSPARENT_80 , "20%" ); AppendMenu(hTransparencyMenu, MF_BYPOSITION, TM_TRANSPARENT_70 , "30%" ); AppendMenu(hTransparencyMenu, MF_BYPOSITION, TM_TRANSPARENT_60 , "40%" ); AppendMenu(hTransparencyMenu, MF_BYPOSITION, TM_TRANSPARENT_50 , "50%" ); AppendMenu(hTransparencyMenu, MF_BYPOSITION, TM_TRANSPARENT_40 , "40%" ); AppendMenu(hTransparencyMenu, MF_BYPOSITION, TM_TRANSPARENT_30 , "30%" ); AppendMenu(hTransparencyMenu, MF_BYPOSITION, TM_TRANSPARENT_20 , "20%" ); AppendMenu(hTransparencyMenu, MF_BYPOSITION, TM_TRANSPARENT_10 , "10%" ); AppendMenu(hTransparencyMenu, MF_BYPOSITION, TM_TRANSPARENT_0 , "0% (transparent)" ); MENUITEMINFO transparency; ZeroMemory(&transparency, sizeof(transparency)); transparency.cbSize = sizeof(transparency); transparency.fMask = (MIIM_ID | MIIM_TYPE | MIIM_DATA | MIIM_SUBMENU); transparency.fType = MFT_STRING; transparency.wID = 0; transparency.hSubMenu = hTransparencyMenu; transparency.dwTypeData = "Transparency"; transparency.dwItemData = POWER_MENU_ID; MENUITEMINFO minToTray; ZeroMemory(&minToTray, sizeof(minToTray)); minToTray.cbSize = sizeof(minToTray); minToTray.fMask = (MIIM_ID | MIIM_TYPE | MIIM_DATA); minToTray.fType = MFT_STRING; minToTray.wID = TM_MINIMIZE_TO_TRAY; minToTray.dwTypeData = "Minimize To Tray"; minToTray.dwItemData = POWER_MENU_ID; MENUITEMINFO sep; ZeroMemory(&sep, sizeof(sep)); sep.cbSize = sizeof(sep); sep.fMask = (MIIM_TYPE | MIIM_DATA); sep.fType = MFT_SEPARATOR; sep.dwItemData = POWER_MENU_ID; b=InsertMenuItem(hMenu, SC_CLOSE, FALSE, &topMost); ASSERT(b); b=InsertMenuItem(hMenu, SC_CLOSE, FALSE, &priority); ASSERT(b); b=InsertMenuItem(hMenu, SC_CLOSE, FALSE, &transparency); ASSERT(b); b=InsertMenuItem(hMenu, SC_CLOSE, FALSE, &minToTray); ASSERT(b); b=InsertMenuItem(hMenu, SC_CLOSE, FALSE, &sep); ASSERT(b); } } else if (message == WM_UNINITMENUPOPUP) { HMENU hMenu = (HMENU)wParam; DWORD dwStyle = (DWORD)GetWindowLong(hwnd, GWL_STYLE); if(!(dwStyle & WS_SYSMENU)) { return FALSE; } int menuCnt = GetMenuItemCount(hMenu); for(int i = 0; i < menuCnt; i++) { MENUITEMINFO menuItem; ZeroMemory(&menuItem, sizeof(menuItem)); menuItem.cbSize = sizeof(menuItem); menuItem.fMask = (MIIM_ID | MIIM_STATE | MIIM_TYPE | MIIM_DATA); if(!GetMenuItemInfo(hMenu, i, TRUE, &menuItem)) { continue; } if(menuItem.dwItemData == POWER_MENU_ID) { b=DeleteMenu(hMenu, i, MF_BYPOSITION); ASSERT(b); i--; // back up menu index to not skip the entry now at position i } } } return FALSE; }
/* * Dialog-box function for the main PuTTYgen dialog box. */ static int CALLBACK MainDlgProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) { static const char generating_msg[] = "Please wait while a key is generated..."; static const char entropy_msg[] = "Please generate some randomness by moving the mouse over the blank area."; struct MainDlgState *state; switch (msg) { case WM_INITDIALOG: if (has_help()) SetWindowLongPtr(hwnd, GWL_EXSTYLE, GetWindowLongPtr(hwnd, GWL_EXSTYLE) | WS_EX_CONTEXTHELP); else { /* * If we add a Help button, this is where we destroy it * if the help file isn't present. */ } SendMessage(hwnd, WM_SETICON, (WPARAM) ICON_BIG, (LPARAM) LoadIcon(hinst, MAKEINTRESOURCE(800))); state = snew(struct MainDlgState); state->generation_thread_exists = FALSE; state->collecting_entropy = FALSE; state->entropy = NULL; state->key_exists = FALSE; SetWindowLongPtr(hwnd, GWLP_USERDATA, (LONG_PTR) state); { HMENU menu, menu1; menu = CreateMenu(); menu1 = CreateMenu(); AppendMenu(menu1, MF_ENABLED, IDC_LOAD, "&Load private key"); AppendMenu(menu1, MF_ENABLED, IDC_SAVEPUB, "Save p&ublic key"); AppendMenu(menu1, MF_ENABLED, IDC_SAVE, "&Save private key"); AppendMenu(menu1, MF_SEPARATOR, 0, 0); AppendMenu(menu1, MF_ENABLED, IDC_QUIT, "E&xit"); AppendMenu(menu, MF_POPUP | MF_ENABLED, (UINT) menu1, "&File"); state->filemenu = menu1; menu1 = CreateMenu(); AppendMenu(menu1, MF_ENABLED, IDC_GENERATE, "&Generate key pair"); AppendMenu(menu1, MF_SEPARATOR, 0, 0); AppendMenu(menu1, MF_ENABLED, IDC_KEYSSH1, "SSH-&1 key (RSA)"); AppendMenu(menu1, MF_ENABLED, IDC_KEYSSH2RSA, "SSH-2 &RSA key"); AppendMenu(menu1, MF_ENABLED, IDC_KEYSSH2DSA, "SSH-2 &DSA key"); AppendMenu(menu, MF_POPUP | MF_ENABLED, (UINT) menu1, "&Key"); state->keymenu = menu1; menu1 = CreateMenu(); AppendMenu(menu1, MF_ENABLED, IDC_IMPORT, "&Import key"); AppendMenu(menu1, MF_SEPARATOR, 0, 0); AppendMenu(menu1, MF_ENABLED, IDC_EXPORT_OPENSSH, "Export &OpenSSH key"); AppendMenu(menu1, MF_ENABLED, IDC_EXPORT_SSHCOM, "Export &ssh.com key"); AppendMenu(menu, MF_POPUP | MF_ENABLED, (UINT) menu1, "Con&versions"); state->cvtmenu = menu1; menu1 = CreateMenu(); AppendMenu(menu1, MF_ENABLED, IDC_ABOUT, "&About"); if (has_help()) AppendMenu(menu1, MF_ENABLED, IDC_GIVEHELP, "&Help"); AppendMenu(menu, MF_POPUP | MF_ENABLED, (UINT) menu1, "&Help"); SetMenu(hwnd, menu); } /* * Centre the window. */ { /* centre the window */ RECT rs, rd; HWND hw; hw = GetDesktopWindow(); if (GetWindowRect(hw, &rs) && GetWindowRect(hwnd, &rd)) MoveWindow(hwnd, (rs.right + rs.left + rd.left - rd.right) / 2, (rs.bottom + rs.top + rd.top - rd.bottom) / 2, rd.right - rd.left, rd.bottom - rd.top, TRUE); } { struct ctlpos cp, cp2; /* Accelerators used: acglops1rbde */ ctlposinit(&cp, hwnd, 4, 4, 4); beginbox(&cp, "Key", IDC_BOX_KEY); cp2 = cp; statictext(&cp2, "No key.", 1, IDC_NOKEY); cp2 = cp; statictext(&cp2, "", 1, IDC_GENERATING); progressbar(&cp2, IDC_PROGRESS); bigeditctrl(&cp, "&Public key for pasting into authorized_keys file:", IDC_PKSTATIC, IDC_KEYDISPLAY, 5); SendDlgItemMessage(hwnd, IDC_KEYDISPLAY, EM_SETREADONLY, 1, 0); staticedit(&cp, "Key f&ingerprint:", IDC_FPSTATIC, IDC_FINGERPRINT, 75); SendDlgItemMessage(hwnd, IDC_FINGERPRINT, EM_SETREADONLY, 1, 0); staticedit(&cp, "Key &comment:", IDC_COMMENTSTATIC, IDC_COMMENTEDIT, 75); staticpassedit(&cp, "Key p&assphrase:", IDC_PASSPHRASE1STATIC, IDC_PASSPHRASE1EDIT, 75); staticpassedit(&cp, "C&onfirm passphrase:", IDC_PASSPHRASE2STATIC, IDC_PASSPHRASE2EDIT, 75); endbox(&cp); beginbox(&cp, "Actions", IDC_BOX_ACTIONS); staticbtn(&cp, "Generate a public/private key pair", IDC_GENSTATIC, "&Generate", IDC_GENERATE); staticbtn(&cp, "Load an existing private key file", IDC_LOADSTATIC, "&Load", IDC_LOAD); static2btn(&cp, "Save the generated key", IDC_SAVESTATIC, "Save p&ublic key", IDC_SAVEPUB, "&Save private key", IDC_SAVE); endbox(&cp); beginbox(&cp, "Parameters", IDC_BOX_PARAMS); radioline(&cp, "Type of key to generate:", IDC_TYPESTATIC, 4, "SSH-&1 (RSA)", IDC_KEYSSH1, "SSH-2 &RSA", IDC_KEYSSH2RSA, "SSH-2 &DSA", IDC_KEYSSH2DSA, NULL); staticedit(&cp, "Number of &bits in a generated key:", IDC_BITSSTATIC, IDC_BITS, 20); endbox(&cp); } CheckRadioButton(hwnd, IDC_KEYSSH1, IDC_KEYSSH2DSA, IDC_KEYSSH2RSA); CheckMenuRadioItem(state->keymenu, IDC_KEYSSH1, IDC_KEYSSH2DSA, IDC_KEYSSH2RSA, MF_BYCOMMAND); SetDlgItemInt(hwnd, IDC_BITS, DEFAULT_KEYSIZE, FALSE); /* * Initially, hide the progress bar and the key display, * and show the no-key display. Also disable the Save * buttons, because with no key we obviously can't save * anything. */ ui_set_state(hwnd, state, 0); if (cmdline_keygen) { PostMessage(hwnd, WM_COMMAND, IDC_GENERATE, 0); /* * Load a key file if one was provided on the command line. */ } else if (cmdline_keyfile) { Filename *fn = filename_from_str(cmdline_keyfile); load_key_file(hwnd, state, fn, 0); filename_free(fn); } return 1; case WM_MOUSEMOVE: state = (struct MainDlgState *) GetWindowLongPtr(hwnd, GWLP_USERDATA); if (state->collecting_entropy && state->entropy && state->entropy_got < state->entropy_required) { state->entropy[state->entropy_got++] = lParam; state->entropy[state->entropy_got++] = GetMessageTime(); SendDlgItemMessage(hwnd, IDC_PROGRESS, PBM_SETPOS, state->entropy_got, 0); if (state->entropy_got >= state->entropy_required) { struct rsa_key_thread_params *params; DWORD threadid; /* * Seed the entropy pool */ random_add_heavynoise(state->entropy, state->entropy_size); smemclr(state->entropy, state->entropy_size); sfree(state->entropy); state->collecting_entropy = FALSE; SetDlgItemText(hwnd, IDC_GENERATING, generating_msg); SendDlgItemMessage(hwnd, IDC_PROGRESS, PBM_SETRANGE, 0, MAKELPARAM(0, PROGRESSRANGE)); SendDlgItemMessage(hwnd, IDC_PROGRESS, PBM_SETPOS, 0, 0); params = snew(struct rsa_key_thread_params); params->progressbar = GetDlgItem(hwnd, IDC_PROGRESS); params->dialog = hwnd; params->keysize = state->keysize; params->is_dsa = state->is_dsa; params->key = &state->key; params->dsskey = &state->dsskey; if (!CreateThread(NULL, 0, generate_rsa_key_thread, params, 0, &threadid)) { MessageBox(hwnd, "Out of thread resources", "Key generation error", MB_OK | MB_ICONERROR); sfree(params); } else { state->generation_thread_exists = TRUE; } } } break; case WM_COMMAND: switch (LOWORD(wParam)) { case IDC_KEYSSH1: case IDC_KEYSSH2RSA: case IDC_KEYSSH2DSA: { state = (struct MainDlgState *) GetWindowLongPtr(hwnd, GWLP_USERDATA); if (!IsDlgButtonChecked(hwnd, LOWORD(wParam))) CheckRadioButton(hwnd, IDC_KEYSSH1, IDC_KEYSSH2DSA, LOWORD(wParam)); CheckMenuRadioItem(state->keymenu, IDC_KEYSSH1, IDC_KEYSSH2DSA, LOWORD(wParam), MF_BYCOMMAND); } break; case IDC_QUIT: PostMessage(hwnd, WM_CLOSE, 0, 0); break; case IDC_COMMENTEDIT: if (HIWORD(wParam) == EN_CHANGE) { state = (struct MainDlgState *) GetWindowLongPtr(hwnd, GWLP_USERDATA); if (state->key_exists) { HWND editctl = GetDlgItem(hwnd, IDC_COMMENTEDIT); int len = GetWindowTextLength(editctl); if (*state->commentptr) sfree(*state->commentptr); *state->commentptr = snewn(len + 1, char); GetWindowText(editctl, *state->commentptr, len + 1); if (state->ssh2) { setupbigedit2(hwnd, IDC_KEYDISPLAY, IDC_PKSTATIC, &state->ssh2key); } else { setupbigedit1(hwnd, IDC_KEYDISPLAY, IDC_PKSTATIC, &state->key); } } }
static int CustomButtonPressed(WPARAM, LPARAM lParam) { CustomButtonClickData *cbcd = (CustomButtonClickData *)lParam; CHARRANGE cr; HWND hEdit = NULL; BOOL bCTRL = 0; BOOL bIsService = 0; TCHAR* pszText = NULL; TCHAR* pszCBText = NULL; TCHAR* ptszQValue = NULL; UINT textlenght = 0; SortedList* sl = NULL; int state = 0; if (mir_strcmp(cbcd->pszModule, PLGNAME)) return 0; if (!ButtonsList[cbcd->dwButtonId]) return 1; sl = ButtonsList[cbcd->dwButtonId]->sl; if (!sl) return 1; if (IsClipboardFormatAvailable(CF_TEXT)) { if (OpenClipboard(cbcd->hwndFrom)) { HANDLE hData = NULL; TCHAR* chBuffer = NULL; int textLength = 0; hData = GetClipboardData(CF_UNICODETEXT); chBuffer = (TCHAR*)GlobalLock(hData); textLength = (int)mir_tstrlen(chBuffer); pszCBText = mir_tstrdup(chBuffer); GlobalUnlock(hData); CloseClipboard(); } } qsort(sl->items, sl->realCount, sizeof(ButtonData *), sstSortButtons); hEdit = GetDlgItem(cbcd->hwndFrom, IDC_MESSAGE); if (!hEdit) hEdit = GetDlgItem(cbcd->hwndFrom, IDC_CHATMESSAGE); cr.cpMin = cr.cpMax = 0; SendMessage(hEdit, EM_EXGETSEL, 0, (LPARAM)&cr); textlenght = cr.cpMax - cr.cpMin; if (textlenght) { pszText = (TCHAR *)mir_alloc((textlenght + 10)*sizeof(TCHAR)); memset(pszText, 0, ((textlenght + 10) * sizeof(TCHAR))); SendMessage(hEdit, EM_GETSELTEXT, 0, (LPARAM)pszText); } if (cbcd->flags&BBCF_RIGHTBUTTON) state = 1; else if (sl->realCount == 1) state = 2; else state = 3; switch (state) { case 1: if (ButtonsList[cbcd->dwButtonId]->ptszQValue) ptszQValue = ParseString(cbcd->hContact, ButtonsList[cbcd->dwButtonId]->ptszQValue, pszText ? pszText : _T(""), pszCBText ? pszCBText : _T(""), (int)mir_tstrlen(ButtonsList[cbcd->dwButtonId]->ptszQValue), textlenght, pszCBText ? (int)mir_tstrlen(pszCBText) : 0); if ((bIsService = ButtonsList[cbcd->dwButtonId]->bIsServName) && ptszQValue) CallService(mir_u2a(ptszQValue), (WPARAM)cbcd->hContact, 0); break; case 2: { ButtonData *bd = (ButtonData *)sl->items[0]; if (bd && bd->pszValue) { ptszQValue = ParseString(cbcd->hContact, bd->pszValue, pszText ? pszText : _T(""), pszCBText ? pszCBText : _T(""), (int)mir_tstrlen(bd->pszValue), textlenght, pszCBText ? (int)mir_tstrlen(pszCBText) : 0); if ((bIsService = bd->bIsServName) && ptszQValue) CallService(mir_u2a(ptszQValue), (WPARAM)cbcd->hContact, 0); } } break; case 3: if (!g_iButtonsCount) break; HMENU hMenu = CreatePopupMenu(), hSubMenu = NULL; for (int menunum = 0; menunum < sl->realCount; menunum++) { ButtonData *bd = (ButtonData *)sl->items[menunum]; if (bd->dwOPFlags&QMF_NEW) continue; BOOL bSetPopupMark = FALSE; if (bd->pszValue == 0 && bd->fEntryType == 0) { hSubMenu = CreatePopupMenu(); bSetPopupMark = TRUE; } if (bd->pszValue && bd->fEntryType == 0) hSubMenu = NULL; if (bd->fEntryType&QMF_EX_SEPARATOR) AppendMenu((HMENU)((hSubMenu && !bSetPopupMark) ? hSubMenu : hMenu), MF_SEPARATOR, 0, NULL); else AppendMenu((HMENU)((hSubMenu && !bSetPopupMark) ? hSubMenu : hMenu), MF_STRING | (bSetPopupMark ? MF_POPUP : 0), (bSetPopupMark ? (UINT_PTR)hSubMenu : (menunum + 1)), bd->pszName); } int res = TrackPopupMenu(hMenu, TPM_RETURNCMD, cbcd->pt.x, cbcd->pt.y, 0, cbcd->hwndFrom, NULL); if (res == 0) break; ButtonData *bd = (ButtonData *)sl->items[res - 1]; bCTRL = (GetKeyState(VK_CONTROL) & 0x8000) ? 1 : 0; if (bd->pszValue) { ptszQValue = ParseString(cbcd->hContact, bd->pszValue, pszText ? pszText : _T(""), pszCBText ? pszCBText : _T(""), (int)mir_tstrlen(bd->pszValue), textlenght, pszCBText ? (int)mir_tstrlen(pszCBText) : 0); if ((bIsService = bd->bIsServName) && ptszQValue) CallService(mir_u2a(ptszQValue), (WPARAM)cbcd->hContact, 0); } break; } if (ptszQValue) { if (!bIsService) { SendMessage(hEdit, EM_REPLACESEL, TRUE, (LPARAM)ptszQValue); if ((g_bLClickAuto&&state != 1) || (g_bRClickAuto&&state == 1) || cbcd->flags&BBCF_CONTROLPRESSED || bCTRL) SendMessage(cbcd->hwndFrom, WM_COMMAND, IDOK, 0); } free(ptszQValue); } mir_free(pszText); mir_free(pszCBText); return 1; }
static INT_PTR CALLBACK DlgProfileSelect(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam) { DlgProfData* dat = (struct DlgProfData *)GetWindowLongPtr(hwndDlg, GWLP_USERDATA); HWND hwndList = GetDlgItem(hwndDlg, IDC_PROFILELIST); switch (msg) { case WM_INITDIALOG: { HIMAGELIST hImgList; LVCOLUMN col; TranslateDialogDefault( hwndDlg ); dat = (DlgProfData*) lParam; SetWindowLongPtr(hwndDlg, GWLP_USERDATA, (LONG_PTR)dat); // set columns col.mask = LVCF_TEXT | LVCF_WIDTH; col.pszText = TranslateT("Profile"); col.cx=122; ListView_InsertColumn( hwndList, 0, &col ); col.pszText = TranslateT("Driver"); col.cx=100; ListView_InsertColumn( hwndList, 1, &col ); col.pszText = TranslateT("Size"); col.cx=60; ListView_InsertColumn( hwndList, 2, &col ); col.pszText = TranslateT("Created"); col.cx=145; ListView_InsertColumn( hwndList, 3, &col ); col.pszText = TranslateT("Modified"); col.cx=145; ListView_InsertColumn( hwndList, 4, &col ); // icons hImgList = ImageList_Create(16, 16, ILC_MASK | (IsWinVerXPPlus() ? ILC_COLOR32 : ILC_COLOR16), 2, 1); ImageList_AddIcon_NotShared(hImgList, MAKEINTRESOURCE(IDI_USERDETAILS)); ImageList_AddIcon_NotShared(hImgList, MAKEINTRESOURCE(IDI_DELETE)); // LV will destroy the image list SetWindowLongPtr(hwndList, GWL_STYLE, GetWindowLongPtr(hwndList, GWL_STYLE) | LVS_SORTASCENDING); ListView_SetImageList(hwndList, hImgList, LVSIL_SMALL); ListView_SetExtendedListViewStyle(hwndList, ListView_GetExtendedListViewStyle(hwndList) | LVS_EX_DOUBLEBUFFER | LVS_EX_LABELTIP | LVS_EX_FULLROWSELECT); // find all the profiles ProfileEnumData ped = { hwndDlg, dat->pd->szProfile }; findProfiles(dat->pd->szProfileDir, EnumProfilesForList, (LPARAM)&ped); PostMessage(hwndDlg, WM_FOCUSTEXTBOX, 0, 0); dat->hFileNotify = FindFirstChangeNotification(dat->pd->szProfileDir, TRUE, FILE_NOTIFY_CHANGE_FILE_NAME | FILE_NOTIFY_CHANGE_LAST_WRITE); if (dat->hFileNotify != INVALID_HANDLE_VALUE) SetTimer(hwndDlg, 0, 1200, NULL); return TRUE; } case WM_DESTROY: KillTimer(hwndDlg, 0); FindCloseChangeNotification(dat->hFileNotify); break; case WM_TIMER: if (WaitForSingleObject(dat->hFileNotify, 0) == WAIT_OBJECT_0) { ListView_DeleteAllItems(hwndList); ProfileEnumData ped = { hwndDlg, dat->pd->szProfile }; findProfiles(dat->pd->szProfileDir, EnumProfilesForList, (LPARAM)&ped); FindNextChangeNotification(dat->hFileNotify); } break; case WM_FOCUSTEXTBOX: SetFocus(hwndList); if (dat->pd->szProfile[0] == 0 || ListView_GetSelectedCount(hwndList) == 0) ListView_SetItemState(hwndList, 0, LVIS_SELECTED | LVIS_FOCUSED, LVIS_SELECTED | LVIS_FOCUSED); break; case WM_SHOWWINDOW: if ( wParam ) { SetWindowText(dat->hwndOK, TranslateT("&Run")); EnableWindow(dat->hwndOK, ListView_GetSelectedCount(hwndList)==1); } break; case WM_CONTEXTMENU: { LVHITTESTINFO lvht = {0}; lvht.pt.x = GET_X_LPARAM(lParam); lvht.pt.y = GET_Y_LPARAM(lParam); ScreenToClient(hwndList, &lvht.pt); if (ListView_HitTest(hwndList, &lvht) < 0) break; lvht.pt.x = GET_X_LPARAM(lParam); lvht.pt.y = GET_Y_LPARAM(lParam); HMENU hMenu = CreatePopupMenu(); AppendMenu(hMenu, MF_STRING, 1, TranslateT("Run")); AppendMenu(hMenu, MF_SEPARATOR, 2, NULL); AppendMenu(hMenu, MF_STRING, 3, TranslateT("Delete")); int index = TrackPopupMenu(hMenu, TPM_RETURNCMD, lvht.pt.x, lvht.pt.y, 0, hwndDlg, NULL); switch (index) { case 1: SendMessage(GetParent(hwndDlg), WM_COMMAND, IDOK, 0); break; case 3: DeleteProfile(hwndList, lvht.iItem, dat); break; } DestroyMenu(hMenu); break; } case WM_NOTIFY: { LPNMHDR hdr = (LPNMHDR) lParam; if (hdr && hdr->code == PSN_INFOCHANGED) break; if (hdr && hdr->idFrom == IDC_PROFILELIST) { switch (hdr->code) { case LVN_ITEMCHANGED: EnableWindow(dat->hwndOK, ListView_GetSelectedCount(hwndList) == 1); case NM_DBLCLK: { LVITEM item = {0}; TCHAR profile[MAX_PATH]; if (dat == NULL) break; item.mask = LVIF_TEXT; item.iItem = ListView_GetNextItem(hwndList, -1, LVNI_SELECTED | LVNI_ALL); item.pszText = profile; item.cchTextMax = SIZEOF(profile); if (ListView_GetItem(hwndList, &item)) { // profile is placed in "profile_name" subfolder TCHAR tmpPath[MAX_PATH]; mir_sntprintf(tmpPath, SIZEOF(tmpPath), _T("%s\\%s.dat"), dat->pd->szProfileDir, profile); HANDLE hFile = CreateFile(tmpPath, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS, NULL); if (hFile == INVALID_HANDLE_VALUE) mir_sntprintf(dat->pd->szProfile, MAX_PATH, _T("%s\\%s\\%s.dat"), dat->pd->szProfileDir, profile, profile); else _tcscpy(dat->pd->szProfile, tmpPath); CloseHandle(hFile); if (hdr->code == NM_DBLCLK) EndDialog(GetParent(hwndDlg), 1); } return TRUE; } case LVN_KEYDOWN: { LPNMLVKEYDOWN hdrk = (LPNMLVKEYDOWN) lParam; if (hdrk->wVKey == VK_DELETE) DeleteProfile(hwndList, ListView_GetNextItem(hwndList, -1, LVNI_SELECTED | LVNI_ALL), dat); break; } } } break; } } return FALSE; }
void Menu::add_option(string display_text, string option_name){ AppendMenu(handle, MF_STRING, Controls::geti()->id_counter, display_text.c_str()); Controls::geti()->menu_names.push_back(option_name); Controls::geti()->menu_ids.push_back(Controls::geti()->id_counter); Controls::geti()->id_counter++; }
int KUiShowWndTree::SelParent(HWND hParent, HWND hTree, KSHOWWNDNODE *pNode, char *pszParent) { int nResult = FALSE; KG_PROCESS_ERROR(hTree); KG_PROCESS_ERROR(pNode); int nMaxID = TreeView_GetCount(hTree) + 4; int nStartID = 10000; int nEndID = nStartID; HMENU hMenu = CreatePopupMenu(); KG_PROCESS_ERROR(hMenu); struct MENUNAME { char szName[128]; }; MENUNAME *pMenuItem = new MENUNAME[nMaxID]; KG_PROCESS_ERROR(pMenuItem); if (pNode == &m_Root) { int i; for (i = LAYER_BEGIN; i < LAYER_END; i++) { AppendMenu(hMenu, MF_ENABLED |MF_STRING, nEndID, g_GetFrameLayerLayoutString(i)); strcpy(pMenuItem[nEndID -nStartID].szName, g_GetFrameLayerName(i)); nEndID++; } } else { AppendMenu(hMenu, MF_ENABLED |MF_STRING, nEndID, m_Root.szName); strcpy(pMenuItem[nEndID -nStartID].szName, m_Root.szName); nEndID++; KSHOWWNDNODE *pNow = m_Root.pChildNode; KG_PROCESS_ERROR(pNow); BOOL bChildFinished = FALSE; do { if (bChildFinished) { if(pNow->pNextBrotherNode) { pNow = pNow->pNextBrotherNode; bChildFinished = FALSE; } else { pNow = pNow->pParentNode; bChildFinished = TRUE; } } else { if (pNow != pNode) { BOOL bNeedAdd = TRUE; KSHOWWNDNODE *pParent = pNow->pParentNode; while (pParent) { if(pParent == pNode) { bNeedAdd = FALSE; break; } pParent = pParent->pParentNode; } if (bNeedAdd) { AppendMenu(hMenu, MF_ENABLED |MF_STRING, nEndID, pNow->szName); strcpy(pMenuItem[nEndID - nStartID].szName, pNow->szName); nEndID++; } } if(pNow->pChildNode) { pNow = pNow->pChildNode; bChildFinished = FALSE; } else { if (pNow->pNextBrotherNode) { pNow = pNow->pNextBrotherNode; bChildFinished = FALSE; } else { pNow = pNow->pParentNode; bChildFinished = TRUE; } } } if (pNow == &m_Root) { break; } }while (TRUE); } POINT Pos; GetCursorPos(&Pos); int nSel = TrackPopupMenu(hMenu, TPM_RETURNCMD | TPM_LEFTBUTTON | TPM_NONOTIFY, Pos.x, Pos.y, 0, hParent, NULL); DestroyMenu(hMenu); hMenu = NULL; KG_PROCESS_ERROR(nSel >= nStartID && nSel < nEndID); strcpy(pszParent, pMenuItem[nSel - nStartID].szName); nResult = TRUE; Exit0: if (hMenu) { DestroyMenu(hMenu); } if (pMenuItem) { delete[] pMenuItem; pMenuItem = NULL; } return nResult; }
void Menu::add_menu(Menu* submenu, string display_text){ AppendMenu(handle, MF_POPUP, (UINT_PTR)submenu->handle, display_text.c_str()); }
IPopupMenu* IGraphicsWin::CreateIPopupMenu(IPopupMenu* pMenu, IRECT* pAreaRect) { ReleaseMouseCapture(); int numItems = pMenu->GetNItems(); POINT cPos; cPos.x = pAreaRect->L; cPos.y = pAreaRect->B; ClientToScreen(mPlugWnd, &cPos); HMENU hMenu = CreatePopupMenu(); int flags = 0; if(numItems && hMenu) { for(int i = 0; i< numItems;i++) { IPopupMenuItem* menuItem = pMenu->GetItem(i); if (menuItem->GetIsSeparator()) { AppendMenu (hMenu, MF_SEPARATOR, 0, 0); } else { const char* str = menuItem->GetText(); char* titleWithPrefixNumbers = 0; if (pMenu->GetPrefix()) { titleWithPrefixNumbers = (char*)malloc(strlen(str) + 50); switch (pMenu->GetPrefix()) { case 1: { sprintf(titleWithPrefixNumbers, "%1d: %s", i+1, str); break; } case 2: { sprintf(titleWithPrefixNumbers, "%02d: %s", i+1, str); break; } case 3: { sprintf(titleWithPrefixNumbers, "%03d: %s", i+1, str); break; } } } const char* entryText (titleWithPrefixNumbers ? titleWithPrefixNumbers : str); flags = MF_STRING; //if (nbEntries < 160 && _menu->getNbItemsPerColumn () > 0 && inc && !(inc % _menu->getNbItemsPerColumn ())) // flags |= MF_MENUBARBREAK; if (menuItem->GetSubmenu()) { // HMENU submenu = createMenu (item->getSubmenu (), offsetIdx); // if (submenu) // { // AppendMenu (menu, flags|MF_POPUP|MF_ENABLED, (UINT_PTR)submenu, (const TCHAR*)entryText); // } } else { if (menuItem->GetEnabled()) flags |= MF_ENABLED; else flags |= MF_GRAYED; if (menuItem->GetIsTitle()) flags |= MF_DISABLED; //if (multipleCheck && menuItem->GetChecked()) // flags |= MF_CHECKED; if (menuItem->GetChecked()) flags |= MF_CHECKED; else flags |= MF_UNCHECKED; //if (!(flags & MF_CHECKED)) // flags |= MF_UNCHECKED; AppendMenu(hMenu, flags, i+1, entryText); } if(titleWithPrefixNumbers) FREE_NULL(titleWithPrefixNumbers); } } int itemChosen = TrackPopupMenu(hMenu, TPM_LEFTALIGN/*|TPM_VCENTERALIGN*/|TPM_NONOTIFY|TPM_RETURNCMD, cPos.x, cPos.y, 0, mPlugWnd, 0); // IPopupMenu* chosenMenu; if (itemChosen > 0) { pMenu->SetChosenItemIdx(itemChosen - 1); DestroyMenu(hMenu); return pMenu; } else { DestroyMenu(hMenu); return 0; } } else return 0; }
INT_PTR CALLBACK _main_dialog_proc( HWND hwnd, UINT message, WPARAM wparam, LPARAM lparam ) { WORD id = LOWORD(wparam); WORD code = HIWORD(wparam); _wnd_data *wnd; _dnode *sel; _dmnt *mnt; int k = 0; switch ( message ) { case WM_INITDIALOG : { memset( __lists, 0, sizeof(__lists) ); __lists[HMAIN_DRIVES] = GetDlgItem( hwnd, IDC_DISKDRIVES ); __dlg = hwnd; _init_main_dlg( hwnd ); _load_diskdrives( hwnd, &__drives, _list_volumes(0) ); { TCITEM tab_item = { TCIF_TEXT }; HWND h_tab = GetDlgItem(hwnd, IDT_INFO); _tab_data *d_tab = malloc(sizeof(_tab_data)); memset( d_tab, 0, sizeof(_tab_data) ); d_tab->curr_tab = 1; wnd_set_long( hwnd, GWL_USERDATA, d_tab ); wnd = _sub_class( h_tab, SUB_NONE, CreateDialog( __hinst, MAKEINTRESOURCE(DLG_MAIN_INFO), GetDlgItem(hwnd, IDC_MAIN_TAB), _tab_proc ), CreateDialog( __hinst, MAKEINTRESOURCE(DLG_MAIN_ACTION), GetDlgItem(hwnd, IDC_MAIN_TAB), _tab_proc ), HWND_NULL ); { __lists[HMAIN_INFO] = GetDlgItem( wnd->dlg[0], IDC_INF_TABLE ); __lists[HMAIN_ACT] = GetDlgItem( wnd->dlg[1], IDC_ACT_TABLE ); } { __dlg_act_info = wnd->dlg[1]; _list_insert_col( __lists[HMAIN_INFO], 380 ); _list_insert_col( __lists[HMAIN_INFO], 90 ); while ( _list_insert_item( __lists[HMAIN_INFO], k, 0, _info_table_items[k], 0 ) ) k++; _set_header_text( __lists[HMAIN_INFO], 0, STR_HEAD_NO_ICONS, countof(STR_HEAD_NO_ICONS) ); _list_insert_col( __lists[HMAIN_ACT], 90 ); _list_insert_col( __lists[HMAIN_ACT], 70 ); _list_insert_col( __lists[HMAIN_ACT], 85 ); _list_insert_col( __lists[HMAIN_ACT], 50 ); _list_insert_item( __lists[HMAIN_ACT], 0, 0, _act_table_items[0], 0 ); ListView_SetItemText( __lists[HMAIN_ACT], 0, 2, _act_table_items[3] ); _list_insert_item( __lists[HMAIN_ACT], 1, 0, _act_table_items[1], 0 ); ListView_SetItemText( __lists[HMAIN_ACT], 1, 2, _act_table_items[4] ); _init_combo( GetDlgItem( __dlg_act_info, IDC_COMBO_PASSES), wipe_modes, WP_NONE, FALSE, -1 ); SendMessage( GetDlgItem( __dlg_act_info, IDC_PROGRESS ), PBM_SETBARCOLOR, 0, _cl( COLOR_BTNSHADOW, DARK_CLR - 20 ) ); SendMessage( GetDlgItem( __dlg_act_info, IDC_PROGRESS ), PBM_SETRANGE, 0, MAKELPARAM(0, PRG_STEP) ); } tab_item.pszText = L"Info"; TabCtrl_InsertItem( h_tab, 0, &tab_item ); { NMHDR mhdr = { 0, 0, TCN_SELCHANGE }; TabCtrl_SetCurSel( h_tab, 0 ); SendMessage(hwnd, WM_NOTIFY, IDT_INFO, (LPARAM)&mhdr); } } SendMessage( hwnd, WM_SYSCOLORCHANGE, 0, 0 ); _set_timer( MAIN_TIMER, TRUE, TRUE ); _set_timer( RAND_TIMER, TRUE, FALSE ); _set_timer( POST_TIMER, TRUE, FALSE ); return 0L; } break; case WM_WINDOWPOSCHANGED : { WINDOWPOS *pos = (WINDOWPOS *)lparam; int flags = pos->flags; _dlg_right = pos->cx + pos->x; _dlg_bottom = pos->cy + pos->y; _dlg_left = pos->x; if ( ( flags & SWP_SHOWWINDOW ) || ( flags & SWP_HIDEWINDOW ) ) { _set_timer( MAIN_TIMER, flags & SWP_SHOWWINDOW, TRUE ); } return 0L; } break; case WM_ENTERSIZEMOVE : { //_middle_ctl( // GetDlgItem(hwnd, IDC_DISKDRIVES), // GetDlgItem(hwnd, IDC_RESIZING), // TRUE // ); //ShowWindow(GetDlgItem(hwnd, IDC_DISKDRIVES), SW_HIDE); return 0L; } break; case WM_EXITSIZEMOVE : { //ShowWindow(GetDlgItem(hwnd, IDC_DISKDRIVES), SW_SHOW); return 0L; } break; case WM_SIZING : { RECT *rect = ((RECT *)lparam); rect->right = _dlg_right; rect->left = _dlg_left; if ( rect->bottom - rect->top < MAIN_DLG_MIN_HEIGHT ) { rect->bottom = rect->top + MAIN_DLG_MIN_HEIGHT; } return 1L; } break; case WM_SIZE : { int height = HIWORD(lparam); int width = LOWORD(lparam); int k; _size_move_ctls _resize[ ] = { { -1, IDC_DISKDRIVES, FALSE, 0, 0 }, { -1, IDC_STATIC_LIST, TRUE, 0, 0 }, { -1, IDC_STATIC_RIGHT, TRUE, 0, 0 } }; _size_move_ctls _move[ ] = { { IDC_STATIC_LIST, IDC_MAIN_TAB, TRUE, 0, 6 }, { IDC_STATIC_LIST, IDT_INFO, FALSE, 0, 3 }, { IDT_INFO, IDC_LINE_BOTTOM, TRUE, 0, 2 } }; { int c_size_hide = _main_headers[1].width; int c_size_show = c_size_hide - GetSystemMetrics(SM_CXVSCROLL); int c_size_curr = ListView_GetColumnWidth( __lists[HMAIN_DRIVES], 1 ); if ( GetWindowLong(__lists[HMAIN_DRIVES], GWL_STYLE) & WS_VSCROLL ) { if ( c_size_curr != c_size_show ) ListView_SetColumnWidth( __lists[HMAIN_DRIVES], 1, c_size_show ); } else { if ( c_size_curr != c_size_hide ) ListView_SetColumnWidth( __lists[HMAIN_DRIVES], 1, c_size_hide ); } } if ( height == 0 || width == 0 ) { return 0L; } for ( k = 0; k < countof(_resize); k++ ) { _resize_ctl( GetDlgItem(hwnd, _resize[k].id), height - _dlg_height, 0, _resize[k].val ); } _dlg_height = height; for ( k = 0; k < countof(_move); k++ ) { _relative_move( GetDlgItem( hwnd, _move[k].anchor ), GetDlgItem( hwnd, _move[k].id ), _move[k].dy, _move[k].dy, _move[k].val ); InvalidateRect( GetDlgItem( hwnd, _move[k].id ), NULL, TRUE ); } _middle_ctl( GetDlgItem( hwnd, IDC_DISKDRIVES ), GetDlgItem( hwnd, IDC_RESIZING ), TRUE ); return 0L; } break; case WM_SYSCOMMAND : { if ( wparam == SC_MINIMIZE || wparam == SC_RESTORE ) { _set_timer( MAIN_TIMER, wparam == SC_RESTORE, TRUE ); } return 0L; } break; case WM_APP + WM_APP_SHOW : { ShowWindow( hwnd, SW_HIDE ); } break; case WM_NOTIFY : { if ( wparam == IDT_INFO ) { if ( ((NMHDR *)lparam)->code == TCN_SELCHANGE ) { HWND h_tab = GetDlgItem( hwnd, IDT_INFO ); if ( !_is_curr_in_group(h_tab) ) { _change_page( h_tab, TabCtrl_GetCurSel(h_tab) ); } } } if ( wparam == IDC_DISKDRIVES ) { sel = pv( _get_sel_item( __lists[HMAIN_DRIVES] ) ); mnt = &sel->mnt; if ( ((NMHDR *)lparam)->code == LVN_ITEMCHANGED && (((NMLISTVIEW *)lparam)->uNewState & LVIS_FOCUSED ) ) { _update_info_table( FALSE ); _activate_page( ); _refresh_menu( ); return 1L; } if ( ((NMHDR *)lparam)->code == LVN_ITEMACTIVATE ) { BOOL mount = ( !(sel->mnt.info.status.flags & F_ENABLED) ) && ( sel->mnt.fs[0] == '\0' ); if (! mount ) { if (! sel->is_root ) __execute( mnt->info.status.mnt_point ); } else { _menu_mount( sel ); } } switch( ((NM_LISTVIEW *)lparam)->hdr.code ) { case LVN_KEYDOWN : { WORD key = ((NMLVKEYDOWN *)lparam)->wVKey; int item = ListView_GetSelectionMark( __lists[HMAIN_DRIVES] ); switch ( key ) { case VK_UP: item -= 1; break; case VK_DOWN: item += 1; break; } if ( _is_root_item(_get_item_index( __lists[HMAIN_DRIVES], item )) ) { ListView_SetItemState( __lists[HMAIN_DRIVES], item, LVIS_FOCUSED, TRUE ); } if ( key != VK_APPS ) { break; } } case NM_RCLICK : { int item; HMENU h_popup = CreatePopupMenu( ); _dact *act = _create_act_thread( sel, -1, -1 ); _update_info_table( FALSE ); _activate_page( ); _set_timer(MAIN_TIMER, FALSE, FALSE); _refresh_menu( ); if ( ListView_GetSelectedCount( __lists[HMAIN_DRIVES] ) && !_is_root_item((LPARAM)sel) && _is_active_item((LPARAM)sel) ) { if ( mnt->info.status.flags & F_ENABLED ) { if ( mnt->info.status.flags & F_CDROM ) { AppendMenu( h_popup, MF_STRING, ID_VOLUMES_UNMOUNT, IDS_UNMOUNT ); } else { if ( mnt->info.status.flags & F_FORMATTING ) { AppendMenu( h_popup, MF_STRING, ID_VOLUMES_FORMAT, IDS_FORMAT ); } else { if ( IS_UNMOUNTABLE(&mnt->info.status) ) { AppendMenu( h_popup, MF_STRING, ID_VOLUMES_UNMOUNT, IDS_UNMOUNT ); } if ( !(mnt->info.status.flags & F_SYNC) ) { AppendMenu( h_popup, MF_SEPARATOR, 0, NULL ); AppendMenu( h_popup, MF_STRING, ID_VOLUMES_CHANGEPASS, IDS_CHPASS ); } if ( !(act && act->status == ACT_RUNNING) ) { if ( mnt->info.status.flags & F_SYNC ) { if ( GetMenuItemCount(h_popup) > 0 ) { AppendMenu( h_popup, MF_SEPARATOR, 0, NULL ); } AppendMenu( h_popup, MF_STRING, ID_VOLUMES_ENCRYPT, IDS_ENCRYPT ); } else { if ( GetMenuItemCount(h_popup) > 0 ) { AppendMenu( h_popup, MF_SEPARATOR, 0, NULL ); } AppendMenu( h_popup, MF_STRING, ID_VOLUMES_REENCRYPT, IDS_REENCRYPT ); } AppendMenu( h_popup, MF_STRING, ID_VOLUMES_DECRYPT, IDS_DECRYPT ); } } } } else { if ( mnt->info.status.flags & F_CDROM ) { if ( *mnt->fs == '\0' ) { AppendMenu( h_popup, MF_STRING, ID_VOLUMES_MOUNT, IDS_MOUNT ); } } else { if ( *mnt->fs == '\0' ) { AppendMenu( h_popup, MF_STRING, ID_VOLUMES_MOUNT, IDS_MOUNT ); } else { AppendMenu( h_popup, MF_STRING, ID_VOLUMES_ENCRYPT, IDS_ENCRYPT ); } if ( IS_UNMOUNTABLE(&mnt->info.status) ) { AppendMenu( h_popup, MF_SEPARATOR, 0, NULL ); AppendMenu( h_popup, MF_STRING, ID_VOLUMES_FORMAT, IDS_FORMAT ); } } } } /* _state_menu( popup, sel && sel->status.flags & F_LOCKED ? MF_GRAYED : MF_ENABLED ); */ item = TrackPopupMenu( h_popup, TPM_RETURNCMD | TPM_LEFTBUTTON, LOWORD(GetMessagePos( )), HIWORD(GetMessagePos( )), 0, hwnd, NULL ); DestroyMenu( h_popup ); switch ( item ) { case ID_VOLUMES_DECRYPT : _menu_decrypt(sel); break; case ID_VOLUMES_ENCRYPT : _menu_encrypt(sel); break; case ID_VOLUMES_FORMAT : _menu_format(sel); break; case ID_VOLUMES_REENCRYPT : _menu_reencrypt(sel); break; case ID_VOLUMES_UNMOUNT : _menu_unmount(sel); break; case ID_VOLUMES_MOUNT : _menu_mount(sel); break; case ID_VOLUMES_CHANGEPASS : _menu_change_pass(sel); break; } if ( item ) { _refresh( TRUE ); } _set_timer( MAIN_TIMER, TRUE, TRUE ); } break; case NM_CLICK : { sel = pv( _get_item_index( __lists[HMAIN_DRIVES], ((NM_LISTVIEW *)lparam)->iItem ) ); _update_info_table( FALSE ); _activate_page( ); _refresh_menu( ); } break; } } if ( ((NMHDR *)lparam)->code == HDN_ITEMCHANGED ) { InvalidateRect( __lists[HMAIN_DRIVES], NULL, TRUE ); } if ( ((NMHDR *)lparam)->code == HDN_ITEMCHANGING ) { return 0L; } if ( ((NMHDR *)lparam)->code == HDN_BEGINTRACK ) { return 1L; } } break; case WM_COMMAND: { _dnode *node = pv( _get_sel_item( __lists[HMAIN_DRIVES] ) ); switch (id) { case ID_SHIFT_TAB : case ID_TAB : { HWND h_current = GetFocus( ); HWND h_next = GetNextDlgTabItem( hwnd, h_current, id == ID_SHIFT_TAB ); SetFocus( h_next ); } break; case ID_TOOLS_DRIVER : { if ( __msg_q( __dlg, L"Remove DiskCryptor driver?") ) { int rlt; if ( (rlt = _drv_action(DA_REMOVE, 0)) != ST_OK ) { __error_s( __dlg, L"Error remove DiskCryptor driver", rlt ); } else { return 0L; } } } break; case ID_TOOLS_BENCHMARK : _dlg_benchmark( __dlg ); break; case ID_HELP_ABOUT : _dlg_about( __dlg ); break; case ID_HOMEPAGE : __execute( DC_HOMEPAGE ); break; case ID_EXIT : { SendMessage( hwnd, WM_CLOSE, 0, 1 ); } break; case IDC_BTN_WIZARD : _menu_wizard(node); break; case ID_VOLUMES_DELETE_MNTPOINT : { wchar_t *mnt_point = node->mnt.info.status.mnt_point; if ( __msg_q( __dlg, L"Are you sure you want to delete mount point [%s]?", mnt_point ) ) { _set_trailing_slash(mnt_point); DeleteVolumeMountPoint(mnt_point); } } break; case IDC_BTN_DECRYPT_ : case ID_VOLUMES_DECRYPT : _menu_decrypt( node ); break; case IDC_BTN_ENCRYPT_ : case ID_VOLUMES_ENCRYPT : _menu_encrypt( node ); break; case ID_VOLUMES_MOUNTALL : case IDC_BTN_MOUNTALL_ : _menu_mountall( ); break; case ID_VOLUMES_DISMOUNTALL : case IDC_BTN_UNMOUNTALL_ : _menu_unmountall( ); break; case ID_VOLUMES_DISMOUNT : _menu_unmount( node ); break; case ID_VOLUMES_MOUNT : _menu_mount( node ); break; case ID_VOLUMES_FORMAT : _menu_format(node); break; case ID_VOLUMES_REENCRYPT : _menu_reencrypt( node ); break; case ID_TOOLS_SETTINGS : _dlg_options( __dlg ); break; case ID_BOOT_OPTIONS : _dlg_config_loader( __dlg, FALSE ); break; case ID_VOLUMES_CHANGEPASS : _menu_change_pass( node ); break; case ID_TOOLS_CLEARCACHE : _menu_clear_cache( ); break; case ID_VOLUMES_BACKUPHEADER : _menu_backup_header( node ); break; case ID_VOLUMES_RESTOREHEADER : _menu_restore_header( node ); break; case ID_TOOLS_ENCRYPT_CD: _menu_encrypt_cd( ); break; } switch ( id ) { case IDC_BTN_MOUNT_: { node->mnt.info.status.flags & F_ENABLED ? _menu_unmount(node) : _menu_mount(node); } break; case ID_TOOLS_BSOD : { if ( __msg_q( __dlg, L"Crash?" ) ) { dc_get_bsod( ); } } break; } if ( id == IDCANCEL ) { ShowWindow(hwnd, SW_HIDE); } _refresh(TRUE); } break; case WM_CLOSE : { if ( lparam ) { _tray_icon(FALSE); EndDialog(hwnd, 0); ExitProcess(0); } else { ShowWindow(hwnd, SW_HIDE); } return 0L; } break; case WM_DESTROY : { PostQuitMessage(0); return 0L; } break; case WM_HOTKEY : { switch (wparam) { case 0 : { int mount_cnt; dc_mount_all(NULL, &mount_cnt, 0); } break; case 1 : dc_unmount_all( ); break; case 2 : dc_clean_pass_cache( ); break; case 3 : dc_get_bsod( ); break; } return 1L; } break; case WM_ENDSESSION : { if ( lparam & ENDSESSION_LOGOFF ) { if ( __config.conf_flags & CONF_DISMOUNT_LOGOFF ) { dc_unmount_all( ); } if ( __config.conf_flags & CONF_WIPEPAS_LOGOFF ) { dc_clean_pass_cache( ); } } } break; case WM_SYSCOLORCHANGE : { COLORREF cl_light = _cl( COLOR_BTNFACE, LGHT_CLR ); COLORREF cl_button = GetSysColor( COLOR_BTNFACE ); int k; for ( k = 0; k < countof(__lists); k++ ) { if ( ( __lists[k] != HWND_NULL ) && ( __lists[k] != NULL ) ) { ListView_SetBkColor( __lists[k], cl_button ); ListView_SetTextBkColor( __lists[k], cl_button ); ListView_SetExtendedListViewStyle( __lists[k], LVS_EX_FULLROWSELECT ); if ( !IsWindowEnabled( __lists[k] ) ) { // EnableWindow( __lists[k], TRUE ); // EnableWindow( __lists[k], FALSE ); } } } TreeView_SetBkColor( GetDlgItem(hwnd, IDC_TREE), cl_light ); ListView_SetBkColor( __lists[HMAIN_DRIVES], cl_light ); ListView_SetTextBkColor( __lists[HMAIN_DRIVES], cl_light ); ListView_SetExtendedListViewStyle( __lists[HMAIN_DRIVES], LVS_EX_FULLROWSELECT ); ListView_SetImageList( __lists[HMAIN_DRIVES], __dsk_img, LVSIL_SMALL ); } break; case WM_APP + WM_APP_TRAY : { switch ( lparam ) { case WM_LBUTTONDOWN : { BOOL show = !IsWindowVisible(hwnd); ShowWindow(hwnd, show ? SW_SHOW : SW_HIDE); if ( show ) { SetForegroundWindow(hwnd); } } break; case WM_RBUTTONDOWN : { POINT pt; int item; HMENU menu = CreatePopupMenu( ); AppendMenu( menu, MF_STRING, ID_VOLUMES_UNMOUNTALL, IDS_UNMOUNTALL ); AppendMenu( menu, MF_STRING, ID_VOLUMES_MOUNTALL, IDS_MOUNTALL ); AppendMenu( menu, MF_SEPARATOR, 0, NULL ); AppendMenu( menu, MF_STRING, ID_TOOLS_SETTINGS, IDS_SETTINGS ); AppendMenu( menu, MF_STRING, ID_HELP_ABOUT, IDS_ABOUT ); AppendMenu( menu, MF_SEPARATOR, 0, NULL ); AppendMenu( menu, MF_STRING, ID_EXIT, IDS_EXIT ); GetCursorPos(&pt); SetForegroundWindow( hwnd ); item = TrackPopupMenu ( menu, TPM_RETURNCMD | TPM_LEFTALIGN | TPM_BOTTOMALIGN | TPM_RIGHTBUTTON, pt.x, pt.y, 0, hwnd, NULL ); DestroyMenu( menu ); switch (item) { case ID_VOLUMES_UNMOUNTALL : _menu_unmountall( ); break; case ID_VOLUMES_MOUNTALL : _menu_mountall( ); break; case ID_HELP_ABOUT : _dlg_about( HWND_DESKTOP ); break; case ID_TOOLS_SETTINGS : _dlg_options( __dlg ); break; case ID_EXIT : { SendMessage(hwnd, WM_CLOSE, 0, 1); } break; } } break; } } break; default: { int rlt = _draw_proc( message, lparam ); if (rlt != -1) { return rlt; } } } return 0L; }
// // FUNCTION: WndProc(HWND, UINT, WPARAM, LPARAM) // // PURPOSE: Processes messages for the main window. // // WM_DESTROY - post a quit message and return // // LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { switch (message) { /* case WM_COMMAND: { int wmId = LOWORD(wParam); // Parse the menu selections: switch (wmId) { case IDM_ABOUT: DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, About); break; default: return DefWindowProc(hWnd, message, wParam, lParam); } } break;*/ case WM_CREATE : // Creating the contextual menu systrayMenu = CreatePopupMenu(); //AppendMenu(systrayMenu, MF_SEPARATOR, TRAYCONTEXTMENU_SEPARATOR, NULL); AppendMenu(systrayMenu, MF_STRING, TRAYCONTEXTMENU_EXIT, TEXT("Exit")); case WM_TRAYICON: if (lParam == WM_RBUTTONUP) { // Show the contextual menu // Getting the cursor position POINT curPoint; GetCursorPos(&curPoint); // There is a bug in windows that requires us to do that in order for the // contextual menu to vanish properly SetForegroundWindow(hWnd); UINT clicked = TrackPopupMenu( systrayMenu, TPM_RETURNCMD // Does not send notification when a menu item is clicked | TPM_NONOTIFY, // The function returns the menu item identifier of the user's selection in the return value. curPoint.x, curPoint.y, 0, hWnd, NULL ); PostMessage(hWnd, WM_NULL, 0, 0); // Bugfix to properly hide the contextual menu switch (clicked) { case TRAYCONTEXTMENU_EXIT: cleanAndExit(); break; } } case WM_HOTKEY: if (wParam == HOTKEY_GUID) { toggleCursorClipping(); } break; case WM_DESTROY: cleanAndExit(); break; default: return DefWindowProc(hWnd, message, wParam, lParam); } return 0; }
static void sInitMenu() { HMENU hMenu = CreateMenu(); HMENU hMenuPopup = CreateMenu(); AppendMenu(hMenuPopup, MF_STRING, IDM_NEW, TEXT("&New")); AppendMenu(hMenuPopup, MF_STRING, IDM_OPEN, TEXT("&Open...")); AppendMenu(hMenuPopup, MF_SEPARATOR, 0, NULL); AppendMenu(hMenuPopup, MF_STRING, IDM_SAVE, TEXT("&Save")); AppendMenu(hMenuPopup, MF_STRING, IDM_SAVEAS, TEXT("Save &As...")); AppendMenu(hMenuPopup, MF_SEPARATOR, 0, NULL); AppendMenu(hMenuPopup, MF_STRING, IDM_PROPERTIES, TEXT("Properties")); AppendMenu(hMenuPopup, MF_SEPARATOR, 0, NULL); AppendMenu(hMenuPopup, MF_STRING, IDM_PRINT, TEXT("&Print")); AppendMenu(hMenuPopup, MF_STRING, IDM_PRINTSETUP, TEXT("Print Setup")); AppendMenu(hMenuPopup, MF_SEPARATOR, 0, NULL); AppendMenu(hMenuPopup, MF_STRING, IDM_CLOSE, TEXT("&Close")); AppendMenu(hMenuPopup, MF_SEPARATOR, 0, NULL); AppendMenu(hMenuPopup, MF_STRING, IDM_EXIT, TEXT("E&xit")); AppendMenu(hMenu, MF_POPUP, (UINT_PTR)hMenuPopup, TEXT("&File")); hMenuPopup = CreateMenu(); AppendMenu(hMenuPopup, MF_STRING, IDM_UNDO, TEXT("&Undo")); AppendMenu(hMenuPopup, MF_STRING, IDM_REDO, TEXT("&Redo")); AppendMenu(hMenuPopup, MF_SEPARATOR, 0, NULL); AppendMenu(hMenuPopup, MF_STRING, IDM_CUT, TEXT("Cu&t")); AppendMenu(hMenuPopup, MF_STRING, IDM_COPY,TEXT("&Copy")); AppendMenu(hMenuPopup, MF_STRING, IDM_PASTE,TEXT("&Paste")); AppendMenu(hMenuPopup, MF_STRING, IDM_CLEAR,TEXT("De&lete")); AppendMenu(hMenuPopup, MF_SEPARATOR, 0, NULL); AppendMenu(hMenuPopup, MF_STRING, IDM_SELECTALL, TEXT("Select &All")); AppendMenu(hMenu, MF_POPUP, (UINT_PTR)hMenuPopup, TEXT("&Edit")); hMenuPopup = CreateMenu(); AppendMenu(hMenuPopup, MF_STRING, IDM_FIND, TEXT("&Find")); AppendMenu(hMenuPopup, MF_STRING, IDM_REPLACE, TEXT("&Replace")); AppendMenu(hMenu, MF_POPUP, (UINT_PTR)hMenuPopup, TEXT("&Search")); hMenuPopup = CreateMenu(); AppendMenu(hMenuPopup, MF_STRING, IDM_OPTIONS, TEXT("&Options")); AppendMenu(hMenu, MF_POPUP, (UINT_PTR)hMenuPopup, TEXT("&Tools")); hMenuPopup = CreateMenu(); AppendMenu(hMenuPopup, MF_STRING, IDM_ABOUT, TEXT("&About")); AppendMenu(hMenu, MF_POPUP, (UINT_PTR)hMenuPopup, TEXT("&Help")); SetMenu(gHwndFrame, hMenu); }
static LRESULT CALLBACK WindowProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) { static SERVICE_TABLE_ENTRY service_table[] = { {server_name, (LPSERVICE_MAIN_FUNCTION) ServiceMain}, {NULL, NULL} }; int service_installed; char buf[200], *service_argv[] = {__argv[0], NULL}; POINT pt; HMENU hMenu; switch (msg) { case WM_CREATE: if (__argv[1] != NULL && !strcmp(__argv[1], service_magic_argument)) { start_mongoose(1, service_argv); StartServiceCtrlDispatcher(service_table); exit(EXIT_SUCCESS); } else { start_mongoose(__argc, __argv); } break; case WM_COMMAND: switch (LOWORD(wParam)) { case ID_QUIT: mg_stop(ctx); Shell_NotifyIcon(NIM_DELETE, &TrayIcon); PostQuitMessage(0); break; case ID_EDIT_CONFIG: edit_config_file(); break; case ID_INSTALL_SERVICE: case ID_REMOVE_SERVICE: manage_service(LOWORD(wParam)); break; } break; case WM_USER: switch (lParam) { case WM_RBUTTONUP: case WM_LBUTTONUP: case WM_LBUTTONDBLCLK: hMenu = CreatePopupMenu(); AppendMenu(hMenu, MF_STRING | MF_GRAYED, ID_SEPARATOR, server_name); AppendMenu(hMenu, MF_SEPARATOR, ID_SEPARATOR, ""); service_installed = manage_service(0); snprintf(buf, sizeof(buf), "NT service: %s installed", service_installed ? "" : "not"); AppendMenu(hMenu, MF_STRING | MF_GRAYED, ID_SEPARATOR, buf); AppendMenu(hMenu, MF_STRING | (service_installed ? MF_GRAYED : 0), ID_INSTALL_SERVICE, "Install service"); AppendMenu(hMenu, MF_STRING | (!service_installed ? MF_GRAYED : 0), ID_REMOVE_SERVICE, "Deinstall service"); AppendMenu(hMenu, MF_SEPARATOR, ID_SEPARATOR, ""); AppendMenu(hMenu, MF_STRING, ID_EDIT_CONFIG, "Edit config file"); AppendMenu(hMenu, MF_STRING, ID_QUIT, "Exit"); GetCursorPos(&pt); SetForegroundWindow(hWnd); TrackPopupMenu(hMenu, 0, pt.x, pt.y, 0, hWnd, NULL); PostMessage(hWnd, WM_NULL, 0, 0); DestroyMenu(hMenu); break; } break; case WM_CLOSE: mg_stop(ctx); Shell_NotifyIcon(NIM_DELETE, &TrayIcon); PostQuitMessage(0); return 0; // We've just sent our own quit message, with proper hwnd. } return DefWindowProc(hWnd, msg, wParam, lParam); }
PWBOBJ wbCreateMenu(PWBOBJ pwboParent, PWBITEM pitem[], int nItems) { int i; MENUITEMINFO mi; PWBOBJ pwbo; HMENU hMenu, hPopup = NULL; LPCTSTR pszLastPopup = NULL; if(!pwboParent || !pwboParent->hwnd || !IsWindow(pwboParent->hwnd)) return NULL; // Start building the menu hMenu = CreateMenu(); for(i = 0; i < nItems; i++) { if(!pitem[i]) { AppendMenu(hPopup, MF_SEPARATOR, 0, NULL); } else if(!pitem[i]->id) { if(pitem[i]->pszCaption && *pitem[i]->pszCaption) { // Attach a pop-up menu to a top-level menu if(hPopup && pszLastPopup) { AppendMenu(hMenu, MF_POPUP, (UINT)hPopup, pszLastPopup); } hPopup = CreateMenu(); pszLastPopup = pitem[i]->pszCaption; } else { // Separator AppendMenu(hPopup, MF_SEPARATOR, 0, NULL); } } else { if(pitem[i]->pszCaption && *pitem[i]->pszCaption) { // Create a submenu item AppendMenu(hPopup, MF_STRING, pitem[i]->id, pitem[i]->pszCaption); if(pitem[i]->pszImage && *pitem[i]->pszImage) { HBITMAP hImage = wbLoadImage(pitem[i]->pszImage, 0, 0); if(hImage) SetMenuItemBitmaps(hPopup, pitem[i]->id, MF_BYCOMMAND, hImage, hImage); } } } } // Create last first-level menu if(hPopup && pszLastPopup) { AppendMenu(hMenu, MF_POPUP, (UINT)hPopup, pszLastPopup); } // Attach the menu to the window pwbo = wbMalloc(sizeof(WBOBJ)); pwbo->hwnd = (HWND)hMenu; pwbo->id = 0; pwbo->uClass = Menu; pwbo->item = -1; pwbo->subitem = -1; pwbo->style = 0; pwbo->pszCallBackFn = NULL; pwbo->pszCallBackObj = NULL; pwbo->lparam = 0; pwbo->parent = pwboParent; // ********* DOESN'T WORK mi.dwItemData = (DWORD)pwbo; SetMenuItemInfo((HMENU)pwbo->hwnd, 0, TRUE, &mi); // ********* DOESN'T WORK SetMenu(pwboParent->hwnd, hMenu); return pwbo; }
LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) { switch (msg) { case WM_CREATE: { hWndListOne = CreateWindow(L"listbox", NULL, WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS | WS_BORDER | WS_VSCROLL | LBS_NOTIFY, 5, 10, 380, 430, hWnd, (HMENU)ID_LISTONE, hInst, NULL); hWndListTwo = CreateWindow(L"listbox", NULL, WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS | WS_BORDER | WS_VSCROLL | LBS_NOTIFY, 390, 10, 380, 430, hWnd, (HMENU)ID_LISTONE, hInst, NULL); GetProcess(true); }; return 0; case WM_COMMAND: { UINT code = HIWORD(wParam); UINT idCtrl = LOWORD(wParam); int j = 0; switch (idCtrl) { case ID_HIGH: SetPriority(HIGH_PRIORITY_CLASS); break; case ID_IDLE: SetPriority(IDLE_PRIORITY_CLASS); break; case ID_NORMAL: SetPriority(NORMAL_PRIORITY_CLASS); break; case ID_REALTIME: SetPriority(REALTIME_PRIORITY_CLASS); break; case ID_LISTONE: if (code == LBN_DBLCLK) { SendMessage(hWndListTwo, LB_RESETCONTENT, 0, 0); i = SendMessage(hWndListOne, LB_GETCURSEL, 0, 0); if(i<=1024&&i>=0) PrintModules(twar[i]); } break; } }; return 0; case WM_CONTEXTMENU: { HMENU hMenu = CreatePopupMenu(); AppendMenu(hMenu, MFT_STRING, ID_HIGH, L"HIGH"); AppendMenu(hMenu, MFT_STRING, ID_IDLE, L"IDLE"); AppendMenu(hMenu, MFT_STRING, ID_NORMAL, L"NORMAL"); AppendMenu(hMenu, MFT_STRING, ID_REALTIME, L"REALTIME"); TrackPopupMenu(hMenu, TPM_RIGHTBUTTON | TPM_TOPALIGN | TPM_LEFTALIGN, LOWORD(lParam), HIWORD(lParam), 0, hWnd, NULL); DestroyMenu(hMenu); } break; case WM_DESTROY: { PostQuitMessage(0); } break; default: return DefWindowProc(hWnd, msg, wParam, lParam); } return 0; }