动态创建控件支持事件响应并可保存与读取
2010-08-22 20:47:30 来源:WEB开发网这些代码不是很难,相信都能看懂。事实上以后建立控件的话就是创建了一个_myControl* 对象。使用它来管理所有不同类型的控件。我们已经做好了准备 ,现在即将开始。在工程中加入菜单(这里,我只是想要有三个按钮来触发新建的三个不同类型控件的事件)。
addContorl(this,MYBUTTON); //新建按钮
addContorl函数很重要:
addContorl(this,MYEDIT); //新建文本框
addContorl(this,MYLABEL); //新建标签// ***********************************************************************************
//新增控件
//参数:
// [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:;
}
}
更多精彩
赞助商链接