#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;
}
ENTER и ESC в диалоговом окне
Сделал главное окно диалоговым:
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 или крестику.
Честное слово, у меня такой проблемы нету, я Win32 Project полюбил :-)))) ни разу ничего подобного не замечал.
case WM_CHAR:
if (LOWORD(wParam)==13)
{
//Что будет происходить по нажатию на Enter
break;
}
if (LOWORD(wParam)==27
{
//Что будет происходить по нажатию на ESC
break;
}
break;
Код сишный...
case WM_CHAR:
if (LOWORD(wParam)==13)
{
//Что будет происходить по нажатию на Enter
break;
}
if (LOWORD(wParam)==27
{
//Что будет происходить по нажатию на ESC
break;
}
break;
Код сишный...[/QUOTE]
не работает
ШпиЁн, у меня теперь тоже Win32API.
Ты ведь мастер в Win32API. Ты знаешь как решить эту проблему?
Найди в MSDN тему Subclassing. Поможет.
вот какой код у меня, и он работает нормально, если нажмешь на enter\escape программа вообще не среагирует.
Код:
когда я писал под mfc(приспичило), там эта проблема была :-))))
Класс CDialog имеет две виртуальные функции: OnOK() и OnCancel() которые вызываются при нажатии Enter или Escape внутри диалога. Я переопределил эти 2 виртуальные функции(OnOK() вообще оставил пустой) Для этого:
virtual void OnOK();
virtual void OnCancel(); - это я дописал в классе диалога
Реализация в классе -
void CTestDialog::OnOK()
{
....
}
void CTestDialog::OnCancel()
{
....
}
Сбрось сюда код, я посмотрю хоть :-)))))
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 можно поймать все сообщения, идущие к окну.
Всем спасибо, тема закрыта!
Отдельное спасибо ШпиЁну, который всегда помогает.
Код:
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);
}
{
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 у формы пропадает вообще :-)))) пример во вложении.
:-)))))))))))