关于绘制不填充矩形问题?
调用CDC::Rectangle()在鼠标移动过程中,绘制矩形,但是这样绘制的矩形总是会覆盖之前的图像,有没有办法在绘制过程中不填充矩形呢?
采用NULL_BRUSH,或者FrameRect()等,也不行。注意:是在鼠标移动过程中绘制矩形,就像画图程序那样,而不是在WM_PAINT消息中绘制.求指教~
[解决办法]
我遇到过和楼主一样的问题,似乎GDI没有提供绘制空心矩形的API
于是走弯路实现该效果
绘制矩形的四条边即可
- C/C++ code
RECT rc;pCdc = CDC::FromHandle(hDc);pCdc->SelectObject(pPen);pCdc->MoveTo(rect.left, rect.top);pCdc->LineTo(rect.left, rect.bottom);pCdc->LineTo(rect.right, rect.bottom);pCdc->LineTo(rect.right, rect.top);pCdc->LineTo(rect.left, rect.top);
[解决办法]
另外,楼主是要在鼠标移动过程中绘制矩形矩形,这样楼主应该不希望移动过程中变化的矩形留下痕迹覆盖之前的图像吧?我之前弄了一个程序用来给屏幕上鼠标所指向的窗口绘制边框,就像QQ截图里的那种,需要实现和楼主差不多的功能,当时我也搞得很头痛,用了很多方法,最后也是走弯路实现了
我的方法就是创建一个无标题无边框的窗口,并且拥有透明属性(WS_EX_LAYERED),然后将窗口移动到指定位置,调整为指定大小,将该窗口的背景刷成某种颜色(我选择白色),然后在该窗口上绘制矩形(即上面所说的绘制4条直线),最后给该窗口设置透明度(指定白色部分透明),这样由于图是绘制在新创建的窗口上的,所以我们销毁这个窗口后不会在原来的地方留下任何痕迹
- C/C++ code
//敲代码太累,简略一点,楼主不懂再问我//定义一个窗口类CCoverDlg,先为这个窗口类创建一个窗口资源,设置属性(无标题、无边框、透明)//然后创建窗口CCoverDlg *pCoverDlg = new CCoverDlg;pCover->Create(IDD_COVER, NULL);pCover->ShowWindow(SW_SHOW);pCover->MoveWindow(你想要的位置);//在CCoverDlg类的OnPaint代码中:将该窗口的背景刷成某种颜色,然后在该窗口上绘制矩形//最后用SetLayeredWindowAttributes让窗口的背景色变成透明//备注:VC6没有SetLayeredWindowAttributes和透明属性,所以在VC6中怎样使用这个函数请楼主自己百度,码字太累