荔园在线

荔园之美,在春之萌芽,在夏之绽放,在秋之收获,在冬之沉淀

[回到开始] [上一篇][下一篇]


发信人: Second (石开), 信区: Program
标  题: 5.4 在对话框中进行消息映射
发信站: 荔园晨风BBS站 (Wed May 30 06:55:39 2001), 转信

5.4 在对话框中进行消息映射

利用对话框的一个好处是可以利用ClassWizard对对话框中各个控件产生的消息进行映射
,ClassWizrd可以列出各种控件可以使用的消息,并能自动产生代码。在本节中我们以
一个例子来讲解如何在对话框中对子窗口消息进行映射同时还讲解如何对对话框中的子
窗口进行初始化。

首先我们产生编辑好一个对话框,如图,在对话框中使用的控件和ID号如下表: ID 类

IDC_RADIO_TEST_1 圆形按钮
IDC_RADIO_TEST_2 圆形按钮
IDC_BUTTON_TEST 按钮
IDC_CHECK_TEST 检查按钮
IDC_TREE_TEST 树形控件
IDC_LIST_CTRL List Ctrl
IDC_TAB_CTRL Tab Ctrl
IDC_LIST_TEST 列表框
IDC_COMBO_TEST 组合框
IDC_EDIT_TEST 输入框

首先我们需要在对话框的OnInitDialog()函数中对各个控件进行初始化,这里我们使用
CWnd* GetDlgItem( int nID )来通过ID号得到子窗口指针。(类似的函数还有UINT Ge
tDlgItemInt( int nID, BOOL* lpTrans = NULL, BOOL bSigned = TRUE ) 通过ID号得
到子窗口中输入的数字,int GetDlgItemText( int nID, CString& rString ) 通过ID
号得到子窗口中输入的文字)。代码如下:
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
}

接下来我们需要利用ClassWizard对控件所产生的消息进行映射,打开ClassWizard对话
框,选中相关控件的ID,在右边的列表中就会显示出可用的消息。如我们对按钮的消息
进行映射,在选中按钮ID(IDC_BUTTON_TEST)后,会看到两个消息,如图,一个是BN_
CLICKED,一个是BN_DOUBLECLICKED。双击BN_CLICKED后在弹出的对话框中输入函数名,
ClassWizard会产生按钮被按的消息映射。

然后我们看看对TabCtrl的TCN_SELCHANGE消息进行映射,如图,在TabCtrl的当前页选择
发生改变时这个消息会被发送,所以通过映射该消息可以在当前页改变时及时得到通知

最后我们对输入框的EN_CHANGE消息进行映射,如图,在输入框中的文本改变后该消息会
被发送。相关的代码如下:
//头文件中相关的消息处理函数定义
        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");
}
对于其他的控件都可以采取类似的方法进行消息映射。此外如果你对各种控件可以使用
的消息不熟悉,你可以通过使用对话框,然后利用ClassWizard产生相关代码的方法来进
行学习,你也可以将ClassWizard产生的代码直接拷贝到其他需要的地方(不瞒你说,我
最开始就是这样学的 :-D 这也算一个小窍门)。

--
                            既然热爱生命
                            那么,
                            一切都在意料之中。

※ 来源:·荔园晨风BBS站 bbs.szu.edu.cn·[FROM: 192.168.28.190]


[回到开始] [上一篇][下一篇]

荔园在线首页 友情链接:深圳大学 深大招生 荔园晨风BBS S-Term软件 网络书店