::GetDlgItem调用 窗口控件遇到的中断 (自己遇到的问题,已被解决)

来源:互联网 发布:sql server 2016 sn 编辑:程序博客网 时间:2024/05/16 19:22

BOOL CDlgShape::OnInitDialog()
{
CDialog::OnInitDialog();

//CString strWFSVersion = _T("1.0.0");
//CString strWFSRequestMethod = _T("GET");
//CString strWFSConnectionType = _T("WFS");

HWND hwnd = this->m_hWnd;
//ASSERT(hwnd != 0);
((CComboBox*)GetDlgItem(IDC_COMBO_SHAPESTATUS))->ResetContent();
((CComboBox*)GetDlgItem(IDC_COMBO_SHAPESTATUS))->AddString("ON");
//((CComboBox*)GetDlgItem(IDC_COMBO_SHAPESTATUS))->AddString("OFF"); 
//m_SHAPEStatus.AddString("OFF");  控件变量用法

        ((CComboBox*)::GetDlgItem(hwnd,IDC_COMBO_SHAPESTATUS))->AddString("OFF");
((CComboBox*)GetDlgItem(IDC_COMBO_SHAPESTATUS))->SetCurSel(1);

代码如上所示,若用蓝色的代码,编译无问题,但是用了红色部分代码,会产生一个中断,ASSERT(::IsWindow(m_hWnd))
应该是父窗口句柄无法找到窗口的问题,但是hwnd确实是有值的,为何这个用法会产生这个中断?

如果说窗口未创建的话,红色部分的代码我曾在 一个button的事件函数里用过,也是这个问题,但是用控件变量却是可以的

有高手知道是为何吗??

 

 

1.

::GetDlgItem(hwnd,IDC_COMBO_SHAPESTATUS))这样得到是窗口句柄,不能直接转化为CComboBox*.
你要调用函数转换.

 

 

2.

一个是CWnd* ,一个是HWND两者不能强制转换

 

 

3.

HWND hwnd = ::GetDlgItem(this->GetSafeHwnd(),IDC_COMBO_SHAPESTATUS);
CComboBox* combo = (CComboBox*)FromHandle(hwnd);
combo->AddString("OFF");

 

 

 

同理:

 

  //以下用法有错,不能通过句柄获取内容,错误为找不到父窗口句柄,用下面方法可以
  //HWND hwndwms = WMS_Page.m_hWnd;
  //CEdit* pEdit =  (CEdit*)::GetDlgItem(hwndwms,IDC_EDIT_WMSNAME);     
  //if (pEdit)
  //{
  // pEdit->GetWindowText(strLayerName);//LAYER
  //}

  //此种方法正确
  //HWND hwnd = ::GetDlgItem(hwndwms,IDC_EDIT_WMSDATA);   
  //CEdit* combo = (CEdit*)FromHandle(hwnd);
  //combo->GetWindowText(strWMSData);

原创粉丝点击