⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 teach_road_54.htm

📁 闻怡洋VC基础教程 里面是一些VC的基础知识
💻 HTM
字号:

<!-- LANGUAGE='JavaScript'>write_body();<-->
<!-- LANGUAGE='JavaScript'>write_bar();<-->


<table width=98% cellspacing="0" cellpadding="0" align=center><!--整体框架-->
<tr><td>

<table border=0 width="100%" cellspacing="0" cellpadding="2"><!--标记放置区域-->
<tr>
	<td width="30%" align="center" bgcolor="#8E8E8E" valign=middle><img src=../../img/brand_200_60.gif width=200 height=60 alt="LOGO1"></td>
	<td width="70%" align="center" bgcolor="#8E8E8E" valign=middle><!-- LANGUAGE='JavaScript'>write_ban();<--></td>
</tr>
<tr>
	<td colspan="2" bgcolor="#939393" align=center><font color=white>您当前位置</font></font> <a href=../../index.htm><font color=white>首页</font></a> <a href=../index.htm><font color=white>开发教程</font></a> <a href=index.htm><font color=white><font class=engul>Visual C++/MFC</font>入门教程</font></a> <font color=white>5.4 在对话框中进行消息映射</font><!-- LANGUAGE='JavaScript'>write_command();<--></td>
</tr>
</table><!--标记放置区域 END-->

<table border=0 width=100% cellspacing="0" cellpadding="0">
<tr>
<td><!--begin-->

<br>
<p align=center><big>5.4 在对话框中进行消息映射</big></p>
<table border=0 align=center width=100%>
<tr><td>
<small>
<p>利用对话框的一个好处是可以利用ClassWizard对对话框中各个控件产生的消息进行映射,ClassWizrd可以列出各种控件可以使用的消息,并能自动产生代码。在本节中我们以一个例子来讲解如何在对话框中对子窗口消息进行映射同时还讲解如何对对话框中的子窗口进行初始化。
</p>
<p>首先我们产生编辑好一个对话框,<a href=54_g1.gif target=_blank>如图</a>,在对话框中使用的控件和ID号如下表:
<table width=80% align=center border=1 cellpadding=3 cellspacing=0 bordercolor="#939393" bordercolordark="#939393" bordercolorlight="#939393">
<tr><td width=60%>ID</td><td width=40%>类型</td></tr>
<tr><td>IDC_RADIO_TEST_1</td><td>圆形按钮</td></tr>
<tr><td>IDC_RADIO_TEST_2</td><td>圆形按钮</td></tr>
<tr><td>IDC_BUTTON_TEST</td><td>按钮</td></tr>
<tr><td>IDC_CHECK_TEST</td><td>检查按钮</td></tr>
<tr><td>IDC_TREE_TEST</td><td>树形控件</td></tr>
<tr><td>IDC_LIST_CTRL</td><td>List Ctrl</td></tr>
<tr><td>IDC_TAB_CTRL</td><td>Tab Ctrl</td></tr>
<tr><td>IDC_LIST_TEST</td><td>列表框</td></tr>
<tr><td>IDC_COMBO_TEST</td><td>组合框</td></tr>
<tr><td>IDC_EDIT_TEST</td><td>输入框</td></tr>
</table>
首先我们需要在对话框的OnInitDialog()函数中对各个控件进行初始化,这里我们使用CWnd* GetDlgItem( int nID )来通过ID号得到子窗口指针。(类似的函数还有UINT GetDlgItemInt( int nID, BOOL* lpTrans = NULL, BOOL bSigned = TRUE ) 通过ID号得到子窗口中输入的数字,int GetDlgItemText( int nID, CString& rString ) 通过ID号得到子窗口中输入的文字)。代码如下:
<pre>
BOOL CMy54_s1Dlg::OnInitDialog()
{
	CDialog::OnInitDialog();
	/*添加初始化代码*/
	//初始化输入框
	((CEdit*)GetDlgItem(IDC_EDIT_TEST))->SetWindowText("this is a edit box");
	//初始化列表框
	CListBox* pListB=(CListBox*)GetDlgItem(IDC_LIST_TEST);
	pListB->AddString("item 1");
	pListB->AddString("item 2");
	pListB->AddString("item 3");
	//初始化组合框
	CComboBox* pCB=(CComboBox*)GetDlgItem(IDC_COMBO_TEST);
	pCB->AddString("item 1");
	pCB->AddString("item 2");
	pCB->AddString("item 3");
	//初始化Tab Ctrl
	CTabCtrl* pTab=(CTabCtrl*)GetDlgItem(IDC_TAB_TEST);
	pTab->InsertItem(0,"Tab Page1");
	pTab->InsertItem(1,"Tab Page2");
	pTab->InsertItem(2,"Tab Page3");
	//初始化ListCtrl
	CListCtrl* pList=(CListCtrl*)GetDlgItem(IDC_LIST_CTRL);
	pList->InsertColumn(0,"Column 1",LVCFMT_LEFT,100);
	pList->InsertItem(0,"Item 1");
	pList->InsertItem(1,"Item 2");
	pList->InsertItem(2,"Item 3");
	//初始化TreeCtrl
	CTreeCtrl* pTree=(CTreeCtrl*)GetDlgItem(IDC_TREE_TEST);
	pTree->InsertItem("Node1",0,0);
	HTREEITEM hNode=pTree->InsertItem("Node2",0,0);
	pTree->InsertItem("Node2-1",0,0,hNode);
	pTree->InsertItem("Node2-2",0,0,hNode);
	pTree->Expand(hNode,TVE_EXPAND);

	return TRUE;  // return TRUE  unless you set the focus to a control
}
</pre>
接下来我们需要利用ClassWizard对控件所产生的消息进行映射,打开ClassWizard对话框,选中相关控件的ID,在右边的列表中就会显示出可用的消息。如我们对按钮的消息进行映射,在选中按钮ID(IDC_BUTTON_TEST)后,会看到两个消息,<a href=54_g2.gif target=_blank>如图</a>,一个是BN_CLICKED,一个是BN_DOUBLECLICKED。双击BN_CLICKED后在弹出的对话框中输入函数名,ClassWizard会产生按钮被按的消息映射。
</p>
<p>然后我们看看对TabCtrl的TCN_SELCHANGE消息进行映射,<a href=54_g3.gif target=_blank>如图</a>,在TabCtrl的当前页选择发生改变时这个消息会被发送,所以通过映射该消息可以在当前页改变时及时得到通知。</p>
<p>最后我们对输入框的EN_CHANGE消息进行映射,<a href=54_g4.gif target=_blank>如图</a>,在输入框中的文本改变后该消息会被发送。相关的代码如下:
<pre>
//头文件中相关的消息处理函数定义
	afx_msg void OnButtonTest();
	afx_msg void OnSelchangeTabTest(NMHDR* pNMHDR, LRESULT* pResult);
	afx_msg void OnChangeEditTest();
	//}}AFX_MSG
	DECLARE_MESSAGE_MAP()

//CPP文件中消息映射代码
	ON_BN_CLICKED(IDC_BUTTON_TEST, OnButtonTest)
	ON_NOTIFY(TCN_SELCHANGE, IDC_TAB_TEST, OnSelchangeTabTest)
	ON_EN_CHANGE(IDC_EDIT_TEST, OnChangeEditTest)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

//消息处理函数
void CMy54_s1Dlg::OnButtonTest() 
{
	AfxMessageBox("you pressed a button");
}

void CMy54_s1Dlg::OnSelchangeTabTest(NMHDR* pNMHDR, LRESULT* pResult) 
{
	TRACE("Tab Select changed\n");	
	*pResult = 0;
}

void CMy54_s1Dlg::OnChangeEditTest() 
{
	TRACE("edit_box text changed\n");	
}
</pre>
对于其他的控件都可以采取类似的方法进行消息映射,<a href=54_s1.zip>下载例子</a>。此外如果你对各种控件可以使用的消息不熟悉,你可以通过使用对话框,然后利用ClassWizard产生相关代码的方法来进行学习,你也可以将ClassWizard产生的代码直接拷贝到其他需要的地方(不瞒你说,我最开始就是这样学的 :-D 这也算一个小窍门)。
</p>
</small>
</td>
</tr>
<tr><td>
<small>
<p align=center><a href=index.htm#charpter5>返回</a></p>
</small>
</td></tr>
</table>
<p align=center><small>版权所有 闻怡洋 <a href=http://www.vchelp.net/>http://www.vchelp.net/</a></small></p>

</td><!--end-->
</tr>
</table>

</td></tr></table><!--整体框架 END-->




<!-- LANGUAGE='JavaScript'>write_tail();<-->


⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -