MFC编程中Edit框的 *** 作

MFC编程中Edit框的 *** 作,第1张

问题一:

更改Edit输入框中的字体步骤如下:

(1)、在OnInitDialog()函数中声明如下两个变量:CFont

*Font

LOGFONT

lf(前一个变量是一个字体类指针,后一个变量是一个字体信息结构体,这两个变量用于创建字体)

(2)、在OnInitDialog()函数中添加如下代码:

CFont

*Font

LOGFONT

lf

//第(1)步中已经添加

Font=new

CFont

Font->CreatePointFont(120,(LPCTSTR)"隶书")

Font->GetLogFont(&lf)

//lf.lfUnderline=TRUE

Font->DeleteObject()

Font->CreateFontIndirect(&lf)

((CEdit*)GetDlgItem(IDC_EDIT1))->SetFont(Font,true)

编译运行就可以了,IDC_EDIT1为编辑控件ID号;

更改编辑控件字体颜色步骤如下:

(1)、为对话框类添加WM_CTLCOLOR消息函数OnCtlColor();

(2)、在OnCtlColor()函数中添加代码后如下:

HBRUSH

CXcDlg::OnCtlColor(CDC*

pDC,

CWnd*

pWnd,

UINT

nCtlColor)

{

HBRUSH

hbr

=

CDialog::OnCtlColor(pDC,

pWnd,

nCtlColor)

//

TODO:

Change

any

attributes

of

the

DC

here

if(nCtlColor==CTLCOLOR_EDIT)

{

//pDC->SetBkMode(TRANSPARENT)

pDC->SetTextColor(RGB(255,0,0))

//文字颜色

pDC->SetBkColor(RGB(233,233,220))

//背景颜色

HBRUSH

b=CreateSolidBrush(RGB(233,233,220))//背景颜色

return

b

}

//

TODO:

Return

a

different

brush

if

the

default

is

not

desired

return

hbr

}

问题二:

在“浏览”按钮的消息函数中添加如下代码:

CString

StrFilter="文本文件(*.txt)|*.txt|所有文件(*.*)|*.*||"

CFileDialog

Dlg(TRUE,NULL,NULL,NULL,StrFilter,this)

//A

if(Dlg.DoModal()==IDOK)

{

FilePath=Dlg.GetPathName()

UpdateData(false)

}

其中FilePath是与为编辑控件定义的变量,A行中第一个参数为true时显示打开对话框,为false时显示保存对话框

你判断非法字符 可能是一个一个的找的 也就是说 你输入了多个汉字 程序是一个汉字一个汉字的处理的 比如说你输入的是“我是中国人” 程序第一次处理是判断 “我” 是否为非法字符

然后d出对话框 第二次处理是“我是” d出对话框 第三次处理是“我是中” d出对话框 依次类推 所以不能再消息函数中 直接添加处理函数 你可以记录下输入的字符串的长度 当处理的字符串的长度为最长时 再d出对话框 也就是说在处理“我是中国人” 时再d框

控件可以动态创建

具体思路如下:

先在你的对话框类中添加一个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=0i<ni++)

{

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=0i<ni++)

{

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控件后到底要做什么,你自己可以修改。

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

有什么问题可以再问我


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/bake/11514395.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-16
下一篇2023-05-16

发表评论

登录后才能评论

评论列表(0条)

    保存