winapi - богатый контроль редактирования - как вставить текст с помощью контекстного меню - PullRequest
0 голосов
/ 10 января 2020

Я создаю окно редактирования следующим образом:

hwndEdit = CreateWindowEx(
   0, 
   MSFTEDIT_CLASS, 
   TEXT("EDIT"),
   WS_BORDER | WS_CHILD | ES_LEFT,
   20, 
   20, 
   100,
   30,
   gHwnd, 
   NULL, 
   hInst, 
   NULL);

Я могу вставить текст, используя сочетание клавиш (ctrl + v), но когда я использую правую кнопку мыши, контекстное меню не отображается (для стандартное управление редактирования это работает). Я не мог найти пример кода c / c ++. Как включить / реализовать контекстное меню для расширенного редактирования?

1 Ответ

1 голос
/ 13 января 2020

Похоже, что вы создали собственное окно редактирования.

Вы можете обрабатывать щелчок правой кнопкой мыши в окне редактирования, проверяя WM_CONTEXTMENU в вашем WndPro c.

Захватите дескриптор окна через параметр wParam, сравните его с окном редактирования, чтобы увидеть, щелкнул ли пользователь правой кнопкой мыши в окне редактирования.

Оттуда создайте popupmenu через CreatePopupMenu ( ) .

Вставить / добавить в меню с помощью InsertMenu () / AppendMenu () .

Наконец, вызовите TrackPopupMenu () .

Код:

#define IDC_PASTE 102

case WM_CONTEXTMENU:
        if ((HWND)wParam == hwndEdit) 
        {
            m_hMenu = CreatePopupMenu();
            InsertMenu(m_hMenu, 0, MF_BYCOMMAND | MF_STRING | MF_ENABLED, IDC_PASTE, L"Paste");
            TrackPopupMenu(m_hMenu, TPM_TOPALIGN | TPM_LEFTALIGN, GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam), 0, hWnd, NULL);
    }

Далее необходимо обработать сообщение вставки. Как видно из проблемы, ярлык вставки по-прежнему полезен, поэтому вы можете использовать SendInput для имитации вставки.

Код:

 case WM_COMMAND:
        {
            int wmId = LOWORD(wParam);
            // Parse the menu selections:
            switch (wmId)
            {
            case IDC_PASTE:
            {
                SetForegroundWindow(hwndEdit);
                INPUT ip;
                ip.type = INPUT_KEYBOARD;
                ip.ki.wScan = 0;
                ip.ki.time = 0;
                ip.ki.dwExtraInfo = 0;
                // Press the "Ctrl" key
                ip.ki.wVk = VK_CONTROL;
                ip.ki.dwFlags = 0; // 0 for key press
                SendInput(1, &ip, sizeof(INPUT));

                // Press the "V" key
                ip.ki.wVk = 'V';
                ip.ki.dwFlags = 0; // 0 for key press
                SendInput(1, &ip, sizeof(INPUT));

                // Release the "V" key
                ip.ki.wVk = 'V';
                ip.ki.dwFlags = KEYEVENTF_KEYUP;
                SendInput(1, &ip, sizeof(INPUT));

                // Release the "Ctrl" key
                ip.ki.wVk = VK_CONTROL;
                ip.ki.dwFlags = KEYEVENTF_KEYUP;
                SendInput(1, &ip, sizeof(INPUT));
            }
            break;
            ...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...