问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

MFC 中关于Edit控件问题

发布网友 发布时间:2022-06-02 03:48

我来回答

3个回答

热心网友 时间:2023-10-27 17:16

控件可以动态创建
具体思路如下:
先在你的对话框类中添加一个CPtrArray对象,如CPtrArray m_ptr;它是一个链表类,用于保存动态创建的Edit控件的地址,以便程序结束时销毁所有动态创建的Edit控件,否则会造成内存泄露。

然后添加动态创建Edit控件的代码,示例如下:
void CMyDlg::OnAddEdit()
{ int n=m_ptr.GetSize();
CEdit* pEdit=NULL;
pEdit=new CEdit;
pEdit->Create(WS_VISIBLE | WS_CHILD,CRect //A(0,0,25,25),this,ID_MYEDIT+n);
pEdit->ShowWindow(SW_SHOW); //B
if(pEdit!=NULL)
m_ptr.Add((void*)pEdit);
}
上面的代码很简单,首先声明一个CEdit指针变量,然后对其进行new运算(这些最基本的应该知道吧),然后用该变量创建一个Edit控件,这里把A行Create的几个参数介绍一下,第一个参数是窗口风格,Edit控件作为对话框的子窗口,所以必须包含WS_VISIBLE 和WS_CHILD两个风格,另外,如果想让Edit控件有水平和竖直滚动条的话,可以添加WS_VSCROLL和WS_HSCROLL两个风格属性,最好还添加一个ES_MULTILINE属性,这样编辑控件支持多行显示; 第二个参数是Edit控件在其父窗口的位置和大小,是一个CRect类对象,第三个参数是其父窗口指针,这里用this,第四个是控件ID,这里需要在消息函数外定义一个宏,如#define ID_MYEDIT 19874;每个Edit控件创建后ID都是不同的(自己分析); 最后将指向新创建的Edit控件的指针添加到m_ptr列表中。
B行为了让Edit控件在创建后立即显示。该函数可以把CRect对象作为参数,然后传递到A行的Create函数里面,这样想把Edit控件创建在哪儿都可以。

最后在对话框的析构函数中释放所有创建的Edit控件的内存,
CMyDlg::~CMyDlg()
{
int n=m_ptr.GetSize();
for(int i=0;i<n;i++)
{
CEdit* pEdit=(CEdit*)m_ptr.GetAt(i);
pEdit->DestroyWindow();
delete pEdit;
pEdit=NULL;
}
m_ptr.RemoveAll();
}

如果在对话框中直接添加消息函数的话,由于事先不知道到底有几个Edit控件,也不知道每个Edit控件的ID是多少,响应消息时很容易出错。 要响应双击消息的话我建议你自己从CEdit派生一个CMyEdit子类,然后在子类中具体实现,有一点麻烦,但是只要你派生好了一个子类,以后编程时可以直接使用,非常方便,而且不易出错。不过代码有点长,这里说不清楚。有谁想了解具体如何实现可以把你的邮箱发给我,我写好后给你发过去。

具体的细节可以在百度或百度百科上搜索,或参考MSDN
顺便提供一个MSDN下载地址:http://ftp.sdshiyan.cn/soft/program/DN60ACHS1.rar
http://ftp.sdshiyan.cn/soft/program/DN60ACHS2.rar
有两个CD,速度应该很快。

有什么VC++问题可以问我,大家一起讨论讨论

完整说明如下:
根据你的要求写了一个类似的程序

首先从CEdit类派生一个子类CMyEdit,在文件MyEdit.h和MyEdit.cpp中,该类只重载了鼠标单击和双击的消息函数,在双击消息函数中,首先让编辑框获得输入焦点(这一句可以不要),然后向它的父窗口发送NM_MYDBLCLK消息,并且把发送消息的编辑框的窗口指针传递给父窗口用于识别消息到底是谁发送的,NM_MYDBLCLK的定义在MyEdit.h"的开头,其实它就是一个消息ID,即一个整数。

然后再说说Dlg类,在对话框类的头文件中添加包含语句:#include "MyEdit.h" .在对话框类中添加一个CPtrArray对象,如CPtrArray m_ptr;它是一个链表类,用于保存动态创建的Edit控件的地址,以便程序结束时销毁所有动态创建的Edit控件,否则会造成内存泄露。

然后添加动态创建Edit控件的代码,示例如下:
void CEditTestDlg::AddEdit(CRect rc)
{
int n=m_ptr.GetSize();
CMyEdit* pEdit=NULL;
pEdit=new CMyEdit;
ASSERT(pEdit->Create(WS_CHILD|WS_VISIBLE|WS_HSCROLL|WS_VSCROLL|ES_MULTILINE,rc,this,ID_MYEDIT+n));
pEdit->ShowWindow(SW_SHOW);
m_ptr.Add((void*)pEdit);
}

再添加一个按钮并添加该按钮的响应消息函数,在该函数中调用AddEdit函数添加Edit控件
void CEditTestDlg::OnButton1()
{
// TODO: Add your control notification handler code here
CRect rc(0,0,340,120);
AddEdit(rc);
}

此时单击该按钮就能看见创建的Edit控件了,为了不造成内存泄露,还要添加对话框的析构函数如下:
CEditTestDlg::~CEditTestDlg()
{
int n=m_ptr.GetSize();
for(int i=0;i<n;i++)
{
CMyEdit* pEdit=(CMyEdit*)m_ptr.GetAt(i);
pEdit->DestroyWindow();
delete pEdit;
pEdit=NULL;
}
m_ptr.RemoveAll();
}

为了响应双击Edit消息,在对话框类中作如下修改:
1、在对话框类的头文件中添加消息函数声明: afx_msg void OnEditDblClk(WPARAM wParam, LPARAM lParam);
2、在对话框类的cpp文件中添加该消息函数的消息映射 ON_MESSAGE(NM_MYDBLCLK, OnEditDblClk)
3、添加双击消息函数的实现代码入下:
void CEditTestDlg::OnEditDblClk(WPARAM wParam, LPARAM lParam)
{
CMyEdit* pEdit=(CMyEdit*)lParam;
if(pEdit!=NULL)
{
AfxMessageBox("双击了Edit控件!");
}
pEdit->SetWindowText("双击了Edit控件!");
}

这里只是一个实例,双击Edit控件后到底要做什么,你自己可以修改。

大概就是这样,其实其他控件你也可以这样做,例如按钮控件等等,这样就可以做出自己别具一格的控件

有什么问题可以再问我

热心网友 时间:2023-10-27 17:16

给你一段我的代码参考一下吧

CString m_pathname;//路径名
//MessageBox(_T("OnButtonTalkSm2"));从文件插入图片
/*CFileDialog dlg(TRUE,NULL,NULL,OFN_READONLY,_T("bmp file (*.bmp)|*.bmp"));
if(dlg.DoModal()==IDOK)
m_RichEdit.InsertBitmap(dlg.GetPathName());*/
CFileDialog hFileDlg(TRUE,NULL,NULL,OFN_FILEMUSTEXIST|OFN_PATHMUSTEXIST|OFN_READONLY,
TEXT("图像文件 (*.jpg;*.gif;*.bmp;...)|*.jpg;*.gif;*.bmp|所有文件(*.*;)|*.*||"),NULL);
hFileDlg.m_ofn.nFilterIndex=1;
hFileDlg.m_ofn.hwndOwner=m_hWnd;
hFileDlg.m_ofn.lStructSize=sizeof(OPENFILENAME);
hFileDlg.m_ofn.lpstrTitle=TEXT("打开图像文件...\0");
hFileDlg.m_ofn.nMaxFile=MAX_PATH;
if(hFileDlg.DoModal() == IDOK)
{

m_pathname=_T("");
m_pathname = hFileDlg.GetPathName();
....

热心网友 时间:2023-10-27 17:17

首先解决你的第一个问题,先添加EDIT控件并设置为隐藏,当单击按钮时就显示EDIT控件,这样就达到你的要求了。第二个问题,要重载EDIT的双击事件 然后弹出打开文件对话框,(打开文件对话框代码网上有),当关闭对话框时就会得到路径,然后将路径写入EDIT控件就可以了
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
临沂比较有名的男装品牌 呼伦贝尔市悦动网络科技有限公司怎么样? 呼伦贝尔中汇实业有限公司怎么样? 呼伦贝尔油玉不绝电子商务有限公司怎么样? 如何避免wps卡顿? 属鼠的男人找对象是属什么,属鼠的人和什么属相合 96年鼠的姻缘在哪年 属相相合年份运势提升 2024属鼠找对象属什么最佳 黑客攻击网站能报案吗 黑客攻击报案有用吗 手机壳热胀冷缩变小了 小手机用什么手机壳好看 小羊皮手机壳会不会发黄 谁的头像好看给谁 谁的头像新型可爱?拜托各位了 3Q 头像是谁? 你的头像是谁? 论坛谁的头像最帅??? 是谁的头像?卡斯特罗?? 谁能告诉我这是谁的头像 谁的头像最可爱 谁的头像最有名 谁的头像,是谁? 老人头是谁的头像? 谁的头像 海南省文昌市清澜开发总公司怎么样? 扬州文昌特易购地产有限公司怎么样? 文昌建设用地许可证在哪里办 文昌百安房地产开发有限公司怎么样? 微信,我一个手机两张卡可以注册两个吗? 我是新手,MFC里edit Control控件怎么用 MFC中的edit控件怎样能被多次赋值并且控件上都显示出所赋的值 MFC的EDIT控件怎么根据窗口大小变化?谢谢了 mfc如何对一个edit控件多次读取 如何利用MFC创建一个Edit子控件? 怎么设置MFC中Edit控件显示字体对齐 MFC中主窗口如何加入EDIT框 VS MFC Edit 控件传入传出值 mfc edit控件 形状如何改变 mfc中edit控件怎么设置提示 如何删除free 网通的域名访问提示,听你说到,到底要怎么做? 域名可能存在什么问题? cisco 怎么也安装不上 我的世界国际电脑版不连能玩吗 ubuntu 上面有命令行下的 L2TP/IPSec 客户端吗 k歌极速板怎么去领花? 计算机隐藏大师有那些? 常州吉鑫风能科技 打磨工资多少 请问下江苏吉鑫风能科技股份有限公司怎么样?工资待遇和福利怎么样?