Chinaunix首页 | 论坛 | 博客
  • 博客访问: 4737175
  • 博文数量: 206
  • 博客积分: 5240
  • 博客等级: 大校
  • 技术积分: 3224
  • 用 户 组: 普通用户
  • 注册时间: 2010-08-12 21:40
文章分类

全部博文(206)

文章存档

2013年(13)

2012年(8)

2011年(33)

2010年(152)

我的朋友

分类: WINDOWS

2011-04-04 23:39:36

//界面支持库
import win.ui.ctrl;  
import win.gdi; 

namespace win   
namespace ui{
    _forms = {}  
//记录所有win.form对象,创建则添加此表,销毁则从表中移除 
     
    getForm = 
function(hwnd){
        
var winform = _forms[hwnd];
        
while(!winform){
            hwnd = ..win.getParent(hwnd);
            
if(!hwnd) 
                
return null
            winform =  _forms[hwnd]; 
        } 
        
        
return winform
    }
     
    
/**intellisense(win.ui)
    _forms = 记录所有winform对象,键作为句柄
    getForm(__/*控件或窗口句柄*/) = 返回指向或包含句柄指向窗口的form对象 
    end intellisense**/

    
}
 

//下面两个函数是保护成员,禁止外部直接调用
var SetTimer = ::User32.api("SetTimer","INT(int hWnd,INT nIDEvent,INT uElapse,pointer lpTimerFunc)");
var KillTimer = ::User32.api("KillTimer","int(int hWnd,INT nIDEvent)");

var cyborder = ::GetSystemMetrics( 0x6/*_SM_CYBORDER*/ );
var cxborder = ::GetSystemMetrics( 0x5/*_SM_CXBORDER*/ );
var cycaption = ::GetSystemMetrics( 0x4/*_SM_CYCAPTION*/  ); 

::Shell32 := ..raw.loadDll(
"Shell32")
var DragQueryFile = ::Shell32.api("DragQueryFile","INT(int hDrop,  INT iFile,str& lpszFile,INT cch)");
var DragFinish =  ::Shell32.api("DragFinish","INT(int hDrop)");


//接收拖放文件名
getDropFile = function(wparam){ 
    
var re = DragQueryFile(wparam,0xFFFFFFFF,128,128);
    
var file = {}; 
    
for(i=1;re)
        re,file[i] = DragQueryFile(wparam,i-1,128,128);
    DragFinish( wparam );
    
return file;
}
/**intellisense(win)
getDropFile(wparam) = 用于消息回调函数中获取拖放文件列表
end intellisense**/


try{
    uxTheme = ..raw.loadDll(
"UxTheme.dll")
    SetWindowTheme = uxTheme.api(
"SetWindowTheme","void(int hwnd,string pszSubAppName,string pszSubIdList)" )
    
//SetWindowTheme(控件句柄," "," ")
}
catch(e){


ui.NMHDR = 
class {
 int hwndFrom;
 INT idFrom;
 INT code; 
// NM_ code
}
var NMHDR_L = ui.NMHDR;
/**intellisense()
!nmhdl.hwndFrom = 发送消息的控件句柄
!nmhdl.idFrom = 发送消息的控件ID
!nmhdl.code = 通知代码
?.ui.NMHDR = !nmhdl.
end intellisense**/



var io = ..io;
var raw = ..raw;
var hInstance = ::GetModuleHandle(null);
class form{  
    
//form类构造函数
    ctor( tparam ) begin   
        
this.hInstance = hInstance;
        
var wndclass  = ::WNDCLASSEX();   
        tparam.cls := 
"AAU_FORM"
        tparam.cls = ..string.format(
"%s[TID:%d]",tparam.cls , ..thread.getId() ) 
        
if(not ::GetClassInfo(this.hInstance,tparam.cls,wndclass) ) {  
            
//创建一个新的窗口类
            wndclass  = ::WNDCLASSEX(); 
            wndclass.hInstance= hInstance ; 
            wndclass.lpszClassName=tparam.cls; 
            wndclass.hIcon =   ::LoadIcon(
this.hInstance, topointer(130) );
            wndclass.hIconSm =   ::LoadIcon(
this.hInstance, topointer(130) );
            wndclass.hCursor =  ::LoadCursor(
nulltopointer(0x7F00/*_IDC_ARROW*/) );
            wndclass.hbrBackground =  
topointer(0xF/*_COLOR_BTNFACE*/ + 1) //::GetStockObject(_HOLLOW_BRUSH); 
            wndclass.lpfnWndProc = ::DefWindowProc;  
         
            
assert(  RegisterClassEx( wndclass) ,   ..lasterr()  ) 
        }
        
        
var cyborder = CY_BORDER
        
var cxborder = CX_BORDER
        
var cycaption = CY_CAPTION
        
        
//生成窗口扩展样式
        //---------------------------------
        
        
//初始化为组合扩展样式
        tparam.exstyle := 0 
        
select( tparam.exmode ) { 
            
case "toolwindow" { 
                tparam.exstyle |= 0x80
/*_WS_EX_TOOLWINDOW*/;
            }
            
case "none" {
                tparam.exstyle |= 0;
            } 
            
else {
                tparam.exstyle |= 0x40000
/*_WS_EX_APPWINDOW*/;
            } 
        
        }
        
        
if(tparam.acceptfiles) 
             tparam.exstyle |= 0x10
/*_WS_EX_ACCEPTFILES*/
             
        
if(tparam.frame)
             tparam.exstyle |= 0x1
/*_WS_EX_DLGMODALFRAME*/
             
        
if(tparam.cp)
             tparam.exstyle |= 0x10000
/*_WS_EX_CONTROLPARENT*/ 
         
        
if(tparam.topmost) 
            tparam.exstyle |= 0x8
/*_WS_EX_TOPMOST*/
     
        
//生成窗口样式
        //---------------------------------
        
        
//初始化为组合样式
        tparam.style := 0
        
select( tparam.mode ) { 
            
case "child" {
                tparam.style |= 0x40000000
/*_WS_CHILD*/  
            }
            
case "popup" {
                tparam.style |= 0x80000000
/*_WS_POPUP*/ ; 
            }  
            
else  {
                tparam.style |= 0x0
/*_WS_OVERLAPPED*/;
            }
        
        }  
        
        
//如果窗口标题为空,则自动禁用标题栏,系统菜单
        if(! (#(tparam.text)) ){
            tparam.title = 
false;
            
//tparam.sysmenu = false;
        }
        
        
if(tparam.title === false ) //无标题栏时不能应用_WS_OVERLAPPED样式
            tparam.style := 0x80000000/*_WS_POPUP*/
      
        
//边框样式
        
        
//WS_CAPTION 实际上是 _WS_BORDER 与 _WS_DLGFRAME组合而成
        var deltitle =  ~0xC00000/*_WS_CAPTION*/;
        
select( tparam.border ) { 
            
case "resizable" {
                tparam.style |= 0x40000
/*_WS_SIZEBOX*/;
            }
            
case "thin" {
                tparam.style |= 0x800000
/*_WS_BORDER*/;
                deltitle = ~0x400000
/*_WS_DLGFRAME*/
            }
            
case "none" {
                
//无边框窗口
                cyborder = 0;
                cxborder = 0;
                
                
//取消默认的 0x0/*_WS_OVERLAPPED* 样式
                tparam.style :=   0x80000000/*_WS_POPUP*/
                tparam.style &= ~ 0x800000
/*_WS_BORDER*/;
                 
                tparam.title = 
false;
            } 
            
else {
                tparam.style |= 0x400000
/*_WS_DLGFRAME*/;
                deltitle = ~0x800000
/*_WS_BORDER*/
            }
        
        }   
         
        
if(tparam.title===false) {
            tparam.style &= deltitle 
//避免去掉标题栏时覆盖了边框设置
            cycaption = 0; //如果没有标题栏,则要去掉标题栏的高度 
        }   
        
else
            tparam.style |= 0xC00000
/*_WS_CAPTION*/ 
        } 
        
 
        
if(tparam.max!==false
            tparam.style |= 0x10000
/*_WS_MAXIMIZEBOX*/ 
        
else
            tparam.style &= ~0x10000
/*_WS_MAXIMIZEBOX*/ 
            
        
if(tparam.min!==false
            tparam.style |= 0x20000
/*_WS_MINIMIZEBOX*/ 
        
else
            tparam.style &= ~0x20000
/*_WS_MINIMIZEBOX*/ 
             
             
        
if(tparam.sysmenu!==false) {
            tparam.style |= 0x80000
/*_WS_SYSMENU*/
        }
        
else {
            tparam.style &= ~0x80000
/*_WS_SYSMENU*/
        } 
        
        
if( tparam.maxmize  ){
            tparam.style |= 0x1000000
/*_WS_MAXIMIZE*/;
        }
        
if( tparam.minmize  ){
            tparam.style |= 0x20000000
/*_WS_MINIMIZE*/
        }
        
        
        this@ = metaProperty
         
//如果用户设置了背景图片
        this.image = tparam.image 
 
    
    
        
        
if( ( type( tparam.parent) == type.table )   ){
            
this.parent = tparam.parent;
            tparam.parent = tparam.parent.hwnd; 
        } 
        
        
iftype( tparam.parent ) != type.number )
            tparam.parent = 0;  
        
        
if(tparam.left===null
            tparam.left= -1;
        
if(tparam.top===null
            tparam.top= -1; 
        
        
//计算窗体宽、高
        var cx = tparam.right - tparam.left + (cxborder*2) ;
        
var cy = tparam.bottom - tparam.top + (cyborder*2) + cycaption;
        
        
var x = tparam.left ;
        
//如果为负数,计算默认坐标
        if(x==-1){
            
var sx = ::GetSystemMetrics(0x0/*_SM_CXSCREEN*/) ;
            
if(sx>cx)
                x = (sx-cx)/2;
            
else
                x = 0; 
//0x80000000/*_CW_USEDEFAULT*/
        }
        
        
var y = tparam.top ;
        
//如果为负数,计算默认坐标
        if(y==-1){
            
var sy = ::GetSystemMetrics(0x1/*_SM_CYSCREEN*/ ) ;
            
if(sy>cy)
                y = (sy-cy)/2;
            
else
                y = 0; 
//0x80000000/*_CW_USEDEFAULT*/
        }
            
        
//创建主窗口
        this.hwnd = ::CreateWindowEx(
        tparam.exstyle,
        tparam.cls,
        tparam.text,
        tparam.style , 
//窗口风格
        x,//x
        y,//y
        cx,//w
        cy,//h
        tparam.parent,//parent
        0,//menu
        hInstance,
        
null//param
        );
         
        
this.font = LOGFONT(  );//设置字体
        
        
//记录窗口大小 
        this._defDlgRect = ::RECT();//记录主窗体大小 
        this._defDlgRect.left = tparam.left- cxborder ;
        
this._defDlgRect.top = tparam.top-( cyborder + cycaption) ;
        
this._defDlgRect.right = tparam.right + cxborder;
        
this._defDlgRect.bottom = tparam.bottom + cyborder;
        
        
//不要清除设置图片时设定的默认背景色
        if( tparam.bgcolor)
            
this[["bgcolor"]] = tparam.bgcolor;
            
        
this[["scroll"]] = tparam.scroll;
        
        
this._wndproc_c = raw.tostdcall( _wndproc,   ..win.CALLBACK.WNDPROC,this/*设为owner对象*/)   
        ::SetWindowPointer(
this.hwnd,0xFFFFFFFC/*_GWL_WNDPROC*/,  this._wndproc_c);  
        
        
this.maxmize =  tparam.maxmize;
        
this.minmize =  tparam.minmize 
                 
        ..win.ui._forms[
this.hwnd] = this;
        
        ..win.closed = 
null;//通知所有消息函数,窗体正在运行
    end;
    _ctrlId = {};
//控件ID映射关系
    _ctrlHwnd = {};//控件句柄映射关系 
    add = function( tparam ) begin
        
var zorder = {}
        
for name,tvalue in  tparam{
            
for(i=1;#zorder;1){
                 
if( zorder[i][2].z > tvalue.z )
                 { 
                     ..table.insert( zorder,{name;tvalue} , i) 
                     
continue 2;
                 }
            } 
            ..table.push( zorder,{name;tvalue} );
            
        }
 
        
for(i=#zorder;1;-1 ){  
            
var name = zorder[i][1];
            
var tvalue = zorder[i][2];  
            
             
//创建控件
            tvalue.parent = this;//自定义控件要用到
            ctrl = ..win.ui.ctrl.factory.create(tvalue);
            
if(!ctrl)continue ;
            
this[name] = ctrl;
            
            
//对控件添加一些默认的属性
            ctrl.id =  ..table.push( this._ctrlId, ctrl ) ; 
            ctrl.parent = 
this
             
            
//创建控件窗口  
            if( !ctrl.hwnd ){
                
//如果不是自定义控件    
                ctrl.hwnd = ::CreateWindowEx (tvalue.exstyle, tvalue.cls , tvalue.text ,  tvalue.style  ,tvalue.left,tvalue.top,tvalue.right - tvalue.left , tvalue.bottom - tvalue.top,
                                        
this.hwnd , 
                                        ctrl.id , 
                                        
this.hInstance   ) 
            } 
            
else{
                ..win.setPos(ctrl.hwnd,tvalue.left,tvalue.top,tvalue.right - tvalue.left , tvalue.bottom - tvalue.top);
            }
            
//记录所有子控件的窗口句柄     
            this._ctrlHwnd[ctrl.hwnd] = ctrl     
            
            
//初始化控件
            ..win.ui.ctrl.factory.onCreateComplete(ctrl);
        }


    
end;
     
    _tTimeProc = {};
    addtimer = 
function(elapse,func){ 
         
var  timeproc_c = this._tTimeProc[func]
         
if(!timeproc_c){
            timeproc_c =  ..raw.tostdcall(func,
"void(int hwnd, INT uMsg, INT idEvent, INT dwTime)" );
            
this._tTimeProc[func] = timeproc_c;
         } 
         
var id = ..table.push( this[["_tTimeProc"]] ,timeproc_c); //保存回调函数
         SetTimer(this.hwnd,id,elapse,timeproc_c); 
         
return id;
    } 
    reghotkey  = 
function( func , mod,vk ){ 
         
if(! this[["_hotkeys"]] ) this[["_hotkeys"]] = {};
         
var id = ..table.push( this[["_hotkeys"]] ,func); //保存回调函数
         RegisterHotKey(this.hwnd,id,mod,vk);
         
return id;
    } 
    unreghotkey  = 
function(idEvent){ 
         UnregisterHotKey(
this.hwnd,idEvent);
         ..table.remove( 
this[["_hotkeys"]],idEvent);
    } 
    settimer = 
function(id,elapse){  
         
var  timeproc_c = this._tTimeProc[id] 
         SetTimer(
this.hwnd,id,elapse,timeproc_c); 
    } 
    killtimer = 
function(idEvent){  
         KillTimer(
this.hwnd,idEvent);
         ..table.remove( 
this[["_tTimeProc"]],idEvent);
    } 

    pretranslate = 
false//避免触发元表
         


var loopmessage_l =  loopMessage 
form.
loadcode = function(code,parent){
    loopMessage = 
function(){ }//禁用..win.loopMessage 
    var f = assertloadcode(code) );
    
var result = f(parent);
    loopMessage  = loopmessage_l;
//恢复..win.loopMessage 
    return result;
}
    
namespace form{ 
    
/*intellisense(win.form)*/
    RegisterHotKey = ::User32.api(
"RegisterHotKey","int(int hwnd,int id,int fsModifiers,int vk)")
    UnregisterHotKey = ::User32.api(
"UnregisterHotKey","Long(int hwnd,int id)")

    SetLayeredWindowAttributes = ::User32.api(
"SetLayeredWindowAttributes","int(int hwnd,int crKey,BYTE bAlpha,INT dwFlags)");
    DefWindowProc  = User32.api( 
"DefWindowProc""int(int hWnd,INT msg,int wparam,int lParam) " ) 
    RegisterClassEx = User32.api( 
"RegisterClassEx"" word(struct lpWndClass) " )  
    GetClassInfo  = User32.api( 
"GetClassInfoA""int(pointer hInstance,string lpClassName,struct &lpWndClass)" )  
    
    GetSysColor = ::User32.api(
"GetSysColor","int(int nIndex)"
    LoadCursor  := User32.api(  
"LoadCursorA""pointer(pointer,string)"
    EnableWindow = ::User32.api(
"EnableWindow","int(int hwnd,int fEnable)")
    WNDCLASSEX = 
class
        INT     cbSize = 48; 
        INT     style = 0x2 | 0x1 | 0x8;
//_CS_HREDRAW | _CS_VREDRAW | _CS_DBLCLKS;
        pointer    lpfnWndProc;
        int      cbClsExtra;
        int      cbWndExtra;
        pointer      hInstance;
        pointer      hIcon;
        pointer      hCursor;
        pointer      hbrBackground;
        string   lpszMenuName;
        string   lpszClassName;
        pointer      hIconSm;
    }  
    
    CY_BORDER = ::GetSystemMetrics( 0x6
/*_SM_CYBORDER*/ );
    CX_BORDER = ::GetSystemMetrics( 0x5
/*_SM_CXBORDER*/ );
    CY_CAPTION = ::GetSystemMetrics( 0x4
/*_SM_CYCAPTION*/  );
 
    
/*end intellisense*/
    _wndproc =  
function( hwnd,  message, wparam , lparam) {    
            
ifowner[["wndproc__"]] ) { 
                
var result = owner[["wndproc__"]](  hwnd,  message, wparam , lparam );
                
if( result !== null )//用非恒等式来排除0,false等逻辑假的值
                      return result;
            }
             
            
select(message) { 
                
case 0x14/*_WM_ERASEBKGND*/    {     
                      
var dlgRect = owner[["dlgRect"]]; //获取新的窗口区域   
                      var hdc = topointer(wparam)
                      
if(! dlgRect ){
                        dlgRect= ::RECT();
                        ::GetWindowRect( 
owner.hwnd , dlgRect ); //获取新的窗口区域
                        owner[["dlgRect"]] = dlgRect;
                      }
                      
                      
                      
var erase = 0;
                      
iftype(owner[["bgcolor"]] ) == type.number && (owner[["bgcolor"]]!=-1) ){ //有可能为0 - 黑色,因为0为false,因此改用类型判断
                        var bgbrush = ::CreateSolidBrush( owner[["bgcolor"]]  );
                        
var oldbrush   =   ::SelectObject(hdc,bgbrush ); 
                        ::PatBlt(hdc,0,0,dlgRect.right - dlgRect.left   ,dlgRect.bottom - dlgRect.top,0xF00021
/*_PATCOPY*/);   
                        ::SelectObject(hdc,oldbrush); 
                        ::DeleteObject(bgbrush);
                        erase = 1;
                      }
                             
                      
// winform的元表对于不存在的对象会返回一个空的table 
                      ifowner[[ "hBkbitmap" ]] ){  
                        
                        
var hdcMem   =   ::CreateCompatibleDC(hdc);     
                        
var hBitmapStartScanBAK   =   ::SelectObject(hdcMem,owner.hBkbitmap );   
                        ::BitBlt(hdc,0,0,dlgRect.right - dlgRect.left   ,dlgRect.bottom - dlgRect.top,hdcMem,0,0, 0xCC0020
/*_SRCCOPY*/);   
                        ::SelectObject(hdcMem,hBitmapStartScanBAK);   
                        ::DeleteDC(hdcMem);  
                        erase = 1; 
                      }
                        
                      
if( erase )  
                        
return 1;
                        
                }   
                
case 0x138/*_WM_CTLCOLORSTATIC*/ , 0x133/*_WM_CTLCOLOREDIT*/,0x135/*_WM_CTLCOLORBTN*/, 0x134/*_WM_CTLCOLORLISTBOX*/   {
                    
var ctrl = owner._ctrlHwnd[ lparam ];
                    
var hdc = topointer(wparam)
                    
if( ctrl  ){  ; 
                        
iftype(ctrl.color)==type.number )
                                ::SetTextColor(hdc,ctrl.color ) ;
                                
                        
if(ctrl.transparent) {
                            ::SetBkMode(hdc,1);  
                            
return tonumber(  ::GetStockObject(5) );//NULL_BRUSH
                        }
                        
else if( ( type(ctrl[["bgcolor"]]) == type.number ) && (ctrl[["bgcolor"]]!=-1)) 
                        {
                            
//::SetBkMode(hdc,0); 
                            ::SetBkColor(hdc,ctrl.bgcolor)  ;
                            ctrl.brush := ::CreateSolidBrush( ctrl.bgcolor )  ;
                            
return  ctrl.brush ;//返回值必须与回调函数声明完全一致 
                        }
                    
                    }
                }
                
case 0x5/*_WM_SIZE*/ { 
                    
if( hwnd == owner.hwnd){ //主窗口
                    
                        
if( ..win.isIconic(hwnd) )
                               
return;
                     
                        
//获取新的窗口区域 (屏幕坐标)
                        owner.dlgRect = ::RECT();
                        
var dlgRect = owner.dlgRect 
                        ::GetWindowRect( 
owner.hwnd , dlgRect ); 
                        
                        
var defDlg = owner._defDlgRect;
                        
                        
//计算变化的比例
                        xrate = (dlgRect.right-dlgRect.left)/(defDlg.right-defDlg.left);
                        yrate = (dlgRect.bottom-dlgRect.top)/(defDlg.bottom-defDlg.top); 
                         
                        
var defCtrl;//预设控件位置
                        var width,height;//宽高
                        var left,top,right,bottom;//这里表示边距
                        
                        
var ptLt = {
                            int x;
                            int y; 
                        };
                        
var ptRb  = {
                            int x;
                            int y;
                        }
                        
                        
for(id,ctrl in owner._ctrlId){
                            defCtrl = ctrl._defCtrlRect;
                            width=(defCtrl.right-defCtrl.left);
                            height=(defCtrl.bottom -defCtrl.top ); 
                            
                            left = defCtrl.left-defDlg.left;
                            top = defCtrl.top-defDlg.top;
                            right = defCtrl.right-defDlg.right;
                            bottom = defCtrl.bottom-defDlg.bottom;
                            
                            
if( ctrl[["dl"]] )
                                ptLt.x = dlgRect.left + left ;
                            
else
                                ptLt.x = dlgRect.left+ left * xrate ;
                            
                            
if( ctrl[["dt"]] )
                                ptLt.y = dlgRect.top+ top ;
                            
else
                                ptLt.y = dlgRect.top+ top *yrate ;
                            
                            
if( ctrl[["dr"]] ) {
                                ptRb.x = dlgRect.right + right ;
                                 
                                
if( ctrl[["aw"]] == false ) && ( ctrl[["dl"]] == false )
                                    ptLt.x = ptRb.x  - width;
                            }
                            
else {
                                
if( ctrl[["aw"]] )
                                    ptRb.x = dlgRect.right+ right * xrate ;
                                
else
                                    ptRb.x = ptLt.x+width;
                
                            }
                
                            
if( ctrl[["db"]] )  {
                                ptRb.y= dlgRect.bottom+ bottom ;
                                
if( ( ctrl[["ah"]] == false ) && ( ctrl[["dt"]] == false ) )
                                    ptLt.y  = ptRb.y  - height ;
                            }
                            
else{
                                
if( ctrl[["ah"]] )
                                    ptRb.y= dlgRect.bottom+ bottom * yrate ;
                                
else
                                    ptRb.y= ptLt.y + height;
                            }
                             
                            ::ScreenToClient(
owner.hwnd,ptLt); 
                            ::ScreenToClient(
owner.hwnd,ptRb); 
                            
                            
var adjust = ctrl[["adjust"]] ;
                            ::MoveWindow( ctrl.hwnd ,ptLt.x,ptLt.y, ptRb.x - ptLt.x, ptRb.y - ptLt.y  ,adjust?1:0)
                            
iftype( adjust) == type.function ){ 
                                adjust( ptRb.x - ptLt.x, ptRb.y - ptLt.y); 
//容器控件
                            }
                            
                        }
                        
owner.redraw();  
                        
                        
iftypeowner[["adjust"]]  ) == type.function ){  
                            
owner.adjust( dlgRect.right-dlgRect.left,dlgRect.bottom-dlgRect.top);
                        } 
                    }
                    
                } 
                
case 0x111/*_WM_COMMAND*/ {
                    
var wmId    = ::LOWORD(wparam);
                    
var wmEvent = ::HIWORD(wparam); 
                    
                    
var ctrl = owner._ctrlId[wmId];
                    
if(ctrl) { 
                        
var oncommand = ctrl.oncommand;
                        
if(oncommand) 
                              oncommand(wmId,wmEvent);  
                    }
                    
else if( (!lparam) && wmId > 5000){
                         wmId -= 5000; 
                         
var proc = owner._menus[wmId];
                         
if(type(proc)==type.function)
                            proc(wmId+5000,wmEvent);
                    }
                }
                
case 0x004E /*_WM_NOTIFY*/ {
                    
if(lparam){
                        
                        wmId = wparam;
                        
var ctrl = owner._ctrlId[wmId];
                        
                        
if(ctrl && (ctrl._prenotify || ctrl.onnotify) ){ 
                            
var  nmdr = ..raw.convert(topointer(lparam),NMHDR_L());
                         
                            
if( ctrl._prenotify ) 
                                ctrl._prenotify(wmId,nmdr.code,
topointer(lparam) )
                            
                            
if( ctrl.onnotify ) 
                                ctrl.onnotify(wmId,nmdr.code,
topointer(lparam) ) 
                        
                        } 

                    }
                
                }
                
case 0x312/*_WM_HOTKEY*/
                    
var id = wparam; //这个是注册的时候设定的ID 
                     
                    
ifowner[["_hotkeys"]] && ( typeowner[["_hotkeys"]][id] ) == type.function )  ){
                    
owner[["_hotkeys"]][id] (id,::LOWORD(lparam),::HIWORD(lparam) )
                    }
            
                } 
                
case  0x2/*_WM_DESTROY*/ { 
                     
ifowner[["_ondestroy"]] ){
                        
owner[["_ondestroy"]] ();
                     }
                     
                     
//删除所有定时器
                     var tm = owner[["_tTimeProc"]]   
                     
for(id=1;#tm){
                        KillTimer(
owner.hwnd,id);  
                     } 
                     
                     
//遍历控件 
                     for(hwnd,ctrl in owner._ctrlHwnd){
                         
iftype(ctrl[["brush"]])==type.number){ //删除GDI对象
                           ::DeleteObject( ctrl[["brush"]]  );
                         } 
                     }
                     
ifowner[["uniqueId"]] ){ 
                        
owner.atom();//释放实例占用原子
                     } 
                     
owner[["continueModal _"]] =null;//退出模态循环
                      
                    ..win.ui._forms[hwnd] = 
null;
                    
for(k,v in ..win.ui._forms ){
                        
//只要还有一个窗口存在,就不要退出当前线程  
                        if(type(v)==type.table)
                            
return  ::DefWindowProc(hwnd,message,wparam,lparam);
                    }   
                    ..win.quitMessage(); 
                          
                     
                } 
            }
            
            
return  ::DefWindowProc(hwnd,message,wparam,lparam);
        }
    
    metaProperty = ..win.ui.ctrl.metaProperty( 
             
            
//覆盖父类 ..win.ui.ctrl.metaProperty.common的redraw成员
            redraw = function(){
                
//重绘窗口
                if(owner[["menu"]])owner[["menu"]].redraw();
                
                
var rc = ::RECT();
                ::GetClientRect(
owner[["hwnd"]],rc); 
                ::InvalidateRect(
owner[["hwnd"]],rc,1);
                ::UpdateWindow(
owner[["hwnd"]]); 
            }
            doModal = 
function(hwndparent){ 
            
                
if(!hwndparent)
                    hwndparent = 
owner[["parent"]];
                 
                
if(type(hwndparent)==type.table) 
                   hwndparent = hwndparent.hwnd;
//winform.hwnd  
                
                
if(hwndparent){ 
                    EnableWindow(hwndparent,0x0
/*_FALSE*/);
                }
                
                
//设置模态对话框样式
                owner.modifyStyle(0,0x80/*_DS_MODALFRAME*/
                ::SendMessageInt(
owner[["hwnd"]],0x110/*_WM_INITDIALOG*/,0,0);
                
                
//模态标记,加上空格等使之成为非法标识符,以避免与控件名字冲突
                owner[["continueModal _"]] = true;
                
//显示窗体
                owner.show(true); 
                
//SetForegroundWindow(owner.hwnd);
                
                
while(owner[["continueModal _"]])   
                    ..win.pumpMessage(); 
                
                
//还原开始被禁用的窗体
                if(hwndparent) {//启用父窗体 
                    ..win.enable(hwndparent,1/*_TRUE*/); 
                    ..win.setForeground(hwndparent) 
                }
                
                ::DestroyWindow(
owner[["hwnd"]]);
                ..win.pumpMessage(); 
//pump exit message
                
                
return owner[["result _"]];
            }
            endModal = 
function(result){
                
owner[["result _"]] = result;
                
owner[["continueModal _"]] =null;//退出模态循环 
                
            }  
            
loadcode = function(path){
                
return ..win.form.loadcode(path,owner /*指定父窗口*/ );
            } 
            msgbox = 
function(str,title = "AAuto" ,style){
                ..win.msgbox(str,title,style,
owner[["hwnd"]] )
            }
            msgboxTest = 
function(str,title){
                
return ..win.msgboxTest(str,title,owner[["hwnd"]]  )
            } 
            transparent = 
function(alpha=128,clr ){
                
owner.modifyStyleEx(0,0x80000/*_WS_EX_LAYERED*/)
                SetLayeredWindowAttributes( 
owner[["hwnd"]],clr:0, alpha,clr!==null?1:2)
            }
            image = {
                _get = 
function(){ 
                    
return owner[["image__"]];
                }
                _set = 
function( v ){
                    
if(type(v)==type.string ){
                        v = ..string.trim( v  );
                        
if(v!=""){
                            
owner[["image__"]] = v;  
                            
ifowner[["hBkbitmap"]] )
                                ::DeleteObject(  
owner[["hBkbitmap"]]  )
                                
                            
if( ! owner[["bgcolor"]] )
                                
owner[["bgcolor"]] = GetSysColor(0xF/*_COLOR_BTNFACE*/);
                            
else{
                                io.print(
'owner[["bgcolor"]]',owner[["bgcolor"]])
                            }
                            
                            
var pic = ..win.ole.image.load(v)
                            
owner[["hBkbitmap"]] =  pic.CopyHandle();
                            
                        }
                    }
                    
else if(v===null){
                        
if(owner[["hBkbitmap"]])
                                ::DeleteObject( 
tonumberowner[["hBkbitmap"]] ) )
                        
owner[["image__"]] = null
                    } 
                }   
            };  
            
            
//无边框窗体支持
            hitCaption = function () {
                ::PostMessage( 
owner.hwnd, 0xA1/*_WM_NCLBUTTONDOWN*/ , 0x2/*_HTCAPTION*/, 0 ); 
            };
            hitTopleft = 
function () {
                ::SendMessageInt( 
owner.hwnd, 0x112/*_WM_SYSCOMMAND*/, 0xF004/*_SC_SIZE | _WMSZ_TOPLEFT*/,0xD/*_HTTOPLEFT*/)
            };
            hitTop  = 
function () {
                ::SendMessageInt( 
owner.hwnd, 0x112/*_WM_SYSCOMMAND*/, 0xF003 ,0xC/*_HTTOP*/)
            };
            hitTopright  = 
function () {
                ::SendMessageInt( 
owner.hwnd, 0x112/*_WM_SYSCOMMAND*/, 0xF005,0xE/*_HTTOPRIGHT*/)
            };
            hitLeft  = 
function () {
                ::SendMessageInt( 
owner.hwnd, 0x112/*_WM_SYSCOMMAND*/, 0xF001,0xA/*_HTLEFT*/)
            };
            hitRight  = 
function () {
                ::SendMessageInt( 
owner.hwnd, 0x112/*_WM_SYSCOMMAND*/, 0xF002,0xB/*_HTRIGHT*/)
            };
            hitBottomleft = 
function () {
                ::SendMessageInt( 
owner.hwnd, 0x112/*_WM_SYSCOMMAND*/, 0xF007,0x10/*_HTBOTTOMLEFT*/)
            };
            hitBottom  = 
function () {
                ::SendMessageInt( 
owner.hwnd, 0x112/*_WM_SYSCOMMAND*/, 0xF006,0xF/*_HTBOTTOM*/)
            };
            hitBottomright  = 
function () {
                ::SendMessageInt( 
owner.hwnd, 0x112/*_WM_SYSCOMMAND*/, 0xF008,0x11/*_HTBOTTOMRIGHT*/)
            }; 
            hitmin  = 
function () {
                ::PostMessage(
owner.hwnd, 0x112/*_WM_SYSCOMMAND*/,0xF020/*_SC_MINIMIZE*/, 0);  
            }; 
            hitmax = 
function(){
                
var zoomed = ..win.isZoomed(owner.hwnd);
                
if(zoomed)
                    ::PostMessage(
owner.hwnd, 0x112/*_WM_SYSCOMMAND*/,0xF120/*_SC_RESTORE*/, 0);  
                
else
                    ::PostMessage(
owner.hwnd, 0x112/*_WM_SYSCOMMAND*/,0xF030/*_SC_MAXIMIZE*/,0);
                
return !zoomed;
            }
            

            get = 
function(k){ 
                
if( k != "_struct" ){
/*
                    import debug
                    var a = debug.queryinfo(4,"select source,function,upvars,name,currentline,activelines")
                    io.print( a.source.src, a.currentline )
*/

                    
//..io.print( k,"可能是在设计器删除的控件");
                    return {};//在设计器删除的控件
                }
                
            }
        
    )
}

阅读(2635) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~