目录
1.消息映射
可读可写的编辑框可以通过响应WM_CTLCOLOREDIT消息,来自定义编辑框的文本颜色和字体。但如果该编辑框只读,那么需要响应WM_CTLCOLORSTATIC消息。
public:
BEGIN_MSG_MAP(TestDialog)
MESSAGE_HANDLER(WM_INITDIALOG, OnInitDialog)
MESSAGE_HANDLER(WM_CTLCOLOREDIT, OnColorEdit)
END_MSG_MAP()
public:
LRESULT OnInitDialog(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
LRESULT OnColorEdit(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
2.设置文本颜色
LRESULT TestDialog::OnColorEdit(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
{
UINT ctrID = ::GetDlgCtrlID((HWND)lParam);
HDC dc = (HDC)wParam;
switch (ctrID)
{
case IDC_TESTEDIT:
{
SetBkMode(dc, TRANSPARENT);
SetTextColor(dc, RGB(0, 0, 255));
}
break;
}
return (LRESULT)GetStockObject(WHITE_BRUSH);
}
3.设置文本字体
设置编辑框的字体的最佳时机应该是在窗口初始化的时候,所以我们要在WM_INITDIALOG消息中给编辑框发送WM_SETFONT消息。创建的字体记得在窗口销毁前删除!
LRESULT TestDialog::OnInitDialog(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
{
HWND editHwnd = GetDlgItem(IDC_TESTEDIT);
HFONT editFont = CreateFont(14, 0, 0, 0, FW_NORMAL, FALSE,
FALSE, FALSE, DEFAULT_CHARSET, OUT_OUTLINE_PRECIS,
CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY, VARIABLE_PITCH,
L"宋体");
SendMessage(editHwnd, WM_SETFONT, (WPARAM)editFont, (LPARAM)FALSE);
return TRUE;
}
效果图:
后记
编辑框默认是可以复制其显示的内容的,但是要想自己实现也可以。我们创建一个按钮,通过响应按钮按下的动作,然后获取编辑框中的内容复制到粘贴板,复制内容到粘贴板的实现如下:
BOOL result = FALSE;
size_t len = wcslen(text);
HGLOBAL hClip;
if (OpenClipboard())
{
EmptyClipboard(); //将剪贴板内容清空
hClip = GlobalAlloc(GMEM_MOVEABLE, sizeof(TCHAR) * (len + 1));
if (hClip != NULL)
{
TCHAR* buff = (TCHAR*)GlobalLock(hClip);
if (buff != NULL)
{
//将数据复制到分配的内存块中
memcpy(buff, text, sizeof(TCHAR) * len);
buff[len] = (TCHAR)0;
GlobalUnlock(hClip);
//将内存块放入剪贴板中, 当前是ASCII码格式需要转为UNICODE否则字符串可能乱码。
HANDLE res = SetClipboardData(CF_UNICODETEXT, hClip);
CloseClipboard();
if (res != NULL)
result = TRUE;
}
else
{
result = FALSE;
GlobalUnlock(hClip);
}
}
return result;
}
return result;