IntersectRect求两个矩形的交集矩形图解

6649 人浏览 | 时间: 2015-12-29 10:06:44 | 作者: codexia 会员文章,禁止转载

    两个矩形区域的交集,就是两个矩形重叠的区域。我们先看用程序生成的交集的图形,已经做了标注,如下图所示:

两个矩形相交的交集矩形

    我们从上图可以看到,一个是浅灰色的矩形1,一个是灰色的矩形2,相交的部分是深灰色的交集矩形。我们来确定一个交集矩形的范围。这个范围也就是矩形2的左上角与矩形1的右下角构成的矩形。
    当然,如果矩形2要移动与矩形1左下角重叠,则交集矩形则是由矩形1的左下角和矩形2的左上角确定,不过没有这样的确定方法,不过利用交集矩形左上角的x和矩形1左上角的x值一样,交集矩形的左上角的y与矩形2的左上角的y值一样。交集矩形右下角的坐标则是由矩形2的右下角x和矩形1的右下角y值确定。
    当两个矩形的位置不同时,计算的方法就会有所变化。我们要么找到一个通用的方法来计算,要么就只能根据两个矩形的位置分情况确定了。
    你可以想到,这样是多么复杂的事情呀。不管是找到一个通用模型还是分情况计算左上角和右下角的值,都要费脑经呀。不过此时,我们有了IntersectRect函数,就倍感轻松呀。不过如果你想了解交集到底如何求的,可以阅读《IntersectRect求交集的原理分析以及代码实现》 。
    那么我们绘制这个图片,就利用了求交集的方法绘制了中间的交集矩形。因为交集矩形需要显示在最上层,这样才会显示出深灰色的交集矩形,如果先绘制的话,则会被两个绘制的矩形覆盖掉。这里需要注意一个绘制层次的问题。
    那么我们先在WM_CREATE消息中设置好了两个矩形的大小,故意让两个矩形的范围交叉。然后在WM_PAINT中求出交集矩形,然后最后画出交集矩形即可。而文字想不被矩形覆盖,则个应该是在重叠的矩形后面画。这里的文字“C++技术网http:www.cjjjs.com”没有白色的背景,是因为我们设置了文字背景透明模式,然后用TextOut输出。
    下面是完整的代码:
#include "windows.h"
#include <tchar.h>
// - 项目是Unicode字符集
TCHAR cjjjs[100]=_T("C++技术网http:www.cjjjs.com");
LRESULT CALLBACK WinProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam)
{
    HDC hdc;
    PAINTSTRUCT ps;
    static RECT rect1,rect2,comRect;
    switch (message)
    {
    case WM_CREATE:
        SetRect(&rect1,100,0,300,100);//设置矩形的大小
        SetRect(&rect2,200,50,400,150);//设置矩形的大小
        
        return 0;
     case WM_PAINT:
         hdc = BeginPaint(hwnd,&ps);
         //交集画图
         IntersectRect(&comRect,&rect1,&rect2);
         SelectObject(hdc,GetStockObject(LTGRAY_BRUSH));
         Rectangle(hdc,rect1.left,rect1.top,rect1.right,rect1.bottom);
         SelectObject(hdc,GetStockObject(GRAY_BRUSH));
         Rectangle(hdc,rect2.left,rect2.top,rect2.right,rect2.bottom);

         SelectObject(hdc,GetStockObject(DKGRAY_BRUSH));
         Rectangle(hdc,comRect.left,comRect.top,comRect.right,comRect.bottom);

         SelectObject(hdc,GetStockObject(SYSTEM_FIXED_FONT));
         SetBkMode(hdc,TRANSPARENT);
         TextOut(hdc,10,0,cjjjs,lstrlen(cjjjs));

         EndPaint(hwnd,&ps);
         return 0;
     case WM_DESTROY:
         PostQuitMessage(0);
         return 0;
     default:
         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_HAND);
    wndClass.hIcon=LoadIcon(NULL,IDI_APPLICATION);
    wndClass.hInstance = hInstance;
    wndClass.lpfnWndProc = WinProc;
    wndClass.lpszClassName = ClassName;
    wndClass.lpszMenuName=NULL;
    wndClass.style=CS_HREDRAW|CS_VREDRAW;

    if(!RegisterClass(&wndClass))return 0;
    HWND hwnd = CreateWindow(ClassName,title1,WS_OVERLAPPEDWINDOW,0,0,440,400,NULL,NULL,hInstance,NULL);
    ShowWindow(hwnd,SW_SHOWNORMAL);

    MSG msg;
    while (GetMessage(&msg,NULL,0,0))
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
    return msg.wParam;
}

当前文章为会员文章,请前往[用户中心]开通会员后继续阅读。

相关阅读