Member 12275258 Ответов: 2

Проблемы с просмотром изображений MFC SDI.


Привет,

Я использую шаблон ленты MFC для создания приложения SDI.
Я добавляю новый класс(Cchildview), который наследуется от CWnd к mainframe.cpp.


в моем мэйнфрейме.
Здесь выполняется m_wndView

// create a view to occupy the client area of the frame
	if (!m_wndView.Create(NULL, NULL, AFX_WS_DEFAULT_VIEW,
		CRect(0, 0, 0, 0), this, AFX_IDW_PANE_FIRST, NULL))
	{
		TRACE0("Failed to create view window\n");
		return -1;
	}


в моем childview.cpp, он загрузит img и отобразится в функции onpaint, как показано ниже.

void CChildView::OnPaint()
{
	CString szFilename("baseimg.bmp");
	HBITMAP hBmp = (HBITMAP)::LoadImage(NULL, szFilename,
		IMAGE_BITMAP, 0, 0,
		LR_LOADFROMFILE | LR_CREATEDIBSECTION);

	CBitmap bmp;
	bmp.Attach(hBmp);

	CClientDC dc(this);
	CDC bmDC;
	bmDC.CreateCompatibleDC(&dc);
	CBitmap *pOldbmp = bmDC.SelectObject(&bmp);

	BITMAP  bi;
	bmp.GetBitmap(&bi);

	dc.BitBlt(0, 0, bi.bmWidth, bi.bmHeight, &bmDC, 0, 0, SRCCOPY);

	bmDC.SelectObject(pOldbmp);
}


Мое изображение может отображаться на экране. Но когда я настраиваю разделитель границы, мое изображение исчезает, и если я снова перестраиваюсь, оно может отображаться, а затем, если я снова настраиваюсь, оно снова будет отображаться @@.
Есть идеи, почему это произойдет?

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

используйте другой метод для загрузки изображения. результат все тот же.

2 Ответов

Рейтинг:
2

Member 12275258

Привет,

Я уже решил эту проблему, просто загрузив и отобразив (функция Ondraw) изображение в классе view.

Спасибо.


Shao Voon Wong

По праву вы загружаете изображение только один раз и отображаете его в OnDraw().

Рейтинг:
0

Shao Voon Wong

Вместо

CClientDC dc(this);


пробовать

CPaintDC dc(this);


Member 12275258

У меня была попытка ниже метода, но все еще была та же проблема.

Я загружаю растровое изображение в precreatewindows

BOOL CChildView::PreCreateWindow(CREATESTRUCT& cs)
{
	if (!CWnd::PreCreateWindow(cs))
		return FALSE;

	cs.dwExStyle |= WS_EX_CLIENTEDGE;
	cs.style &= ~WS_BORDER;
	cs.lpszClass = AfxRegisterWndClass(CS_HREDRAW | CS_VREDRAW | CS_DBLCLKS,
		::LoadCursor(NULL, IDC_ARROW), HBRUSH(COLOR_WINDOW + 1), NULL);

	//if (!ggtest)
	//{
	ggtest = true;
	CImage image;
	image.Load(_T("baseimg.bmp"));
	//CBitmap bitmap;
	m_Bitmap.Attach(image.Detach());
	//}


	return TRUE;
}


и OnPaint изменится на это.
void CChildView::OnPaint()
{

	CPaintDC PaintDC(this);
	HDC hDC = ::GetDC(NULL);
	// Bitmap for drawing.
	CBitmap Drawing;
	Drawing.CreateCompatibleBitmap(&PaintDC, 1600, 1200);
	COLORREF m_BkColor;
	m_BkColor = BLACK;
	// Double buffering.
	CDC MemDC1;
	CDC MemDC2;
	MemDC1.CreateCompatibleDC(&PaintDC);
	MemDC2.CreateCompatibleDC(&PaintDC);
	MemDC2.SetStretchBltMode(HALFTONE);
	MemDC2.SetBkColor(m_BkColor);
	CBitmap* pBitmap1 = MemDC1.SelectObject(&m_Bitmap);
	CBitmap* pBitmap2 = MemDC2.SelectObject(&Drawing);

	// Copy scale bitmap.
	MemDC2.StretchBlt(0, 0, 1600, 1200, &MemDC1, 0, 0, 1600, 1200, SRCCOPY);
	
	// Copy memory buffer to display.
	PaintDC.BitBlt(0, 0, 1600, 1200, &MemDC2, 0, 0, SRCCOPY);

	// Release buffers.
	MemDC1.SelectObject(pBitmap1);
	MemDC2.SelectObject(pBitmap2);
}


но проблема все еще сохраняется...

Shao Voon Wong

Вы можете попробовать переопределить обработчик WM_SIZE, чтобы он перерисовывал ваше представление после завершения изменения размера.

BEGIN_MESSAGE_MAP(CChildView, CView)
	ON_WM_SIZE() // add this line to your message map
END_MESSAGE_MAP()

void CChildView::OnSize(UINT nType, int cx, int cy)
{
    CView::OnSize(nType, cx, cy);
    Invalidate(TRUE); // add this line to redraw your CChildView
}

Member 12275258

Привет,

Спасибо вам, но по-прежнему возникают те же проблемы, если применять OnSize().