关于不规则形状窗口

时间:2022-03-08 20:33:48
小弟要做个应用,所有窗口都是不规则窗口.窗口的形状由位图决定,主窗口的位图(不包括透明色)大小要小于完成界面的大小.在主窗口上创建子窗口时,希望子窗口部分超出主窗口,但子窗口不能移出主窗口,该如何解决?

9 个解决方案

#1


第一个很好解决,确定位图后生成一个多边形,再设定窗口区域就行了
好像是用 CreatePolygonRgn, SetWindowRgn 两个函数搞定

第二个用 MDI 比较简单,否则要自己裁剪窗口,也可以但是很麻烦。

#2


SetWindowRgn();

#3


   做不规则窗口的话可以用函数SetWindowRgn()函数,将一个构造好的区域赋给一个窗口,我这里有一个非常酷的播放器的界面,有源代码,想要就和我联系吧

#4


创建位图不规则窗口很容易,我这也有现成的实现函数。
要使子窗口不移出主窗口,我可以提供思路:
  定义一个矩形(RECT),这个矩形位于子窗口中心区域,在Move事件中修改此矩形位置,并用RectInRgn判断其是否在主窗口区域,若超出则移动其回主窗口区域。
也可简单的定义子窗口中心点,用PtInRgn判断。

#5


在www.codeguru.com上有几个关于创建不规则窗体的例子,你可以参考一下,主要使用两个函数
CreatePolygonRgn,SetWindowRgn 

#6


关于不规则窗口的实现,我有一个简单的例子,没有实现位图功能.mail me your address.

#7


使用位图创建区域的源代码我有,已经放在我的网页上了http://rain.cnpick.com
或者http://breath.cnpick.com
函数名BmpToRegion
想要就来吧,或者给我发EMail

#8


to breath
知道原理,只是没时间做,也给我一份,谢谢了先

#9


多谢各位指点,小弟这里谢了!子窗口并不是在有Move事件时才超出主窗口,而是一直超出主窗口,关于这个问题我已解决了.我把原先所有的子窗口做成popup窗口就可以了.但还有两个问题我没弄明白:
    1.  当我用GetWindowRgn得到窗口的区域后,用CRgn::PtInRegion 判断某点是否在该区域中时,发现该点明明在区域外,可CRgn::PtInRegion 却返回TRUE,这是怎么回事?如何解决?
    2.  我在某窗口中按着鼠标键移出该窗口,在该窗口外松开鼠标键,该窗口中的控件还是处于鼠标键按下时的状态,并且我发现当按着鼠标在窗口中移动时,不能捕获WM_MOUSEMOVE消息,这问题该如何解决?
   多谢各位赐教!

#1


第一个很好解决,确定位图后生成一个多边形,再设定窗口区域就行了
好像是用 CreatePolygonRgn, SetWindowRgn 两个函数搞定

第二个用 MDI 比较简单,否则要自己裁剪窗口,也可以但是很麻烦。

#2


SetWindowRgn();

#3


   做不规则窗口的话可以用函数SetWindowRgn()函数,将一个构造好的区域赋给一个窗口,我这里有一个非常酷的播放器的界面,有源代码,想要就和我联系吧

#4


创建位图不规则窗口很容易,我这也有现成的实现函数。
要使子窗口不移出主窗口,我可以提供思路:
  定义一个矩形(RECT),这个矩形位于子窗口中心区域,在Move事件中修改此矩形位置,并用RectInRgn判断其是否在主窗口区域,若超出则移动其回主窗口区域。
也可简单的定义子窗口中心点,用PtInRgn判断。

#5


在www.codeguru.com上有几个关于创建不规则窗体的例子,你可以参考一下,主要使用两个函数
CreatePolygonRgn,SetWindowRgn 

#6


关于不规则窗口的实现,我有一个简单的例子,没有实现位图功能.mail me your address.

#7


使用位图创建区域的源代码我有,已经放在我的网页上了http://rain.cnpick.com
或者http://breath.cnpick.com
函数名BmpToRegion
想要就来吧,或者给我发EMail

#8


to breath
知道原理,只是没时间做,也给我一份,谢谢了先

#9


多谢各位指点,小弟这里谢了!子窗口并不是在有Move事件时才超出主窗口,而是一直超出主窗口,关于这个问题我已解决了.我把原先所有的子窗口做成popup窗口就可以了.但还有两个问题我没弄明白:
    1.  当我用GetWindowRgn得到窗口的区域后,用CRgn::PtInRegion 判断某点是否在该区域中时,发现该点明明在区域外,可CRgn::PtInRegion 却返回TRUE,这是怎么回事?如何解决?
    2.  我在某窗口中按着鼠标键移出该窗口,在该窗口外松开鼠标键,该窗口中的控件还是处于鼠标键按下时的状态,并且我发现当按着鼠标在窗口中移动时,不能捕获WM_MOUSEMOVE消息,这问题该如何解决?
   多谢各位赐教!