EDIT控件的用法_vc中edit消息-程序员宅基地

技术标签: dialog  MFC编程  null  文本编辑  mfc  microsoft  class  

一、利用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   ==   CTLCOLOR_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;
}

 

 

三、基本用法

http://hi.baidu.com/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参数的区别。

 

 

四、参数

 

http://hi.baidu.com/callstudio/blog/item/422c43b781506f7f8ad4b240.html

编辑框(Edit)控件实际上是一个简易的文本编辑器,用户可以在编辑框中输入可添加或插入文本。还有复制、粘贴、剪切、删除等编辑功能。
  应用程序用CreateWindowEx创建编辑框控件时,可根据控件的用途在下表中选择部份常数来设定其风格属性(style)。
常数 说明
ES_MULTILINE 多行文本,指定编辑控件可以多行文本编辑,用户每按一次Enter,在当前光标次输入一个回车换行符(0Dh,0Ah),文本增加一行。
ES_LEFT 文本显示居左。
ES_CENTER 文本显示居中。
ES_RIGHT 文本显示居右。
ES_LOWERCASE 把用户输入的字母统统转换成小写字母。
ES_UPPERCASE 把用户输入的字母统统转换成大写字母。
ES_OEMCONVERT 使编辑框中的正文可以在ANSI字符集和OEM字符集之间相互转换。这在编辑框中包含文件名时是很有用的。
ES_AUTOHSCROLL 当用户在行尾键入一个字符时,正文将自动向右滚动10个字符,当用户按回车键时,正文总是滚向左边。
ES_AUTOVSCROLL 当用户在最后一个可见行按回车键时,正文向上滚动一页。
ES_NUMBER 只接收数码输入,其它字符输入一律无效。
ES_NOHIDESEL 当编辑框失去输入焦点,正文中的选择保持不变,缺省时正文中的选择将失效。
ES_READONLY 将编辑框设置成只读的。
ES_PASSWORD 使所有键入的字符都用“*”来显示。
ES_WANTRETURN 使多行编辑器接收回车键输入并换行。如果不指定该风格,按回车键会选择缺省的命令按钮,这往往会导致对话框的关闭。

  当用户在编辑控件上进行各种操作时,其父窗口将收到WM_COMMAND通知消息,同时wParam的低16位带控件的ID。lParam带控件句柄(hWnd),wParam的高16位带有如下表的消息代码。
消息代码 用户操作
EN_CHANGE 编辑框的内容被用户改变了。与EN_UPDATE不同,该消息是在编辑框显示的正文被刷新后才发出的。
EN_ERRSPACE 编辑框控件无法申请足够的动态内存来满足需要。
EN_HSCROLL 用户在水平滚动条上单击鼠标。
EN_KILLFOCUS 编辑框失去输入焦点。
EN_MAXTEXT 输入的字符超过了规定的最大字符数。在没有ES_AUTOHSCROLL或ES_AUTOVSCROLL的编辑框中,当正文超出了编辑框的边框时也会发出该消息。
EN_SETFOCUS 编辑框获得输入焦点。
EN_UPDATE 在编辑框准备显示改变了的正文时发送该消息。
EN_VSCROLL 用户在垂直滚动条上单击鼠标。

  应用程序可以通过调用SendMessage向控件发送如下消息来设定和查询控件各种参数。
uMsg wParam lParam 说明
EM_UNDO 0 0 撤消前一次在控件的编辑操作,当重复发送本消息,控件将在撤消和恢复中来回切换。
EM_CANUNDO 0 0 检测控件撤消缓冲区是否为空,通常控件把最后一次在控件的编辑操作保存在一个撤消缓冲区,如果缓冲区非空则返回TRUE表示上次操作可以撤消,否则返回FALSE,应用程序可以利用该返回值来禁止或允许菜单或工具条的“撤消”项。
EM_EMPTYUNDOBUFFER 0 0 清除控件的撤消缓冲区,使其不能撤消前一次编辑操作。
EM_REPLACESEL TRUE或FALSE 替换文本指针 用指定文本替换编辑控件中的当前选定内容,如果wParam为TRUE,则本次操作允许撤消,FALSE禁止撤消。
EM_SETSEL 起点 终点 设置编辑控件中文本选定内容范围,该范围被高亮度显示,用于为复制、替换、粘贴、剪切、删除等编辑功能指定范围。使用本 功能,键盘光标将被移至指定的终点后面,通常使用指定相同起点和终点来移动键盘光标而不选定范围。当指定的起点等于0和终点等于-1时,全文全部被选中, 此法常用在清空编辑控件。当指定的起点等于-2和终点等于-1时,全文均不选,键盘光标移至文本未端,此法常用在文本未端追加内容。注意 :当控件没有输入焦点时,本操作将会失败,一般在执行本操作前都应调用SetFocus先取得输入焦点。
EM_GETSEL 起点缓冲地址
或NULL
终点缓冲地址
或NULL
取得编辑控件中选定内容的范围,返回值中低16位为起点与高16位为终点,如果wParam和lParam中指定了地址,则会在该地址填入相应值(dword)。本操作也常用来求取键盘光标位置。
EM_CHARFROMPOS 0 位置 取得指定位置处的字符相对于文本头部的偏移,使用本操作应先在lParam的高16位指定行号,低16位指定列号,行列是按编辑控件的客户区左上角为原点(0,0)计算的。如果指定的位置超出控件客户区则返回-1
EM_FMTLINES TRUE或FALSE 0 决定是否在取回的文本宇串中包含软回车字符
EM_GETFIRSTVISIBLELINE 0 0 取得编辑控件中显示的第一行
EM_GETHANDLE 0 0 取得编辑控件文本缓冲区。
EM_GETLIMITTEXT 0 0 获取一个编辑控件中文本的最大长度
EM_GETLINE 行号 缓冲地址 从编辑控件取回一行的内容,缓冲区第一个字(word)必须先填写缓冲区的长度,
EM_GETLINECOUNT 0 0 取得一个编辑控件的总行数
EM_GETMARGINS 0 0 获取编辑控件的左、右边距,返回值低16位为左边距,高16位为右边距
EM_GETMODIFY 0 0 取编辑控件的修改标志,返回 TRUE则控件文本已被修改,返回FALSE则未变。此值可以来决定是否提示用户存盘。
EM_GETPASSWORDCHAR 0 0 取得编辑控件用来显示密码的字符,返回NULL表示没有字符。
EM_GETRECT 0 RECT结构地址 获取一个编辑控件的格式化矩形
EM_GETTHUMB 0 0 取得多行文本编辑控件的滚动框的当前位置。
EM_GETWORDBREAKPROC 0 0 取得整字换行回调函数EditWordBreakProc指针。
EM_LIMITTEXT 最大值 0 限制编辑中文本的最大长度
EM_LINEFROMCHAR 字符偏移 0 取得指定的字符偏移处的行号。
EM_LINEINDEX 行号 0 取得指定行第一个字符偏移
EM_LINELENGTH 字符偏移 0 取得指定字符偏移处对应的一行长度字符数。
EM_LINESCROLL 列字符 行数 滚动编辑控件
EM_POSFROMCHAR POINT结构地址 字符偏移 取得指定字符偏移的显示位置行列号,行列是按编辑控件的客户区左上角为原点(0,0)计算的。字符偏移是相对于文本头部的偏移。
EM_SCROLL SB_LINEDOWN
SB_LINEUP
SB_PAGEDOWN
SB_PAGEUP
0 编辑框显示文本垂直滚动。滚动方向:SB_LINEDOWN向下滚动一行,SB_LINEUP向上滚动一行,SB_PAGEDOWN向下滚动一页,SB_PAGEUP向上滚动一页。
EM_SCROLLCARET 0 0 把键盘光标移至可见范围。
EM_SETHANDLE 缓冲区指针 0 为编辑控件指定新的文本缓冲区。此操作仅适用对话框创建带DS_LOCALEDIT风格的控件。
EM_SETLIMITTEXT 长度(字节) 0 限制编辑控件中的文本缓冲区最大长度。
EM_SETMARGINS EC_LEFTMARGIN
EC_RIGHTMARGIN
EC_USEFONTINFO
边距 设置编辑控件的左、右边距,当wParam含EC_LEFTMARGIN时在lParam的低16位指定左边距点数,当 wParam含EC_RIGHTMARGIN时在lParam的高16位指定右边距点数。当指定wParam为EC_USEFONTINFO时,则用当前 字体的字符"A"的宽度指定右边距和字符"C"的宽度指定左边距lParam被忽略。
EM_SETMODIFY TRUE或FALSE 0 用于设置或清除一个编辑控件的修改标志
EM_SETPASSWORDCHAR 字符 0 指定控件用来显示密码字符,缺省为“*”。当wParam为0时,本操作将清除控件的ES_PASSWORD风格,并按实际字符显示。
EM_SETREADONLY TRUE或FALSE 0 决定是否将编辑控件设为只读,同时决定控件的ES_READONLY风格
EM_SETRECT 0 RECT结构地址 为一个编辑控件设置格式化矩形
EM_SETRECTNP 0 RECT结构地址 与EM_SETRECT类似,只是控件此时不会重画
EM_SETTABSTOPS 制表站数 站距表地址 设置编辑控件中的制表站间距,当制表站数为0时lParam被忽略,所有制表站距均为32个对话框单位,当制表站数不为0时lParam指向一个由32位(dword)组成的站距表,以对话框单位为宽度计算单位。
EM_SETWORDBREAK 0 0 本操作现已不支持,请使用EM_SETWORDBREAKPROC。
EM_SETWORDBREAKPROC 0 函数入口地址 设置整字换行回调函数EditWordBreakProc指针。


五、 vc edit box 控件使用

http://hi.baidu.com/lilipangtou/blog/item/131c16f90d2363849f51467e.html

转载自  dongfangjack
最终编辑  lilipangtou

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

 

本文来自程序员宅基地,转载请标明出处:http://blog.csdn.net/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 控件使用


http://hi.baidu.com/whudd/blog/item/e39ef1172d1eb04720a4e9d5.html


对MFC基础为零,想学习一下,先从控件开始学习吧。今天用EDIT控件。都是在网上找的东西,再把自己用过的过程记录一下,呵呵。
    1、新建一个基于Dialog工程,拖一个Edit控件进去。
   2、设置支持换行操作,在属性设置中Multiline和Want return勾上。
     若想编辑内容到最右边后自动换行,将Auto HScroll前面的勾去掉。
   3、想Edit控制支持全选、复制、粘帖、剪切、撤销操作,实现过程如下:
     在类向导中添加PreTranslateMessage函数,然后在该函数中编辑如下代码:

   BOOL CProcessDlg::PreTranslateMessage(MSG *pMsg)
   {
   // 编辑框快捷键操作
   if(WM_KEYDOWN == pMsg->message) 
   {
    if(GetKeyState( VK_CONTROL) & 0x8000) 
    {
     // 全选
     if( pMsg->wParam == 'A' || pMsg->wParam == 'a')
     {
      m_CtrlEdit.SetSel(0, -1); //m_CtrlEdit为控件的名字
      return true;
     }
     
     // 复制
     if( pMsg->wParam == 'C' || pMsg->wParam == 'c')
     {
      m_CtrlEdit.Copy();
      return true;
     }
     // 粘贴
     if( pMsg->wParam == 'V' || pMsg->wParam == 'v')
     {
      m_CtrlEdit.Paste();
      return true;
     }   
     // 剪切
     if( pMsg->wParam == 'X' || pMsg->wParam == 'x')
     {
      m_CtrlEdit.Cut();
      return true;
     }
     // 撤销
     if( pMsg->wParam == 'Z' || pMsg->wParam == 'z')
     {
      m_CtrlEdit.Undo();
      return true;
     }
     
    }
   }
   return CDialog::PreTranslateMessage(pMsg);
   }


版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/ziyue007/article/details/7979318

智能推荐

mysql中如何更新数据库_MySQL数据库如何使用update set语句更新数据表-程序员宅基地

文章浏览阅读3.2k次。UPDATE 更新UPDATE SET 语法用于修改更新数据表中的数据。语法:UPDATEtb_nameSETcolumn1=new_value1,column2=new_value2,…WHEREdefinition该语法将数据表中符合 WHERE 条件的记录中的 column1 的值更新为 new_value1,column2 的值更新为new_value2 ,以此类推。如果..._update set用法

SpringBoot整合Canal实现数据同步到ElasticSearch-程序员宅基地

文章浏览阅读773次,点赞15次,收藏8次。在监听类上实现ApplicationRunner接口,springBoot项目启动时,若想在启动之后直接执行某一段代码,就可以用 ApplicationRunner这个接口,并实现接口里面的run(ApplicationArguments args)方法,方法中写上自己的想要的代码逻辑。项目pom文件中导入的canal版本需要和本地(或服务器)上启动的canal版本保持一致,否则会有代码中连接不上本地canal的情况,本案例采用的是canal 1.6版本。看到上述截图,代表Canal的服务端已经搭建成功。

感恩-程序员宅基地

文章浏览阅读137次。生活中学会感恩,感恩家人、朋友和你的那个他。 感恩是有方法的,心存他人对自己的好,心存他人对自己无谓的付出,接受这份情,接受这份意,在合适的时候是需要给别人回报的,可以是言语上的,可以是精神上的,也可以是物质上的。 不要对他冷眼看待,认为他人是傻子,因为没有人是真正意义上的傻子,没有人会毫无所求的对另一个人好,他自是在满足自己的情感而已,...

基于FPGA的数字分频器实现-程序员宅基地

文章浏览阅读47次。通过设置适当的分频系数,我们可以将输入信号的频率降低到所需的频率。为了在FPGA开发板上运行我们的数字分频器,我们需要进行适当的FPGA开发环境配置。我们的数字分频器将接收一个时钟信号作为输入,并输出一个较低频率的分频后的信号。在将比特流文件下载到FPGA开发板后,我们可以通过连接一个时钟源到开发板的时钟输入引脚上,以及连接分频后的信号输出引脚到示波器或其他外部设备上,来验证数字分频器的功能。通过在顶层模块中实例化数字分频器模块,并设置适当的分频系数,我们可以根据实际需求生成不同频率的分频信号。

适用于Win和Mac的专业电脑数据恢复软件EasyRecovery易恢复14_easyrecovery warning-程序员宅基地

文章浏览阅读1.8k次。EasyRecovery易恢复一键轻松找回丢失数据 支持电脑、相机、移动硬盘、U盘、SD卡、内存卡、光盘、本地电子邮件和 RAID 磁盘阵列等各类存储设备的数据恢复。EasyRecovery还可以支持恢复从硬盘、光盘、U盘、数码相机、手机等各种设备中恢复被删除或丢失的文件,只是使用EasyRecovery恢复时时间较久。如果小伙伴们有误删除的文件需要恢复可以选择这款EasyRecovery数据恢复工具!_easyrecovery warning

springboot景区自助售票系统 计算机毕设源码68175_景区票务系统 开源-程序员宅基地

文章浏览阅读110次。景区自助售票系统主要功能模块包括系统首页、用户管理、公共管理、景点信息、景点类型、会员钱包、充值信息、确认充值、订票信息、退票申请、确认退票、联系我们,采取面对对象的开发模式进行软件的开发和硬体的架设,能很好的满足实际使用的需求,完善了对应的软体架设以及程序编码的工作,采取MySQL作为后台数据的主要存储单元,采用springboot框架、Java技术、Ajax技术进行业务系统的编码及其开发,实现了本系统的全部功能。本次报告,首先分析了研究的背景、作用、意义,为研究工作的合理性打下了基础。针对景区自助..._景区票务系统 开源

随便推点

CNVD原创漏洞证书总结_cnvd漏洞收录一定有证书吗-程序员宅基地

文章浏览阅读4.2w次,点赞3次,收藏21次。之前打算申请个CNVD的原创漏洞证书。经过这一个多月的时间证书下来了,现在简单总结一下。原创漏洞审核和处理流程参考此链接:http://www.cnvd.org.cn/webinfo/show/3933然后我就说说我提交过两个后台的文件上传漏洞7.26提交-7.27二审通过,验证通过-9.4三审通过,漏洞归档-9.9漏洞公开我在想漏洞公开了,怎么证书也应该下来了,我这个通用型的漏洞..._cnvd漏洞收录一定有证书吗

Zotero 6 文献管理 + 内置PDF阅读器 + 选中翻译_pdf-translate github-程序员宅基地

文章浏览阅读2.6w次,点赞40次,收藏78次。不做标题党,本来想叫《还在用知云?zotero 6内置PDF阅读器了 还带翻译插件的!》学生党可能很多都知道知云,一个看论文神器,直接选中翻译。支持百度、谷歌、有道翻译等等,并且还可以白嫖(就是之前分享朋友圈集赞免费用)。我平时用的文献管理工具是zotero,我默认的看PDF的软件是edge浏览器。但是每次要翻译论文的时候我还得把文件拖到知云里,就很麻烦。终于!zotero自带了!不用再拆两个软件了!下载安装zoterozotero官网:https://www.zotero.org/downlo_pdf-translate github

数据库安全性是什么:防火墙保护你的数据-程序员宅基地

文章浏览阅读197次。数据库安全性是指对数据库系统中的数据进行保护和安全管理的措施。防火墙是一种有效的网络安全设备,用于监控和控制网络通信流量,从而保护数据免受未经授权的访问或恶意攻击。数据库安全性结合防火墙技术,可以有效保护数据库中的重要信息,防止数据泄漏或被篡改。用户对数据库安全性是什么:防火墙保护你的数据的评价普遍积极。3. 准确的监控和报警系统,及时发现和应对潜在安全威胁,值得用户选择和信赖。2. 用户友好的操作界面和丰富的安全功能,满足用户的多样化需求。1. 高度的安全性保障,保护数据库中的重要数据不受损害。

爱好选择器_爱好checked-程序员宅基地

文章浏览阅读331次。<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"><html><head> <meta http-equiv="Content-Type" content="text/html; charset=..._爱好checked

windows无法打开添加打印机_windows无法打开添加打印机 一个小技巧轻松搞定-程序员宅基地

文章浏览阅读81次。大家好,我是小白一键重装软件的客服。windows无法打开添加打印机怎么办呢?打印机在使用的过程中,最头疼的就是打印机各式各样的小故障,不是打印不了就是打印机突然脱机,今天遇到的就是windows无法打开添加打印机的情况,如何是好呢?下面带您看下这种情况如何快速解决吧。首先我们从无法添加打印机的提示来看,可能是打印机后台处理程序服务未运行,或者需要重启电脑。那么尝试重启电脑看下能否解决,接着再看下..._windows无法打开添加打印机

减少产品中缺陷和其他废物数量的终极指南-程序员宅基地

文章浏览阅读249次。有什么缺陷? 我喜欢这个定义。 缺陷是威胁产品价值的任何事物。 在开始之前,我们要同意: 我们不想破坏威胁我们产品价值的缺陷 我们希望在任何时候都为客户提供尽可能多的价值。 如果您不同意1和2,请不要浪费时间并立即停止阅读。 软件缺陷又称错误 测试人员通常与发现缺陷有关。 一些测试人员可以很好地保护发现的缺陷,而某些开发人员可以对所编写的缺陷采取防御措施。 ..._978寓意

推荐文章

热门文章

相关标签