|
楼主 |
发表于 2011-1-10 22:33:50
|
显示全部楼层
回复 wudijushi 的帖子
//图片路径画窗体
if( arg["color"] !=null ){
//创建一个内存兼容DC
var hdc = ::GetDC( this.hWnd );
this.hMemDC := ::CreateCompatibleDC( hdc );
::ReleaseDC(this.hWnd, hdc);
//将内存DC和位图关联
this.hOldBmp := ::SelectObject(this.hMemDC, this.winform.hBkbitmap);
//根据位图生成区域对象
//循环中用到的临时变量
var hRgn = null;
var hRgnTemp = null;
//循环检测位图,将非透明点增加到最终区域。
var img = ..gdip.bitmap(this.winform.image);
for(x=0; img.width-1; 1){
for(y=0; img.height-1; 1){
var cr = ::GetPixel(this.hMemDC, x, y);
if (cr != arg["color"]){
hRgnTemp = CreateRectRgn(x, y, x+1, y+1);
if (hRgn){
CombineRgn(hRgn, hRgn, hRgnTemp, 0x2/*_RGN_OR*/);
::DeleteObject(topointer(hRgnTemp));
}
else{
hRgn = hRgnTemp;
}
}
}
}
this.hRgn := hRgn;
//将区域设置到窗体
SetWindowRgn(this.hWnd, this.hRgn, 0x1/*_TRUE*/);
}
//显示窗口
if( shownow ){ this.winform.show(); }
} //end ctor
//成员函数
showme = function( flag ){
if( flag ){
..win.show(this.hWnd, flag);
}
else {
..win.show(this.hWnd, flag);
}
}
}
namespace float{
SetWindowRgn = ::User32.api("SetWindowRgn","int(int hWnd,int hRgn,int bRedraw)");
GetObjectAPI = ::Gdi32.api("GetObjectA","int(int hObject,int nCount,pointer& lpObject)");
CreateRectRgn = ::Gdi32.api("CreateRectRgn","int(int X1,int Y1,int X2,int Y2)");
CombineRgn = ::Gdi32.api("CombineRgn","int(int hDestRgn,int hSrcRgn1,int hSrcRgn2,int nCombineMode)");
}
/*intellisense()
win.util.float(.(parentwinform, linkimage, shownow(true|false),{可选项} ) ={可选项}\n{buttom=50;\nright=50;\ncolor= gdi.RGB( 0, 0, 0)若传入,侧使你指定的颜色透明,但是请确保是.bmp后缀的图片做背景! }
!float.showme(.(true显示 / false隐藏)
!float.hWnd = 悬浮窗句柄
!float.winform = 悬浮窗体对象
!float.popmenu = 右键菜单
?win.util.float = !float.
end intellisense*/
|
|