void CMyEdit::OnSetFocus(CWnd* pOldWnd) 
{
CEdit::OnSetFocus(pOldWnd);

// TODO: Add your message handler code here
ModifyStyleEx(0, WS_EX_RIGHT);
RedrawWindow();
}void CMyEdit::OnKillFocus(CWnd* pNewWnd) 
{
CEdit::OnKillFocus(pNewWnd);

// TODO: Add your message handler code here
ModifyStyleEx(WS_EX_RIGHT, 0);
RedrawWindow();
}以上代码为什么无效?

解决方案 »

  1.   

    我想做的效果是:当输入框获得焦点的时候,输入框变成左对齐,方便客户输入。当输入完成,输入框失去焦点的时候,输入框变成右对齐,方便客户查看。因此我写了以上代码,编译没问题,但是好像没有实现我要的效果。我在google上找了一圈也没什么头绪,因此上这里讨教来了。希望知道这个问题的大侠不吝告知,谢谢先。
      

  2.   

    另外,WS_EX_CLIENTEDGE之类的exStyle用这个方法随时修改没问题,就是我想要设的WS_EX_RIGHT用这个方法无效。
      

  3.   

    这是由于EDIT的一些属性必须在创建时确定的,象单行与多行,滚动方式,对齐方式等,也没有什么其他好办法,重建吧.
      

  4.   

    to devouer(玩笑一生) :我这么执着的原因在于,我记得我很久以前就做过这个效果。不过那台机器上装了ntddk和VS.net,ie版本是6.0
    我现在的机器没有ntddk和VS.net,ie是5.0版本。我现在不清楚是代码问题还是环境问题了。因为我在codeproject上是看到了修改WS_EX_....属性的示范代码的,不过那只是擦边球,而且语焉不详。
      

  5.   

    to  maoxianwang:直接在对话框里写好像也不行。有兴趣你可以自己写份代码试试。
      

  6.   

    用SetWindowPos()代替RedrawWindow()。
      

  7.   

    edit创建以后就不能动态改变对齐方式,你无论怎么ModifyStyle都没用,有一个变通的办法是创建两个edit,一个左对齐一个右对齐,需要的时候显示一个隐藏另一个。以下代码调试通过:
    BOOL CAboutDlg::OnInitDialog() 
    {
    CDialog::OnInitDialog();
    CEdit* pEditLeft=(CEdit*)GetDlgItem(IDC_EDIT1);
    CRect rect;
    pEditLeft->GetWindowRect(rect);
    ScreenToClient(rect);
    m_EditRight.CreateEx(WS_EX_CLIENTEDGE,"edit",NULL,
                      WS_CHILD|ES_RIGHT,rect,this,IDC_EDIT2);
    m_EditRight.SetFont(pEditLeft->GetFont(),false);  //两个edit设为相同的字体
    return TRUE;  
    }void CAboutDlg::OnChangealign() 
    {
    // TODO: Add your control notification handler code here
    CWnd* pLeft=GetDlgItem(IDC_EDIT1);
    CWnd* pRight=GetDlgItem(IDC_EDIT2);
    if(pLeft->IsWindowVisible())//如果右对齐的显示,则隐藏;否则隐藏左对齐的那个
    {
        pLeft->ShowWindow(false);
        pRight->ShowWindow(true);
    //设置edit的内容,如果是multiline的edit,有一种更简单的办法,就是在创建的时候用SetHandle和GetHandle把它们的缓冲区设为相同,这样就不用每次去GetWindowText和SetWindowText
        CString text;                
        pLeft->GetWindowText(text);  
        pRight->SetWindowText(text); 
             }
    else
    {
        pLeft->ShowWindow(true);
        pRight->ShowWindow(false);
        CString text;
        pRight->GetWindowText(text);
        pLeft->SetWindowText(text);
    }
    }
      

  8.   

    to  Mackz(在相互):
    我试了一下,好像没变化。to  JennyVenus():
    ModifyStyleEx和ModifyStyle最后都是通过调用SetWindowLong来实现的,所以这个应该没区别。to webber84(***闭关修炼中***):
    创建一个隐藏一个的方法我知道,在codeproject上有这种实现方法。你可以参考一下下面这个连接:http://www.codeguru.com/editctrl/BorderEdit.shtml
    另外,如果确实对齐方式不能改(我记错了的话),那哪些exStyle可以改,哪些不可以改呢?有相关的资料吗?
      

  9.   

    看看MSDN对WS_EX_RIGHT的描述:Gives a window generic right-aligned properties. This depends on the window class,它是否有效是取决于窗口类的。对于edit控件来说,指定右对齐应该用ES_RIGHT属性(我没有试过如果ES_LEFT+ WS_EX_RIGHT能否实现右对齐)。MSDN里的Q66942文章明确说了edit创建以后不能改变对齐方式。
       至于哪些可以改,我想可以改的是多数,需要的时候你尽管用,如果实现有问题再回过来想办法。我也没有见过相关的资料。
      

  10.   

    Q66942里面还说Only multiline edit controls can be right-aligned or centered.可实际上并不是这样。
    可能我们的msdn版本都太旧了
      

  11.   

    http://msdn.microsoft.com/library/default.asp?url=/library/en-us/winui/winui/windowsuserinterface/windowing/windows/windowreference/windowfunctions/createwindowex.asp最新的说法是:WS_EX_RIGHT
    The window has generic "right-aligned" properties. This depends on the window class. This style has an effect only if the shell language is Hebrew, Arabic, or another language that supports reading-order alignment; otherwise, the style is ignored.
    Using the WS_EX_RIGHT style for static or edit controls has the same effect as using the SS_RIGHT or ES_RIGHT style, respectively. Using this style with button controls has the same effect as using BS_RIGHT and BS_RIGHTBUTTON styles. 文章里说ES_RIGHT和WS_EX_RIGHT是等效的。
      

  12.   

    http://www.codeguru.com/editctrl/BorderEdit.shtml
      

  13.   

    如果还有人看这个帖子。在我装了ie6并且在线更新了win2k的那25项更新之后,动态修改edit的对齐方式OK了。因此不是代码问题,而是运行环境的问题。同样这个程序,我在同事机器上再试就不能动态修改对齐方式。但我发现,就算我将那个程序depends的所有动态库拷贝到同事机器上,我同事的机器上也无法动态修改edit的对齐方式。迷惑ing我会继续研究这个问题,有兴趣的人不妨继续关注这个帖子。