我最近在学习Win32程序的时候碰到点麻烦,就是对FrameRect和FrameRgn这两个函数有点有不理解,FrameRect画的边界框为一个逻辑宽度,我觉得FrameRgn与FrameRect的作用差不多,那么FrameRgn的第四个和第五个函数好像就有点多余,Charles Petzold在那本《Programming Windows (Fifth Edition)》书里说的也不详细,我试着把映射方式改为“MM_ISOTROPIC”,然后把逻辑单位设为16分之1英寸,然后分别用这两个函数来给两个一样大小的矩形的矩形区域画边框,然而这两个边框却不是一样的宽度(FrameRgn的第四和第五个参数都为1),不知道为什么?请高手指点迷津!!!

解决方案 »

  1.   

    FrameRect用指定的刷子围绕一个矩形画一个边框(组成一个帧),边框的宽度是一个逻辑单位.
    FrameRgn用指定刷子围绕指定区域画一个外框
      

  2.   

    我就自己的理解来谈一下吧:
    RECT是正规的矩形,RGN可以是各种样式的形状(可以用CombineRgn等函数来合成)。故而:
    FrameRect是只能沿着一个RECT的边界来画,所以只能画出来举行,而且这条边线的宽度只能是一个逻辑单位。
    FrameRgn是沿着你所制造的一个形状来画边界线的,而且宽度我们可以自定义,所以你说的“FrameRgn的第四个和第五个函数好像就有点多余”就不是了。
    nWidth 
    [in] Specifies the width, in logical units, of vertical brush strokes. 
    nHeight 
    [in] Specifies the height, in logical units, of horizontal brush strokes. 呵呵,多说无益,看看代码你就明白了:
    在一个单文档的OnDraw里加上:
    CBrush brush;
    brush.CreateSolidBrush(0xff00cc); CRect rect;
    rect.SetRect(100, 100, 200, 200);
    pDC->FrameRect(&rect,&brush); CRgn rgn;
    rgn.CreateEllipticRgn(0,0,100,100);
    pDC->FrameRgn(&rgn,&brush,2,10); brush.DeleteObject();看到区别了吧?