//button 按钮
import win.ui.ctrl.metaProperty;//导入控件属性元表支持
import com.picture;
namespace win.ui.ctrl; 

class button{
    ctor(parent,tParam){ 
    	if( tParam ){
			if(tParam.flat) tParam.style |= 0x8000/*_BS_FLAT*/;
			if(tParam.edge) tParam.exstyle |= 0x20000/*_WS_EX_STATICEDGE*/;	
			if(tParam.multiline ) tParam.style |= 0x2000/*_BS_MULTILINE*/	
			tParam.style |=  0x2000/*_BS_MULTILINE*/;
			
			select(tParam.align) {
				case  "left"  
	   			tParam.style |= 0x100/*_BS_LEFT*/;
				case "right" 
	   			tParam.style |= 0x200/*_BS_RIGHT*/; 
				else 
	   			tParam.style |= 0x300/*_BS_CENTER*/;  
			}
			
			select(tParam.valign) {
				case  "top"  
	   			tParam.style |= 0x400/*_BS_TOP*/;
				case "bottom" 
	   			tParam.style |= 0x800/*_BS_BOTTOM*/; 
				else 
	   			tParam.style |= 0xC00/*_BS_VCENTER*/;  
			} 
		} 
	}
	@_metaProperty;
}

var loadIpicture = ..com.picture.load;
button._metaProperty = metaProperty(
	image = {
		_get = function(){   
			return topointer(  
				::SendMessage(owner.hwnd, 0x00F6/*_BM_GETIMAGE*/,
			    	..win.getStyle(owner.hwnd,0x80/*_BS_BITMAP*/)?0x173/*_STM_GETIMAGE*/: 0x171/*_STM_GETICON*/ 
			    ) 
			)
		}
		_set = function( v ){
			if(type(v)==type.pointer)
				return owner.setImage(h);
				
			var ipic = loadIpicture(v)
			if(!ipic){
				owner.modifyStyle( 0x3/*_SS_ICON*/  |  0xE/*_SS_BITMAP*/);
				return;
			}
			
			var hpic,imgtype = ipic.CopyHandle() ; 
			if( imgtype ==0x1/*_IMAGE_ICON*/ )	{  
			     owner.setIcon(hpic); 
		    }
		    else if( imgtype ==0x0/*_IMAGE_BITMAP*/ ){
		        owner.setImage(hpic); 
		    }
		    ..com.Release(ipic)
		} 	
	}   
	setImage = function(h,delPrev=true,bs=0x80/*_BS_BITMAP*/,tt=0x0/*_IMAGE_BITMAP*/){
		owner.modifyStyle( ,0x80/*_BS_BITMAP*/); 
		var retPrev = ::SendMessage(owner.hwnd,0xF7/*_BM_SETIMAGE*/, topointer(0x0/*_IMAGE_BITMAP*/),h);
		if(retPrev){
			if(delPrev){
				::DeleteObject(topointer(retPrev));
				retPrev = true;
			}
		}
		return retPrev;
	} 
	setIcon = function(h,delPrev=true){ 
		return owner.setImage(h,delPrev,0x40/*_BS_ICON*/,0x1/*_IMAGE_ICON*/)
	}
)


class radiobutton{
    ctor(parent,tParam){ 
       if( tParam ){
       	tParam.style |= 0x9/*_BS_AUTORADIOBUTTON*/  //BS_RADIOBUTTON 
       	tParam.cls = "button" 
       	if(tParam.edge) tParam.exstyle |= 0x200/*_WS_EX_CLIENTEDGE*/;
       }
    }
	@_metaProperty;
}
radiobutton._metaProperty = metaProperty(

	checked = {
		_get = function(){ 
			 return  ::SendMessage(owner.hwnd ,0xF0/*_BM_GETCHECK*/);
		}
		_set = function( v ){
			::SendMessage(owner.hwnd ,0xF1/*_BM_SETCHECK*/,topointer(v?1:0));
		} 	
	}
)
 

class checkbox{
    ctor(parent,tParam){ 
       if( tParam ){
       	tParam.style |= 0x3/*_BS_AUTOCHECKBOX*/  
       	tParam.cls = "button" //这个类名仅用于创建窗口 
       	if(tParam.edge) tParam.exstyle |= 0x200/*_WS_EX_CLIENTEDGE*/;
       	tParam.exstyle |= 0x20/*_WS_EX_TRANSPARENT*/;
       }
    }
	@_metaProperty;
}
checkbox._metaProperty = metaProperty(

	checked = {
		_get = function(){ 
			 return  ::SendMessage(owner.hwnd ,0xF0/*_BM_GETCHECK*/);
		}
		_set = function( v ){
			::SendMessage(owner.hwnd ,0xF1/*_BM_SETCHECK*/,topointer(v?1:0));
		} 	
	}
)
  
  
class groupbox{
    ctor(parent,tParam){  
    	if( tParam ){
    		tParam.style |= 0x7/*_BS_GROUPBOX*/  
    		tParam.cls = "button" //这个类名仅用于创建窗口 
			if(tParam.edge) tParam.style |= 0x20000/*_WS_EX_STATICEDGE*/;
		}	 
    }
	@_metaProperty;
}
groupbox._metaProperty = metaProperty( )



/***intellisense() 
!button.cls = 设计时类名
!button.className = 运行时类名
!button.text = 按钮文本属性
!button.hwnd = 控件句柄
!button.id = 控件ID 
!button._parentForm = 控件所在的父窗口(指win.form对象)\n!winform.
!button.getParent() = 返回父窗口\n!static.
!button.setParent(__/*控件对象*/) = 改变父窗口  
!button.hide = 控件是否隐藏
!button.disabled = 是否禁用
!button.left = 左侧坐标
!button.right = 右侧坐标
!button.top = 顶部坐标
!button.bottom = 底部坐标
!button.width = 宽度
!button.height = 高度
!button.redraw() = 刷新
!button.show(true__) = 显示控件
!button.getRect() = 控件区块位置(::RECT结构体)
!button.getRect(true) = 控件屏幕区块位置(::RECT结构体)  
!button.setRect(rc) = 设置控件区块位置(::RECT结构体)  
!button.setRect(rc,true) = 设置控件屏幕区块位置(::RECT结构体)  
!button.getClientRect() =  控件客户区块位置(::RECT结构体)\n!rect.
!button.getFont() = 控件字体(::LOGFONT结构体)\n!logfont.
!button.setFont(__/*指定字体*/) = 指定LOGFONT字体对象,或逻辑字体句柄 
!button.setFont(混入字体属性) = @.setFont(point=10;name="宋体");
!button.clientRect =  获取控件客户区块位置(::RECT结构体)
!button.theme = 外观主题,例如\nwinform.button.theme = "Explorer"\nwinform.button.theme = false
!button.modifyStyle(.(remove,add) = 如果指定第三个参数，则使用此参数调用::SetWidnowPos 
!button.modifyStyleEx(.(remove,add) = 如果指定第三个参数，则使用此参数调用::SetWidnowPos
!button.capture = 是否捕获全局鼠标消息
!button.close() = 关闭控件窗口
!button.invalidate(__/*可选使用::RECT()对象指定客户区*/) = 使窗口绘图区无效
!button.invalidate(__/*可选使用::RECT()对象指定客户区*/,0) = 使窗口绘图区无效\n不刷新背景
!button.update() = 重绘invalidate函数指定的区块
!button.setFocus() = 设置焦点 
!button.setPos(.(x坐标,y坐标,宽,高,插入位置,参数) = 调整窗口位置或排序,所有参数可选\n同时指定x,y坐标则移动位置\n同时指定宽高则改变大小\n指定插入位置(句柄或_HWND前缀常量)则调整Z序
!button.getPos() = 返回相对坐标,宽,高\nx,y,cx,cy=win.getPos(hwnd)
!button.image = 按钮图片或图标\n赋值必须是图片文件路径或数据\n位图句柄由窗体负责销毁\n取值时返回位图句柄
!button.setIcon(__/*图标句柄*/) = 设置图标\n成功返回true,自动销毁原来的位图
!button.setImage(__/*图片句柄*/) = 设置图片\n成功返回true,自动销毁原来的位图
!button.setIcon(__/*图标句柄*/,false) = 设置图标\n成功返回控件原来的位图句柄,\n必须调用::DeleteObject()函数销毁该句柄
!button.setImage(__/*图片句柄*/,false) = 设置图片\n成功返回控件原来的位图句柄,\n必须调用::DeleteObject()函数销毁该句柄
?win.ui.ctrl.button  =!button. 
win.ui.ctrl.button() = 控钮控件\n!button. 
?win.ui.ctrl.groupbox  =!static. 
win.ui.ctrl.groupbox() = 控钮控件\n!static.
end intellisense***/

/***intellisense()
?win.ui.ctrl.checkbox  =!checkbox.
win.ui.ctrl.checkbox() = 复选控钮控件\n!checkbox.
!checkbox.checked = 复选框是否选中状态
!checkbox.hwnd = 控件句柄
!checkbox.id = 控件ID
!checkbox._parentForm = 控件所在的父窗口(指win.form对象)\n!winform.
!checkbox.getParent() = 返回父窗口\n!static.
!checkbox.setParent(__/*控件对象*/) = 改变父窗口 
!checkbox.hide = 控件是否隐藏
!checkbox.disabled = 是否禁用
!checkbox.left = 左侧坐标
!checkbox.right = 右侧坐标
!checkbox.top = 顶部坐标
!checkbox.bottom = 底部坐标
!checkbox.width = 宽度
!checkbox.height = 高度
!checkbox.redraw() = 刷新
!checkbox.show(true__) = 显示控件
!checkbox.getRect() = 控件区块位置(::RECT结构体)
!checkbox.getRect(true) = 控件屏幕区块位置(::RECT结构体)  
!checkbox.setRect(rc) = 设置控件区块位置(::RECT结构体)  
!checkbox.setRect(rc,true) = 设置控件屏幕区块位置(::RECT结构体) 
!checkbox.getClientRect() =  控件客户区块位置(::RECT结构体)\n!rect.
!checkbox.getFont() = 控件字体(::LOGFONT结构体)\n!logfont\n!logfont.
!checkbox.setFont(__/*指定字体*/) = 指定LOGFONT字体对象,或逻辑字体句柄 
!checkbox.setFont(混入字体属性) = @.setFont(point=10;name="宋体");
!checkbox.clientRect =  获取控件客户区块位置(::RECT结构体)
!checkbox.theme = 外观主题,例如\nwinform.button.theme = "Explorer"\nwinform.button.theme = false
!checkbox.modifyStyle(.(remove,add) = 如果指定第三个参数，则使用此参数调用::SetWidnowPos 
!checkbox.modifyStyleEx(.(remove,add) = 如果指定第三个参数，则使用此参数调用::SetWidnowPos
!checkbox.capture = 是否捕获全局鼠标消息
!checkbox.close() = 关闭控件窗口
!checkbox.invalidate(__/*可选使用::RECT()对象指定客户区*/) = 使窗口绘图区无效
!checkbox.invalidate(__/*可选使用::RECT()对象指定客户区*/,0) = 使窗口绘图区无效\n不刷新背景
!checkbox.update() = 重绘invalidate函数指定的区块
!checkbox.setFocus() = 设置焦点 
!checkbox.setPos(.(x坐标,y坐标,宽,高,插入位置,参数) = 调整窗口位置或排序,所有参数可选\n同时指定x,y坐标则移动位置\n同时指定宽高则改变大小\n指定插入位置(句柄或_HWND前缀常量)则调整Z序
!checkbox.getPos() = 返回相对坐标,宽,高\nx,y,cx,cy=win.getPos(hwnd)
end intellisense***/


/***intellisense()
?win.ui.ctrl.radiobutton  =!radiobutton.
win.ui.ctrl.radiobutton() = 单选控钮控件\n!radiobutton.
!radiobutton.checked = 单选按钮否选中状态
!radiobutton.hwnd = 控件句柄
!radiobutton.id = 控件ID
!radiobutton._parentForm = 控件所在的父窗口(指win.form对象)\n!winform.
!radiobutton.getParent() = 返回父窗口\n!static.
!radiobutton.setParent(__/*控件对象*/) = 改变父窗口 
!radiobutton.hide = 控件是否隐藏
!radiobutton.disabled = 是否禁用
!radiobutton.left = 左侧坐标
!radiobutton.right = 右侧坐标
!radiobutton.top = 顶部坐标
!radiobutton.bottom = 底部坐标
!radiobutton.width = 宽度
!radiobutton.height = 高度
!radiobutton.redraw() = 刷新
!radiobutton.show(true__) = 显示控件
!radiobutton.getRect() = 控件区块位置(::RECT结构体)
!radiobutton.getRect(true) = 控件屏幕区块位置(::RECT结构体)  
!radiobutton.setRect(rc) = 设置控件区块位置(::RECT结构体)  
!radiobutton.setRect(rc,true) = 设置控件屏幕区块位置(::RECT结构体) 
!radiobutton.getClientRect() =  控件客户区块位置(::RECT结构体)\n!rect.
!radiobutton.getFont() = 控件字体(::LOGFONT结构体)\n!logfont\n!logfont. 
!radiobutton.setFont(__/*指定字体*/) = 指定LOGFONT字体对象,或逻辑字体句柄 
!radiobutton.setFont(混入字体属性) = @.setFont(point=10;name="宋体");
!radiobutton.clientRect =  获取控件客户区块位置(::RECT结构体)
!radiobutton.theme = 外观主题,例如\nwinform.button.theme = "Explorer"\nwinform.button.theme = false
!radiobutton.modifyStyle(.(remove,add) = 如果指定第三个参数，则使用此参数调用::SetWidnowPos 
!radiobutton.modifyStyleEx(.(remove,add) = 如果指定第三个参数，则使用此参数调用::SetWidnowPos
!radiobutton.capture = 是否捕获全局鼠标消息
!radiobutton.close() = 关闭控件窗
!radiobutton.invalidate(__/*可选使用::RECT()对象指定客户区*/) = 使窗口绘图区无效
!radiobutton.invalidate(__/*可选使用::RECT()对象指定客户区*/,0) = 使窗口绘图区无效\n不刷新背景
!radiobutton.update() = 重绘invalidate函数指定的区块
!radiobutton.setFocus() = 设置焦点 
!radiobutton.setPos(.(x坐标,y坐标,宽,高,插入位置,参数) = 调整窗口位置或排序,所有参数可选\n同时指定x,y坐标则移动位置\n同时指定宽高则改变大小\n指定插入位置(句柄或_HWND前缀常量)则调整Z序
!radiobutton.getPos() = 返回相对坐标,宽,高\nx,y,cx,cy=win.getPos(hwnd)
end intellisense***/

