gpt4 book ai didi

c++ - 编辑控件未完全使用所选画笔重新绘制

转载 作者:塔克拉玛干 更新时间:2023-11-03 08:03:19 27 4
gpt4 key购买 nike

我有一个编辑控件,其背景颜色取决于用户输入的有效性。

如果输入有效,编辑控件应保持默认外观,否则背景颜色应更改为浅灰色。

我正在检查 EN_UPDATE 处理程序的有效性,如果无效,我将编辑控件的 HWND 存储到 vector 中。

视觉样式已启用。

当我改变鼠标指针的位置时,问题就来了。让我描述一下:

  1. 我点击编辑控件并输入无效输入。

  2. 我将鼠标指针移到别处,但编辑控件仍具有焦点。

  3. 现在我通过按 backspace 删除无效输入。

  4. 一旦输入有效,颜色就会正确改变,但边框会变得更粗/更暗。

这些图片说明了问题:

在输入数据之前编辑控件: enter image description here

当用户粘贴无效数据时编辑控件(鼠标指针位于灰色区域): enter image description here

最后一个字符是r

现在,如果鼠标指针超出了编辑控件的客户区(例如在对话框的客户区)并且用户删除了r,这就是我得到的:enter image description here

请注意较粗的边框。

当鼠标指针悬停在编辑控件上方时,它会被正确重绘。

这里是相关的代码片段(如果需要我可以提交一个小的 SSCCE ):

// minimal code snippet for EN_UPDATE
case WM_COMMAND:
{
switch( LOWORD(wParam) )
{
case IDC_MYEDIT:
{
if( HIWORD(wParam) == EN_CHANGE )
{
if( /* invalid input */ )
{
// store HWND into vector

}
// InvalidateRect(...); // tried this too...
}
}
break;

// minimal code snippet for WM_CTLCOLOREDIT
case WM_CTLCOLOREDIT:
{
if( /* this control is stored in vector */ )
{
//=== then this is invalid entry->paint it grey ===//

// Needed SetBkMode for text's background transparency
SetBkMode( (HDC)wParam, TRANSPARENT );
// return light gray brush
return (INT_PTR)( (HBRUSH)GetStockObject( LTGRAY_BRUSH ) );
}
else
return DefWindowProc( ... ); // default processing
}

我该如何解决这个问题?

最佳答案

我找到了解决问题的方法。我刚刚添加了 RedrawWindow 而不是 InvalidateRect 并且命令框架也被重绘:

// minimal code snippet for EN_UPDATE
case WM_COMMAND:
{
switch( LOWORD(wParam) )
{
case IDC_MYEDIT:
{
if( HIWORD(wParam) == EN_CHANGE )
{
if( /* invalid input */ )
{
// store HWND into vector

}

// after finishing validation, redraw window INCLUDING THE FRAME
// This solves the problem with edges entirely

RedrawWindow( (HWND)lParam, NULL, NULL,
RDW_ERASE | RDW_FRAME | RDW_INVALIDATE );
}
}
break;

关于c++ - 编辑控件未完全使用所选画笔重新绘制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23378938/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com