CDialog重写
我把边框全部都贴图了, 上面左右二个角(系统本身已经圆角了), 但底下二个边角, 用什么处理?我用以下二种方法都行不通:
1、使用SetWindowRgn, 会导致我的窗口不能拉大拉小了.
2、我把下面二个角的颜色过虐掉就会是黑色的区域.请教各位高手,还有什么好的处理方法,把下面二个角给处理掉?

解决方案 »

  1.   

    1. 我觉得楼主要想实现圆角界面 还是要使用SetWindowRgn 
    2.设定了RGN以后 自己手动设定窗口调整大小的热区即可。
    3.没有找到具体的例子 但是楼主可以参考http://www.vckbase.com/document/viewdoc/?id=317
    代码中的OnNcMouseMove中的处理过程。
      

  2.   

    CreateRoundRectRgn、SetWindowRgn。
    如有必要,可响应WM_NCHITTEST消息,判断鼠标在左下角时返回HTBOTTOMLEFT,右下角时返回HTBOTTOMRIGHT。
      

  3.   

    如果我使用SetWindowRgn 窗口就已经固定了.
    拉大拉小的时候,只有图片在动, 窗口就不会变大变小了.你指的第2点是怎么回事?你说的第3点,我这程序中都有.
      

  4.   

    怎么弄出来了个图片吧 
    设定一个成员变量 CRect WinRn; 来标明你窗口的大小
    通过WinRn 创建一个圆角矩形区域 CRgn rndRgn; 在OnPaint中用SetWindowRgn设定窗口为rndRgn形状。在WinRn中 通过计算 确定窗体标题栏位置 各个顶点的响应拉伸的热区 也就是正常情况下 鼠标到了那个位置会变形 标示可以拉伸窗口的地方。通过对鼠标事件的处理来 重新设定 WinRn的大小 不就实现了不规则窗体拉伸么
      

  5.   

    到我说的这个网址:http://www.vckbase.com/document/viewdoc/?id=317 
    去下载那个Dialog源码,然后把里面CTitleBarDlg下添加下面的代码:
    void CTitleBarDlg::OnSize(UINT nType, int cx, int cy) 
    {
    CDialog::OnSize(nType, cx, cy); CRect winRT;
    AfxGetMainWnd()->GetWindowRect(&winRT); CDC* pDC = GetWindowDC();
    CRgn hRgn1;   
    pDC->BeginPath();
    pDC->RoundRect( 0,0,winRT.Width(),winRT.Height(),50,50);  //将窗体设定为圆角矩形 50是圆角矩形 圆角的半径(可以是椭圆的长轴和短轴 数值不一定相同)
    pDC->CloseFigure();   
    pDC->EndPath();   
    hRgn1.CreateFromPath(pDC);

    SetWindowRgn((HRGN)hRgn1.m_hObject,TRUE);
    }UINT CTitleBarDlg::OnNcHitTest(CPoint point) 
    {
    CRect lT;  //重新设定四个顶点对应的热区
    CRect lB;
    CRect rT;
    CRect rB;  CRect rtWnd;
      AfxGetMainWnd()->GetWindowRect(&rtWnd); lT.left = rtWnd.left; //重新设定四个顶点对应的热区 热区具体设定成什么样子 要根据楼主的情况自己设定 
    lT.top = rtWnd.top;
    lT.bottom = rtWnd.top+50;
    lT.right = rtWnd.left+50; lB.left = rtWnd.left;
    lB.top = rtWnd.bottom - 50;
    lB.bottom = rtWnd.bottom;
    lB.right = rtWnd.left+50; rT.left = rtWnd.right - 50;
    rT.top = rtWnd.top;
    rT.bottom = rtWnd.top+50;
    rT.right = rtWnd.right;

    rB.left = rtWnd.right - 50;
    rB.top = rtWnd.bottom - 50;
    rB.bottom = rtWnd.bottom;
    rB.right = rtWnd.right; if( lT.PtInRect( point ) ) 
    {
    return HTTOPLEFT;
    }
    if( lB.PtInRect( point ) ) 
    {
    return HTBOTTOMLEFT;
    }
    if( rT.PtInRect( point ) ) 
    {
    return HTTOPRIGHT;
    }
    if( rB.PtInRect( point ) ) 
    {
    return HTBOTTOMRIGHT;
    }

    return CDialog::OnNcHitTest(point);
    }不多解释了 一看就知道是怎么回事了, 能实现你说的效果。
    我前面说的 以及满天星说的 都是对的 唯一一点不同的是 不是OnPaint 而是OnSize里面。我们都没有现成的程序 回答问题总不能面面俱到 
    没办法 去试验了一下 是可以的。 效果:上面这个效果就是拖动了右下的热区后得到的。
      

  6.   

    非常感谢Tinary3v0:
    我缺的就是OnSize里面的这一段圆角的.其他的我都不需要, 我已经搞定了,谢谢.!
      

  7.   

    顶楼上的各位,,
    以前都是用贴图实现的,现在可以用SetWindowRgn api了
    学习了。。