CEdit小结.docx_第1页
CEdit小结.docx_第2页
CEdit小结.docx_第3页
CEdit小结.docx_第4页
CEdit小结.docx_第5页
已阅读5页,还剩3页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

CEdit小结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(第一rn第二rn第三);将显示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的值应该是MingFeiif (m_sEdit1 = MingFei)AfxMessageBox(OK);2.CString str;GetDlgItemText(IDC_EDIT1, str);/获得文本框中的内容,保存在str中SetDlgItemText(IDC_EDIT1, str);/向文本框中写入str3.麻烦点,其实就是第二种方法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 uppercasevoid 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 structurestrcpy(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;/关于CEdit控件的透明做一个透明的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 CEditpublic:/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_MSGDECLARE_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;/更改CEdit的字体和颜色更改对话框中控件的外观可以在其所在对话框中,响应WM_CTLCOLOR事件(表示控件即将刷新),然后在OnCtlColor中判断出需要改变的控件,然后更改其颜色或画刷。为了更一般、更方便的改变CEdit的字体和颜色,则可以继承MFC的CEdit类,重写自己的CMyEdit,方便使用,代码如下:注意:其中最重要的一点是其响应函数是CtlColor,而不是OnCtlColor,两者区别在于CtlColor是反射消息响应函数,它响应“=WM_CTLCOLOR”,而OnCtlColor响应“WM_CTLCOLOR”。当CEdit即将刷新时,将像父窗口发送WM_CTLCOLOR消息,如果父窗口没有对它的WM_CTLCOLOR消息做出处理,将发送给控件,由控件的CtlColor反射函数处理。所以在控件的CtlColor可以自己决定自己如何绘画,与父窗口无关。/-以下为MyEdit.h-#pragma once/ CMyEditclass CMyEdit : public CEditDECLARE_DYNAMIC(CMyEdit)public:CMyEdit();virtual CMyEdit();protected:DECLARE_MESSAGE_MAP()public:void SetBackColor(COLORREF rgb);/设置文本框背景色void SetTextColor(COLORREF rgb);/设置文本框的字体颜色void SetTextFont(const LOGFONT &lf);/设置字体COLORREF GetBackColor(void)return m_crBackGnd;/获取当前背景色COLORREF GetTextColor(void)return m_crText;/获取当前文本色BOOL GetTextFont(LOGFONT &lf);/获取当前字体private:COLORREF m_crText;/字体的颜色COLORREF m_crBackGnd;/字体的背景颜色CFont m_font;/字体CBrush m_brBackGnd;/整个文本区的画刷/控件自己的消息反射函数CtlColor,绘制控件之前调用afx_msg HBRUSH CtlColor(CDC* pDC, UINT nCtlColor);/-以下为MyEdit.cpp-#include stdafx.h#include MyEdit.h/ CMyEditIMPLEMENT_DYNAMIC(CMyEdit, CEdit)CMyEdit:CMyEdit()/初始化为系统字体和窗口颜色m_crText = GetSysColor(COLOR_WINDOWTEXT);m_crBackGnd = GetSysColor(COLOR_WINDOW);m_font.CreatePointFont(90,宋体);m_brBackGnd.CreateSolidBrush(GetSysColor(COLOR_WINDOW);CMyEdit:CMyEdit()BEGIN_MESSAGE_MAP(CMyEdit, CEdit)/WM_CTLCOLOR的消息反射ON_WM_CTLCOLOR_REFLECT()END_ME

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论