Ошибка подтверждения mfc при попытке создать страницу свойств

0

Я получаю сообщение "Debug Assertion failed", когда я пытаюсь создать лист свойств, это мой первый, и я копирую его с "Программирование MFC с нуля".

Вот класс свойств:

class CSamplePropSheet : public CPropertySheet
{
    CPropDialog1 page1; //first page
    CPropDialog2 page2; //second page
    CPropDialog3 page3; //third page

public:
    CSamplePropSheet() : CPropertySheet(){
        Construct("Sample Property Sheet", this);

        page1.Construct("PropDialog1", 0);
        page2.Construct("PropDialog2", 0);
        page3.Construct("PropDialog3", 0);
        AddPage(&page1);
        AddPage(&page2);
        AddPage(&page3);
    }
};

У меня есть переменная Property Sheet, указанная в моем главном окне:

class CMainWin : public CFrameWnd
{
    CSamplePropSheet m_PropSheet;

public:
    CMainWin();

    afx_msg void OnActivate();
    afx_msg void OnExit();
    afx_msg void OnHelp();

    DECLARE_MESSAGE_MAP()
};

Затем я звоню здесь:

afx_msg void CMainWin::OnActivate()
{

    m_PropSheet.DoModal(); //activate modal property sheet

}

Когда всплывает ошибка, он указывает на этот раздел кода:

int AFXAPI AfxMessageBox(UINT nIDPrompt, UINT nType, UINT nIDHelp)
{
    CString string;
    if (!string.LoadString(nIDPrompt))
    {
        TRACE(traceAppMsg, 0, "Error: failed to load message box prompt string 0x%04x.\n",
                nIDPrompt);
         ASSERT(FALSE);
     }
    if (nIDHelp == (UINT)-1)
        nIDHelp = nIDPrompt;
     return AfxMessageBox(string, nType, nIDHelp);
 }

Пропустили что-нибудь? Остальные параметры меню программы работают, за исключением кнопки "Активировать", чтобы открыть лист свойств.

Теги:
mfc
assertions

1 ответ

1
Лучший ответ

Похоже, что вы используете Construct метод для страниц свойств page1, page2 и page3 неправильно. Вероятно, вы предположили, что в этом выражении Construct("PropDialog1", 0); "PropDialog1" - это заголовок страницы. Однако это имя шаблона ресурса. Пожалуйста, прочитайте здесь, как использовать шаблоны ресурсов.

Я рекомендую использовать другую перегрузку метода Construct:

void Construct( 
   UINT nIDTemplate, 
   UINT nIDCaption = 0  
); 

С этой перегрузкой вы можете указать идентификатор ресурса диалога, связанный со страницей свойств, как первый параметр, и идентификатор строки String страницы в качестве второго параметра. Например:

page1.Construct(IDD_PROP_PAGE1, IDS_PAGE1_CAPTION);
  • 0
    Я не уверен, почему, но по какой-то причине имя шаблона ресурса не будет работать, пока я не укоротил имя, с «PropDialog1» до «PropD1», теперь программа работает. Спасибо за помощь!

Ещё вопросы

Сообщество Overcoder
Наверх
Меню