void CTEKWindow::OnLButtonDown(UINT nFlags, CPoint point) { POINT p; HMENU PopupMenu, PopupBase; p.x = point.x; p.y = point.y; // popup menu if (ControlKey() && (MainMenu==NULL)) { InitMenu(&PopupMenu); InitMenuPopup(EditMenu); if (WinMenu!=NULL) { InitMenuPopup(WinMenu); } PopupBase = CreatePopupMenu(); get_lang_msg("MENU_CONTROL", ts.UIMsg, sizeof(ts.UIMsg), "&File", ts.UILanguageFile); AppendMenu(PopupBase, MF_STRING | MF_ENABLED | MF_POPUP, (UINT)GetSubMenu(PopupMenu,0), ts.UIMsg); get_lang_msg("TEKMENU_EDIT", ts.UIMsg, sizeof(ts.UIMsg), "&Edit", ts.UILanguageFile); AppendMenu(PopupBase, MF_STRING | MF_ENABLED | MF_POPUP, (UINT)EditMenu, ts.UIMsg); get_lang_msg("TEKMENU_SETUP", ts.UIMsg, sizeof(ts.UIMsg), "&Setup", ts.UILanguageFile); AppendMenu(PopupBase, MF_STRING | MF_ENABLED | MF_POPUP, (UINT)GetSubMenu(PopupMenu,2), ts.UIMsg); get_lang_msg("TEKMENU_VTWIN", ts.UIMsg, sizeof(ts.UIMsg), "VT-Wind&ow", ts.UILanguageFile); AppendMenu(PopupBase, MF_STRING | MF_ENABLED, ID_TEKVTWIN, ts.UIMsg); if (WinMenu!=NULL) { get_lang_msg("TEKMENU_WINDOW", ts.UIMsg, sizeof(ts.UIMsg), "&Window", ts.UILanguageFile); AppendMenu(PopupBase, MF_STRING | MF_ENABLED | MF_POPUP, (UINT)WinMenu, ts.UIMsg); } get_lang_msg("TEKMENU_HELP", ts.UIMsg, sizeof(ts.UIMsg), "&Help", ts.UILanguageFile); AppendMenu(PopupBase, MF_STRING | MF_ENABLED | MF_POPUP, (UINT)GetSubMenu(PopupMenu,4), ts.UIMsg); ::ClientToScreen(tk.HWin, &p); TrackPopupMenu(PopupBase,TPM_LEFTALIGN | TPM_LEFTBUTTON, p.x,p.y,0,tk.HWin,NULL); if (WinMenu!=NULL) { DestroyMenu(WinMenu); WinMenu = NULL; } DestroyMenu(PopupBase); DestroyMenu(PopupMenu); return; } TEKWMLButtonDown(&tk,&ts,&cv,p); }
HMENU LoadMenuGeneric(HANDLE inst, char *name) { HMENU result = LoadMenu(inst, name); if (result) InitMenuPopup(result); return result; }
void CTEKWindow::OnInitMenuPopup(CMenu* pPopupMenu, UINT nIndex, BOOL bSysMenu) { InitMenuPopup(pPopupMenu->m_hMenu); }
static LRESULT WINAPI MainWndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { switch(uMsg) { case WM_CREATE: { TEXTMETRICW tm; HDC hDC = GetDC(hWnd); /* * Note that the method with GetObjectW just returns * the original parameters with which the font was created. */ if (GetTextMetricsW(hDC, &tm)) { Globals.CharWidth = tm.tmMaxCharWidth; // tm.tmAveCharWidth; Globals.CharHeight = tm.tmHeight + tm.tmExternalLeading; } ReleaseDC(hWnd, hDC); Globals.hMenu = GetMenu(hWnd); Globals.hWndNext = SetClipboardViewer(hWnd); // For now, the Help dialog item is disabled because of lacking of HTML support EnableMenuItem(Globals.hMenu, CMD_HELP, MF_BYCOMMAND | MF_GRAYED); UpdateLinesToScroll(&Scrollstate); UpdateDisplayMenu(); SetDisplayFormat(0); DragAcceptFiles(hWnd, TRUE); break; } case WM_CLOSE: { DestroyWindow(hWnd); break; } case WM_DESTROY: { ChangeClipboardChain(hWnd, Globals.hWndNext); if (Globals.uDisplayFormat == CF_OWNERDISPLAY) { HGLOBAL hglb; PRECT prc; hglb = GlobalAlloc(GMEM_MOVEABLE, sizeof(*prc)); if (hglb) { prc = GlobalLock(hglb); SetRectEmpty(prc); GlobalUnlock(hglb); SendClipboardOwnerMessage(TRUE, WM_SIZECLIPBOARD, (WPARAM)hWnd, (LPARAM)hglb); GlobalFree(hglb); } } PostQuitMessage(0); break; } case WM_PAINT: { OnPaint(hWnd, wParam, lParam); break; } case WM_KEYDOWN: { OnKeyScroll(hWnd, wParam, lParam, &Scrollstate); break; } case WM_MOUSEWHEEL: case WM_MOUSEHWHEEL: { OnMouseScroll(hWnd, uMsg, wParam, lParam, &Scrollstate); break; } case WM_HSCROLL: { // NOTE: Windows uses an offset of 16 pixels OnScroll(hWnd, SB_HORZ, wParam, 5, &Scrollstate); break; } case WM_VSCROLL: { // NOTE: Windows uses an offset of 16 pixels OnScroll(hWnd, SB_VERT, wParam, 5, &Scrollstate); break; } case WM_SIZE: { RECT rc; if (Globals.uDisplayFormat == CF_OWNERDISPLAY) { HGLOBAL hglb; PRECT prc; hglb = GlobalAlloc(GMEM_MOVEABLE, sizeof(*prc)); if (hglb) { prc = GlobalLock(hglb); if (wParam == SIZE_MINIMIZED) SetRectEmpty(prc); else GetClientRect(hWnd, prc); GlobalUnlock(hglb); SendClipboardOwnerMessage(TRUE, WM_SIZECLIPBOARD, (WPARAM)hWnd, (LPARAM)hglb); GlobalFree(hglb); } break; } GetClipboardDataDimensions(Globals.uDisplayFormat, &rc); UpdateWindowScrollState(hWnd, rc.right, rc.bottom, &Scrollstate); // NOTE: There still are little problems drawing // the background when displaying clipboard text. if (!IsClipboardFormatSupported(Globals.uDisplayFormat) || Globals.uDisplayFormat == CF_DSPTEXT || Globals.uDisplayFormat == CF_TEXT || Globals.uDisplayFormat == CF_OEMTEXT || Globals.uDisplayFormat == CF_UNICODETEXT) { InvalidateRect(Globals.hMainWnd, NULL, TRUE); } else { InvalidateRect(Globals.hMainWnd, NULL, FALSE); } break; } case WM_CHANGECBCHAIN: { /* Transmit through the clipboard viewer chain */ if ((HWND)wParam == Globals.hWndNext) { Globals.hWndNext = (HWND)lParam; } else if (Globals.hWndNext != NULL) { SendMessageW(Globals.hWndNext, uMsg, wParam, lParam); } break; } case WM_DESTROYCLIPBOARD: break; case WM_RENDERALLFORMATS: { /* * When the user has cleared the clipboard via the DELETE command, * we (clipboard viewer) become the clipboard owner. When we are * subsequently closed, this message is then sent to us so that * we get a chance to render everything we can. Since we don't have * anything to render, just empty the clipboard. */ DeleteClipboardContent(); break; } case WM_RENDERFORMAT: // TODO! break; case WM_DRAWCLIPBOARD: { UpdateDisplayMenu(); SetDisplayFormat(0); /* Pass the message to the next window in clipboard viewer chain */ SendMessageW(Globals.hWndNext, uMsg, wParam, lParam); break; } case WM_COMMAND: { if ((LOWORD(wParam) > CMD_AUTOMATIC)) { SetDisplayFormat(LOWORD(wParam) - CMD_AUTOMATIC); } else { OnCommand(hWnd, uMsg, wParam, lParam); } break; } case WM_INITMENUPOPUP: { InitMenuPopup((HMENU)wParam, lParam); break; } case WM_DROPFILES: { LoadClipboardFromDrop((HDROP)wParam); break; } case WM_PALETTECHANGED: { /* Ignore if this comes from ourselves */ if ((HWND)wParam == hWnd) break; /* Fall back to WM_QUERYNEWPALETTE */ } case WM_QUERYNEWPALETTE: { BOOL Success; HDC hDC; if (!OpenClipboard(Globals.hMainWnd)) return FALSE; hDC = GetDC(hWnd); if (!hDC) { CloseClipboard(); return FALSE; } Success = RealizeClipboardPalette(hDC); ReleaseDC(hWnd, hDC); CloseClipboard(); if (Success) { InvalidateRect(hWnd, NULL, TRUE); UpdateWindow(hWnd); return TRUE; } return FALSE; } case WM_SYSCOLORCHANGE: { SetDisplayFormat(Globals.uDisplayFormat); break; } case WM_SETTINGCHANGE: { if (wParam == SPI_SETWHEELSCROLLLINES) { UpdateLinesToScroll(&Scrollstate); } break; } default: { return DefWindowProc(hWnd, uMsg, wParam, lParam); } } return 0; }