调用windows API使用HDC重绘控件、文字、颜色

    技术2022-07-11  96

    看了一些绘制相关的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); } }
    Processed: 0.010, SQL: 9