CEdit小结

来源:互联网 发布:怎么买风衣 知乎 编辑:程序博客网 时间:2024/06/04 17:42

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; 

}

////////////////////////////////////////////////////////////////////////////

关于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 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;

}

 

////////////////////////////////////////////

更改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

// CMyEdit

class CMyEdit : public CEdit

{

DECLARE_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"

// CMyEdit

IMPLEMENT_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_MESSAGE_MAP()

 

// CMyEdit 消息处理程序

void CMyEdit::SetBackColor(COLORREF rgb)

{

   //设置文字背景颜色

   m_crBackGnd = rgb;

   //释放旧的画刷

   if (m_brBackGnd.GetSafeHandle())

       m_brBackGnd.DeleteObject();

   //使用文字背景颜色创建新的画刷,使得文字框背景和文字背景一致

   m_brBackGnd.CreateSolidBrush(rgb);

   //redraw

   Invalidate(TRUE);

}

void CMyEdit::SetTextColor(COLORREF rgb)

{

   //设置文字颜色

   m_crText = rgb;

   //redraw

   Invalidate(TRUE);

}

void CMyEdit::SetTextFont(const LOGFONT &lf)

{

//创建新的字体,并设置为CEDIT的字体

if(m_font.GetSafeHandle())

{

   m_font.DeleteObject();

}

m_font.CreateFontIndirectA(&lf);

CEdit::SetFont(&m_font);

//redraw

Invalidate(TRUE);

}

BOOL CMyEdit::GetTextFont(LOGFONT &lf)

if(m_font.GetLogFont(&lf)!=0)

{      return TRUE;   }

return FALSE;

}

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

{

//刷新前更改文本颜色

pDC->SetTextColor(m_crText);

//刷新前更改文本背景

pDC->SetBkColor(m_crBackGnd);

//返回画刷,用来绘制整个控件背景

return m_brBackGnd;

}

原创粉丝点击