欢迎您访问 最编程 本站为您分享编程语言代码,编程技术文章!
您现在的位置是: 首页

调用 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 绘制窗口控件

  1. 重绘按钮
DrawFrameControl(dc, rcBitmap, DFC_BUTTON, DFCS_BUTTONPUSH);
  1. 重绘文字
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);
  1. 设置颜色
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);
	}
}