|
楼主 |
发表于 2009-5-30 16:17
|
显示全部楼层
原帖由 清风_ll 于 2009-5-30 14:16 发表
很好玩的作品.
不知图片中间指定部位不能填充采用什么方法实现的,期待看到源码.
实现异型窗体的方法是否只是透明窗体中的指定部分,因此在拖动窗体时,会出现窗体的虚边框.
谢谢清风版主,两个都是用Region实现的,前者使用ptInRegion判断指定部位是否可以填充,如果可以的话,就用FillRegion函数填充;后者是先将窗口的边框设为None之后再使用SetWindowRgn指定窗口的显示区域,据说这样比用SetLayeredWindowAttributes让指定颜色透明更有效率(没有亲自实验),至少窗口中可以使用的颜色不受限制了
*Region是Windows GDI中的一个概念,可以先看这个:http://edais.mvps.org/Tutorials/GDI/DC/DCch6.html对Region有一个直观的认识,然后再看MSDN中相关函数的详细说明就容易多了
其中用到的不规则形状的Region是用24位bmp位图(因为它的格式相对比较简单)转化过来的,就是将全部像素读入到数组中,遍历各个像素点,使用CreateRectRgn和CombineRgn将同一颜色的像素组合成一个大的不规则的Region
目前源码还在完善过程中,暂时不能公布,有时间的话我会把根据位图创建不规则窗口的部分拿出来做个VBA版的示例;填色部分转VBA太困难,主要是VBA中不支持的东西太多(资源文件、控件DC、AutoRedraw属性、运行时改变控件MouseIcon、坐标单位转换...),尽管可以用API克服,但代码会复杂很多
虚边框是因为我用了常规的拖动无边框窗口的方法(在MouseMove事件中判断Button=1时,使用SendMessage Me.hwnd, WM_NCLBUTTONDOWN, HTCAPTION, ByVal 0&),貌似窗口在收到WM_NCLBUTTONDOWN, HTCAPTION消息时即使鼠标不移动也会出现虚框,如果在桌面-显示-外观-效果-“拖动时显示窗口内容”前打上勾,虚框就没有了,效果也很完美,如果不使用上面的方法,而是在MouseMove事件中设置窗口的Left和Top属性来设置窗口位置的话,窗口移动的路线上会留下一串残影,我正在寻找更好一点的解决办法,也请清风版主帮忙出出主意。
[ 本帖最后由 小fisher 于 2009-5-30 16:20 编辑 ] |
|