天天看點

積累的VC程式設計小技巧之編輯框

////////////////////////////////////////////////

// 如何讓對話框中的CEdit控件類接收對話框的消息

1、在對話框中增加一個ID 為IDC_EDIT1的CEdit1控件

2、通過ClassWizard 生成一個基于CEdit的新類CMyEdit,

CMyEdit  m_wndEdit;

3、在對話框OnInitDialog()中,将m_wndEdit子類化,使其能夠接受對話框的消息。

m_wndEdit.SubclassDlgItem (IDC_EDIT1,this);

  [問題提出]

    這兩天大家比較專注在擷取Edit密碼框的密碼.在盜取時,我們如何防範呢?

  [解決方法]

    此方法針對于通過SendMessage向此視窗發送WM_GETTEXT或EM_GETLINE消息來取得密碼.跟我來.

  [程式實作]

    方法很簡單,用CWnd::DefWindowProc函數攔截得到的消息(向Edit發的).

    建立名為My的對話框工程.建立一個Edit控件ID=IDC_EDIT1.建一個新類名為CMyProtectEdit,派生于CEdit.

    在MyDlg.cpp中聲明全局變量:BOOL g_bIdentity;

    BOOL g_bIdentity;

    在MyProtecEdit.cpp中:

    extern BOOL g_bIdentity;

    響應CMyProtectEdit的DefWindowProc函數:

    LRESULT CMyProtectEdit::DefWindowProc(UINT message, WPARAM wParam, LPARAM lParam) 

    {

       // TODO: Add your specialized code here and/or call the base class

       // 對Edit的内容擷取必須通過以下兩個消息之一,不對其采用預設的處理:

       if(( message == WM_GETTEXT) || ( message == EM_GETLINE))

       {   //檢查是否為合法

          if(!g_bIdentity)

          {   //非法擷取,顯示非法資訊

             AfxMessageBox(_T("不能讓你看我的密碼,:( !"));

             return 0;

          )

          g_bIdentity = FALSE;//合法擷取

       }

       return CEdit::DefWindowProc(message, wParam, lParam);

    }

    然後在MyDlg.cpp中

    void CMyDlg::DoDataExchange(CDataExchange* pDX)

        CDialog::DoDataExchange(pDX);

        //{{AFX_DATA_MAP(CGetPasswordDlg)

        // NOTE: the ClassWizard will add DDX and DDV calls here

       if( pDX->m_bSaveAndValidate)

       {

          g_bIdentity = TRUE;

       }      

       //}}AFX_DATA_MAP

    即可.找個程式(盜取)的試試.

    SetDlgItemText可以向Edit控件中輸入字元,發送更新的消息也可是Edit控件顯示與其關聯的變量的值,但若是向已有的Edit字元後追加字元,該如何做?

    建立名為My的對話框工程,添加一個Edit和一個Button控件.Edit的ID=IDC_EDIT1,Button的ID=IDC_BUTTON1.建立和IDC_BUTTON1的響應函數:OnButton1()

    void CMyDlg::OnButton1() 

       CString pText="你好";

       CEdit *m_Edit=(CEdit *)GetDlgItem(IDC_EDIT1);

       int nLen=m_Edit->GetWindowTextLength(); 

       m_Edit->SetFocus(); 

       m_Edit->SetSel(nLen, nLen); 

       m_Edit->ReplaceSel(pText); 

    在Edit控件中輸入字元,想追加時按IDC_BUTTON1按鈕.看看效果.

在對話框中怎樣實作Edit和Listboxes控件的3D效果?(環境95/NT VC5.0)

1). 使用帶WS_EX_CLIENTEDGE标志的::CreateWindowEx來替換::CreateWindow 或者用CWnd::CreateEx替換CWnd::Create.

2).在建立控件之後,調用ModifyStyleEx(0, WS_EX_CLIENTEDGE).

在Dialog(FormView中打開)中加入CRichEdit控件後,這個dialog 為什麼打不開如何處理?

  在函數:InitInstance的第一句加入AfxInitRichEdit();

1:繼承CRichEditCtrl::OnEraseBkgnd(CDC* pDC)消息事件中,給Richedit控件繪制上背景圖檔:m_bmpBackground.DrawDIB(pDC, 0, 0, rc.Width(), rc.Height());當然也可以通過subclass richedit window之後,在回調函數中處理WM_ERASEBKGND消息。

2:設定了Richedit控件的透明屬性;

3:依照kenwhale所說的,Hook了GDI32.DLL中的ExtTextOut函數,将RichEdit的text-output options去除ETO_OPAQUE style

。綜上所述,即可實作RichEdit控件的背景圖檔效果。

據此,我還實作了RichEdit控件背景繪制AVI動畫效果。

首先要明白: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"

繼續閱讀