现在的位置: 首页 > 综合 > 正文

CEdit用法小记

2018年05月28日 ⁄ 综合 ⁄ 共 8159字 ⁄ 字号 评论关闭

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;
}

抱歉!评论已关闭.