我试图在控件周围画一个矩形的圆头,我做过这样的事情:
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
);
}
好的,这看起来像这样:
但如果我将CreateWindowEx();
上的样式更改为ES_PASSWORD
,则边缘消失,留下如下内容:
他们为什么会消失?
答案 0 :(得分:0)
我会说实施方式有多种错误:
Chdc
是一个DC,只能在编辑控件的客户区域上绘制,而您想在父窗口(对话框的)客户区域上绘制。GetClientRect()
总是返回(0,0)左上角,因为矩形相对于...编辑控件本身。WM_CTLCOLOREDIT
可能不是绘制矩形的最佳位置,您需要进行一些测试以检查实际调用此消息的时间。如果您希望以这种方式保持实施,您应该:
GetClientRect()
调用GetWindowRect()
然后调用ScreenToClient()
来制作相对于父窗口客户区的坐标。WM_PAINT
消息(以及BeginPaint()
/ EndPaint()
函数)获取父窗口的DC。我会考虑一个不同的实现,创建一个所有者绘制的静态控件,比编辑控件大一些像素,以某种方式放置"围绕"编辑控件(设置WS_CLIPSIBLINGS
样式以确保编辑控件保持在静态编辑控件的顶部)。应该在处理WM_DRAWITEM
消息时执行绘图。我认为这种实施更加强大。