天天看點

[置頂] VC++界面程式設計之--自定義CEdit(編輯框)皮膚

[置頂] VC++界面程式設計之--自定義CEdit(編輯框)皮膚

自定義編輯框是登陸界面經常用到的效果,是以我也模仿站酷網的素材做了個

要想繼承CCustomDraw來完全自繪CEdit控件,是不太可行的方案,因為一旦你完全重繪,那麼你需要額外做以下幾件事:

1. CEdit光标的處理;

2. 當是密碼提示時,需要彈窗提示使用者大寫打開。

3. 需要處理視窗文字的滾動。

這樣一來,工作量會很大,而且效果也不一定好。

我這裡想到相對比較好的解決方案是:子視窗+透明邊框的CEdit。子視窗負責皮膚的繪制,而CEdit負責處理使用者的輸入。這樣一來,可以利用到CEdit原有的一些特性,以保證原有的效果,并減輕我們開發的工作量。

如下圖的密碼輸入框偵測到使用者鍵盤大寫打開時,CEdit也會提示使用者大寫已經打開:

[置頂] VC++界面程式設計之--自定義CEdit(編輯框)皮膚

CEdit制作透明背景的方式是:

1. 子視窗擷取WM_CTLCOLOREDIT和WM_CTLCOLORSTATIC這兩個消息,當CEdit為ReadOnly時會響應WM_CTLCOLORSTATIC。

2. 在這兩個消息中,傳回背景畫刷。

LRESULT OnCtlColorEdit(UINT /*uMsg*/, WPARAM wParam, LPARAM /*lParam*/, BOOL& /*bHandled*/)
  {
    CDCHandle dc( (HDC) wParam );
    dc.SetTextColor(m_clrText);
    dc.SetBkMode(TRANSPARENT);

    // The AtlGetBackgroundBrush will repaint window.
    if( m_brEditBack.m_GDIBrush.m_hBrush == NULL ) 
    {
      m_brEditBack.GetBackGroundBrush(m_Edit.m_hWnd, m_hWnd);
    }

    return (LRESULT)m_brEditBack.m_GDIBrush.m_hBrush;
  }      

總結了下,有些Windows控件看起來簡單,但要想完全實作其效果,也得花很多功夫。能利用Windows現有的東西就盡量利用,不要一直想着完全重寫。 

繼續閱讀