cppcoder1 Ответов: 2

Приложение MFC терпит крах, когда я объявляю переменную cpen в области видимости класса и использую ее в ondraw(...)


Привет всем, я пытаюсь объявить объект CPen в области видимости класса и использовать его в OnDraw (...). но мое приложение терпит крах, когда я его запускаю.Если я объявляю объект в OnDraw (...), он работает нормально. Может ли кто-нибудь, пожалуйста, дать мне знать, нужно ли мне что-то дополнительное, если объявить объект CPen в области видимости класса? Заранее спасибо.

Что я уже пробовал:

xxxxx.h
private:
  CPen cPen;


xxxxx.cpp

void CMFCApplication2View::OnDraw(CDC* pDC)
{
        //CPen cPen;  If I do it here its working fine.
	CPen* pOldPen = NULL;

	BOOL bCPen = cPen.CreatePen(PS_SOLID, 10, RGB(255, 0, 0));

	
	if (bCPen)
	{
		pOldPen = pDC->SelectObject(&cPen);

		pDC->MoveTo(95, 125);
		pDC->LineTo(230, 125);

		pDC->SelectObject(pOldPen);
		//cPen.DeleteObject();
	}
}

Richard MacCutchan

Запустите код через отладчик, чтобы точно увидеть, где он выходит из строя и какая переменная вызывает проблему.

2 Ответов

Рейтинг:
1

Jochen Arndt

Вы звоните CreatePen снова и снова с каждым рисунком.

Самым простым решением было бы позвонить CreatePen в конструкторе вашего класса и удалите его из функции draw:

CMFCApplication2View::CMFCApplication2View()
{
    // Other initialisation goes here

    cPen.CreatePen(PS_SOLID, 10, RGB(255, 0, 0));
}

void CMFCApplication2View::OnDraw(CDC* pDC)
{
    CPen* pOldPen = pDC->SelectObject(&cPen);

    // Perform drawing here

    pDC->SelectObject(pOldPen);
}


cppcoder1

Спасибо Йохену Арндту, но это не решает моей проблемы.Его сбой при создании объекта Cpen в области видимости класса

Jochen Arndt

Вы уверены, что сбой происходит при вызове CreatePen() в конструкторе? Это довольно маловероятно.

Что это за катастрофа? Используете ли вы отладочную сборку и запускаете ли приложение в отладчике?

Рейтинг:
1

Richard MacCutchan

BOOL CPen = cPen.CreatePen(PS_SOLID, 10, RGB(255, 0, 0));

Что на Земле является то, что заявление должно быть? Вы повторно объявляете имя класса (CPen) в качестве BOOLпеременная ean.