[英]Deselect edit control win32 c++
我将如何去取消选择编辑控件中的文本?
输入输入后,我希望用户能够取消选择编辑控件。 因为即使您单击它并按下一个键,它也会进入编辑。
这是我的编辑控件的代码:
HFONT fontMain = CreateFont(
-16, // Height Of Font
0, // Width Of Font
0, // Angle Of Escapement
0, // Orientation Angle
0, // Font Weight
false, // Italic
false, // Underline
false, // Strikeout
ANSI_CHARSET, // Character Set Identifier
OUT_TT_PRECIS, // Output Precision
CLIP_DEFAULT_PRECIS, // Clipping Precision
ANTIALIASED_QUALITY, // Output Quality
FF_DONTCARE|DEFAULT_PITCH, // Family And Pitch
TEXT("Calibri"));
HWND editControl = CreateWindow(
TEXT("EDIT"),
TEXT("TEST TEXT"),
WS_CHILD | WS_VISIBLE | ES_LEFT | ES_MULTILINE,
x, y, width, height,
window,
(HMENU) 100,
instance,
NULL);
SendMessage(window /* parent window */, WM_SETFONT, (WPARAM)fontMain, NULL);
DeleteObject(fontMain);
我检查了 MSDN 文档并没有找到任何额外的样式来添加来完成任务。
如果您对如何完成此任务有任何想法,您能帮帮我吗?
谢谢你。
您可以使用相同的技巧来消除(组合框的)下拉列表、弹出菜单等。
您需要继承 EDIT 控件,以便首先接收到您自己的窗口过程的消息。
在您的文本框子类WM_SETFOCUS
处理程序中,调用SetCapture
以便将下一次单击传递到文本框,即使它在外面。
在文本框子类的鼠标单击消息处理程序中,测试位置,如果在文本框之外,则调用SetFocus(NULL)
以放弃焦点。 (这是弹出窗口会自行消失的地方)。 也调用ReleaseCapture()
。
还要在子类的WM_KILLFOCUS
处理程序中调用ReleaseCapture()
,因为鼠标单击不是失去焦点的唯一方法。
以上是让文本框外的任何点击移除其焦点的方法。 如果您只想在父窗口的客户区域单击以使文本框失焦,那么您当然可以跳过子类化和捕获,而只需处理父窗口中的鼠标单击事件,调用SetFocus(NULL)
或SetFocus(parentHWnd)
.
我在窗口过程中处理了 WM_LBUTTONDOWN 消息。
这样当我在父窗口上单击鼠标按钮时,它将焦点设置到父窗口。
static LRESULT WINAPI WndProc
(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
switch(message){
case WM_LBUTTONDOWN : {
// Passing the parent window as the parameter.
SetFocus(HWND parentWindow);
}
}
}
此方法的工作原理是,如果单击父窗口以外的任何其他窗口,可能不会触发 WM_LBUTTONDOWN。
上述语句可能有一些例外,但总体而言,它适用于按钮和编辑,但由于某种原因不适用于静态文本。
答案由@PaulSanders 和@BenVoigt提供
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.