当前位置:C++技术网 > 资讯 > 排除剪切区域函数ExcludeClipRect详解

排除剪切区域函数ExcludeClipRect详解

更新时间:2016-02-02 21:22:47浏览次数:1+次

    我们在前面介绍了创建区域和合并区域等操作,也介绍了将区域设置为剪切区域的方法。设置好剪切区域后,我可以控制需要绘制的地方。这些解析文章,请在C++技术网的操作系统->Windows 频道下阅读,或者搜索相关关键词找到文章。
    然而,我们在实际的需要中,可能需要将现有的剪切区域的部分排除掉,以保护这部分的画面,以免被覆盖破坏了。或者是将一部分的内容作为前景图,其他的部分作为背景图,那么就将前景图从剪切区域里排除。那么所有的绘制都只会在前景图后外绘制。
    使用ExcludeClipRect函数,你要对现在的剪切区域很清楚。默认的情况下,前切区域是整个客户区。如果你自己设置了剪切区域,你就要自己把握了。通过区域的各种组合可以完成不规格的区域的实现,这是做加法组合不规则区域。还有时候,我们需要使用减法,将现在的剪切区域去除一部分,也就是现在的函数ExcludeClipRect实现的效果了。
    ExcludeClipRect函数第一个参数为HDC类型参数,后面四个参数则是确定要排除的剪切区域的矩形参数。函数使用是很简单的。
    我们使用前切区域的效果图如下:

        剪切区域ExcludeClipRect的使用效果图
        【剪切区域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;
}