很简单的做了个测试:
OnInitDialog中加入: DWORD stylex = GetWindowLong(GetSafeHwnd(), GWL_EXSTYLE);
stylex |= WS_EX_LAYERED;
SetWindowLong(GetSafeHwnd(), GWL_EXSTYLE, stylex);
SetLayeredWindowAttributes( 0, 255, LWA_ALPHA);响应WM_NCPAINT:void CSimple1DemoDlg::OnNcPaint()
{
CRect rc;
GetWindowRect(&rc);
rc.OffsetRect(-rc.TopLeft());
CWindowDC dc(this);
Color clr(255, 255, 0, 0);
SolidBrush brush(clr);
Graphics g(dc.GetSafeHdc());
g.FillRectangle(&brush, rc.left, rc.top, rc.Width(), rc.Height());
}结果是右边框和下边框未被绘出来,显示为黑色,如果把代码改成:void CSimple1DemoDlg::OnNcPaint()
{
CRect rc;
GetWindowRect(&rc);
rc.OffsetRect(-rc.TopLeft());
CWindowDC dc(this);
//Color clr(255, 255, 0, 0);
//SolidBrush brush(clr);
//Graphics g(dc.GetSafeHdc());
//g.FillRectangle(&brush, rc.left, rc.top, rc.Width(), rc.Height());
dc.FillSolidRect(&rc, RGB(255, 0, 0));
}就OK了。
http://hi.csdn.net/attachment/201111/18/0_13216170568xJH.gif现在必须使用GDI+绘制,求解决方法?
OnInitDialog中加入: DWORD stylex = GetWindowLong(GetSafeHwnd(), GWL_EXSTYLE);
stylex |= WS_EX_LAYERED;
SetWindowLong(GetSafeHwnd(), GWL_EXSTYLE, stylex);
SetLayeredWindowAttributes( 0, 255, LWA_ALPHA);响应WM_NCPAINT:void CSimple1DemoDlg::OnNcPaint()
{
CRect rc;
GetWindowRect(&rc);
rc.OffsetRect(-rc.TopLeft());
CWindowDC dc(this);
Color clr(255, 255, 0, 0);
SolidBrush brush(clr);
Graphics g(dc.GetSafeHdc());
g.FillRectangle(&brush, rc.left, rc.top, rc.Width(), rc.Height());
}结果是右边框和下边框未被绘出来,显示为黑色,如果把代码改成:void CSimple1DemoDlg::OnNcPaint()
{
CRect rc;
GetWindowRect(&rc);
rc.OffsetRect(-rc.TopLeft());
CWindowDC dc(this);
//Color clr(255, 255, 0, 0);
//SolidBrush brush(clr);
//Graphics g(dc.GetSafeHdc());
//g.FillRectangle(&brush, rc.left, rc.top, rc.Width(), rc.Height());
dc.FillSolidRect(&rc, RGB(255, 0, 0));
}就OK了。
http://hi.csdn.net/attachment/201111/18/0_13216170568xJH.gif现在必须使用GDI+绘制,求解决方法?
解决方案 »
- 为什么说"ATL的双接口"效率比IDispatch::Invoke()要高?
- 请教简繁体转换的问题
- 请教一个KEYDOWN的处理,想实现输入符A,但面界面上出现B(想实现在英文键盘输入其它语言的字符),重载了CEdit,但不会没出现我要的效果?
- 各位上网的弟兄,问一个垃圾程序:华义小助手 如何关闭。
- Winsock接收单片机发来的数据出现了乱码
- 怎样使radio按钮一开始就选中?
- 50分求TCP/IP 协议栈source code, 如觉分不够,可以另给。
- 如何断开文件连结?
- 哪里有刷新速度快的报表控件或者源码??用LISTCTRL太慢了,插入2万行数据简直是恶梦,更不用说每1分钟1刷新数据了
- 去掉菜单上的最近打开的文件,在哪儿修改?
- ON_CONTROL_RANGE 中后来添加的控件无法加进去
- MFC
g.FillRectangle(&brush, rc.left, rc.top, rc.Width(), rc.Height());
改成:
g.FillRectangle(&brush, 0,0, rc.Width(), rc.Height());
rc.top和left就是0
,不信先自己试试,
首先GDI+的矩形都是浮点数,这是误差的根源。
其次由于GDI+支持2D变换操作(缩放、旋转、平移等),它需要很多高精度的浮点运算,无论如何,浮点运算的次数越多,误差越大。当然如果用整数运算,误差只会更大,而且大得离谱。
最重要的是,从浮点的眼光来看像素填充,因为无法跟图片的像素一一对应,它只能采取插值填充,这种方式即使最终的大小跟要填充的大小一致,也会存在边缘无法对齐的后果。如果你了解3D的纹理贴图,就可以知道纹理素跟像素是如何错位对齐的。
最后,浮点矩形还要再次转换回整数以便绘制到屏幕上,还得产生点误差。一家之言,欢迎拍砖。
要分