MFC:GetDlgItem

    技术2024-10-11  56

    CWnd::GetDlgItem CWnd* GetDlgItem( int nID ) const; void CWnd::GetDlgItem( int nID, HWND* phWnd ) const;

    返回值:

    指向给定的控件或子窗口的指针。如果没有控件具有nID给出的整数ID,则返回NULL。

    返回的指针可能是临时的,不能被保存以供将来使用。 参数:

    nID指定了要获取的控件或子窗口的标识符。phWnd指向子窗口的指针。

    GetDlgItem:根据一个对话窗或一个控件的ID,返回一个指向这个对话窗或控件的对象的指针 

    void CGetRadioDlg::OnButtonok() { // TODO: Add your control notification handler code here CString str; CButton* Radiobutton = (CButton*)GetDlgItem(IDC_RADIO1 + m_Radio - 1); Radiobutton->GetWindowText(str); MessageBox(str); }

    拓展:MFC项目的Resource.h文件中定义了各种资源ID,如下图单选按钮的定义

    疑问:

    宏定义:IDC_RADIO1对应1000 CWnd* GetDlgItem( int nID ) const; GetDlgItem(IDC_RADIO1 + m_Radio - 1)

    ( IDC_RADIO1 + m_Radio - 1 )是一个int型数值,也就是说在函数调用的时候会将 IDC_RADIO1 转换为 1000

    但是在MFC中通过拖动添加按钮后会出现宏定义不连续的现象,即:

    IDC_RADIO 1000 IDC_RADIO1 1002

     是不是通过以下方式查找按钮会出现问题

    void CGetRadioDlg::OnRadio1() { // TODO: Add your control notification handler code here m_Radio = 1; } void CGetRadioDlg::OnRadio2() { // TODO: Add your control notification handler code here m_Radio = 2; } void CGetRadioDlg::OnRadio3() { // TODO: Add your control notification handler code here m_Radio = 3; } void CGetRadioDlg::OnRadio4() { // TODO: Add your control notification handler code here m_Radio = 4; } GetDlgItem(IDC_RADIO1 + m_Radio - 1)

     还是程序重启后,会重新修改,待验证


    如果想访问控件特有的功能,则可以尝试将GetDlgItem的返回值强制转换为控件所对应的类型 

    CButton* Radiobutton = (CButton*)GetDlgItem(IDC_RADIO1 + m_Radio - 1); Radiobutton->GetWindowText(str);

     不推荐用这种方法来访问控件的特有功能,因为MFC对这样的用法不太支持,有些情况下会产生严重错误,而有些情况下则不起任何作用

    Processed: 0.011, SQL: 9