mfc 怎么设置字体不透明

lixudong1011324 2012-05-23 02:45:20
如题:
我设置字体的背景色为白色,字体为黑色。
但是当我画在白色的区域中去的时候,字体就显示不出来的变为的一片空白,各位大侠给点意见,并且背景色不能设为黑色,一旦设置为黑色,就变为透明的

if (NULL == pDc)
{
return ;
}
int ibkmode;
pDc->SelectObject(::GetStockObject(BLACK_BRUSH));

if (bIsTransparent)
{

//ibkmode = pDc->SetBkMode(TRANSPARENT );
}

COLORREF clr = pDc->SetTextColor(RGB(0,0,0));
long lenStr = strTxt.GetLength();
pDc->DrawText(strTxt,CRect(ptDraw.x - lenStr*iHeight/2,ptDraw.y-iHeight/3 ,ptDraw.x +lenStr*iHeight/2,ptDraw.y+iHeight*2/3 ),DT_CENTER);//|DT_NOCLIP

if (bIsTransparent)
{
//pDc->SetBkMode(ibkmode );
}

pDc->SetTextColor(clr);
...全文
407 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
lixudong1011324 2012-05-24
  • 打赏
  • 举报
回复
有两层

上面一层图片是镂空的,让他不遮住后面的 图片,并且在上面一层上画线,和画字,但是字体的背景设却变为透明的
lixudong1011324 2012-05-24
  • 打赏
  • 举报
回复
不行
是我做了个重叠的效果
在BitBlt()的时候加了SRCPAINT 效果
我想让他透明,当时在图片上的文字的背景色不为透明的
豪放哥 2012-05-24
  • 打赏
  • 举报
回复
百度出来的,看看行不
豪放哥 2012-05-24
  • 打赏
  • 举报
回复
1、改变对话框的底色
在对话框的类中添加一个 private : CBrush m_brush;的成员变量。在类的构造函数中添加如下代码:
m_brush.CreateSolidBrush(RGB(0,0,255)); //初始化为蓝色
为对话框添加一个WM_CTLCOLOR消息响应函数,专门为控件着色的消息响应函数,代码如下:
HBRUSH CSettingDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);
//return hbr; /*这里特意将系统返回的画刷屏蔽*/
return m_brush; /*返回自己制定的蓝色画刷*/
}
2、如果我们要设置某一个对话框控件的底色和文字颜色时只要将上面return m_brush;改为:
if (pWnd->GetDlgCtrlID()==IDC_LINE_STYLE) /*如果控件的名称为IDC_LINE_STYLE*/
{
pDC->SetTextColor(RGB(0,255,0)); /*将色彩容器中的文字颜色设置为绿色*/
//pDC->SetBkMode(TRANSPARENT); /*设置文字的背景为透明,否则文字背景认为系统默认色*/
pDC->SetBkColor(RGB(255,0,0)); /*设置文字的背景色,注意如果写了上面句的话,背景色无效*/
return m_brush; /*返回1中自定义的画刷句柄,这里注意虽然要求返回的是画刷的句柄,但是我们这里放置一个CBrush对象,不会出错。是因为CBrush有一个HBRUSH的重载*/
}
return hbr; /*否则的话返回系统默认的画刷句柄*/
注意如果要设置单行EDIT的文字背景色,需要使用SetBkColor设置,而SetBkMode即使为透明,文字的背景仍为系统的默认色。
3、利用上面的原理,在对话框控件响应OnPaint消息时,将一个静态文本显示所设置字体的文字。添加一个静态文本框,改名为IDC_TEXT。添加一个字体成员变量 private: CFont font;在对话框的构造函数中对字体进行初始化: m_font.CreatePointFont(200,"华文行楷");在2的return hbr;之前加入如下代码:
if (pWnd->GetDlgCtrlID()==IDC_TEXT) /*如果为ID号所指的静态文本框*/
{
pDC->SelectObject(&m_font); /*则将绘图设备加入所需的字体。*/
}
注意,因为OnPaint消息响应函数是在控件被绘制之前触发的,它所返回的HBRUSH画刷句柄,便携带了我们所设置的这些属性。
3、如果要改变OK按钮的文字颜色,靠上面的方式是不行的。我们需要创建一个新的从CButton类继承的CTestBtn类,并用类向导添加一个类的DrawItem的虚函数,加入以下代码(可以从CButton的例子中复制):
// TODO: Add your code to draw the specified item
UINT uStyle = DFCS_BUTTONPUSH;
// This code only works with buttons.
ASSERT(lpDrawItemStruct->CtlType == ODT_BUTTON);
// If drawing selected, add the pushed style to DrawFrameControl.
if (lpDrawItemStruct->itemState & ODS_SELECTED)
uStyle |= DFCS_PUSHED;
// Draw the button frame.
::DrawFrameControl(lpDrawItemStruct->hDC, &lpDrawItemStruct->rcItem,
DFC_BUTTON, uStyle);
// Get the button's text.
CString strText;
GetWindowText(strText);
// Draw the button text using the text color red.
COLORREF crOldColor = ::SetTextColor(lpDrawItemStruct->hDC, RGB(255,0,0));/*设置按钮的字体为红色。将返回的原先的颜色暂时保存*/
::DrawText(lpDrawItemStruct->hDC, strText, strText.GetLength(),
&lpDrawItemStruct->rcItem, DT_SINGLELINE|DT_VCENTER|DT_CENTER);
::SetTextColor(lpDrawItemStruct->hDC, crOldColor);
然后,右键选择OK按钮,用向导创建一个关联的成员变量m_btnTest,从新创建的CTestBtn类继承。在OK按钮的属性页-〉Styles-〉Owner Draw选中,否则OK按钮仍然继承默认的CButton类。
lixudong1011324 2012-05-24
  • 打赏
  • 举报
回复
怎么没人
自己顶起

64,654

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧