MFC 中关于Edit控件问题

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MFC 中关于Edit控件问题相关的知识,希望对你有一定的参考价值。

如何动态添加Edit控件?
1.设置一个按钮,点击按钮在窗体上添加一个Edit控件
2.若是双击生成的Edit控件,弹出一个打开文件对话框,在打开对话框中选上文件,确定后把该文件的路径写进Edit控件上

急求思路和代码。。。谢谢!

控件可以动态创建
具体思路如下:
先在你的对话框类中添加一个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控件后到底要做什么,你自己可以修改。

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

有什么问题可以再问我
参考技术A 还学MFC??

如何增加mfc中组合框控件的高度?

【中文标题】如何增加mfc中组合框控件的高度?【英文标题】:How to increase the height of the combobox control in mfc? 【发布时间】:2015-01-26 14:11:15 【问题描述】:

我想增加组合框控件的高度。正在增加宽度。但是当我试图增加组合框高度时,它并没有增加。我很清楚我想增加控件的垂直高度。通常我创建的combobox控件如下。

如上图所示,红色边框的控件是组合框控件,我想增加高度。如果你可以看看下图的EDIT控件(注意编辑控件的大小)。类似于编辑控件的大小我必须增加组合框控件的高度。

CString str;
CSize   sz;
CDC*    pDC = m_comboCtrl.GetDC();

m_comboCtrl.GetLBText(0, str);
sz = pDC->GetTextExtent(str);

m_comboCtrl.SetItemHeight(-1,50);

增加垂直高度后,控件中的文本非常小,我们如何使文本适合控件(这类似于默认组合框控件中的普通文本)。但是控件中的文本为接下来,

任何人都可以让我知道如何使文本居中到控件中,如下图所示。上图中的文本在顶部,但我想让文本居中为标准控件中的文本。

【问题讨论】:

ComboBox_SetItemHeight 或相应的 MFC 实现 CComboBox::SetItemHeight。 index/nIndex 必须为 -1 才能设置选择字段的高度。 @IInspectable ,通过 sz.cy=50 后,组合框高度增加了。我们不能使组合中的文本完全适合控件。高度修改后组合框控件是如原始帖子所示。请参考该图像并请告诉我,即使我增加了高度,我们也可以使文本适合控件。 @IInspectable,我已经更新了我的帖子,请看一下,请告诉我您的建议。 这是一个不同的主题,我建议为此提出一个新问题。由于您找到了最初问题的答案,请考虑留下答案(请参阅Can I answer my own question?)。 @IInspectable,关于组合中文本的垂直对齐,正如您建议将其作为一个单独的问题提出的那样,我做到了请参考此链接以了解该问题link,我要求您提供看看那个问题,请告诉我您的宝贵建议。 【参考方案1】:

要增加组合框的高度,我们需要在 OnInitDialog() 中这样做,如下所示,

CString str;
CSize   sz;
CDC*    pDC = m_comboCtrl.GetDC();

m_comboCtrl.GetLBText(0, str);
sz = pDC->GetTextExtent(str);

m_comboCtrl.SetItemHeight(-1,50);//CCombobox m_comboCtrl;

SetItemHeight 中的 50 表示现在我们术语中称为高度的 y 坐标。在 OnInitDialog() 中添加上述代码 sn-p 后,组合框看起来像(参考我添加图像的原始帖子增加高度后的组合框控件(图2))。

【讨论】:

【参考方案2】:

按照http://dotnetbutchering.blogspot.com/2008/03/vc-mfc-how-to-set-combobox-dropdown.html上的说明进行操作:

在 MFC 设计器中

    单击下拉控件中的箭头:将出现一个调整大小的矩形。 调整下拉菜单的高度。

瞧。

【讨论】:

【参考方案3】:

在“属性”窗口中将 Type 属性设置为 Simple

【讨论】:

以上是关于MFC 中关于Edit控件问题的主要内容,如果未能解决你的问题,请参考以下文章

MFC 窗体的edit控件实时刷新。。。。

如何增加mfc中组合框控件的高度?

通过编写串口助手工具学习MFC过程——添加Edit编辑框控件

一个 MFC/Win32 控件似乎让我的整个桌面重绘

MFC Edit Control控件里面怎么样输入小数

vc MFC EDIT控件 设置光标位置