在主页上看到有关有句柄窗口和无句柄窗口的讨论,本来想直接在回复里面问这个问题的,但是希望能让跟多人解答下这个问题,就单独开了一个贴。图如下:上面那张图片上的UI不是方的,它的实现是直接写显存还是在创建win32窗口的时候用了CreateDC("Display",NULL,NULL,NULL)这个函数实现非规则形状窗口,还是其他方法?

解决方案 »

  1.   

    所有窗口都被设置在一个区域内(CRgn)显示!去了解一下
    SetWindowRgn
    函数!
      

  2.   

    我也看过GDI里关于区域的东西,但只是简单看了一下,里面区域形状好像是用GDI绘图的相关函数实现,比如绘制椭圆形区域,绘制矩形区域,多边形区域等,也可以将这些形状合并。但是上面的UI形状极复杂。比如点一下图形中间的空白区域,整个窗口是不会被选中的。只有点有颜色部分才选中。
      

  3.   

    那是因为处理了WM_LBUTTONDOWN消息;
    if(point.y>=0 && point.y<=30)
    {
    SendMessage(WM_NCLBUTTONDOWN,HTCAPTION,0);
    }
    如上:可以在该指定的范围内移动窗口!
      

  4.   

    GDI+ 搞的http://www.vckbase.com/document/viewdoc/?id=1745
      

  5.   

    5楼的方法我不知道可行不可行,但是那将是非常麻烦的东西,要照顾到每个像素点~~6楼的方法是一个不错的方法,强大的GDI+。
      

  6.   

    看看这个
    http://hi.baidu.com/jenfmo/blog/item/1add55388b6288f1b211c7c3.html
    还有这个
    http://www.anqn.com/dev/vc/2009-06-12/a09111475.shtml
      

  7.   

    学到了一些东西:
    CRgn rgnWnd,rgnTemp;
    rgnWnd.CreateRectRgn(0,0,rectWnd.Width(),rectWnd.Height());
    int nWidth,nHeight;
    COLORREF color; 
    //下面的两层循环为检查背景位图象素颜色,进行透明区域处理;
    //当象素颜色为指定的透明值时,即将该点从区域中剪裁掉。
    for (nWidth = 0;nWidth <= rectWnd.Width()-1;nWidth++)
    {
     for (nHeight = 0;nHeight <= rectWnd.Height();nHeight++)
     {
      color = memDC.GetPixel(nWidth,nHeight);
      // 当象素是白色时,去掉该点
      if (color == RGB(255,255,255))
      {
       //象素颜色为指定的透明色,创建透明"微区域"
       rgnTemp.CreateRectRgn(nWidth,nHeight,nWidth+1,nHeight+1);
       //"扣像",从完整的区域中"扣除"透明的"微区域"
       rgnWnd.CombineRgn(&rgnWnd,&rgnTemp,RGN_XOR);
       //删除刚创建的透明"微区域",释放系统资源
       rgnTemp.DeleteObject(); 
      }
     }
    }
    memDC.SelectObject(pOldBitmap);
    SetWindowRgn((HRGN)rgnWnd,TRUE); //用最终设定窗口的显示区域为指定区域
    上面的代码可以根据位图形成复杂形状的区域。