您的位置:首页 > 编程语言 > C语言/C++

其实回调函数并不神秘 C/C++中回调函数初探

2010-04-14 14:42 316 查看
package org.sk.controls
{
 import flash.events.MouseEvent;
 import flash.text.TextField;
 import flash.text.TextLineMetrics;
 
 import mx.collections.ArrayCollection;
 import mx.controls.DataGrid;
 import mx.controls.dataGridClasses.DataGridColumn;
 import mx.core.ScrollPolicy;
 
 import org.sk.controls.vo.DataGridColumnInfoVo;
 
 /**
  *
  * @author Ozone
  * MyDataGrid-> DataGrid
  * 1. 双击 自定适应内容宽度
  * 思路: 1.先给 DataGrid的header添加 MouseDoubleClick事件
  * 2.记录 所有列的x坐标
  * 3.双击是 根据x的坐标寻找 Column
  * 4.找到Column后,找出 此列下最长的 文字的 长度
  * 5.设置此Column的width 为 合适的长度的
  */
 public class MyDataGrid extends DataGrid
 {
  private var widthMap:Array=[]; //存放 列,宽度 映射关系
  private var _textField:TextField=new TextField();

  /**
   * 构造
   */
  public function MyDataGrid()
  {
   super();
   this.doubleClickEnabled=true;
   this.horizontalScrollPolicy=ScrollPolicy.ON;
  }

  override protected function createChildren():void
  {
   super.createChildren();
   this.header.addEventListener(MouseEvent.DOUBLE_CLICK, mouseDblClickHandler);
  }

  override protected function updateDisplayList(unscaledWidth:Number, unscaledHeight:Number):void
  {
   super.updateDisplayList(unscaledWidth, unscaledHeight);
   widthMap.length=0;
   var tmpWidth:uint=0;
   for (var i:uint=0; i < columns.length; i++)
   {
    var col:DataGridColumn=columns[i];
    tmpWidth+=col.width;
    var colVo:DataGridColumnInfoVo=new DataGridColumnInfoVo(i, col.dataField, tmpWidth - DataGridColumnInfoVo.PRECSITION, tmpWidth + DataGridColumnInfoVo.PRECSITION);
    widthMap.push(colVo);
   }
  }

  /*表头 双击事件*/
  private function mouseDblClickHandler(e:MouseEvent):void
  {
   var colVo:DataGridColumnInfoVo=getColumnInfo(this.mouseX);
   if (colVo)
   {
    var maxLen:int=getMaxLength(colVo.label);
    if (maxLen != -1)
    {
     maxLen+=30;
     var col:DataGridColumn=columns[colVo.index];
     if (col)
     {
      col.width=maxLen;
     }
    }
   }
  }

  /*获取 列索引 */
  private function getColumnInfo(mousex:int):DataGridColumnInfoVo
  {
   var scrollColCount:int = this.horizontalScrollPosition;
   if(scrollColCount!=0){
    mousex += widthMap[scrollColCount-1].min + DataGridColumnInfoVo.PRECSITION;
   }
   for each (var colVo:DataGridColumnInfoVo in widthMap)
   {
    if (colVo.min < mousex && mousex < colVo.max)
     return colVo;
   }
   return null;
  }

  /*获取 最长行的长度*/
  private function getMaxLength(colLabel:String):int
  {
   var arr:ArrayCollection=this.dataProvider as ArrayCollection;
   var maxLen:int=-1;
   if (arr)
   {
    for (var i:uint=0; i < arr.length; i++)
    {
     var obj:Object=arr.getItemAt(i);
     _textField.text=obj[colLabel] ? obj[colLabel] : '';
     var line:TextLineMetrics=_textField.getLineMetrics(0);
     if (line.width > maxLen)
      maxLen=line.width;
    }
   }
   return maxLen;
  }
 }
}

3. 用的 值对象

package org.sk.controls.vo
{
 import mx.controls.dataGridClasses.DataGridColumn;
 
 public class DataGridColumnInfoVo
 {
  private var _index:uint;
  private var _min:int;
  private var _max:int;
  private var _label:String;
  public static const PRECSITION:int = 3;
  public function DataGridColumnInfoVo(_index:uint,_label:String,_min:int,_max:int)
  {
   this._index = _index;
   this._label = _label;
   this._min = _min;
   this._max = _max;
  }
  public function get index():uint{
   return _index;
  }
  public function set index(index:uint):void{
   _index = index;
  }
  public function get label():String{
   return _label;
  }
  public function set label(label:String):void{
   _label = label;
  }
  public function get min():int{
   return _min;
  }
  public function set min(min:int):void{
   _min = min;
  }
  public function get max():int{
   return _max;
  }
  public function set max(max:int):void{
   _max = max;
  }
 }
}

 

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: