获取纸张大小,和预览的大小比例问题??

wxpwxp 2004-01-15 03:15:31

问题1:CPaperSet :public CPageSetupDialog
类CPaperSet 定义。。。
然后在view类里
CPaperSet m_size;
CSize lsize;
lsize=m_size.GetPaperSize();
但GetPaperSize();这的返回值是零。没有获得纸张的大小
请问怎么会事??
问题2:SetScrollSizes(MM_TEXT, szTotal,szPage,szLine);
再显示图片时,用上面语句设定,显示面,但显示正常,但打印预览缩小了好几倍
如果在ondrow()里使图片扩大,虽然预览里变大了,但显示时,太大。
怎么才能正常显示,预览,听说是MM_TEXT参数的问题,但不知怎么改??
希望大家给看看。。
一问50分。。。!!!
...全文
255 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
wxpwxp 2004-02-02
  • 打赏
  • 举报
回复
干吗不回信呀??
bluebohe 2004-02-01
  • 打赏
  • 举报
回复
CDC *pDC
pDC->GetDeviceCaps(PHYSICALWIDTH)
pDC->GetDeviceCaps(PHYSICALHEIGHT)
要保证pDC是打印机dc,否则会出问题,通过pDC->IsPrinting()判断,m_spIPicture->Render,我不清楚是否同样适用于打印机dc
zhangcrony 2004-02-01
  • 打赏
  • 举报
回复
cronyzhang@jxfw.com
wxpwxp 2004-01-31
  • 打赏
  • 举报
回复
快呀。
taianmonkey 2004-01-17
  • 打赏
  • 举报
回复
cong119@sohu.com
wxpwxp 2004-01-17
  • 打赏
  • 举报
回复
快来看看!
wxpwxp 2004-01-15
  • 打赏
  • 举报
回复
有邮箱吗?我给你发!
wxpwxp 2004-01-15
  • 打赏
  • 举报
回复
这个我是在view类的一个函数里实现的。
编译正确,运行不对!!
CDC *pDC
pDC->GetDeviceCaps(PHYSICALWIDTH)
pDC->GetDeviceCaps(PHYSICALHEIGHT)
编译正确,运行不对!!
运行时,说什么不能读。。
////////////////////////////////////////////
在一个图象预览哪个
在view实现里的ondraw()函数是;
void CMy11View::OnDraw(CDC* pDC)
{
CMy11Doc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
// TODO: add draw code for native data here
pDC->SetMapMode(MM_TEXT);
CPicture* ppic = pDoc->GetPicture();
ASSERT(ppic);
if (*ppic) {
CRect rc;
GetImageRect(rc);
ppic->Render(pDC,rc);
}
}
BOOL CPicture::Render(CDC* pDC, CRect rc, LPCRECT prcMFBounds) const
{
ASSERT(pDC);

if (rc.IsRectNull()) {
CSize sz = GetImageSize(pDC);
rc.right = sz.cx;
rc.bottom = sz.cy;
}
long hmWidth,hmHeight; // HIMETRIC units
GetHIMETRICSize(hmWidth, hmHeight);
m_spIPicture->Render(*pDC, rc.left, rc.top, rc.Width(), rc.Height(),
0, hmHeight, hmWidth, -hmHeight, prcMFBounds);

return TRUE;
}
如果GetImageRect(rc);这个函数获得的值rc是零的话图象的显示和预览都正常,
就是显示的时候没有滚动条,
但是相反就有问题,该怎么办??/
////////////
各位高手我是刚开始学习图片处理,不懂得很多,希望你们多多指点,
有什么这方面基础的资料。代码呀,记得给我发。
我的邮箱wxpwxp918@sohu.com,wxpwxpcn@yahoo.com.cn
小弟先在这谢谢你们了。。
bluebohe 2004-01-15
  • 打赏
  • 举报
回复
应该是你的dc不正确,把你的具体代码拿过来
wxpwxp 2004-01-15
  • 打赏
  • 举报
回复
GetPaperSize();
是从CPageSetupDialog 继承下来的。不是自己写的,
pDC->GetDeviceCaps(PHYSICALWIDTH),pDC->GetDeviceCaps(PHYSICALHEIGHT)
我也用了是
CDC *pDC
pDC->GetDeviceCaps(PHYSICALWIDTH)
pDC->GetDeviceCaps(PHYSICALHEIGHT)
编译正确,运行不对!!
不知怎么会事。
bluebohe 2004-01-15
  • 打赏
  • 举报
回复
呵呵,谢天谢地你的帖子还没人回答:)刚才突然停电了,我就想,完了分数肯定不是我的了嘿嘿,
关于纸张大小的获得,你只要用打印机的dc,pDC->GetDeviceCaps(PHYSICALWIDTH),pDC->GetDeviceCaps(PHYSICALHEIGHT)
bluebohe 2004-01-15
  • 打赏
  • 举报
回复
/*


HDC hDC, 打印机dc

HBITMAP hBmp, 待打印位图

int iX, 位图的左上角点x坐标

int iY, 位图的左上角点y坐标

double dScaleX, 打印机分辨率和屏幕分辨率x方向的比值,在没有指定位图显示高度和宽度的时候用的上

double dScaleY, 打印机分辨率和屏幕分辨率y方向的比值,在没有指定位图显示高度和宽度的时候用的上

int iWidth=0, 位图的显示宽度

int iLength=0 位图的显示高度

*/

void Draw(HDC hDC,HBITMAP hBmp,int iX,int iY,double dScaleX=1.0,double dScaleY=1.0,int iWidth=0,int iLength=0)

{

HPALETTE hPal;

BITMAP bm;

BITMAPINFOHEADER bi;

LPBITMAPINFOHEADER lpbi;

DWORD dwLen;

HANDLE hDIB;

HANDLE handle;

HDC hDC1;

if(GetDeviceCaps(hDC,RASTERCAPS) & RC_PALETTE )

{

UINT nSize = sizeof(LOGPALETTE) + (sizeof(PALETTEENTRY) * 256);

LOGPALETTE *pLP = (LOGPALETTE *) new BYTE[nSize];

pLP->palVersion = 0x300;

pLP->palNumEntries =GetSystemPaletteEntries( hDC, 0, 255, pLP->palPalEntry );

hPal=CreatePalette(pLP );

delete[] pLP;

}

if (hPal==NULL) hPal = (HPALETTE) GetStockObject(DEFAULT_PALETTE);

::GetObject(hBmp,sizeof(bm),(LPSTR)&bm);

bi.biSize = sizeof(BITMAPINFOHEADER);

bi.biWidth = bm.bmWidth;

bi.biHeight = bm.bmHeight;

bi.biPlanes = 1;

bi.biBitCount = bm.bmPlanes * bm.bmBitsPixel;

bi.biCompression = BI_RGB;

bi.biSizeImage = 0;

bi.biXPelsPerMeter = 0;

bi.biYPelsPerMeter = 0;

bi.biClrUsed = 0;

bi.biClrImportant = 0;

int nColors = (1 << bi.biBitCount);

if( nColors > 256 )

nColors = 0;

dwLen = bi.biSize + nColors * sizeof(RGBQUAD);

hDC1 = ::GetDC(NULL);

hPal = SelectPalette(hDC1,hPal,FALSE);

RealizePalette(hDC1);

hDIB = GlobalAlloc(GMEM_FIXED,dwLen);

if (!hDIB)

{

SelectPalette(hDC1,hPal,FALSE);

::ReleaseDC(NULL,hDC1);

DeleteObject(hPal);

return ;

}

lpbi = (LPBITMAPINFOHEADER)hDIB;

*lpbi = bi;

::GetDIBits(hDC1, hBmp, 0L, (DWORD)bi.biHeight,

(LPBYTE)NULL, (LPBITMAPINFO)lpbi, (DWORD)DIB_RGB_COLORS);

bi = *lpbi;

if (bi.biSizeImage == 0)

bi.biSizeImage = ((((bi.biWidth * bi.biBitCount) + 31) & ~31) / 8)* bi.biHeight;

dwLen += bi.biSizeImage;

if (handle = GlobalReAlloc(hDIB, dwLen, GMEM_MOVEABLE))

hDIB = handle;

else

{

GlobalFree(hDIB);

SelectPalette(hDC1,hPal,FALSE);

::ReleaseDC(NULL,hDC1);

DeleteObject(hPal);

return ;

}

lpbi = (LPBITMAPINFOHEADER)hDIB;

BOOL bGotBits = GetDIBits( hDC1, hBmp,0L,(DWORD)bi.biHeight,(LPBYTE)lpbi+ (bi.biSize + nColors * sizeof(RGBQUAD)),

(LPBITMAPINFO)lpbi,(DWORD)DIB_RGB_COLORS);

if( !bGotBits )

{

GlobalFree(hDIB);

SelectPalette(hDC1,hPal,FALSE);

::ReleaseDC(NULL,hDC1);

DeleteObject(hPal);

return;

}

if(iWidth==0||iLength==0)

{

iWidth=lpbi->biWidth;

iLength=lpbi->biHeight;

iWidth=(int)(dScaleX*iWidth);

iLength=(int)(iLength*dScaleY);

}

StretchDIBits(hDC,iX,iY,iWidth,iLength,0,0,lpbi->biWidth,lpbi->biHeight,(LPBYTE)lpbi // address for bitmap bits

+ (bi.biSize + nColors * sizeof(RGBQUAD)),(LPBITMAPINFO)lpbi,DIB_RGB_COLORS,SRCCOPY);

SelectPalette(hDC1,hPal,FALSE);

::ReleaseDC(NULL,hDC1);

DeleteObject(hDIB);

DeleteObject(hPal);

}

// 附:得到一个DC位图的代码

HBITMAP GetSrcBit(HDC hDC,DWORD BitWidth, DWORD BitHeight)

{

HDC hBufDC;

HBITMAP hBitmap, hBitTemp;

hBufDC = CreateCompatibleDC(hDC);

hBitmap = CreateCompatibleBitmap(hDC, BitWidth, BitHeight);

hBitTemp = (HBITMAP) SelectObject(hBufDC, hBitmap);

StretchBlt(hBufDC, 0, 0, BitWidth, BitHeight,

hDC, 0, 0, BitWidth, BitHeight, SRCCOPY);

hBitmap = (HBITMAP) SelectObject(hBufDC, hBitTemp);

::DeleteDC(hBufDC);

return hBitmap;

}


bluebohe 2004-01-15
  • 打赏
  • 举报
回复
1:GetPaperSize()是你自己的函数,大家怎么知道
2: 关于位图的打印,很多人对此很困惑,在这方面产生的问题也很多,主要包括以下几点。

1:打印的图片太小;

2:根本打印不出来位图

3:打印预览可见、但打印不出来;

产生这些问题的根本原因,在于对位图的理解不够深刻。

一个CBitmap对象,可能是DDB位图(设备相关位图),或者DIB位图(设备无关位图),其中,一个设备兼容的内存DC中,只能选择该设备兼容的DDB位图或者单色的位图。注意,位图只能被选择进入到设备兼容的内存DC中,并不能选择进入到真实的dc中,这就是有时候根本打印不出来图片的原因。

至于打印图片太小的问题,主要是因为衡量位图大小的单位是横向和纵向的像素数,而不是确切的长度,所以如果把一个图片映射到屏幕上,会出现一个比较大的图像,但是打印机的分辨率比屏幕高很多(屏幕一般是96dpi,而打印机最少一般也有300dpi),如果把位图不缩放地映射到打印机上,则必然要小很多。解决该类问题的方法是使用StretchBlt拉伸显示图像。

另外LoadImage函数中使用LR_CREATEDIBSECTION选项产生的DIB位图可以被选择进入任何设备兼容的内存DC中。因此可以使用LoadImage函数加载一个位图文件或者资源,直接把位图通过StretchBlt打印出来。下面是把一个位图文件进行打印的相关代码:

/*

//打印或者在屏幕左上角上画位图文件

//pDC 打印机或者屏幕dc指针

iLogPixelX

iLogPixelY

屏幕DC的GetDeviceCaps(LOGPIXELSX)值,其中

iLogPixelX=DC.GetDeviceCaps(LOGPIXELSX);

iLogPixelY=DC.GetDeviceCaps(LOGPIXELSY);

const char *strFileName BMP图片文件名称

*/

void DrawBMP(CDC* pDC,int iLogPixelX,int iLogPixelY,const char *strFileName)

{

CDC MemDC; // 内存设备环境指针,在视的整个存在过程都将存在

CBitmap Bitmap,*pOldBmp;

CRect Source, Dest; // 记录源位图尺寸和最终显示尺寸

BITMAP bm;

if(MemDC.GetSafeHdc() == NULL)

{

HBITMAP hbitmap=(HBITMAP)LoadImage(0,strFileName,IMAGE_BITMAP,0,0,LR_CREATEDIBSECTION|LR_DEFAULTSIZE|LR_LOADFROMFILE);

Bitmap.Attach(hbitmap);

MemDC.CreateCompatibleDC(pDC);

Bitmap.GetObject(sizeof(bm),&bm);

pOldBmp=MemDC.SelectObject(&Bitmap);

Source.top=0;

Source.left=0;

Source.right= bm.bmWidth;

Source.bottom = bm.bmHeight;

Dest = Source;

}

pDC->DPtoLP(&Dest);

if(pDC->IsPrinting())

{

Dest.left=(int)(Dest.left*((double)pDC->GetDeviceCaps(LOGPIXELSX))/iLogPixelX);

Dest.right=(int)(Dest.right*((double)pDC->GetDeviceCaps(LOGPIXELSX))/iLogPixelX);

Dest.top=(int)(Dest.top*((double)pDC->GetDeviceCaps(LOGPIXELSY))/iLogPixelY);

Dest.bottom=(int)(Dest.bottom*((double)pDC->GetDeviceCaps(LOGPIXELSY))/iLogPixelY);

}

pDC->StretchBlt(Dest.left, Dest.top, Dest.right, Dest.bottom,

&MemDC, Source.left, Source.top, Source.right,Source.bottom, SRCCOPY);

MemDC.SelectObject(pOldBmp);

Bitmap.DeleteObject();

MemDC.DeleteDC();

return;

}

但是对于显示设备兼容的DDB位图的打印则不是那么简单,比如屏幕截图,这种位图不能选择进入打印设备兼容的内存DC中,对于这种问题的处理,一般是通过转化成DIB位图,然后使用StretchDIBits函数把位图显示在DC上,下面是一个可以打印任何位图的函数代码

19,468

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 图形处理/算法
社区管理员
  • 图形处理/算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧