screen show and print : difference
????IPicture????????????????JPG????,????IPicture::Render????????????????????,????????????????.
??????????????????????????????.??????????????????????????????????,??????:??????????????????????????????????????,
???????????
????????????????????????.
????.
????????:
void CPrintMAP2View::OnDraw(CDC* pDC)
{
CPrintMAP2Doc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
if (!pDoc)
return;
double lon=105.0;
double lat=35.0;
double mag=5.0;
draw("",pDC,lon,lat,mag);
}
.... ...
bool CPrintMAP2View::draw(char* sfn,CDC* pDC,double& lon,double& lat,double&
mag)
{
IStream *pStm;
CFileStatus fstatus;
CFile file;
LONG cb;
CString m_Path("map\\china.bmp");
if (file.Open(m_Path,CFile::modeRead)&&file.GetStatus(m_Path,fstatus)&&
((cb = static_cast<LONG>(fstatus.m_size)) != -1))
{
HGLOBAL hGlobal = GlobalAlloc(GMEM_MOVEABLE, cb);
LPVOID pvData = NULL;
if (hGlobal != NULL)
{
if ((pvData = GlobalLock(hGlobal)) != NULL)
{
file.Read(pvData, cb);
GlobalUnlock(hGlobal);
CreateStreamOnHGlobal(hGlobal, TRUE, &pStm);
}
}
}
file.Close();
IPicture *pPic;
if(SUCCEEDED(OleLoadPicture(pStm,static_cast<LONG>(fstatus.m_size),TRUE,IID_IPicture,(LPVOID*)&pPic))) { OLE_XSIZE_HIMETRIC hmWidth; OLE_YSIZE_HIMETRIC hmHeight; pPic->get_Width(&hmWidth); //???? ????0.01???? pPic->get_Height(&hmHeight); //???? ????0.01???? double fX,fY; fX = pDC->GetDeviceCaps(HORZRES); //???????????????? fY = pDC->GetDeviceCaps(VERTRES); //???????????????? CSize size(hmWidth,hmHeight); pDC->HIMETRICtoLP(&size); // ????MM_HIMETRIC??????????MM_TEXT???????? CSize lefttop( LEFTSPACE , TOPSPACE ); pDC->LPtoHIMETRIC(&lefttop); CSize inlen( MAPLEN - LEFTSPACE - RIGHTSPACE , MAPWIDTH - TOPSPACE -BOTTOMSPACE ); pDC->LPtoHIMETRIC(&inlen); double lonspan = RIGHTLON - LEFTLON ; double latspan = TOPLAT - BOTTOMLAT ; double perlon = inlen.cx/lonspan; double perlat = inlen.cy/latspan; OLE_XPOS_HIMETRIC x0 = static_cast<OLE_XPOS_HIMETRIC>(( lon - LEFTLON ) *perlon + lefttop.cx); OLE_XPOS_HIMETRIC y0 = ( TOPLAT - lat ) * perlat + lefttop.cy; OLE_XPOS_HIMETRIC temx=3049; CSize epic(temx,y0); pDC->LPtoHIMETRIC(&epic); y0=epic.cy; //???????????? OLE_XPOS_HIMETRIC x1 = x0 - perlon * 3; //????????X OLE_XPOS_HIMETRIC y1 = y0 - perlat * 2; //????????Y OLE_XPOS_HIMETRIC xlen = 6 * perlon; //???????????? OLE_XPOS_HIMETRIC ylen = 4 * perlat; //???????????? if(FAILED(pPic->Render(pDC->m_hDC,100,100,fX-200,fY-200,x1,hmHeight-y1,xlen,-ylen,NULL))) AfxMessageBox("??????????????"); //================================================================= // ?????????????????????????????? int radius; if(mag < 4) radius = 10; else if(mag < 6) radius = 15; else if(mag < 7) radius = 20; else radius = 25; CBrush currbrush(RGB(255,0,0)); CBrush* pOldbrush=pDC->SelectObject(&currbrush); pDC->Ellipse(fX/2-radius,fY/2-radius,fX/2+radius,fY/2+radius); pDC->SelectObject(pOldbrush); //================================================================= pPic->Release(); } else AfxMessageBox("????????????????????"); return true;}