WEB开发网
开发学院软件开发VC 动态创建控件支持事件响应并可保存与读取 阅读

动态创建控件支持事件响应并可保存与读取

 2010-08-22 20:47:30 来源:WEB开发网   
核心提示:这些代码不是很难,相信都能看懂,动态创建控件支持事件响应并可保存与读取(3),事实上以后建立控件的话就是创建了一个_myControl* 对象,使用它来管理所有不同类型的控件,addContorl(this,MYBUTTON);//新建按钮addContorl(this,MYEDIT);//新建文本框addContor

这些代码不是很难,相信都能看懂。事实上以后建立控件的话就是创建了一个_myControl* 对象。使用它来管理所有不同类型的控件。我们已经做好了准备 ,现在即将开始。在工程中加入菜单(这里,我只是想要有三个按钮来触发新建的三个不同类型控件的事件)。

addContorl(this,MYBUTTON);  //新建按钮
  addContorl(this,MYEDIT);  //新建文本框
  addContorl(this,MYLABEL);  //新建标签
addContorl函数很重要:// ***********************************************************************************
//新增控件
//参数:
// [1].新建控件的父窗体
// [2].控件的类型
// [3].表示是新增控件还是读取控件(编号)
// 值为0则表示新增控件 编号使用最大数量;为其它值时 是读取控件的编号
// ***********************************************************************************
template<class T>
void addContorl(T& object,int type,int readID=0)
{
  int _index=0;//标识建立的控件编号(新增控件时为最大控件号 读取控件时 为传递过来的值)
  //如果是新增
  if (readID==0)
  {
    globalData.count++;//增加总数
    globalData.myControl[globalData.count]->type=type;//确定类型
    //公共数据
    CString _str;
    _str.Format("%d",globalData.count);
    globalData.myControl[globalData.count]->caption+=_str;//名称标题
    //这里设置新建的控件初始坐标为最后一个控件的坐标偏移
    CRect _rect;
    if (globalData.count>1)
    {
      _rect=globalData.myControl[globalData.count-1]->rect;
      globalData.myControl[globalData.count]->rect.left=_rect.left+10;
      globalData.myControl[globalData.count]->rect.top=_rect.top+10;
      globalData.myControl[globalData.count]->rect.right=_rect.right+10;
      globalData.myControl[globalData.count]->rect.bottom=_rect.bottom+10;
    }
    else
      _rect=globalData.myControl[globalData.count]->rect;
    _index=globalData.count;
  }else
    _index=readID;
// 创建控件
    //一.都是要靠消息来完成 按钮的字体是随系统的不能改变
    HFONT  hFont;
    hFont  =  CreateFont(12,  0,  0,  0,  400,  0,  0,  0,  ANSI_CHARSET,
    OUT_DEFAULT_PRECIS,  CLIP_DEFAULT_PRECIS,  DEFAULT_QUALITY,
    DEFAULT_PITCH  ||  FF_DONTCARE,  "宋体");
  //各自数据
  switch(type) {
  case MYBUTTON:
    {
      globalData.myControl[_index]->myButton.Create(globalData.myControl[_index]->caption,WS_VISIBLE |
             WS_CHILD | BS_PUSHBUTTON,globalData.myControl[_index]->rect,object ,IDB_MYCONTROL+_index);
      SendMessage(globalData.myControl[_index]->myButton,WM_SETFONT,(DWORD)hFont,TRUE);
    };
    break;
  case MYEDIT:
    {
      //两种方法使文本框具有3D风格
/*
      //只有使用CreateEx才能创建具有扩展风格的文本框 否则没有3D效果
      globalData.myControl[_index]->myEdit.CreateEx(WS_EX_CLIENTEDGE, // 指明窗口具有3D外观,这意味着,边框具有下沉的边界。
        _T("EDIT"), "",//globalData.myControl[_index]->caption
        WS_CHILD | WS_VISIBLE,
        globalData.myControl[_index]->rect,object, IDB_MYCONTROL+_index);
*/
      globalData.myControl[_index]->myEdit.Create(WS_VISIBLE |
          WS_CHILD,globalData.myControl[_index]->rect,object ,IDB_MYCONTROL+_index);
      globalData.myControl[_index]->myEdit.ModifyStyleEx(0,  WS_EX_CLIENTEDGE,  SWP_DRAWFRAME)  ;
      //globalData.myControl[_index]->myEdit.HideCaret();
      SendMessage(globalData.myControl[_index]->myEdit,WM_SETFONT,(DWORD)hFont,TRUE);
      //这里EDIT控件要特殊处理一下 因为使用CreateEx创建了带3D的扩展风格 所以 实际大小会少去4个点用来显示3D效果 这里要加上4个点
      //CRect rect;
      //globalData.myControl[_index]->myEdit.GetClientRect(&rect);
      globalData.myControl[_index]->myEdit.SetWindowPos(NULL,
         globalData.myControl[_index]->rect.left-2,
         globalData.myControl[_index]->rect.top-2,
         globalData.myControl[_index]->rect.Width()+4,
         globalData.myControl[_index]->rect.Height()+4,NULL);
    }
    break;
  case MYLABEL:
      globalData.myControl[_index]->myLabel.Create(globalData.myControl[_index]->caption,WS_VISIBLE |
         WS_CHILD | SS_NOTIFY,globalData.myControl[_index]->rect,object ,IDB_MYCONTROL+_index);
      SendMessage(globalData.myControl[_index]->myLabel,WM_SETFONT,(DWORD)hFont,TRUE);
      globalData.myControl[_index]->myLabel.Invalidate(TRUE);
    break;
  default:;
  }
}

上一页  1 2 3 4 5  下一页

Tags:动态 创建 控件

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接