예제 #1
0
파일: AboutDlg.cpp 프로젝트: death/webwatch
void CAboutDlg::OnPaint()
{
    CPaintDC dc(this);
    if (m_pic) {
        CRect rect;
        GetClientRect(&rect);
        int sx = (rect.Width() - m_pic->GetWidth()) / 2;
        int sy = 0;
        CRect picRect(sx, sy, sx + m_pic->GetWidth(), sy + m_pic->GetHeight());
        m_pic->Draw(dc, picRect);
    }
}
예제 #2
0
//--------------------------------------------------------------------
void InterView::Draw(BRect updateRect)
{
	BRect visi(Bounds());

	if (curPicture != NULL)
	{
		BRect picRect(curPicture->Bounds());
		BRect viewRect(visi);

		if (autoScale)
		{
			viewRect.right -= B_V_SCROLL_BAR_WIDTH;
			viewRect.bottom -= B_H_SCROLL_BAR_HEIGHT;
			float dx = picRect.right / viewRect.right;
			float dy = picRect.bottom / viewRect.bottom;
			if (dx > dy)
			{
				float old_height = viewRect.bottom;
				viewRect.bottom = (picRect.bottom / picRect.right) * viewRect.right;

				viewRect.OffsetBy(0., old_height/2 - viewRect.bottom/2);

				FillRect(BRect(0., 0., viewRect.right, viewRect.top-1));
				FillRect(BRect(0., viewRect.bottom, viewRect.right, visi.bottom));

				zoomFactor = 1./dx;
				SendZoomFactorModified();
			}
			else
			{
				float old_width = viewRect.right;
				viewRect.right = (picRect.right / picRect.bottom) * viewRect.bottom;

				viewRect.OffsetBy(old_width/2 - viewRect.right/2, 0.);

				FillRect(BRect(0., viewRect.top, viewRect.left-1, viewRect.bottom));
				FillRect(BRect(viewRect.right+1, viewRect.top, visi.right, viewRect.bottom));

				zoomFactor = 1./dy;
				SendZoomFactorModified();
			}

			DrawBitmap(curPicture, viewRect);
		}
		else
		{
			if (zoomFactor == 1.)
			{
				BPoint pos(viewRect.right/2 - picRect.right/2 - B_V_SCROLL_BAR_WIDTH/2,
						   viewRect.bottom/2 - picRect.bottom/2 - B_H_SCROLL_BAR_HEIGHT/2);
				if (pos.x < 0.)
					pos.x = -xOffs;
				else xOffs = 0.;
//					pos.x = 0;
				if (pos.y < 0.)
					pos.y = -yOffs;
				else yOffs = 0.;
//					pos.y = 0;
			
				DrawBitmap(curPicture, pos);

				FillRect(BRect(0., 0., visi.right, pos.y-1));
				FillRect(BRect(0., visi.bottom - pos.y - B_H_SCROLL_BAR_HEIGHT + 1, visi.right, visi.bottom));
				FillRect(BRect(0., pos.y, pos.x-1, visi.bottom-pos.y));
				FillRect(BRect(visi.right-pos.x-B_V_SCROLL_BAR_WIDTH+1, pos.y, visi.right, visi.bottom-pos.y));
			}
			else
			{
				picRect.right  *= zoomFactor;
				picRect.bottom *= zoomFactor;

				BRect srcR(curPicture->Bounds());

				BRect dstR(viewRect.right/2 - picRect.right/2 - B_V_SCROLL_BAR_WIDTH/2,
						   viewRect.bottom/2 - picRect.bottom/2 - B_H_SCROLL_BAR_HEIGHT/2,
						   viewRect.right/2 + picRect.right/2 + B_V_SCROLL_BAR_WIDTH/2,
						   viewRect.bottom/2 + picRect.bottom/2 + B_H_SCROLL_BAR_HEIGHT/2);

				if (dstR.left < 0.)	// pic wider than view
				{
					dstR.left  = 0.;
					dstR.right = visi.right - B_V_SCROLL_BAR_WIDTH;

					srcR.left  = picRect.left + xOffs/zoomFactor;
					srcR.right = picRect.left + xOffs/zoomFactor + (visi.right - B_V_SCROLL_BAR_WIDTH)/zoomFactor;
				}
				else xOffs = 0.;

				if (dstR.top < 0.) // pic higher than view
				{
					dstR.top = 0.;
					dstR.bottom = visi.bottom - B_H_SCROLL_BAR_HEIGHT;

					srcR.top = picRect.top + yOffs/zoomFactor;
					srcR.bottom = picRect.top + yOffs/zoomFactor + (visi.bottom - B_H_SCROLL_BAR_HEIGHT)/zoomFactor;
				}
				else yOffs = 0.;

				DrawBitmap(curPicture, srcR, dstR);

				FillRect(BRect(0., 0., visi.right, dstR.top-1));					// top
				FillRect(BRect(0., dstR.bottom+1, visi.right, visi.bottom));		// bottom
				FillRect(BRect(0., dstR.top, dstR.left-1, dstR.bottom));			// left
				FillRect(BRect(dstR.right+1, dstR.top, visi.right, dstR.bottom));	// right
			}

		}
	}
	else
		FillRect(Bounds());
}