这个类和MFC的CEdit类完全一样,只是增加下面一点功能:
    一:如果用户通过DDX_Text宏给它初始化初值,那么当用户第一次把光标定位到该EDit框时要清除掉初始值,举个例子:一个编辑框,让用户输入自己的姓名,用DDX_Text宏给该编辑框初始化初值为“请输入您的姓名”,当用户定位光标于该编辑框准备输入自己的姓名时,“请输入您的姓名”这段文字要马上清除,就像新安装的QQ的登陆界面一样(QQ号编辑框初始显示为“请输入你的QQ号”类似)。    二:虽然通过DDX_Text宏给它初始化了初值,但后来编程者又调用了SetWindowText改变了初值(在用户第一次定位光标于该编辑框之前),那么当用户第一次定位光标于该编辑框时,不清除原内容,举个例子:用DDX_Text宏给该编程框初始化初值为“请输入您的姓名”,后来又SetWindowText("江泽名");,那么“江泽名”不应该在用户第一次定位光标于编辑框时被消除,即使是SetWindowText("请输入您的姓名");也一样。

解决方案 »

  1.   

    我想了好久没想到怎么写。因为SetWindowText不能重载。
      

  2.   


    1:重载Onsetfocus(),得到焦点就把编辑框清空。
    2:也重载Onsetfocus(),在里面用getwindowtext()判断清除或不清除。
    给分吧
      

  3.   

    哦,主要是第二个功能:
    你可以 截获 WM_SETTEXT,
      

  4.   

    to wuprograme(不想想太多QQ:58254806欢迎交流)
    如果编辑框为TAB第1的话,用户根本看不到“请输入您的姓名”这句话!!因为它在第一次运行的时候就会自动获得焦点。对于“用getwindowtext()判断清除或不清除”,我上面说得很清楚,并不一定是“请输入您的姓名”这样的文字就清除,有可能有个人的名字就叫“请输入您的姓名”呢?请认真看清楚我对第二个要求的描述。再说了,如果判断是“请输入您的姓名”就清除,那这个类还有什么通用性,若某人想把提示信息写成“please input your name”,那是不是要判断编辑框中的内容是不是等于“please input your name”,等于就删除,如果另外一个人想再用别的提示信息呢?!!这个问题我想了很久才决定要问的,请大家实际的写个这样的类好吗?反正从CEdit重载,也写不了多少程序。
      

  5.   

    我也想这样啊,可是重载不了SetWindowText函数啊,似乎也重载不了WM_SETTEXT,能不能说得详细点啊。
    如果从CWnd来继承,那倒是没有任何问题,可是编辑与输入那一块很麻烦的,既然有CEdit类,为什么不从它继承呢。
      

  6.   

    不是重载WM_SETTEXT,而是获取WM_SETTEXTPreTranslateMessage 中 获得 睡觉了
      

  7.   

    晕,睡不着,试了一下,能达到效果
    LRESULT CT1Dlg::DefWindowProc(UINT message, WPARAM wParam, LPARAM lParam) 
    {
    if(message==WM_SETTEXT)
    {
    MessageBox("A");
    return false;
    }
    return CDialog::DefWindowProc(message, wParam, lParam);
    }
      

  8.   

    to楼主,你重载CEdit,如果你动态创建这个重载的CEdit,除非显示使用setfocus(),这个编辑框是不会自动获的焦点的,所以就不会出现上面你说的问题,你可以试试。
      

  9.   

    当然前提是你重载了SetFocus(),对与你的第2个问题,surstar的想法可行
      

  10.   

    那你为什么要求要动态创建这个编辑框呢?编辑框更多时候不是动态创建的。这个问题在CodeKey() 的提示下我已写出来,可以达到要求,如下:
    申明:
    class CSTEdit : public CEdit
    {
    public:
    CSTEdit();
    //{{AFX_VIRTUAL(CSTEdit)
    protected:
    virtual LRESULT DefWindowProc(UINT message, WPARAM wParam, LPARAM lParam);
    //}}AFX_VIRTUALpublic:
    virtual ~CSTEdit();
    protected:
    int nSetText;
    //{{AFX_MSG(CSTEdit)
    afx_msg void OnLButtonUp(UINT nFlags, CPoint point);
    //}}AFX_MSG DECLARE_MESSAGE_MAP()
    };
    实现:
    CSTEdit::CSTEdit()
    {
    nSetText = 0;
    }CSTEdit::~CSTEdit()
    {
    }BEGIN_MESSAGE_MAP(CSTEdit, CEdit)
    //{{AFX_MSG_MAP(CSTEdit)
    ON_WM_LBUTTONDOWN()
    //}}AFX_MSG_MAP
    END_MESSAGE_MAP()/////////////////////////////////////////////////////////////////////////////
    // CSTEdit message handlers
    LRESULT CSTEdit::DefWindowProc(UINT message, WPARAM wParam, LPARAM lParam) 
    {
    if (nSetText < 2 && message == WM_SETTEXT)
    nSetText++; return CEdit::DefWindowProc(message, wParam, lParam);
    }void CSTEdit::OnLButtonDown(UINT nFlags, CPoint point) 
    {
    if (1 == nSetText)
    SetWindowText("");

    CEdit::OnLButtonDown(nFlags, point);
    }
      

  11.   

    还要改改(当编辑框为TAB顺序第1的时候,用户不用点击鼠标来定位光标于编辑框就可以直接输入了,因为它自动获得了焦点,上面的程序在这种情况下会把用户的正确输入也清除):LRESULT CSTEdit::DefWindowProc(UINT message, WPARAM wParam, LPARAM lParam) 
    {
    if (nSetText < 2)
    if (WM_SETTEXT == message)
    nSetText++;
    else if (WM_CHAR == message)
    nSetText = 2; return CEdit::DefWindowProc(message, wParam, lParam);
    }