文档库 最新最全的文档下载
当前位置:文档库 › EDIt控件用法

EDIt控件用法

EDIT控件的用法

分类:VC WINCE 2010-09-21 18:22 1546人阅读评论(0) 收藏举报一、利用WM_CTLCOLOR消息实现Edit Control的文本与背景色的改变

首先要明白:WM_CTLCOLOR是一个由控制(Control)发送给它父窗口的通知消息(Notification message)。

实现步骤:

生成一个标准的单文档应用程序框架,假设应用程序的名称为Color。我将利用它的About对话框做示范。在About dialog中添加两个Edit control,设定其ID为IDC_EDIT1与IDC_EDIT2。

第一种方法(对应于IDC_EDIT1): 按照标准的Windows编程,由其父窗口的消息处理函数负责处理WM_CTLCOLOR消息。

1. 在CAboutDlg中添加一个数据成员:HBRUSH m_brMine;

2. 利用向导映射AboutDlg的WM_CTLCOLOR消息,产生函数:HBRUSH CAboutDlg::OnCtlColor(CDC* pDC, CWnd* pWnd , UINT nCtlColor);

pDC是AboutDlg的设备上下文,pWnd是AboutDlg中发送该消息的control指针,nCtlColor市Control的类型编码。对其进行如下修改:

HBRUSH CAboutDlg::OnCtlColor(CDC* pDC, CWnd* pWnd , UINT nCtlColor)

if ((pWnd->

GetDlgCtrlID() == IDC_EDIT1) && (nCtlColor == CTLC OLOR_EDIT))

{

COLORREF clr = RGB(255,0,0);

pDC-> SetTextColor(clr); //设置红色的文本

clr = RGB(0,0,0);

pDC-> SetBkColor(clr); //设置黑色的背景

m_brMine = ::CreateSolidBrush(clr);

return m_brMine; //作为约定,返回背景色对应的刷子句柄

}

else

{

HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);

return hbr;

}

}

第二种方法(对应于IDC_EDIT2):

利用MFC 4.0的新特性: Message reflection。

1.利用向导添加一个新的类:CColorEdit,基类为CEdit;

2.在CColorEdit中添加一个数据成员: HBRUSH m_bkBrush;

3.利用向导映射CColorEdit的"=WM_CTLCOLOR "消息,产生函数:HBRUSH CColorEdit::CtlColor(CDC* pDC, UINT nCtlColor);

对其进行如下修改:

HBRUSH CColorEdit::CtlColor(CDC* pDC, UINT nCtlColor)

{

COLORREF clr = RGB(0,0,0);

pDC-> SetTextColor(clr); //设置黑色的文本

clr = RGB(255,0,0);

pDC-> SetBkColor(clr); //设置红色的背景

m_bkBrush = ::CreateSolidBrush(clr);

return m_bkBrush; //作为约定,返回背景色对应的刷子句柄}

4.利用向导为IDC_EDIT2生成一个数据成员CColorEdit m_coloredit;

5.在定义CAboutDlg的color.cpp文件中加入:#include "coloredit.h "

二、关于CEdit控件的透明

关于CEdit控件的透明

作者:monsoon

---前几天和风在这里讨论关于CEdit控件的透明问题。主要的目的就是要做一个有图形背景的Edit控件,经过一番努,终于做出了一个还算

象样的Edit控件。

做一个透明的Edit控件的主要问题是字符的输出,在Edit里输出的刷新有几个时机,一个是在接收到键盘或鼠标消息的时候,还有就是在接收到WM_PAINT消息。刷新的时候也不是全部重画,所以想通过在继承的Edit类中处理WM_PAINT消息是行不通的。但是Edit 控件自己总是知道怎么去刷新,因此只要给控件发消息,让其自己来刷新就可以了。通过使用spy++的得知需要刷新有几个时机,一个是按键的时候,内容变化,另一个是选择变化的时候,前者Edit控件会接收到GetCtlCode和KeyUp 消息,后者会接收到GetCtlCode和CaptureChange消息或KeyUp消息,因此在GetCtlCode里调用ReDrawWindow 来强迫Edit刷新整个控件。在ReDrawWindow中通过使用参数RDW_ERASE可以使控件重画背景,即调用OnEraseBkgnd(CDC* pDC),在该函数中重画背景。比较特殊的情况是按住鼠标左键并来回拖动鼠标的时候,这时候选择要改变,接收的消息是MouseMove,为了正确响应也要处理该消息,但是在每一个MouseMove中都刷新显示的开销太大,而且不可避免地有闪烁感,因此只有在鼠标左键按下的时候才刷新显示。

大概的代码如下,主要是继承了一个CEdit的对象CTpEdit,使用的时候可以动态创建,或者采用SubClass的方法。我用的是后者。

class CTESTDLG : public CDialog

{

......

//声明一个CTpEdit的成员变量

private:

CTpEdit m_tpedit;

};

//在OnInitDialog中Subclass对话框模板中的Edit控件

BOOL CTESTDLG::OnInitDialog()

{

CDialog::OnInitDialog();

m_tpedit.SubclassDlgItem(IDC_EDIT,this);

return TRUE;

}

//在OnCtlColor中设置背景的透明,要改变Edit控件字体的颜色也在这里

HBRUSH CTESTDLG::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)

{

HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);

if((nCtlColor == CTLCOLOR_EDIT) &&

(pWnd->GetDlgCtrlID()==IDC_EDIT))

{

pDC->SetBkMode(TRANSPARENT); //设置背景透明,这样,输出字符的时候就

//是所谓的空心字,而不是有白的底色

pDC->SetTextColor(RGB(255,0,0)); //改变字体的颜色

return HBRUSH(GetStockObject(HOLLOW_BRUSH));

}

return hbr;

}

//CTpEdit对象

class CTpEdit : public CEdit

{

public:

//m_mousedown用来记录鼠标左键是否按下

BOOL m_mousedown;

protected:

//响应如下的消息

//{{AFX_MSG(CTpEdit)

afx_msg BOOL OnEraseBkgnd(CDC* pDC);

afx_msg void OnMouseMove(UINT nFlags, CPoint point); afx_msg void OnLButtonDown(UINT nFlags, CPoint point); afx_msg void OnLButtonUp(UINT nFlags, CPoint point); afx_msg UINT OnGetDlgCode();

//}}AFX_MSG

DECLARE_MESSAGE_MAP()

};

//CTpEdit的消息响应函数如下

//画背景图

BOOL CTpEdit::OnEraseBkgnd(CDC* pDC)

{

//得到Edit控件的外框,即背景区域

RECT updatarect;

GetClientRect(&updatarect);

//画背景,我画的是一个黄色的矩形

CBrush newBrush;

newBrush.CreateSolidBrush(RGB(255,255,200));

CBrush * oldBrush = pDC->SelectObject(&newBrush);

pDC->Rectangle(&updatarect);

pDC->SelectObject(oldBrush);

return TRUE;

}

//强迫Edit控件擦除背景,重写字符

UINT CTpEdit::OnGetDlgCode()

{ RedrawWindow(NULL, NULL,RDW_INVALIDATE | RDW_ERASE ); return CEdit::OnGetDlgCode();

}

//记录鼠标左键是否按下

void CTpEdit::OnLButtonDown(UINT nFlags, CPoint point)

{

m_mousedown = TRUE;

SetCapture();

CEdit::OnLButtonDown(nFlags, point);

}

void CTpEdit::OnLButtonUp(UINT nFlags, CPoint point)

{

if(m_mousedown)

ReleaseCapture();

m_mousedown = FALSE;

CEdit::OnLButtonUp(nFlags, point);

}

//如果左键按下并且拖动鼠标就要刷新显示

void CTpEdit::OnMouseMove(UINT nFlags, CPoint point)

{

if(m_mousedown)

RedrawWindow(NULL, NULL,RDW_INVALIDATE | RDW_ERASE ); CEdit::OnMouseMove(nFlags, point);

}

//初始化成员变量

CTpEdit::CTpEdit()

{

m_mousedown=FALSE;

}

三、基本用法

https://www.wendangku.net/doc/bf433005.html,/matthew49/blog/item/0dc0a7d6f62d1d2307088bcf .html

通过类向导以生成两种类成员变量,一种是cstring类型,一种是cedit 类型。

在程序中使用时如果只是简单的获取edit控件内容,或设置简单的内容建议使用cstring类型成员变量。

示例:

CString m_strEdit;

//获得edit框内容

UpdateData(true);

此时m_strEdit就是edit框内容的字符串变量。

//要更新edit的话只要对m_strEdit进行赋值然后UpdataData(false);//即可

如果是一些对edit框的复杂操作建议用cedit类型。示例:

CEdit m_ctrlEdit;

//将光标移到开头

m_ctrlEdit.SetSel(0,0);

//将光标移到末尾

m_ctrlEdit.SetSel(-1);

//选中所有内容

m_ctrlEdit.SetSel(0,-1);

//写入值

m_ctrlEdit.ReplaceSel("替换内容");

//得到当前edit框中的所有字符数

int iStart,iCount;//iCount 为字符数

m_ctrlEdit.SetSel(0,-1);

m_ctrlEdit.GetSel(iStart,iCount);

还一种可以直接用控件的id值来进行操作

示例:

((CEdit*)GetDlgItem(IDC_EDIT)

他类似于上边的m_ctrlEdit

这样写的好处是可以在消息传递中使用,便于不同窗口间传递edit内容

例如:下面的消息响应函数中

SetEditContent(WPARAM wPARAM, LPARAM lPARAM)

IDC_EDIT可以通过wPARAM传递近来,而字符传内容可以直接通过lPARAM传递近来

CString Msg="要传递的消息";

::SendMessage(m_hParent,WM_SENDMSG_EDIT,(WPARAM)

IDC_EDIT, (LPARAM)(LPSTR)(LPCTSTR)Msg)

如:

((CEdit*)GetDlgItem(wPARAM))->SetSel(-1);

((CEdit*)GetDlgItem(wPARAM))->ReplaceSel((LPCSTR)lPARAM); VC编辑框(EDIT)的自动换行与自动滚屏

经过多次测试,总结出VC编辑框(EDIT)的自动换行与自动滚屏的方法。

方法一:(当EDIT映射到一CString时)

m_String = m_String + sNewString + "/r/n" //自动换行

UpdateData(false);

此法只能做到自动换行,不会自动滚屏到最后一行。

方法二:(当EDIT映射到一EDIT时)

m_Edit.SetSel(-1, -1); //自动滚屏

m_Edit.ReplaceSel(sNewString+"/r/n"); //自动换行

UpdateData(true);

此法可以做到自动换行,并自动滚屏到最后一行。

以上,m_String、m_Edit.分别为给编辑框添加的成员变量;sNewString 为要显示的字符串

注意二法中UpdataData参数的区别。

四、参数

https://www.wendangku.net/doc/bf433005.html,/callstudio/blog/item/422c43b781506f7f8ad4b240.html

SetSel(start,end)作用:

定制EDIT的所选择内容.间接地可以用于定位光标位置.

使用例子:

EXP1:设置光标

CEdit* pEdit=(CEdit*)GetDlgItem(IDC_EDIT1);

pEdit->SetSel(2,2);

pEdit->SetFocus();

EXP2:选择内容

CEdit* pEdit=(CEdit*)GetDlgItem(IDC_EDIT1);

pEdit->SetSel(0,2);//两个字符

说明:

如果出现光标设置失效的情况,可能是由于以下情况:因为UpdateData()的作用也会重置光标,所以用于设置

光标时一定要放在UpdateData()之后.

如果用于选择内容:SetSel(0,-1)表示全选;SetSel(-1,i)表示删除所有.

1.怎么在CEDIT执行回车换行显示的功能?

CEdit控件设置want return 属性并设置Multiline属性,此时用

CEdit* pEdit = (CEdit*)GetDlgItem(IDC_EDIT1);

pEdit->SetWindowText("第一/r/n第二/r/n第三");

将显示3行。

2。作为密码输入控件使用。

m_WndEDIT4.SetPasswordChar('*');

3。CEDIT没有AppendText功能怎么办?

int nLength = m_WndEDIT4.SendMessage(WM_GETTEXTLENGTH);

m_WndEDIT4.SetSel(nLength, nLength);

m_WndEDIT4.ReplaceSel( " abc " );

1.如果文本框和变量建立了关联直接

UpdateData(TRUE) //用于获得文本框中的内容;

UpdateData(FALSE) //用于更新文本框的内容并和更新关联的变量

例如:

DDX_Text(pDX, IDC_EDIT1, m_sEdit1);//把变量m_sEdit1与IDC_EDIT1建立联系

//让文本框中显示“Hello”

m_sEdit1 = "Hello";

UpdateData(FALSE);

//获得文本框的用户输入内容

UpdateData(TRUE);//如果用户写入的是"MingFei",那么m_sEdit1的值应该是"MingFei"

if (m_sEdit1 == "MingFei")

{

AfxMessageBox("OK");

}

2.

CString str;

GetDlgItemText(IDC_EDIT1, str);//获得文本框中的内容,保存在str中

SetDlgItemText(IDC_EDIT1, str);//向文本框中写入str

3.麻烦点,其实就是第二种方法

CEdit *edit=(CEdit*)GetDlgItem(IDC_EDIT1);

CString dir;

edit->GetWindowText(dir);

(47)如何限制编辑框中的准许字符

如果用户在编辑控件中只允许接收数字,可以使用一个标准的编辑控件并指定新的创建标志

ES_NUMBERS,它是Windows 95新增加的标志,该标志限制编辑控件只按收数字字符。如果用户需要复杂的编辑控件,可以使用Microsoft 的屏蔽编辑控件,它是一个很有用的OLE定制控件。

如果希望不使用OLE 定制控件自己处理字符,可以派生一个CEdit类并处理WM_CHAR消息,然后从编辑控件中过滤出特定的字符。首先,使用ClassWizard建立一个CEdit的派生类,其次,在对话类中指定一个成员变量将编辑控件分类在OnInitdialog 中调用CWnd: : SubclassDlgItem .

//In your dialog class declaration (.H file )

private : CMyEdit m_wndEdit // Instance of your new edit control .

//In you dialog class implementation (.CPP file )

BOOL CSampleDialog : : OnInitDialog ( )

{

//Subclass the edit lontrod .

m_wndEdit .SubclassDlgItem (IDC_EDIT,this)

}

使用ClassWizard处理WM_CHAR消息,计算nChar参量并决定所执行的操作,用户可以确定是否修改、传送字符。下例说明了如何显示字母字符,如果字符是字母字符,则调用CWnd OnChar,否则不

调用OnChar.

//Only display alphabetic dharacters .

void CMyEdit : : OnChar (UINT nChar , UINT nRepCnt , UITN nFlags )

{

//Determine if nChar is an alphabetic character.

if (: : IsCharAlpha ( ( TCHAR) nChar ) )

CEdit : : OnChar (nChar, nRepCnt , nFlags )

}

如果要修改字符,则不能仅仅简单地用修改过的nChar调用CEdit: : OnChar,然后CEdit: : OnChar 调用CWnd: : Default获取原来的wParam 和lParam 的值,这样是不行的。要修改一个字符,需要首先修改nChar,然后用修改过的nChar调用CWnd: : DefWindowProc。下例说明了如何将字符转变为大写:

//Make all characters uppercase

void CMyEdit : : OnChar (UINT nChar , UINT nRepCnt , UINT nFlags )

{

//Make sure character is uppercase .

if (: : IsCharAlpha ( .( TCHAR) nChar)

nChar=: : CharUpper(nChar )

//Bypass default OnChar processing and directly call

//default window proc.

DefWindProc (WM_CHAR, nChar , MAKELPARAM (nRepCnt, nFlags ))

}

枚举所有字体

LOGFONT lf;

lf.lfCharSet = DEFAULT_CHARSET; // Initialize the LOGFONT structure

strcpy(lf.lfFaceName,"");

CClientDC dc (this);

// Enumerate the font families

::EnumFontFamiliesEx((HDC) dc,&lf, (FONTENUMPROC) EnumFontFamProc,(LPARAM) this,0);

//枚举函数

int CALLBACK EnumFontFamProc(LPENUMLOGFONT lpelf,

LPNEWTEXTMETRIC lpntm,DWORD nFontType,long lparam)

{

// Create a pointer to the dialog window

CDay7Dlg* pWnd = (CDay7Dlg*) lparam;

// add the font name to the list box

pWnd ->m_ctlFontList.AddString(lpelf ->elfLogFont.lfFaceName);

// Return 1 to continue font enumeration

return 1;

}

本文来自CSDN博客,转载请标明出处:https://www.wendangku.net/doc/bf433005.html,/cciey/archive/2008/07/24/2702356.aspx

用Edit Box 显示系统实时时间:

在对话框的初始化函数OnInitDialog()中添加以下程序:

SYSTEMTIME st;

GetLocalTime(&st);

CString str_temp;

str_temp.Format("%u/%u/%u %u:%u:%u:%u/n", st.wYear, st.wMonth, st.wDay, st.wHour, st.wMinute, st.wSecond, st.wMilliseconds);

CEdit* edt = (CEdit*)GetDlgItem(IDC_EDIT_TIME);

edt->SetWindowText(str_temp);

用Edit Box 显示系统当前时间:

在对话框的初始化函数OnInitDialog()中添加以下程序:

CString str;

CTime tm;

tm = CTime::GetCurrentTime(); //把获得的当前时间保存到变量tm中

str = tm.Format("%Y年%m月%d日%X");

this->GetDlgItem(IDC_EDIT1)->SetWindowText(str);

用Edit Box 只接受数字输入:

在对话框初始化函数中添加以下代码:

CEdit* m_edit = (CEdit*)GetDlgItem(IDC_EDIT1);

long wl = GetWindowLong(m_edit->m_hWnd, GWL_STYLE); //获得Edit Box的

窗口风格

SetWindowLong(m_edit->m_hWnd, GWL_STYLE, wl | ES_NUMBER); //设置

Edit Box新风格

自定义Edit Box的可输入内容:

重载对话框的PreTranslateMessage函数,并且添加以下代码: BOOL CLangziDlg::PreTranslateMessage(MSG* pMsg)

{

CEdit* m_edit = (CEdit*)GetDlgItem(IDC_EDIT1);

if((pMsg->hwnd == m_edit->m_hwnd) && (pMsg->message ==

WM_CHAR))

{

if(65 != pMsg->wParam) //只允许输入字母A(A的ascll码是65)

return TRUE;

}

}

六、MFC中EDIT 控件使用

https://www.wendangku.net/doc/bf433005.html,/whudd/blog/item/e39ef1172d1eb04720a4e9d5.html

对MFC基础为零,想学习一下,先从控件开始学习吧。今天用EDIT控件。都是在网上找的东西,再把自己用过的过程记录一下,呵呵。

1、新建一个基于Dialog工程,拖一个Edit控件进去。

2、设置支持换行操作,在属性设置中Multiline和Want return勾上。

若想编辑内容到最右边后自动换行,将Auto HScroll前面的勾去掉。

3、想Edit控制支持全选、复制、粘帖、剪切、撤销操作,实现过程如下:

在类向导中添加PreTranslateMessage函数,然后在该函数中编辑如下代码:

相关文档
相关文档 最新文档