您的位置:首页 > 其它

vc 画图与打印 学习笔记

2006-12-18 20:38 211 查看
//得到显示分辨率
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);
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: