可以使用ES_PASSWORD样式在Edit控件上绘制一个矩形吗?

时间:2017-03-05 22:46:02

标签: c++ visual-c++ gdi+ gdi

我试图在控件周围画一个矩形的圆头,我做过这样的事情:

LRESULT CALLBACK WindPorc(HWND hwnd, UINT umsg, WPARAM wparam, LPARAM lparam)
{
    case WM_CTLCOLOREDIT:
    {
        // device handle
        HDC Chdc = (HDC)wparam;
        // handle to control
        HWND CHand = (HWND)lparam;

        // new object pen...
        HPEN penx = CreatePen(PS_SOLID, 5, RGB(0, 255, 255));


        // apply pen to device handle and back up the original handle
        HGDIOBJ objb = SelectObject(Chdc, penx);

        // auto...
        RECT rectx;
        GetClientRect(CHand, &rectx);  

        // Now draw the rect with round borders...
        RoundRect(Chdc, (rectx.left -2), (rectx.top - 2), (rectx.right + 2), (rectx.bottom + 2), 5, 5);     

        // reset device hand...
        SelectObject(Chdc, objb);

        // Set text color...
        SetTextColor(Chdc, RGB(0, 255, 255));


        // clean up...
        DeleteObject(penx);
        DeleteObject(objb);


        // I should return a brush for the bk, but this don't care now...
        //return;
    }

}


void InitUI()
{
    // just the edit control, isn't need the RegisterClass etc...

        HWND Edit1 = CreateWindowEx
        (
        NULL,
        L"EDIT",
        NULL,
        WS_CHILD | WS_VISIBLE |
        ES_LEFT | ES_MULTILINE, // Just a demonstration, it should be ES_PASSWORD
        10, 120, 200, 22,
        winx, // parent window HWND...
        (HMENU)TEXTBOX_1, // id
        (HINSTANCE)GetWindowLong(winx, GWL_HINSTANCE),
        NULL
        );
}
好的,这看起来像这样:

enter image description here

但如果我将CreateWindowEx();上的样式更改为ES_PASSWORD,则边缘消失,留下如下内容:

enter image description here

他们为什么会消失?

1 个答案:

答案 0 :(得分:0)

我会说实施方式有多种错误:

  • Chdc是一个DC,只能在编辑控件的客户区域上绘制,而您想在父窗口(对话框的)客户区域上绘制。
  • GetClientRect()总是返回(0,0)左上角,因为矩形相对于...编辑控件本身。
  • WM_CTLCOLOREDIT可能不是绘制矩形的最佳位置,您需要进行一些测试以检查实际调用此消息的时间。

如果您希望以这种方式保持实施,您应该:

  • 使用父窗口的DC进行绘制,而不是使用编辑控件进行绘制。
  • 而不是GetClientRect()调用GetWindowRect()然后调用ScreenToClient()来制作相对于父窗口客户区的坐标。
  • 使用WM_PAINT消息(以及BeginPaint() / EndPaint()函数)获取父窗口的DC。

我会考虑一个不同的实现,创建一个所有者绘制的静态控件,比编辑控件大一些像素,以某种方式放置"围绕"编辑控件(设置WS_CLIPSIBLINGS样式以确保编辑控件保持在静态编辑控件的顶部)。应该在处理WM_DRAWITEM消息时执行绘图。我认为这种实施更加强大。