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控件就可以了