调用 Windows API,使用 HDC 重绘控件、文本和颜色
最编程
2024-03-08 12:05:20
...
看了一些绘制相关的windows API函数:
// 删除和重绘
ExtTextOut 用当前选择的字体、背景颜色和正文颜色来绘制一个字符串
DrawText 在指定的矩形里写入格式化的正文
GetSysColor(COLOR_HIGHLIGHT) windows的高亮背景颜色
GetSysColor(COLOR_HIGHLIGHTTEXT) windows的高亮字体颜色
GetTextMetrics 该函数把程序当前的字体信息,存放到TEXTMETRIC,获取后设置到需要重绘的字体信息中,例如对齐方式。
DrawFocusRect 画一个焦点矩形
DrawFrameControl 绘制窗口控件
- 重绘按钮
DrawFrameControl(dc, rcBitmap, DFC_BUTTON, DFCS_BUTTONPUSH);
- 重绘文字
CString strText("test");
ExtTextOut(dc, 0, 0, ETO_OPAQUE, &rcText, 0, 0, 0);
DrawText(dc, ' ' + strText, strText.GetLength() + 1, &rcText, DT_SINGLELINE|DT_VCENTER|DT_END_ELLIPSIS);
- 设置颜色
SetBkColor(dc, RGB(0,0,0));
SetTextColor(dc, RGB(255,255,255));
一个设置CBCGPExCheckList列表中文字颜色和背景颜色的例子:
使用BCG控件的过程中发现CBCGPExCheckList、CBCGPComboBox初始数据后,列表中文字颜色与背景颜色与整体风格不搭。
上述两控件都可通过重载DrawItem函数重绘来自定义列表颜色。
附上代码:
class CCheckList : public CBCGPExCheckList
{
protected:
virtual void DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct);
};
//globalData.clrBarFace BCG的全局背景颜色
//globalData.clrBarText BCG的全局文本颜色
void CCheckList::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)
{
HDC dc = lpDrawItemStruct->hDC;
if (IDC_LAYERSFILTER == ::GetDlgCtrlID(lpDrawItemStruct->hwndItem))
{
CRect rcText = lpDrawItemStruct->rcItem;
SetBkColor(dc, globalData.clrBarFace);
SetTextColor(dc, globalData.clrBarText);
CString strText;
GetText(lpDrawItemStruct->itemID, strText);
ExtTextOut(dc, 0, 0, ETO_OPAQUE, &rcText, 0, 0, 0);
DrawText(dc, ' ' + strText, strText.GetLength() + 1, &rcText, DT_SINGLELINE|DT_VCENTER|DT_END_ELLIPSIS);
}
}