Я создал окно с пользовательским управлением. Я использую конечную сетку в своем приложении. (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;
}
Любой имеющий ни малейшего представления, как это исправить ??
// 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
}
* «Нажмите« Повторить попытку для отладки приложения »* - Это приведет вас к утверждению об отладке, которое не удалось, включая выражение, которое было проверено. В этом случае это, вероятно, потому, что вы прикрепляете к одному и тому же элементу управления несколько классов C++ (или присоединяете его несколько раз). Подключили ли вы еще один класс C++ к элементу управления с ID 'IDC_CUSTOM1'? Можем ли мы увидеть вашу реализацию 'DoDataExchange()' и ваш конструктор диалога? – IInspectable
класс 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() }; –
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 } –