如何在按键"Enter"上杀死"edit"控件的焦点
How to kill focus of "edit" control on "Enter" key press
我在main函数中创建了一个主窗口。在WM_CREATE消息的主窗口过程中,我使用系统"编辑"窗口类创建了一个编辑控件,作为父窗口的子窗口。当编辑控件中按下回车键时,我希望焦点转移到主窗口。由于我使用了系统类,所以我无法访问它的过程。我在Visual Studio 10中为此使用C++由于我是win32应用程序的新手,无论代码有多长,我都想要一个简单的解决方案
如果您的窗口只有一个可聚焦控件(如编辑控件),则该控件将始终具有焦点。您不能有一个没有聚焦控件的窗口,并且父窗口本身是不可聚焦的(即不能有焦点)。
因此,如果你还没有可聚焦控件,你首先需要在你的窗口中添加另一个可聚焦控件(我无法从这个问题中判断)。例如,您可以添加"确定"或"取消"按钮。这样,无论何时取消编辑控件的焦点,按钮都可以接收焦点。
然后,您需要对编辑控件进行子类化,以便处理其按键事件(例如WM_KEYDOWN
和WM_KEYUP
)。要对单个窗口进行子类化,请调用SetWindowLongPtr
函数并传递窗口句柄、GWLP_WNDPROC
标志和指向自定义窗口过程的指针。这将用自定义窗口过程有效地替换该控件类的默认窗口过程。例如:
// Stores the old original window procedure for the edit control.
WNDPROC wpOldEditProc;
// The new custom window procedure for the edit control.
LRESULT CALLBACK CustomEditProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
switch (msg)
{
case WM_KEYDOWN:
{
if (wParam == VK_RETURN)
{
// The user pressed Enter, so set the focus to the other control
// on the window (where 'hwndOther' is a handle to that window).
SetFocus(hwndOther);
// Indicate that we processed the message.
return 0;
}
}
}
// Pass the messages we don't process here on to the
// original window procedure for default handling.
CallWindowProc(wpOldEditProc, hWnd, msg, wParam, lParam);
}
// ----- Add to the parent window's WM_CREATE: -----
// Create the edit control
HWND hwndEdit = CreateWindowEx(...);
// Subclass it.
wpOldEditProc = (WNDPROC)SetWindowLongPtr(hwndEdit,
GWLP_WNDPROC,
(LONG_PTR)CustomEditProc);
// Show it.
ShowWindow(hwndEdit, SW_SHOW);
// ... your other code (e.g. creating and showing the other control)
// ----- Add to the parent window's WM_DESTROY: -----
// Unsubclass the edit control.
SetWindowLongPtr(hwndEdit, GWLP_WNDPROC, (LONG_PTR)wpOldEditProc);
// ... your other code (e.g. calling PostQuitMessage(...) to close your app)
有关窗口子类化的更多信息,请访问MSDN。那里的示例代码(以及web上的许多其他地方)假设您正在对话框窗口中对编辑控件进行子类化。因为对话框是特殊类型的父窗口,可以自动处理大量键盘处理,所以需要采取额外的步骤来克服对话框所做的默认处理。如果使用的是使用CreateWindowEx
创建的常规窗口,则没有必要这样做。
如果您想要多个编辑控件在响应某些按键时都以相同的方式运行,那么注册一个自定义窗口子类会更干净、更好。尽管上面的代码只将单个编辑控件对象划分为子类,但这种方法将创建一种新类型的自定义编辑控件类。您可以根据需要创建这种新型编辑控件的任意多个实例,并且它们的行为都是相同的。
但我不会在这里讨论如何做到这一点。如果你感兴趣,你可以在网上找到代码,而你的特定用例会使它变得更加复杂。为了更改焦点,控件必须知道应该将焦点设置为其他哪个控件。这很难全局处理。使用对话框窗口作为父窗口可能是可取的。它自动管理Z顺序和设置焦点。
- 在createdialog创建的窗口中捕获用于编辑控件的OnMouseMove消息
- WinAPI 在单击第一个对话框上的按钮控件并销毁第一个对话框后创建第二个对话框
- 在编译时,C++项目抛出错误 C2228,这是预期的,因为控件在运行时未达到该点
- 如何更改窗体上所有控件的标题?[C++生成器]
- 双击更改 mfc 中列表控件中的行的颜色
- 派生的 wxPanel 控件如何访问其中包含 wxDialog 中的数据?
- 如何从代码本身向 wxwidgets 中的文本控件插入字符?
- 如何在MFC中的静态文本控件上插入图标?
- 我的主窗口在创建时或单击更新区域时是否会收到编辑控件?
- 如何在Qt C++中向自定义控件添加属性?
- C/C++ 检测双击 TVItem 的常用控件
- 从C++标头中导入常量而不是硬编码它们:扩展 .net 控件?
- 控件不会在选择函数旁边移动
- MFC:我们能否扩展CEditView中存在的CEdit控件类行为
- C++WIN32-将RTF数据加载到Rich Edit控件
- win32 c++ 我想在静态标签的文本之后直接插入一个 EDIT 控件
- 是否可以将来自 Win32 EDIT 控件的文本输入存储在C++ std::string 中?
- 如何在按键"Enter"上杀死"edit"控件的焦点
- 在c++ WINAPI中对EDIT控件子类化时,窗口为空
- Rich Edit控件更改对话框返回值行为