日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

动态子类化CComboBox以得到子控件EDIT及LISTBOX

發布時間:2025/5/22 编程问答 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 动态子类化CComboBox以得到子控件EDIT及LISTBOX 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

動態子類化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框的。代碼如下:

2?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);

};

2?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):

2?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();

};

2?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

《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀

總結

以上是生活随笔為你收集整理的动态子类化CComboBox以得到子控件EDIT及LISTBOX的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 日日骚一区二区 | 天天狠天天操 | 激情全身裸吻胸 | 国产91麻豆视频 | 日本成人免费观看 | 成人一区二区三区在线 | 91成人短视频在线观看 | 在线精品视频一区 | 永久看看免费大片 | 在线观看视频日韩 | 深夜视频在线观看免费 | 日批免费观看 | av青青| 欧美一级激情 | 91av国产视频 | 久久亚洲一区二区三区四区 | 久操福利视频 | 黄色小视频免费 | 99ri国产| 爱爱视频在线免费观看 | 中国国产毛片 | 中文字幕9| 国产模特av私拍大尺度 | 久久精品a | 毛片视频网站 | 亚洲第一黄色网址 | av片手机在线观看 | 日日拍拍 | 国产一区二区在线免费 | 男女乱淫视频 | 999精品视频在线观看 | 欧美午夜精品理论片 | 中文字幕 视频一区 | 欧美巨大另类极品videosbest | 91精品久久香蕉国产线看观看 | 国产精品一卡二卡三卡 | 亚洲免费中文 | 欧美性大战久久久久久久 | 国产中文字幕一区 | 精品视频在线观看一区 | 在线资源站 | 97国产资源 | 99精品99| 奇米影视四色7777 | 欧美成人aaa | 成人无码精品1区2区3区免费看 | 少妇高潮淫片免费观看 | 99精品欧美一区二区三区综合在线 | 亚洲一区中文字幕 | 亚洲免费中文字幕 | 乱lun合集小可的奶水 | 落日余晖图片 | 涩涩97 | 做爰视频毛片视频 | 国产精品 欧美 日韩 | 色久综合网 | xxxxhd欧美 | 日韩免费小视频 | 国产一级全黄 | 性欧美巨大 | av毛片一区| 久久精品在线免费观看 | 哺乳期喷奶水丰满少妇 | 中国美女黄色一级片 | 久久韩日 | 亚洲一区二区自偷自拍 | 乱熟女高潮一区二区在线 | 色综合天天综合网天天看片 | 96免费视频| 激情爱爱网 | 色黄网站在线观看 | 久久久99精品国产一区二区三区 | 美女bb视频 | 一区二区福利电影 | 老司机免费视频 | 亚洲大尺度在线 | 九七影院在线观看免费观看电视 | 色香蕉影院 | 午夜av免费在线观看 | 噜噜噜久久久 | 日本精品一区视频 | 97精品人人妻人人 | 国产精品91一区二区 | 无码人妻黑人中文字幕 | 动漫美女露胸网站 | 午夜丁香网 | 91大神网址| 国产剧情av麻豆香蕉精品 | 午夜影视av| 日韩91av | 日本成人午夜 | 91视频xxx | 欧美二区视频 | 成人婷婷| 波多野吉衣一区二区 | 日本美女性高潮 | 国语久久 | 日本人妻丰满熟妇久久久久久 | 日本黄a|