<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>
  • 網站首頁 > 物聯資訊 > 技術分享

    動態子類化CComboBox以得到子控件EDIT及LISTBOX

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

    動態子類化CComboBox以得到子控件EDITLISTBOX

    Joise.LI寫于2004-4-6

    ComboBox是比較常用的一個控件,有三種樣式:CBS_SIMPLE(簡單),CBS_DROPDOWN(下拉),CBS_DROPDOWNLIST(下拉列表),其中下拉列表樣式是不允許輸入的,簡單樣式是永遠都顯示下拉框的。

    ComboBox是由一個ListBox和一個Edit框組合而成。本文將以限制只能輸入電話號碼為例介紹子類化過程得到Edit框(類似的可以得到ListBox)。

    電話號碼只能有數字和“-”和“+”組成,經查ASCII表,知道對應的ASCII值為48-57及45和43共12個值。

    好,閑話暫停,開始子類化之旅。

    第一步 先建立一個MFC應用程序工程,取名叫UseSuperCombox(這里表示一下SORRY,因為順手多寫了一個X,呵呵)。

    第二步 新建一個MFC類,選擇繼承自CEdit,取名叫CSuperEdit,這個類是用來替換ComboBox中的Edit框的。代碼如下:

    ² SuperEdit.h:

    class CSuperEdit : public CEdit

    {

    DECLARE_DYNAMIC(CSuperEdit)

    public:

    CSuperEdit();

    virtual ~CSuperEdit();

    protected:

    DECLARE_MESSAGE_MAP()

    public:

    afx_msg void OnChar(UINT nChar, UINT nRepCnt, UINT nFlags);

    };

    ² SuperEdit.cpp:

    // SuperEdit.cpp : 實現文件

    //

    #include "stdafx.h"

    #include "UseSuperCombox.h"

    #include "SuperEdit.h"

    // CSuperEdit

    IMPLEMENT_DYNAMIC(CSuperEdit, CEdit)

    CSuperEdit::CSuperEdit()

    {

    }

    CSuperEdit::~CSuperEdit()

    {

    }

    BEGIN_MESSAGE_MAP(CSuperEdit, CEdit)

    ON_WM_CHAR()

    END_MESSAGE_MAP()

    // CSuperEdit 消息處理程序

    void CSuperEdit::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags)

    {

    if ( (nChar < 48 || nChar > 57) && nChar != 45 && nChar != 43 )

    {

    AfxMessageBox( "you must type the number or the char '-' or the char '+'" );

    return;

    }

    CEdit::OnChar(nChar, nRepCnt, nFlags);

    }

    第三步 再新建一個MFC類,選擇繼承自CComboBox,取名叫CSuperComboBox。代碼如下(注:以下代碼原文見http://support.microsoft.com/default.aspx?scid=kb;en-us;Q174667):

    ² SuperComboBox.h

    #pragma once

    #include "SuperEdit.h"

    class CSuperComboBox : public CComboBox

    {

    DECLARE_DYNAMIC(CSuperComboBox)

    public:

    CSuperEdit m_Edit;

    public:

    CSuperComboBox();

    virtual ~CSuperComboBox();

    protected:

    DECLARE_MESSAGE_MAP()

    public:

    afx_msg HBRUSH OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor);

    afx_msg void OnDestroy();

    };

    ² SuperComboBox.cpp

    // SuperComboBox.cpp : 實現文件

    //

    #include "stdafx.h"

    #include "UseSuperCombox.h"

    #include "SuperComboBox.h"

    // SuperComboBox

    IMPLEMENT_DYNAMIC(CSuperComboBox, CComboBox)

    CSuperComboBox::CSuperComboBox()

    {

    }

    CSuperComboBox::~CSuperComboBox()

    {

    }

    // SuperComboBox 消息處理程序

    BEGIN_MESSAGE_MAP(CSuperComboBox, CComboBox)

    ON_WM_CTLCOLOR()

    ON_WM_DESTROY()

    END_MESSAGE_MAP()

    HBRUSH CSuperComboBox::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)

    {

    if ( nCtlColor == CTLCOLOR_EDIT )

    {

    if ( m_Edit.GetSafeHwnd() == NULL )

    {

    m_Edit.SubclassWindow( pWnd->GetSafeHwnd() );

    }

    //Such Code don't use in this example,but you can use it if you need the ListBox Control

    //else if (nCtlColor == CTLCOLOR_LISTBOX)

    //{

    // //ListBox control

    // if (m_listbox.GetSafeHwnd() == NULL)

    // m_listbox.SubclassWindow(pWnd->GetSafeHwnd());

    //}

    return CComboBox::OnCtlColor( pDC, pWnd, nCtlColor );

    }

    void CSuperComboBox::OnDestroy()

    {

    if ( m_Edit.GetSafeHwnd() != NULL )

    {

    m_Edit.UnsubclassWindow();

    }

    CComboBox::OnDestroy();

    }

    注意:

    1. 該類中使用了消息WM_CTLCOLOR,通過判斷消息的參數nCtlColor是否等于CTLCOLOR_EDIT來將參數pWnd與對應的控件關聯起來,本例僅需要得到Edit框,所以將取得LISTBOX的代碼注釋掉了。

    2. OnCtlColor是CWnd的消息處理函數,用于當框架描繪子控件時調用。只有使用該消息處理函數可以得到子控件的句柄。

    3. SubclassWindow可以動態的子類化一個窗口并且將自己附加到該CWnd對象。

    4. 調用SubclassWindow需要在關閉之前調用UnsubclassWindow。該函數可以將WndProc回到初始狀態并且令子類化窗口與CWnd對象脫離。

    5. 使用該方法動態子類化時對話框必須先被至少描繪一次。如果對話框窗口未被描繪(如在對話框顯示之前就關閉或者隱藏它),該方法將不適合。(原文:Note that for subclassing to occur, the dialog box must be painted at least once. There are cases when the dialog box doesn't paint at all (for example, closing the dialog box before it is displayed, hidden dialog boxes). This method may not be suitable when access to the subclassed windows are needed in these cases. )

    第四步 在對話框類的OnInitDialog中添加以下代碼:

    RECT rect;

    rect.top = 20;

    rect.bottom = 420;

    rect.left = 20;

    rect.right = 180;

    m_Combo.Create( WS_CHILD|CBS_DROPDOWN, rect, this, IDC_COMBO1 );

    m_Combo.ShowWindow( SW_NORMAL );

    m_Combo.UpdateWindow();

    第五步 編譯、運行。

    另,本文的關鍵不在于限制輸入,而在于取得ComboBox控件的子控件Edit或ListBox,如果僅是為了限制輸入使用重載CBN_EDITCHANGE代碼將會是更快捷的辦法(代碼來自CSDN網友ymbymb(毛病大哥),原文見http://expert.csdn.net/Expert/topic/2931/2931917.xml?temp=.3829462 )。

    void CTestDlg::OnEditchangeCombo1()

    {

    CString str;

    m_Combo1.GetWindowText(str);

    int len = str.GetLength();

    if(str[len-1] < '0' || str[len-1] >'9')

    {

    str = str.Left(len-1);

    m_Combo1.SetWindowText(str);

    }

    }

     

     

    from:http://blog.csdn.net/skyremember/article/details/995055

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