<menu id="w8yyk"><menu id="w8yyk"></menu></menu>
  • <dd id="w8yyk"><nav id="w8yyk"></nav></dd>
    <menu id="w8yyk"></menu>
    <menu id="w8yyk"><code id="w8yyk"></code></menu>
    <menu id="w8yyk"></menu>
    <xmp id="w8yyk">
    <xmp id="w8yyk"><nav id="w8yyk"></nav>
  • 網站首頁 > 物聯資訊 > 技術分享

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

    2016-09-28 00:00:00 廣州睿豐德信息科技有限公司 閱讀
    睿豐德科技 專注RFID識別技術和條碼識別技術與管理軟件的集成項目。質量追溯系統、MES系統、金蝶與條碼系統對接、用友與條碼系統對接

    1.如何讓對話框中的編輯框接收對話框的消息

    ////////////////////////////////////////////////
    // 如何讓對話框中的CEdit控件類接收對話框的消息
    ////////////////////////////////////////////////
    1、在對話框中增加一個ID 為IDC_EDIT1的CEdit1控件
    2、通過ClassWizard 生成一個基于CEdit的新類CMyEdit,
    CMyEdit  m_wndEdit;
    3、在對話框OnInitDialog()中,將m_wndEdit子類化,使其能夠接受對話框的消息。
    m_wndEdit.SubclassDlgItem (IDC_EDIT1,this);

     

    2.如何防止密碼被非法獲取?

      [問題提出]
        這兩天大家比較專注在獲取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
        }
        即可.找個程序(盜取)的試試.

     

    3.如何在編輯控件中以追加的方式添入字符?

      [問題提出]
        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按鈕.看看效果.

     

    4.怎樣實現3D效果?

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

    1). 使用帶WS_EX_CLIENTEDGE標志的::CreateWindowEx來替換::CreateWindow 或者用CWnd::CreateEx替換CWnd::Create.
    2).在建立控件之后,調用ModifyStyleEx(0, WS_EX_CLIENTEDGE).

     

    5.RichEdit加入后,對話框打不開

    在Dialog(FormView中打開)中加入CRichEdit控件后,這個dialog 為什么打不開如何處理?
      [解決方法]
      在函數:InitInstance的第一句加入AfxInitRichEdit();

     

    6.Richedit設置背景圖片的辦法

    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動畫效果。

     

    7.改變編輯框的背景色(WM_CTLCOLOR消息)

    首先要明白: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.在定義CAboutDlgcolor.cpp文件中加入:#include "coloredit.h"

    RFID管理系統集成商 RFID中間件 條碼系統中間層 物聯網軟件集成
    最近免费观看高清韩国日本大全