Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

ENTER и ESC в диалоговом окне

8.4K
22 августа 2006 года
Sir
52 / / 28.07.2006
Подскажите, пожалуйста, как решить следующую проблему.

Сделал главное окно диалоговым:
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
DialogBox(hInstance, MAKEINTRESOURCE(IDD_MAINWINDOW), NULL, MainWindowDlgProc);
return 0;
}

Как сделать так, чтобы по нажатию ENTER или ESC диалоговое окно не закрывалось?

В диалоговой процедуре MainWindowDlgProc() WM_KEYDOWN проходит для большинства клавиш, но не для ENTER и ESC. Насколько я понимаю их обрабатывает встроенная в виндовскую библиотеку функция dialog box manager (см. MSDN : Dialog Box Keyboard Interface) и переводит их в WM_COMMAND (IDOK или IDCANCEL). Поэтому внутри MainWindowDlgProc() нажатие на ENTER или ESC отловить нельзя. Где и как это можно сделать?

Хотелось бы, чтобы окно закрывалось только по Alt+F4 или крестику.
354
22 августа 2006 года
ШпиЁн
468 / / 19.02.2006
Честное слово, у меня такой проблемы нету, я Win32 Project полюбил :-)))) ни разу ничего подобного не замечал.
1.8K
22 августа 2006 года
Death Knight
139 / / 19.02.2006
Попробуй так через WM_CHAR

case WM_CHAR:
if (LOWORD(wParam)==13)
{
//Что будет происходить по нажатию на Enter
break;
}
if (LOWORD(wParam)==27
{
//Что будет происходить по нажатию на ESC
break;
}
break;

Код сишный...
8.4K
22 августа 2006 года
Sir
52 / / 28.07.2006
[QUOTE=Death Knight]Попробуй так через WM_CHAR

case WM_CHAR:
if (LOWORD(wParam)==13)
{
//Что будет происходить по нажатию на Enter
break;
}
if (LOWORD(wParam)==27
{
//Что будет происходить по нажатию на ESC
break;
}
break;

Код сишный...[/QUOTE]

не работает
8.4K
22 августа 2006 года
Sir
52 / / 28.07.2006
[QUOTE=ШпиЁн]Честное слово, у меня такой проблемы нету, я Win32 Project полюбил :-)))) ни разу ничего подобного не замечал.[/QUOTE]
ШпиЁн, у меня теперь тоже Win32API.

Ты ведь мастер в Win32API. Ты знаешь как решить эту проблему?
562
22 августа 2006 года
tarekon
175 / / 19.08.2003
Найди в MSDN тему Subclassing. Поможет.
354
23 августа 2006 года
ШпиЁн
468 / / 19.02.2006
Sir, в Win32 API я ни разу с этим не сталкивался, помочь врядли смогу.

вот какой код у меня, и он работает нормально, если нажмешь на enter\escape программа вообще не среагирует.
Код:
#include <windows.h>
#include <windowsx.h>
#include "resource.h"

void Dlg_Close(HWND hwnd)
{
   EndDialog(hwnd, 0);
}

BOOL Dlg_OnInitDialog(HWND hwnd, HWND hwndFocus, LPARAM lParam)
{  
    return true;
}

void Dlg_OnCommand(HWND hwnd, int id, HWND hwndCtl, UINT codeNotify)
{
    switch (id)
    {
        case IDC_BUTTON1:
        {
            break;
        }
        default: break;
    }
}

INT_PTR WINAPI Dlg_Proc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
    switch (uMsg)
    {
        HANDLE_MSG(hwnd, WM_INITDIALOG, Dlg_OnInitDialog);
        HANDLE_MSG(hwnd, WM_COMMAND,    Dlg_OnCommand);
        HANDLE_MSG(hwnd, WM_CLOSE,  Dlg_Close);
    }
return 0;
}

int WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int)
{
    DialogBox(GetModuleHandle(NULL), MAKEINTRESOURCE(IDD_DIALOG1), NULL, Dlg_Proc);
    return 0;
}


когда я писал под mfc(приспичило), там эта проблема была :-))))
Класс CDialog имеет две виртуальные функции: OnOK() и OnCancel() которые вызываются при нажатии Enter или Escape внутри диалога. Я переопределил эти 2 виртуальные функции(OnOK() вообще оставил пустой) Для этого:
virtual void OnOK();
virtual void OnCancel(); - это я дописал в классе диалога
Реализация в классе -
void CTestDialog::OnOK()
{
....
}
void CTestDialog::OnCancel()
{
....
}

Сбрось сюда код, я посмотрю хоть :-)))))
8.4K
23 августа 2006 года
Sir
52 / / 28.07.2006
ШпиЁн, до того, как я прочитал твое сообщение, я сделал такой вариант:

case WM_SYSCOMMAND:
if (wParam == SC_CLOSE)
{
EndDialog(hDlg, IDCANCEL);
return TRUE;
}
break;

(я не использую макрос HANDLE_MSG)

Но твой вариант красивее:

case WM_CLOSE:
EndDialog(hDlg, IDCANCEL);
return TRUE;

Так что спасибо!

А я MFC забросил:) Теперь учусь Win32API. Это действительно круче.

Кстати в MFC эту проблему я решал так: (например, чтобы отключить ESC)
BOOL CTestDialog::PreTranslateMessage(MSG* pMsg)
{
if ( (pMsg->message==WM_KEYDOWN) && (pMsg->wParam == VK_ESCAPE) )
return TRUE;

return CDialog::PreTranslateMessage(pMsg);
}
В PreTranslateMessage можно поймать все сообщения, идущие к окну.

Всем спасибо, тема закрыта!
Отдельное спасибо ШпиЁну, который всегда помогает.
354
23 августа 2006 года
ШпиЁн
468 / / 19.02.2006
Вот, порылся в исходниках, нашел еще вот что, тоже mfc.
Код:
BOOL CTestDlg::PreTranslateMessage(MSG* pMsg)
{
    switch ( pMsg->message)
    {
    case WM_KEYDOWN:
        switch( pMsg->wParam)
        {
            case VK_RETURN:
            {
                return true;
            }
            case VK_ESCAPE:
            {
                return true;
            }
        }
    }

    return CDialog::PreTranslateMessage(pMsg);
}

реакция на Enter\Escape у формы пропадает вообще :-)))) пример во вложении.
354
23 августа 2006 года
ШпиЁн
468 / / 19.02.2006
:-)))))))))))
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог