blog

枪手亨利

博客园 首页 新随笔 联系 订阅 管理

alantop


修改控件风格
( )

CWnd* pWnd 为你控件的指针 ,LPCTSTR lpszClassName 是你控件的类名 , 比如编辑框是 "Edit", 按钮是 "Button", 详情可以使用 SPY++ 查看 .

 

BOOL ModifyControlStyle(CWnd* pWnd,LPCTSTR lpszClassName,DWORD dwRemove,DWORD dwAdd,DWORD dwRemoveEx,DWORD dwAddEx)

{

 CWnd* pParentWnd = pWnd->GetParent();

 

 CFont* pFont = pWnd->GetFont();

 

 CString strText;

 pWnd->GetWindowText(strText);

 

 {

  // 在此添加保存控件其他属性的代码 , 我只保存了字体和文字

 }

 

 CRect rcWindow;

 pWnd->GetWindowRect(&rcWindow);

 pParentWnd->ScreenToClient(rcWindow);

 

 DWORD dwNewStyle = (pWnd->GetStyle() & ~dwRemove) | dwAdd;

 DWORD dwNewStyleEx = (pWnd->GetExStyle() & ~dwRemoveEx) | dwAddEx;

 

 UINT nID = pWnd->GetDlgCtrlID();

 

 pWnd->ShowWindow(SW_HIDE);

 pWnd->DestroyWindow();

 

 BOOL bResult = pWnd->CreateEx(dwNewStyleEx,lpszClassName,strText,dwNewStyle,rcWindow,pParentWnd,nID);

 

 pWnd->SetFont(pFont);

 

 return bResult;

}

 

测试代码 :

 

void CAboutDlg::OnButton()

{

 CWnd* pWnd = GetDlgItem(IDC_EDIT1);

 

 if(pWnd->GetStyle() & ES_PASSWORD)

 {

  ModifyControlStyle(pWnd,"Edit",ES_PASSWORD,0,0,0);

 }

 else

 {

  ModifyControlStyle(pWnd,"Edit",0,ES_PASSWORD,0,0);

 }

}

 

修改控件风格的第二种方法:

Changing Edit Control Styles at Runtime

It is not possible to change all the styles of an Edit Control at runtime using ModifyStyle() or ModifyStyleEx(). If you have the need to change the text alignment at runtime, for example, it is best to construct the Edit Control by calling new and CreateEx, then deleting it and creating a new one when the style is to be changed. Alternatively, you can have 2 Edit Controls superimposed and hide the one with the incorrect style.

 

In the demo, I use CreateEx to create the Edit Control, because then the extended style WS_EX_CLIENTEDGE can be used to give the 3D border for the control.

 

    m_pFlyEdit->CreateEx(WS_EX_CLIENTEDGE, _T("EDIT"),

        "", dwStyle, rc, this, IDC_EDIT6);

You will note the two lines that are commented out. If you enable those and comment out the above line, you will get a flat Edit Control (without border, unless you also uncomment the WS_BORDER style). The control remains flat because WS_EX_CLIENTEDGE is one of the styles that cannot be changed after creation.

 

//    m_pFlyEdit->Create( dwStyle, rc, this, IDC_EDIT6 );

//    m_pFlyEdit->ModifyStyleEx( 0, WS_EX_CLIENTEDGE );

In the demo, the Edit Controls headed 'Text Alignment test' change the alignment style. The code deletes the old Edit Control and creates a new one each time the radio buttons are clicked. ModifyStyle() is called for m_Edit3 but as you will note, it has no effect.

 

void CEditCtrlTutorialDlg::OnAlignmentChange(UINT nID)

{

    UpdateData();

    TRACE("CEditCtrlTutorialDlg::OnAlignmentChange( %d )\n",

                                                 m_nAlignment);

    DWORD dwStyle =

      WS_CHILD|WS_VISIBLE|WS_TABSTOP/*|WS_BORDER*/|ES_AUTOHSCROLL;

 

    switch( m_nAlignment )

    {

    case 1:

        dwStyle |= ES_CENTER;

        m_Edit3.ModifyStyle(ES_RIGHT|ES_LEFT,ES_CENTER);

        break;

    case 2:

        dwStyle |= ES_RIGHT;

        m_Edit3.ModifyStyle(ES_CENTER|ES_LEFT,ES_RIGHT);

        break;

    default:

        dwStyle |= ES_LEFT;

        m_Edit3.ModifyStyle(ES_CENTER|ES_RIGHT,ES_LEFT);

        break;

    }

    m_Edit3.Invalidate();

 

    CString str = _T("");

    if( m_pFlyEdit )

    {

        m_pFlyEdit->GetWindowText( str );

        delete m_pFlyEdit;

    }

 

    CRect rc;

    m_Template.GetWindowRect( &rc );

    ScreenToClient( &rc );

    m_pFlyEdit = new CEdit;

//    m_pFlyEdit->Create( dwStyle, rc, this, IDC_EDIT6 );

//    m_pFlyEdit->ModifyStyleEx( 0, WS_EX_CLIENTEDGE );

    m_pFlyEdit->CreateEx(WS_EX_CLIENTEDGE, _T("EDIT"),

                           "", dwStyle, rc, this, IDC_EDIT6);

    // set font same as dialog to be sure they are the same

    m_pFlyEdit->SetFont( GetFont() );

    m_pFlyEdit->SetWindowText( str );

 

    UpdateData(FALSE);

}

ES_UPPERCASE and ES_LOWERCASE styles need to be treated in the same way. ES_READONLY style can be changed by calling the SetReadOnly() member function as shown in the demo.

 

void CEditCtrlTutorialDlg::OnReadOnly()

{

    UpdateData();

    m_Edit2.SetReadOnly( m_bReadOnly );

}

The ES_NUMBER style can also be changed at runtime using ModifyStyle(). It is handy where an Edit Control is used for multiple purposes and also to turn the style in case it was forgotten in the RC script. The code below will actually toggle the style:

 

void CEditCtrlTutorialDlg::OnNumbersOnly()

{

    UpdateData();

    m_Edit7.SetSel(0,-1);        // select all the text

    m_Edit7.Clear();            // delete selection

    m_Edit7.ModifyStyle(ES_NUMBER*(m_bNumbersOnly==FALSE),

                             ES_NUMBER*(m_bNumbersOnly==TRUE));

}

In this example, the Edit Control is also cleared while the style is changed. A number-only Edit Control can have non-numeric characters in it. It just won't permit them to be entered from the keyboard.

 

posted on 2006-05-25 19:19  henry  阅读(1052)  评论(0编辑  收藏  举报