求助:VC中画刷的概念,以及怎样设置文本背景色与窗口背景色一致?

qaabq 2011-04-20 04:17:10
求助:VC中画刷的概念,以及怎样设置文本背景色与窗口背景色一致?

请用API,下面代码中COLOR_3DFACE为什么与COLOR_3DFACE +1(COLOR_3DSHADOW)配合使用就可以使文本背景色与窗口背景色一致?

wndclass.hbrBackground = (HBRUSH)(COLOR_3DFACE +1);
…………
…………
case WM_PAINT: // 窗口客户区需要重画
{
HDC hdc;
PAINTSTRUCT ps;

// 使无效的客户区变的有效,并取得设备环境句柄
hdc = ::BeginPaint (hwnd, &ps) ;
::SetTextColor(hdc,RGB(255,0,0));//设置输出文本颜色
::SetBkColor(hdc,::GetSysColor(COLOR_3DFACE));//设置文本背
::TextOut(hdc,0,0,str.c_str(),str.length());
::EndPaint(hwnd, &ps);
return 0;
}
...全文
511 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
psbeond 2011-04-22
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 qaabq 的回复:]
引用 3 楼 wocow3 的回复:
在注册窗类的时候,可以用( 系统预定义颜色x+1)设置窗口的默认背景色,+1只是个约定,实际指定的就是x指定的颜色
因为有种系统预定义的颜色是口#define COLOR_SCROLLBAR 0,为了跟NULL区分开,就有了+1这个要求

我想问一下,windows内部是否有默认的画笔和画刷的的颜色?
[/Quote]

wocow3 2011-04-22
  • 打赏
  • 举报
回复
画笔和画刷属于DC的属性,一般情况下,每次得到的DC都会重置为默认属性也就是黑画笔白刷子
qaabq 2011-04-20
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 wocow3 的回复:]
在注册窗类的时候,可以用( 系统预定义颜色x+1)设置窗口的默认背景色,+1只是个约定,实际指定的就是x指定的颜色
因为有种系统预定义的颜色是口#define COLOR_SCROLLBAR 0,为了跟NULL区分开,就有了+1这个要求
[/Quote]
我想问一下,windows内部是否有默认的画笔和画刷的的颜色?
qaabq 2011-04-20
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 visualeleven 的回复:]
SetBkMode(TRANSPARENT);
[/Quote]
部长请看下面:
如果我这样写
wndclass.hbrBackground = (HBRUSH)GetStockObject(GRAY_BRUSH);
…………
…………

case WM_PAINT: // 窗口客户区需要重画
{


// 使无效的客户区变的有效,并取得设备环境句柄
hdc = ::BeginPaint (hwnd, &ps) ;

//::SetBkColor(hdc, RGB(0, 255, 255));
// 注释运行和不注释它运行
::SetBkMode(hdc,OPAQUE);//显示设备共有两种输出方式:OPAQUE和TRANSPARENT。


switch(i)
{
case 0:
hPen = CreatePen(PS_SOLID, 2, RGB(10, 10, 10)); //创建自定义画笔对象
break;
case 1:
hPen = CreatePen(PS_DASH, 1, RGB(20, 20, 20));
break;
case 2:
hPen = CreatePen(PS_DOT, 1, RGB(255, 30, 30));
break;
case 3:
hPen = CreatePen(PS_DASHDOT, 1, RGB(40, 40, 40));
break;
case 4:
hPen = CreatePen(PS_DASHDOTDOT, 1, RGB(50, 50, 50));
break;
case 5:
logPen.lopnStyle = PS_SOLID;
logPen.lopnColor = RGB(0, 60, 60);
logPen.lopnWidth.x = 5;
hPen = CreatePenIndirect(&logPen);
break;

default:
hPen =(HPEN)::GetStockObject(BLACK_PEN);//获取预定义画笔的句柄
break;
}

SelectObject(hdc, hPen);//将画笔对象选入设备

MoveToEx(hdc, 0, (i + 1) * cyClient / 10, NULL); //设置当前点
LineTo(hdc, cxClient, (i + 1) * cyClient / 10);

TextOut(hdc, i* cxClient / 7, 4 * cyClient / 5, "windows", lstrlen("windows"));
if(i++ <= 5)
InvalidateRect(hwnd, NULL, FALSE);//使客户区无效

EndPaint(hwnd, &ps);

// 删除GDI对象, 释放内存!!
DeleteObject(hPen);

return 0;
}

则输出文字背景是白色,这是为什么,OPAQUE的方式吥是用当前背景的画刷的颜色输出显示文字的背景,而画刷的颜色不已经设置为灰色(wndclass.hbrBackground = (HBRUSH)GetStockObject(GRAY_BRUSH);)了吗?那文字背景不应该是灰色而不是白色吗?
psbeond 2011-04-20
  • 打赏
  • 举报
回复
其实你可以处理CStatic控件的WM_PAINT消息,在里面,把控件的颜色,画成与父窗口一样。
wocow3 2011-04-20
  • 打赏
  • 举报
回复
在注册窗类的时候,可以用( 系统预定义颜色x+1)设置窗口的默认背景色,+1只是个约定,实际指定的就是x指定的颜色
因为有种系统预定义的颜色是口#define COLOR_SCROLLBAR 0,为了跟NULL区分开,就有了+1这个要求
无言猪 2011-04-20
  • 打赏
  • 举报
回复
代码的意思应该还是要字体背景色与窗体背景色有点差距的,只是那种差距很难分辨,或者就是正巧在该风格下COLOR_3DFACE与COLOR_3DSHADOW的颜色相同.如果只是要一样的话,采用部长的方法更快更简单.
Eleven 2011-04-20
  • 打赏
  • 举报
回复
SetBkMode(TRANSPARENT);

15,979

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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