2017-02-16 29 views
0

Я создал окно с пользовательским управлением. Я использую конечную сетку в своем приложении. (https://www.codeproject.com/Articles/20183/The-Ultimate-Grid-Home-Page).Подтверждение отладки SubclassDlgItem() не выполнено

У меня возникла ошибка (Debug Assertion Failed) при запуске моего проекта.

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

    // IDM_ABOUTBOX must be in the system command range. 
    ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX); 
    ASSERT(IDM_ABOUTBOX < 0xF000); 

    CMenu* pSysMenu = GetSystemMenu(FALSE); 
    if (pSysMenu != NULL) 
    { 
     BOOL bNameValid; 
     CString strAboutMenu; 
     bNameValid = strAboutMenu.LoadString(IDS_ABOUTBOX); 
     ASSERT(bNameValid); 
     if (!strAboutMenu.IsEmpty()) 
     { 
      pSysMenu->AppendMenu(MF_SEPARATOR); 
      pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu); 
     } 
    } 

    // Set the icon for this dialog. The framework does this automatically 
    // when the application's main window is not a dialog 
    SetIcon(m_hIcon, TRUE);   // Set big icon 
    SetIcon(m_hIcon, FALSE);  // Set small icon 

    // TODO: Add extra initialization here 
    // Add "About..." menu item to system menu. 
    m_grid.AttachGrid(this, IDC_CUSTOM1);// ERROR LINE 

    return TRUE; // return TRUE unless you set the focus to a control 
} 

//Attach grid implementation 
BOOL CUGCtrl::AttachGrid(CWnd * wnd,UINT ID){ 

    if(SubclassDlgItem(IDC_CUSTOM1,wnd)) // ERROR LINE 
    { 
     long style = GetWindowLong(m_hWnd,GWL_STYLE); 
     style = style|WS_CLIPCHILDREN|WS_TABSTOP; 
     SetWindowLong(m_hWnd,GWL_STYLE,style); 

     // if the parent window is specified 
     if(wnd!= NULL) 
     { 
      LOGFONT logFont; 
      CFont *pTempFont = wnd->GetFont(); 
      pTempFont->GetLogFont(&logFont); 

      // ceate a font object based on the font information retrieved from 
      // parent window. This font will be used as grid's default font. 
      int nIndex = AddFont(logFont.lfHeight, logFont.lfWidth, logFont.lfEscapement, 
        logFont.lfOrientation, logFont.lfWeight, logFont.lfItalic, 
        logFont.lfUnderline, logFont.lfStrikeOut, logFont.lfCharSet, 
        logFont.lfOutPrecision, logFont.lfClipPrecision, 
        logFont.lfQuality, logFont.lfPitchAndFamily, logFont.lfFaceName); 

      SetDefFont(nIndex); 

      // create a font that will be used for the heading cells. This object 
      // is almost identical to the grid's default font, except its weight 
      // was increased by 200. 
      nIndex = AddFont(logFont.lfHeight, logFont.lfWidth, logFont.lfEscapement, 
        logFont.lfOrientation, logFont.lfWeight + 200, logFont.lfItalic, 
        logFont.lfUnderline, logFont.lfStrikeOut, logFont.lfCharSet, 
        logFont.lfOutPrecision, logFont.lfClipPrecision, 
        logFont.lfQuality, logFont.lfPitchAndFamily, logFont.lfFaceName); 

      CUGCell cell; 
      GetHeadingDefault(&cell); 
      cell.SetFont(GetFont(nIndex)); 
      SetHeadingDefault(&cell); 
     } 

     CreateChildWindows(); 
     // When WS_EX_RTLREADING style was specified for the place holder 
     // window, then set the grid to be in RTL layout mode. 
     style = GetWindowLong(m_hWnd, GWL_EXSTYLE); 
     if (style&WS_EX_RTLREADING) 
      SetGridLayout(1); 

     OnSetup(); 
     OnSheetSetup(0); 

     // Allow drawing after the grid is initialized 
     m_GI->m_paintMode = TRUE; 
     // Adjust the grid's components to fit current setup 
     AdjustComponentSizes(); 

     return TRUE; 
    } 

    return FALSE; 
} 

enter image description here

Любой имеющий ни малейшего представления, как это исправить ??

// CAboutDlg dialog used for App About 

class CAboutDlg : public CDialog 
{ 
public: 
    CAboutDlg(); 

// Dialog Data 
#ifdef AFX_DESIGN_TIME 
    enum { IDD = IDD_ABOUTBOX }; 
#endif 

    protected: 
    virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support 

// Implementation 
protected: 
    DECLARE_MESSAGE_MAP() 
}; 

CAboutDlg::CAboutDlg() : CDialog(IDD_ABOUTBOX) 
{ 
} 

void CAboutDlg::DoDataExchange(CDataExchange* pDX) 
{ 
    CDialog::DoDataExchange(pDX); 
} 

void CCustomControlDlg::DoDataExchange(CDataExchange* pDX) 
{ 
    CDialog::DoDataExchange(pDX); 
    //{{AFX_DATA_MAP(CCustomControlDlg) 
    // NOTE: the ClassWizard will add DDX and DDV calls here 
    DDX_Control(pDX, IDC_CUSTOM1, m_drawpad); 
    //}}AFX_DATA_MAP 
} 
+2

* «Нажмите« Повторить попытку для отладки приложения »* - Это приведет вас к утверждению об отладке, которое не удалось, включая выражение, которое было проверено. В этом случае это, вероятно, потому, что вы прикрепляете к одному и тому же элементу управления несколько классов C++ (или присоединяете его несколько раз). Подключили ли вы еще один класс C++ к элементу управления с ID 'IDC_CUSTOM1'? Можем ли мы увидеть вашу реализацию 'DoDataExchange()' и ваш конструктор диалога? – IInspectable

+0

класс CAboutDlg: public CDialog { public: \t CAboutDlg(); // Диалоговые данные #ifdef AFX_DESIGN_TIME \t enum {IDD = IDD_ABOUTBOX}; #endif \t protected: \t virtual void DoDataExchange (CDataExchange * pDX); // Поддержка DDX/DDV // Внедрение protected: \t DECLARE_MESSAGE_MAP() }; –

+0

void CAboutDlg :: DoDataExchange (CDataExchange * pDX) { \t CDialog :: DoDataExchange (pDX); } void CCustomControlDlg :: DoDataExchange (CDataExchange * pDX) { \t CDialog :: DoDataExchange (pDX); \t // {{AFX_DATA_MAP (CCustomControlDlg) \t // ПРИМЕЧАНИЕ: ClassWizard добавит DDX и DDV вызывает здесь \t DDX_Control (PDX, IDC_CUSTOM1, m_drawpad); \t //}} AFX_DATA_MAP } –

ответ

1

Проблема в том, что вы подключаете два различных C++ объекты для одного элемента управления (IDC_CUSTOM1). Запись в DoDataExchange() неявно выполняет подклассирование, вызывая DDX_Control(pDX, IDC_CUSTOM1, m_drawpad);, а код в OnInitDialog() более явный (m_grid.AttachGrid(this, IDC_CUSTOM1);), но по сути делает то же самое.

Чтобы это исправить, у вас есть несколько вариантов, в зависимости от того, что вы после:

  • Снимите DDX_Control() вызов в DoDataExchange(), если вам не нужен m_drawpad объект, прикрепленный к IDC_CUSTOM1.
  • Удалите m_grid.AttachGrid() звонок внутри OnInitDialog(), если вам не нужен объект m_grid, прикрепленный к IDC_CUSTOM1.
  • Добавьте дополнительный элемент управления в свой ресурс диалога и используйте его для любого из этих объектов, если вам нужны оба.

 Смежные вопросы

  • Нет связанных вопросов^_^