我们在前面介绍了创建区域和合并区域等操作,也介绍了将区域设置为剪切区域的方法。设置好剪切区域后,我可以控制需要绘制的地方。这些解析文章,请在C++技术网的操作系统->Windows 频道下阅读,或者搜索相关关键词找到文章。
然而,我们在实际的需要中,可能需要将现有的剪切区域的部分排除掉,以保护这部分的画面,以免被覆盖破坏了。或者是将一部分的内容作为前景图,其他的部分作为背景图,那么就将前景图从剪切区域里排除。那么所有的绘制都只会在前景图后外绘制。
使用ExcludeClipRect函数,你要对现在的剪切区域很清楚。默认的情况下,前切区域是整个客户区。如果你自己设置了剪切区域,你就要自己把握了。通过区域的各种组合可以完成不规格的区域的实现,这是做加法组合不规则区域。还有时候,我们需要使用减法,将现在的剪切区域去除一部分,也就是现在的函数ExcludeClipRect实现的效果了。
ExcludeClipRect函数第一个参数为HDC类型参数,后面四个参数则是确定要排除的剪切区域的矩形参数。函数使用是很简单的。
我们使用前切区域的效果图如下:
【剪切区域ExcludeClipRect的使用效果图】
从图中可以看出,在客户区中输出了一段函数名提示文字,然后在一个矩形填充了灰色。然后在灰色区域输出网站名字网址。但是你可以看到,在灰色中间部分,看不到输出的文字,这是因为这部分的剪切区域被排除掉了的。
下面是完整的代码:
#include "windows.h"
#include <tchar.h>
TCHAR txt[]=_T("C++技术网http://www.cjjjs.com");
TCHAR txt2[]=_T("C++技术网排除剪切区域函数:ExcludeClipRect");
// - 项目是Unicode字符集
LRESULT CALLBACK WinProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam)
{
HDC hdc;
PAINTSTRUCT ps;
switch (message)
{
case WM_PAINT:
{
hdc = BeginPaint(hwnd,&ps);
TextOut(hdc,0,0,txt2,lstrlen(txt2));//先输出一串文字,在设置新的剪切区域之前输出,默认的剪切区域为整个客户区
HRGN hRgn = CreateRectRgn(100,50,300,250);//200x200
FillRgn(hdc,hRgn,(HBRUSH)GetStockObject(GRAY_BRUSH));//填充区域
SelectObject(hdc,hRgn);//设置为剪切区域
ExcludeClipRect(hdc,150,100,250,200);//将中间的剪切区域排除出来
TextOut(hdc,100,80,txt,lstrlen(txt));//在剪切区域中输出文字
TextOut(hdc,100,120,txt,lstrlen(txt));//在剪切区域中输出文字
TextOut(hdc,100,160,txt,lstrlen(txt));//在剪切区域中输出文字
TextOut(hdc,100,180,txt,lstrlen(txt));//在剪切区域中输出文字
TextOut(hdc,100,210,txt,lstrlen(txt));//在剪切区域中输出文字
TextOut(hdc,100,240,txt,lstrlen(txt));//在剪切区域中输出文字
DeleteObject(hRgn);//删除区域资源
EndPaint(hwnd,&ps);
}
return 0;
case WM_DESTROY:
PostQuitMessage(0);
return 0;
default:
break;//跳出到默认处理
}
return DefWindowProc(hwnd, message, wParam, lParam);
}
int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrev,LPSTR lpCmd,int iShow)
{
TCHAR ClassName[] = _T("MyClass");
TCHAR title1[] = _T("C++技术网http://www.cjjjs.com");
WNDCLASS wndClass;
wndClass.cbClsExtra=0;
wndClass.cbWndExtra=0;
wndClass.hbrBackground= (HBRUSH)GetStockObject(WHITE_BRUSH);
wndClass.hCursor=LoadCursor(NULL,IDC_ARROW);
wndClass.hIcon=LoadIcon(NULL,IDI_APPLICATION);
wndClass.hInstance = hInstance;
wndClass.lpfnWndProc = WinProc;
wndClass.lpszClassName = ClassName;
wndClass.lpszMenuName=NULL;
wndClass.style=CS_HREDRAW|CS_VREDRAW|CS_DBLCLKS;
if(!RegisterClass(&wndClass))return 0;
HWND hwnd = CreateWindow(ClassName,title1,WS_OVERLAPPEDWINDOW,10,100,400,400,NULL,NULL,hInstance,NULL);
ShowWindow(hwnd,SW_SHOWNORMAL);
MSG msg;
while (GetMessage(&msg,NULL,0,0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return msg.wParam;
}