Информация об изменениях

Сообщение Re: свой контрол и wm_cut/wm_copy/wm_clear/wm_paste от 28.11.2018 17:08

Изменено 28.11.2018 17:15 Evgeniy Skvortsov

Re: свой контрол и wm_cut/wm_copy/wm_clear/wm_paste
Здравствуйте, CEMb, Вы писали:

CEM>Такой вопрос, в свою оконную процедуру прилетает WM_KEYDOWN (Ctrl key) + WM_CHAR (что-то странное) вместо WM_CUT/WM_COPY при нажатии Ctrl+X/Ctrl+C


CEM>Что-то сходу не соображу, что сделать, чтобы в окно стали лететь сообщения?

CEM>Пока писал, подумал: IsDialogMessage, возможно…

Интересно стало, глянул исходники винды (ну те старые которые утекли сто лет назад)
В общем EDIT контрол сам себе шлет эти сообщения. Банально в обработчике WM_KEYDOWN проверяет нажат ли Ctrl и ставит флаг, и дальше в обработчике WM_CHAR проверяет что если нажата комбинация Ctrl-X и прочее, то шлет сам себе WM_CUT

Так что это не в винду глобальная особенность встроена, а просто так сам EDIT контрол реализован. У себя сделай так же. Отлавливай эти нажатия и шли своему окну эти сообщения.
Re: свой контрол и wm_cut/wm_copy/wm_clear/wm_paste
Здравствуйте, CEMb, Вы писали:

CEM>Такой вопрос, в свою оконную процедуру прилетает WM_KEYDOWN (Ctrl key) + WM_CHAR (что-то странное) вместо WM_CUT/WM_COPY при нажатии Ctrl+X/Ctrl+C


CEM>Что-то сходу не соображу, что сделать, чтобы в окно стали лететь сообщения?

CEM>Пока писал, подумал: IsDialogMessage, возможно…

Интересно стало, глянул исходники винды (ну те старые которые утекли сто лет назад)
В общем EDIT контрол сам себе шлет эти сообщения. Банально в обработчике WM_KEYDOWN проверяет нажат ли Ctrl и ставит флаг, и дальше в обработчике WM_CHAR проверяет что если нажата комбинация Ctrl-X и прочее, то шлет сам себе WM_CUT
  кусок исходника Windows_2000_source_code\private\ntos\w32\ntuser\client\editml.c
    /*
     * Handle key codes
     */
    switch(keyPress) {
    UINT msg;

    // Ctrl+Z == Undo
    case 26:
        msg = WM_UNDO;
        goto SendEditingMessage;
        break;

    // Ctrl+X == Cut
    case 24:
        if (ped->ichMinSel == ped->ichMaxSel)
            goto IllegalChar;
        else
        {
            msg = WM_CUT;
            goto SendEditingMessage;
        }
        break;

    // Ctrl+C == Copy
    case 3:
        msg = WM_COPY;
        goto SendEditingMessage;
        break;

    // Ctrl+V == Paste
    case 22:
        msg = WM_PASTE;
SendEditingMessage:
        SendMessage(ped->hwnd, msg, 0, 0L);
        break;


Так что это не в винду глобальная особенность встроена, а просто так сам EDIT контрол реализован. У себя сделай так же. Отлавливай эти нажатия и шли своему окну эти сообщения.