vc 画图与打印 学习笔记

//得到显示分辨率
CDC* pddc = GetDC();
int ixd=pddc->GetDeviceCaps(LOGPIXELSX);
int iyd=pddc->GetDeviceCaps(LOGPIXELSY);
//一英寸约等于25.4mm,在MM_LOMETRIC下的逻辑单位为0.1mm
int scaleX = 25.4*10/ixd;//x方向每个像素点表示的0.1mm数
int scaleY = 25.4*10/iyd;//y方向每个像素点表示的0.1mm数
prnDC->SetMapMode(MM_LOGMETRIC);
//然后画线,注意10厘米的线应该用1000个逻辑单位表示,并且MM_LOMERIC的Y轴正向向上
prnDC->MoveTo(10,-10);
prnDC->LineTo(10+1000,-10);//在(10,-10)处向右画一条10厘米的与X轴平行的直线


:为何我的下拉列表框找不到添加的内容? 
db2_basic        VC如果不安装补丁的话,下拉列表框刚刚从控件栏拖到设计的对话框中时,其下拉列表的高度很小,所以经常会出现看不到内容的情况,在对话框设计中,点下列表框右侧的三角,然后再把下拉列表拖大即可。 
2:为何一个位图在打印状态下于屏幕大小比较显得非常小? 
       可以认为位图是由颜色点阵构成的,因此一般情况下,它只有横向纵向的像素数的概念,而没有横向纵向的宽度高度具体值的概念,因此,位图的显示大小是由显示位图的设备的分辨率决定的。显示器的像素点的大小比起打印机要大很多,所以会出现位图打印以及打印预览状态下非常小的问题。解决的方式使用StretchBlt函数拉伸位图,见下面的小程序: 
/* 
//打印或者在屏幕上画位图 
//pDC  打印机或者屏幕dc指针 
iLogPixelX 
iLogPixelY 
屏幕DC的GetDeviceCaps(LOGPIXELSX)值,其中 
iLogPixelX  =  DC.GetDeviceCaps  (  LOGPIXELSX  )  ; 
iLogPixelY  =  DC.GetDeviceCaps  (  LOGPIXELSY  )  ; 
iResBMPID  BMP资源ID 
*/ 
void  DrawBMP  (CDC  *  pDC,  int  iLogPixelX,int  iLogPixelY,int  iResBMPID) 

           CDC                        MemDC;  //  内存设备环境指针,在视的整个存在过程都将存在 
           CBitmap            Bitmap;               
           CRect                        Source,  Dest;  //  记录源位图尺寸和最终显示尺寸 
           BITMAP            bm; 
           if(MemDC.GetSafeHdc  (  )  ==  NULL) 
           { 
                       Bitmap.LoadBitmap  (  iResBMPID  )  ; 
                       MemDC.CreateCompatibleDC  (  pDC  )  ; 
                       MemDC.SelectObject(  &Bitmap  )  ; 
                       Bitmap.GetObject  (  sizeof  (  bm  ),  &bm  )  ; 
                       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  )  ; 
           Bitmap.DeleteObject(  )  ; 
           MemDC.DeleteDC(  )  ; 
           return  ; 

 
以下关于字符串: 
1:使用CString,要包含文件afx.h,比如在Win32  Console  Application中Alt+F7选择Use  MFC  in  a  Static  Liberary,然后再添加#include<afx.h>就可以使用CString了。 
 
2:WCHAR  ch  =  L’中’;与CHAR  ch  =  ’中’;的区别是第一种使用UNICODE编码,第二种方式一般不经常用到,比如: 
 
                 WCHAR  strA  [  2  ]  =  {  L'中'  ,  0  }  ;//打开VC的Options菜单,选中Debug选项卡中的Display  unicode  strings后,可以看到strA的值。 
 
                 WCHAR  strB  [  2  ]  =  {  '中'  ,  0  }  ; 
 
                 CString  strC  ; 
 
                 strC+  =  (  (  char  *  )  strB  )  [  1  ]  ; 
 
                 strC+  =  (  (  char  *  )  strB  )  [  0  ]  ;//strC==”中” 
 
3:CString的AllocSysString  (  )成员函数;可以方便的把一个字符串转换成UNICODE形式。记得使用完该UNICODE字符串后要调用::SysFreeString()函数释放字符串。 
 
4:  CString::AllocSysString  (  )或者::SysAllocString得到的字符串并不是普通的UNICODE字符串,它之前的四个字节会存放申请的字符串的长度: 
 
                 CString  strD  =  ”asdf”; 
 
                 BSTR  strD  =  strC.AllocSysString(  )  ; 
 
                 long  i  =*  (  (  long  *  )  strD
 

 

MM_LOENGLISH 0.01 in
MM_HIENGLISH 0.001 in
MM_LOMETRIC 0.1 mm
MM_HIMETRIC 0.01 mm
MM_TWIPS 1/1440 in


为了控制你自己应用程序中的坐标系统单位,坐标轴的方向,可以使用MM_ISOTROPIC 或MM_ANISOTROPIC映射模式。第一件事是调用CDC::SetMapMode()函数,并在两个常量中选择一个(MM_ISOTROPIC或 MM_ANISOTROPIC)。下面是例子代码:


两种映射方式的区别在于:MM_ISOTROPIC映射方式中水平、垂直坐标轴的单位相等,MM_ANISOTROPIC映射方式可以随意控制水平及垂直方向的坐标单位长度。


所以,在调用SetMapMode()函数并规定了MM_ISOTROPIC或MM_ANISOTROPIC映射模式后,你必须调用CDC:SetWindowExt()函数,这个函数用来计算老的或默认的坐标系中一个单位的长度。这个函数有两个版本:

CSize SetWindowExt(int cx, int cy);
CSize SetWindowExt(SIZE size);

调用SetWindowExt()函数后,紧接着应调用SetViewportExt()函数,它的任务是规定水平及垂直坐标轴的单位。我们可以这样认为,SetWindowExt()函数对应着“窗口”,SetViewportExt()函数对应着“视口”。SetViewportExt()函数有两个版本:

CSize SetViewportExt(int cx, int cy);
CSize SetViewportExt(SIZE size);

 
  上述两个函数中的参数与“窗口”中的尺寸是相互对应的,它的单位是像素。为了进一步说明这两个函数的使用,我对这两个函数进行了重新说明:
 
SetWindowExt(int Lwidth, int Lheight) //参数的单位为逻辑单位(Logical);
SetViewportExt(int Pwidth, int Pheight) //参数的单位为像素(Pixel);

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值