vc 保存多个vc 编辑框字体的内容到一个文本里 怎么写??

vc++ 编辑框问题。怎么样才能将两个编辑框中的数据关联在一起?_百度知道
vc++ 编辑框问题。怎么样才能将两个编辑框中的数据关联在一起?
都能引起另外一个编辑框中的数据变化,就是当其中任何一个编辑框中的数据变化时,
提问者采纳
SetWindowText(str),只能处理两个编辑框的onchange事件。如两个编辑框Edit1 与Edit2我可以在Edit1的onchange事件中加入以下代码 CString str, ((CWnd*)GetDlgItem(IDC_EDIT2))-&gt,在Edit2的onchange里面可以采取同样的处理 CString str,GetWindowText(str),SetWindowText(str),在VC中没有关联这一说, ((CWnd*)GetDlgItem(IDC_EDIT1))-&gt,你担心的耦合问题,一般都用内核对象如CreateMutex或者CreateEvent来同步就可以了, ((CWnd*)GetDlgItem(IDC_EDIT1))-&gt,GetWindowText(str), ((CWnd*)GetDlgItem(IDC_EDIT2))-&gt,
提问者评价
其他类似问题
按默认排序
其他2条回答
VC中不能关联,可以同时设置另一个编辑框的内容。,5蹦愀谋湟桓霰嗉虻哪谌菔,
第一步:定义两个编辑框的Cstring成员变量分别为m_str1,m_str2.第二步:加入两个编辑框的onchange事件函数如下
void CTttttDlg::OnChangeEdit1()
UpdateData();
m_str2 = &111111&;
UpdateData(FALSE);
}void CTttttDlg::OnChangeEdit2()
UpdateData();
m_str1 = &222222&;
UpdateData(FALSE);
}第三步:编译,测试。
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁当前位置:
动态创建控件支持事件响应并可保存与读取
动态创建控件支持事件响应并可保存与读取
发布日期: 15:48
浏览次数:1506次
标  签:C++,MFC
文章评分:5.0
操  作:
称号:未设置简介:...
文章概要:
动态控件是比较繁杂的一个工作,这里演示了从在一个窗体上分别动态创建按钮、文本框、标签框的例子,当然,你还可以直接再添加其它的控件是很容易的.并且它是可以响应动态控件的事件的,你还可以用类向导生成事件,不必再手动添加消息。我还使这些控件的信息保存为文件并可以随时读取。
VC++6.0中创建动态控件是比较偏离基础的知识,也有一定的难度。它的完整功能是要动态创建控件后再动态响应控件中的事件,两者全部做到才算完整。
这里我将展示一个完整的动态控件示例,它可以动态创建控件,然后再动态响应控件事件,并可以保存控件信息至ini配置文件,然后再根据ini文件读取出控件信息来动态创建控件。相信它能够解决你在动态控件中所遇到的许多问题。
当然,动态控件的方法有许多种,我展示的只是给我认为较好的。
这里以VC++6.0创建对话框工程为例,添加菜单,分别添加子项按钮,文本框,标签。大家知道,VC中基本上都要靠手写,所以,这里先写三个控件的创建,其它的控件基本一致。
第一步当然是建立一个全局的类(噢 这个只是我个人喜好) 里面放上满满的全局共用数据,我会把它们都放入一个*Global.h文件中。还有一个控件类,里面包含了每个控件都需要的属性,比如控件的名称、大小、坐标以及附加。
除了那两个类,最重要的还是控件类,因为使用系统的控件类添加事件的响应会比较麻烦(实现不会太难,主要是不好管理)。具体添加方法我想大家都明白,就是使用系统的添加类向导生成三个类(我们现在只做三个不同类型的控件) 一个继承自按钮类(CButton)-按钮一个继承自编辑框类(CEdit)-文本框,一个继承自静态类(CStatic)-标签,分别命名为CMyButton,CMyEdit,CMyLabel,不会介意吧?。如果使用手动添加的话,则强大的事件类向导将不能使用。
这下应该有二个系统类,三个控件类了吧?当然控件类也会在工程中加入它们的头文件与程序文件。下面就是设计控件类了。我有考虑使用多继承来使这三类自定义控件类都继承控件类(第一步中加入的控件类暂时称为控件主类为好) 不过没使用 因该更方便.现在只是在控件主类中声明了那三个自定义控件 然后加上一开始的一些共公信息 就是下面这样的了:
////////////////
//控件主类
////////////////
class _myControl
//共公信息
CR//坐标大小
//动态控件
CMyButton myB
CMyEdit myE
CMyLabel myL
_myControl()
caption="Control";
type=0;//默认为按钮
rect=CRect(10, 80, 100, 120);//初始坐标大小
在这个类中,用了三个自定义的控件类成员变量,分别用来存放动态生成的三种不同类型的控件。如果你还想把它保存起来,并能随时读取出来的话,还要加上共公信息中的那些成员变量。另外程序中加入了下面这些常量:
IDB_MYCONTROL
//自定义按钮的句柄(ID)
NUM_CONTROL
128 //数目
//保存配置文件用
const CString APPINFO="appInfo";
const CString CONTROL="Control";
const CString SETTING="Setting";
程序里设计了一个_globalData 类,使用它的 globalData 对象可以访问里面的全局数据。
////////////////
//全局数据
////////////////
class _globalData
CString appP//程序路径
CString appAllP//保存文件全路径
bool isD//是否可以拖拽控件
//控件信息
//vector &_mycontrol& myC//考虑使用vector也是可以的
_myControl* myControl[NUM_CONTROL];//这里使用数量受到了限制
//已经建立的控件总数
_globalData()
//初始控件
for (int i=1;i&=NUM_CONTROL-1;i++) {
globalData.myControl[i]=new _myC
//取得当前路径
char temp[255]= _T("");//保存当前路径的变量
GetModuleFileName(NULL,appPath.GetBufferSetLength(sizeof(temp)),sizeof(temp));//取得程序所在的全目录名
int nPos=appPath.ReverseFind('\\'); //取得除去文件名字符数后的总长度
appPath=appPath.Left(nPos+1); //截取得到的文件路径长度 最终得到程序所在路径
appPath.ReleaseBuffer();
appAllPath=appPath+"myControl.ini";
}extern globalD
这些代码不是很难,相信都能看懂。事实上以后建立控件的话就是创建了一个_myControl* 对象。使用它来管理所有不同类型的控件。我们已经做好了准备 ,现在即将开始。在工程中加入菜单(这里,我只是想要有三个按钮来触发新建的三个不同类型控件的事件)。
addContorl(this,MYBUTTON);
//新建按钮
addContorl(this,MYEDIT);
//新建文本框
addContorl(this,MYLABEL);
//新建标签
addContorl函数很重要:
// *****************************************************************
//新增控件
[1].新建控件的父窗体
[2].控件的类型
[3].表示是新增控件还是读取控件(编号)
值为0则表示新增控件 编号使用最大数量;为其它值时 是读取控件的编号
// *****************************************************************
void addContorl(T& object,int type,int readID=0)
int _index=0;//标识建立的控件编号(新增控件时为最大控件号 读取控件时 为传递过来的值)
//如果是新增
if (readID==0)
globalData.count++;//增加总数
globalData.myControl[globalData.count]-&type=//确定类型
//公共数据
_str.Format("%d",globalData.count);
globalData.myControl[globalData.count]-&caption+=_//名称标题
//这里设置新建的控件初始坐标为最后一个控件的坐标偏移
if (globalData.count&1)
_rect=globalData.myControl[globalData.count-1]-&
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;
_rect=globalData.myControl[globalData.count]-&
_index=globalData.
_index=readID;
// 创建控件
//一.都是要靠消息来完成 按钮的字体是随系统的不能改变
CreateFont(12,
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);
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个点
//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);
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);
上面的代码看着真头痛....其实仔细阅读也不是太难理解。它是真正负责在窗体上建立控件的代码。建立控件已经到此就完成了 ,你在例子代码中可以看到。函数会根据 addContorl 调用的第二个参数的不同在窗体上创建不同的控件,
我们要做的不止这些,因为我说过,只有当动态控件能响应几乎所有事件的话,整个工程才算完整。所以接下来我们将要把控件对事件的响应完成掉。
动态控件的事件响应,两种最为常用(也许只是我) 一种是在PreTranslateMessage中判断消息的ID是否是控件ID,然后再判断事件消息来操作。一种就是使用自己的控件类,在类中添加好控件对消息的事件处理。有人会使用 ON_COMMAND_RANGE,但不总是太好也不能实现大多数消息功能。
因为在一开始,我们使用了系统向导来生成继承的控件类,所以,它是能够得到六个文件(三个.h三个.cpp),也就意味着,它是能够使用ctrl+w类向导来生成事件。你可以试一下? 呵,是的,就是这么简单,直接添加事件的响应就可以了,不如在按钮类里面来个单击事件?
void CMyButton::OnClicked()
AfxMessageBox("你单击了我!(BN_CLICKED)");
噢,真的能响应,似乎太简单了!? 也许,任何方法都是不止你所能看到的数量,而只是你我都未发现而已。
到此,动态控件的添加与事件响应已经能够完成了,我还说过要将它能保存与读取,所以,下面的代码将完成它。把下面这些代码都写到global文件中:
//////////////////////////
//取得控件在窗体中的坐标与大小(根据控件 窗体相对屏幕的坐标)
//////////////////////////
static CRect getRect(T& myControl,B& obj)
CRect _rect,_rect2,_rect3;
int _right,_//用于保存控件大小
//获取控件所在父窗体坐标
obj.GetClientRect(&_rect);
obj.ClientToScreen(&_rect);
//获取自身坐标
myControl.GetClientRect(&_rect2);
_right=_rect2.
_bottom=_rect2.
myControl.ClientToScreen(&_rect2);
_rect3.left=_rect2.left-_rect.//控件left值等于自身的left减去父窗体的left
_rect3.top=_rect2.top-_rect.//控件top值等于自身的top减去父窗体的top
_rect3.right=_rect3.left+_//这是控件的right值 等于left坐标+大小
_rect3.bottom=_rect3.top+_//这是控件的bottom值 等于top坐标+大小
return _rect3;
//////////////////////////
//重新计算控件坐标
//////////////////////////
static void getGUIData(T& obj)
//重新计算控件坐标信息
for (int i=1;i&=globalData.i++) {
switch(globalData.myControl[i]-&type) {
case MYBUTTON:
_wnd=CWnd::FromHandle(globalData.myControl[i]-&myButton.m_hWnd);
case MYEDIT:
_wnd=CWnd::FromHandle(globalData.myControl[i]-&myEdit.m_hWnd);
case MYLABEL:
_wnd=CWnd::FromHandle(globalData.myControl[i]-&myLabel.m_hWnd);
globalData.myControl[i]-&rect=getRect(*_wnd,*obj);
// **********************************************
//数据保存
// **********************************************
static void saveFile(T& object)
getGUIData(object);//重新计算控件坐标及大小
//共用变量
//清空文件
CFile _file(globalData.appAllPath,CFile::modeCreate);//清空文件先CFile::Remove
_file.Close();
//DeleteFile(globalData.appAllPath);//删除整个文件
//WritePrivateProfileString(APPINFO,NULL,NULL,globalData.appAllPath);
//保存数量
_str.Format("%d",globalData.count);
WritePrivateProfileString(APPINFO,"count",_str,globalData.appAllPath);
//保存控件信息
//WritePrivateProfileString(CONTROL,NULL,NULL,globalData.appAllPath);
CString ITEM,_
for (int i=1;i&=globalData.i++)
_str.Format("%d",i);
ITEM=CONTROL+_//项名
//公共属性
WritePrivateProfileString(ITEM,"caption",globalData.myControl[i]-&caption,globalData.appAllPath);
_temp.Format("%d",globalData.myControl[i]-&rect.left);
WritePrivateProfileString(ITEM,"left",_temp,globalData.appAllPath);
_temp.Format("%d",globalData.myControl[i]-&rect.top);
WritePrivateProfileString(ITEM,"top",_temp,globalData.appAllPath);
_temp.Format("%d",globalData.myControl[i]-&rect.right);
WritePrivateProfileString(ITEM,"right",_temp,globalData.appAllPath);
_temp.Format("%d",globalData.myControl[i]-&rect.bottom);
WritePrivateProfileString(ITEM,"bottom",_temp,globalData.appAllPath);
_temp.Format("%d",globalData.myControl[i]-&type);
WritePrivateProfileString(ITEM,"type",_temp,globalData.appAllPath);
// **********************************************
//数据读取
// **********************************************
void readFile(T& object)
//清除资源
for (int j=1;j&=globalData.j++) {
delete globalData.myControl[j];
globalData.myControl[j]=new _myC
CString _str,ITEM;
char _buff[255];
globalData.count=GetPrivateProfileInt(APPINFO,"count",NULL,globalData.appAllPath);
for(int i=1;i&=globalData.i++)
_str.Format("%d",i);
ITEM=CONTROL+_//项名
GetPrivateProfileString(ITEM,"caption",NULL,_buff,256,globalData.appAllPath);
globalData.myControl[i]-&caption.Format("%s",_buff);
globalData.myControl[i]-&rect.left=GetPrivateProfileInt(ITEM,"left",NULL,globalData.appAllPath);
globalData.myControl[i]-&rect.top=GetPrivateProfileInt(ITEM,"top",NULL,globalData.appAllPath);
globalData.myControl[i]-&rect.right=GetPrivateProfileInt(ITEM,"right",NULL,globalData.appAllPath);
globalData.myControl[i]-&rect.bottom=GetPrivateProfileInt(ITEM,"bottom",NULL,globalData.appAllPath);
globalData.myControl[i]-&type=GetPrivateProfileInt(ITEM,"type",NULL,globalData.appAllPath);
//调用创建控件函数
addContorl(object,globalData.myControl[i]-&type,i);
//获取屏幕分辩率
int nFullWidth=GetSystemMetrics(SM_CXSCREEN);
int nFullHeight=GetSystemMetrics(SM_CYSCREEN);
在任何地方调用:
saveFile(this);//保存所有控件信息
readFile(this);//读取
我在PreTranslateMessage还加入了对控件拖拽的处理:
//使用鼠标可以随意拖动控件
if (pMsg-&message==WM_LBUTTONDOWN)
if (globalData.isDraw)//自己增加这个变量
FromHandle(pMsg-&hwnd)-&SendMessage( WM_SYSCOMMAND,SC_MOVE+1,0);
this-&Invalidate(TRUE);
控件拖拽我研究了蛮久的时间。感觉使用这个消息方法是最为方便的,你可以再将它功能增加,比如说控件拖拽改变大小(SC_SIZE 可以做到),那岂不是做成界面设计器了 !
最多还可以输入100字
【VIP年会员制套餐】
【C/C++软件工程师实战能力集训大纲】
VC知识库发布了C/C++业界的“本草纲目”
【牛人都在千人一号群! 加群三步走!!!】
第一步:请必须加VC知识库QQ: 为好友;
第二步:请必须关注本站微博:
第三步:申请加入群:.(必须将关注微博截屏发到QQ方可通过!)
【最新2013:】
全部100% VC++源码提供: E-Form++全新大型SCADA & HMI解决方案源码、CAD解决方案源码、Gis解决方案源码 、电力石油化工仿真与图形建模解决方案源码、大量其他高级制图VC++源码下载!
【 新视频发布】
o o o o o o o o o o
Shell扩展一种com对象可以为window浏览器提供各种扩展的功能。Windows中有多种的扩展类型,但是对应的文档的介绍却很少。完成的Shell扩展方法可以查阅 Visual C++ Windows Shell Programming(ISBN ),如果你没有阅读过这本书而希望做相关的扩展这篇文档将可以帮到你,希望使你可以了解扩展shell的方法。...
在VC环境中除了我们所常用的Dialog、Menu和Bitmap等标准资源类型之外,它还支持自定义资源类型(Custom Resource),我们自定义的资源类型能做些什么呢?呵呵,用处多多。...
本文介绍了套接字编程的基本知识。...VC++控件的一些用法_豆搜网
VC++控件的一些用法
文档格式:DOC&&
更新时间:&&
下载次数:0&&
点击次数:205
\r表示回车不换行,\n表示回车换行
mfc中一些使用的方法
1. 在CSatic控件上增加图标及位图ic * =
= (ic*)GetDlgItem(控件ID); ->ModifyStyle(R, SS_ICON); 可用两种方法增加图标(1) ->n(AfxGetApp()->n(图标ID));(2) ->n(::stanceHandle(),"图标名称")); //图标名字改为"IDI_ICON"的形式,因为这里要求的是字符串形式的名称. 增加Bmp图片的形式同上,将ModifyStyle中的SS_ICON改为SS_BITMAP.用相应的位图增加函数即可.
2. CClientDC,CWindowDC这两个类都从CDC类派生,CClientDC类用于获取客户区的DC(不包括标题栏,菜单栏,工具栏),创建了CClientDC类对象后不需用DC来释放.如:tDC dc(this);获取本窗口的lientDC dc(GetParent())可获取父窗口DC,此时就可在非客户区进行dc操作.CWindowDC 获取整个窗口的dc,可对整个窗口进行操作,CWindowDC(GetParent()) 注意在这获得的父窗口对于对话框情况下将是windows窗口,最后无需DC释放
dow()获取桌面窗口句柄.
::eIC("Y",LL);获取桌面的HDC
3. 获取随机数rand()要获取一定范围内的随机数可用:Srand((unsigned) LL)); //意思是每次产生的随机数都不相同.(int)(rand())/() RAND_MAX * 10); //返回1-10之间的随机数
4. 获取路径:char path[MAX_PATH] = "\0"; LL, path, MAX_PATH); //应用程序路径 irectory(); //获取Windows系统目录路径 dowDirectory() //获取Windows目录路径
5. 动态加载ODBC数据源//e为数据库名称, DSN为数据源名称 tODBCSource(char * e ,char * e) { char path[256]=""; B[256]=""; h(path); B,path); (B, "\\"); (B, e); bConfig[256]= "DSN=" ;// bConfig , e); char * pMconfig = nfig + bConfig) + 1 ; strcpy(pMconfig,"DBQ="); pMconfig += 4; (B); pMconfig += B) + 1 ; strcpy(pMconfig,"DEFAULTDIR="); (pMconfig,path); (pMconfig,"\0");if(!LL,ODBC_ADD_SYS_DSN,"cess Driver (*.mdb)\0",nfig)) //注意Driver后的空格 { TRACE("加载数据库失败,请检查数据库是否存在\n"); }
6. 线程退出线程退出请使用return 或 ExitThread()来正常退出线程,尽是避免使用eThread来终止线程,因为终止后线程资源将不会被释放.一般情况下在eThread创建了线程后即使用Handle()来关闭线程句柄,以防止eThread得到句柄后,进行线程的强制终止.
点击查看更多关于的相关文档用VC将编辑框的内容写入文本文件_百度知道
用VC将编辑框的内容写入文本文件
我的对话框上有一个编辑框,一个按钮控件 我想按下按钮后,能将编辑框里的内容都写入到c:\1.txt中 希望有高人指点最好有详细的代码
提问者采纳
在你的那个按钮里写上
UpdateData(); fstream f1; f1.open(&1.txt&,ios::in|ios::out); if(!f1) {
MessageBox(&打不开&,&提示&,0); } f1&&m_E//其中m_Edit 是编辑框的变量
提问者评价
其他类似问题
文本文件的相关知识
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁如何在编辑框内输入文本,然后按回车,然后焦点转移到某个按钮上?
[问题点数:40分,结帖人CThinking]
如何在编辑框内输入文本,然后按回车,然后焦点转移到某个按钮上?
[问题点数:40分,结帖人CThinking]
不显示删除回复
显示所有回复
显示星级回复
显示得分回复
只显示楼主
相关帖子推荐:
2011年 总版技术专家分年内排行榜第三2010年 总版技术专家分年内排行榜第三
2012年 总版技术专家分年内排行榜第五
本帖子已过去太久远了,不再提供回复功能。}

我要回帖

更多关于 vc 编辑框字体 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信