9:05 2009-7-21
2009年7月22日中国几个城市所见日全食预报(北京时间)
地名 初亏 全食始 食甚 全食终 复圆
上海 8:23:25 9:36:44 9:39:16 9:41:49 11:01:36
[单词]
auditors 审计员
National auditors 审计员 express 表示 concern over 使关心 dam project
hydropower 水力发出的电力
controversial 有争议的
in response to对。。做出反应
quickened 苏醒
budget 预算
alleged 声称 illegal 不合法的
Gorges Dam山峡大坝
overrated 对估价过高
exaggerated 夸大的
Construction 建筑
rare fish species 稀有鱼类
extraordinarily格外的
[VC++ 孙鑫]
1.源文件.cpp 头文件.h
在源文件中对初始变量进行赋值
动态存储,列表实现
容量动态增加,
集合类:CPtrArray,成员函数与COBArray类型,add 增加,getat取出元素,
add,
cptrArray,参数增加一个指针,
在onDraw函数中,将集合类函数的图像取出来,
用for循环将图像取出来,
2.在图像尺寸变化时,图像还是消失的原因,
=ondraw函数中,图像没有取出来
=保存图形元素时,出问题了,在onlbuttonup时,CGraph,局部对象,不存在了,
局部对象,分配的内在地址是该对象内部的地址,,在加载(add)后,保存的时候,CGrah对象的内存地址,
对尺寸变化后,虽然只保存了对象的内存地址,但局部对象内存没有了,
解决,1.CPtrArray m_ptrArray
2.CGraph *pGraph;
3.pGraph=new CGraph(...);
用new分配的内存都是在堆中分配的,但局部对象的内存是在栈中分配的,
将在堆中的地址赋给,pgrah,,
4.加载(add)m_ptrArray.add(pGraph)
在堆中分配的内存,如果不显式的释放,它的生命周期,会和应用程序一样长,
执行完之后,pGraph是局部变量 ,所以它的内存消失,但是因为堆内存地址仍在,可以索引到
eg:CGraph *pGraph=new CGraph(m_nDrawType,m_ptOrigin ,point);
m_ptArray.Add(pGraph);
3.ondraw()函数为什么在重绘过程中,没调用 ,
找到src下的viewcore.cpp,在onpaint()函数中调用了,
cpaintDC ,从CDC派生的设备上下文,在构造时调用了,beginPaint获得句柄,在析构时,调用了endpaint,释放DC
CPaintDc对象 只能在响应wm_paint消息时,被使用,通常在onPaint消息响应函数中
ClientDC对象 表示客户窗口区域的设备上下文一起工作, 在构造的时候调用GetDC,析构的时候,调用 ReleaseDC
OnPreareDC 虚函数,在未屏幕显示而调用ondraw之前,在打印和打印预览过程中为每一页调用OnPrint成员函数之前 被框架调用,
如果函数为屏幕显示而被调用,缺省什么也不做,
在派生类中,被覆盖,如CScrollView,调整设备上下文的属性,
onDraw 虚函数,会引起子类中的ondraw调用,
4.增加wm_paint消息,对
5.加滚动条,把CView替换CScrollView,要加一些设置,比如流动多少行,
成员函数,setscrollsizes nMapMode,映射方式,
coordinate spaces and transformations.坐标空间和转换,zoom,
api,使用四种坐标空间,世界坐标系空间,页面空间,设备空间,物理设备空间,
应用程序用世界坐标系统空间对图形输出地旋转,反射,
api把世界坐标空间和页面空间称为逻辑空间,
物理设备空间指应用程序窗口的客户区,但也包括整个桌面,完整的窗口(框架,标题栏,菜单栏)打印机的一面,
物理设备的尺寸随显示器,打印机。绘图仪所设备的尺寸变化而变化
转换
在物理设备上绘制输出 ,把一个矩形从一个坐标空间拷贝(映射)到另一坐标空间,直至最终完整的输出呈现在物理设备上
如果应用程序调用了setworldtransform函数,那映射从应用程序的世界坐标系空间开始,否则,映射在页面空间进行
在windows把矩形区域的每一点从一个空间拷贝到另一个空间,采用了一种被称作转换的算法,
什么是转换:
转换是把对象从一个坐标空间拷贝到另一个坐标空间时改变这一对象的大小,方位 和形态,尽管转换把对象看成一个整体,
但它也作用于对象中的每一点,每条线,
=典型转换
世界坐标系统空间--》页面空间--》设备空间(左上角为0,0)--》物理设备
页面空间到设备空间的转换是原windows接品的一部分,这种转换确定与一特定设备描述表相关的所有图形输出的
映射方式
什么是映射方式:
确定用于绘图操作的单位大小的一种量度转换,映射方式是一种影响几乎任何客户区绘图的设备环境 属性,
四种设备环境属性
窗口原点,视口原点,窗口范围和视品范围,
四种属性与设备密切相关
页面空间到设备空间的转换
用的是两个矩形的宽与高的比率,页面空间中的矩形被称为窗口,设备空间中的矩形被称为视口
windows把窗口原点映射到视口原点,把窗口范围映射到视口范围,就完成了转换
设备空间到物理空间的转换
只限于平殉,并由windows的窗口管理部分控制,
唯一用途:确保设备空间的原点被映射到物理设备上的适当点上,
默认转换
一旦应用程序建立设备描述表,并立即开始调用GDI绘图或输出函数,则运用默认页面空间到设备空间的转换
和设备空间到客户区的转换同,(在应用程序调用setworldtransform函数之前,不会出现世界坐标空间到页面空间的转换)
默认页面空间到设备空间的转换结果是一对一的映射 ,即页面空间上给出的一点映射到设备空间的一个点
把视口宽除以窗口宽,视口高除以窗口高,
默认转换独特之处:设备空间和应用程序的y轴方向,默认状态下,y轴正向朝下,负Y轴方向朝上,
=GetDeviceCaps()获取关于显示设备的一个宽 范围的信息
逻辑坐标和设备坐标
GDI函数使用的坐标值采用逻辑单位,windows必须将逻辑单位转换为设备单位,即像素,
这种转换由映射方式,窗口和视口的原眯以及窗口和视品的范围所控制
windows对所有的消息(如WM_SIZE,wm-mousemove),非GDI函数,和一些GDI函数(如getdevicecaps函数),永远使用设备坐标
窗口是基于逻辑坐标的,逻辑坐标可以是象素,MM,inch,
视口是基于设备坐标(象素)的,
视口和客户区是相同的,
缺省的映射模式为MM_TEXT,逻辑单位和设备单位相同
6.逻辑坐标和设备坐标的相互转换公式
窗口(逻辑)坐标转换为视口(设备)坐标的两个公式
xViewPort=(xWindows-xWinOrg)*xViewExt/xWinExt+xViewOrg
yViewPort=(yWindows-yWinOrg)*yViewExt/yWinExt+yViewOrg
视口(设备)坐标转换为窗口(逻辑)坐标的两个公式
xWindows=(xViewPort-xViewOrg)*xWinExt/xViewExt+xWinOrg
yWindows=(yViewPort-yViewOrg)*yWinExt/yViewExt+yWinOrg
在MM_TEXT映射方式下逻辑坐标和设备坐标的相互转换
窗口(逻辑)坐标转换为视口(设备)坐标的两个公式
xViewPort=xWindow-xWinOrg+xViewOrg
视口(设备)坐标转换为窗口(逻辑)坐标的两个公式
yWindows=yViewPort-yViewOrg+yWinOrg
7.OnInitialUpdate,在第一个文档和第一个视图关联之后,被调用,在ondraw()之前
是窗口创建完成后,第一个被调用的函数
可以做一些初始化工作,切换窗口,下面所画的线条,跑到上面去了原因,
拖动滚动栏,再画线,
因为做图的时候,是用的逻辑坐标 ,在OnPaint()中,有一个OnPrepareDc(&dc),
找到,viewScroll.cpp文件,找到onPrepareDc文件,执行缺省设置模式,
判断是否在打印中,如果不是,调用getdevicescroolposition将返回值加负号,得到点,
调用setviewportorg,设置视口原点,而视口原点可以被改变,
8.视口和窗口原点的改变
CDC中提供了两个成员函数setviewportorg和setWindowOrg,用来改变视品和窗口的原点
如果将视口原点设置为(xViewOrg,yViewOrg),则逻辑点(0,0)就会被映射为设备点(xViewOrg,yViewOrg)
如果将窗口原点改变为(xWinOrg,yWinOrg),刚逻辑点(xWinOrg,yWinOrg)将会被映射为设备点(0,0),即左上角,
不管对窗口和视口原点做什么改变,设备点(0,0)始终是客户区的左上角,
关于图形错位的说明,
在调用ondraw函数前,在OnPaint函数中调用了OnPrepareDC函数,调整了显示上下文的属性,将视口的原点设置为了(0,-150)
在画线的时候,GDI函数使用的是逻辑坐标,在图形显示的时候,widows需要将逻辑坐标转为设备坐标
9.
第一次画线的时候,是在onlbuttonUP函数中,没有调用调用onprepareDC,,视口原来和窗口原点都没有改变,
当窗口发生重绘时,调用onprepareDC,原点改变,
关于解决方法的说明
在绘制图形之后,保存坐标点之前,调用OnPreapreDC函数,调整显示上下文属性,将视口的原点设置为
(0,-150),之样,窗口的原点,也被映射为(0,-150),调用DPtoLP函数将设备坐标(680.390)转为逻辑坐标,
680+-0+0=680 390-(-150)+0=540,将(680.540)保存,在窗口重绘时,先调用OnPreapreDC函数,调整显示
上下文属性,将视口的原点设为(0,-150),然后GDI函数用逻辑坐标(680,540)绘制,被windows转换为设备坐标
点(680,390),和原来图形位置一样,
OnPrepareDC(&dc);
dc.DPtoLP(&m_ptOrigin);
dc.DPtoLP(&point);
10.OnPrepareDC会随时根据滚动窗口的位置来调整视口的原点,
11.CMetaFileDC
CMetaFileDC::Create,
参数:为创建的源文件指定一个文件名,如果为NULL,为内存源文件,
当窗口重绘的时候,关闭源文件,或源文件的句柄
CMetaFileDC::Close,返回源文件的句柄
playmetafile(源文件句柄),播报
再准备一个源文件的设备上下文,因为有可能继续绘制图形,,create()
如果想要保存先前绘制的图形,m_dcMetaFile.PlayMetaFile(hmetaFile);
删除源文件,deletemetafile(源文件句柄)
12.源文件保存
copymetafile.拷贝windows源文件,到指定的文件,
保存后重新创建源文件,以备下次重新绘图
直接保存在目录下,
打开,getmetaFile,为了兼容16位,32位可以用,GetEnhMetaFile
得到源文件句 柄,删除,再调用invalidate()引起窗口重绘
兼容DC,createCompatibleDC
判断是否创建 if(!m_dcCompatible.m_hDC)
兼容位图,createCmpatibleBitmap,通过宽,高,兼容,
获得当前客户区域大小,CRect rect; GetClientRect(&rect);
CBitmap bitmap;
bitmap.CreateCompatibleBitmap(&dc,rect.Width(),rect.Height());
兼容DC是内存DC,在操作过程中,是看不到的,
将兼容DC图形拷贝到目的DC中,
得到客户区域大小,用pDC->BitBlt,绘图,
createcompatiblebitmap,返回的图像只包含相应设备描述表中的位图的位图信息头,
不包含颜色和象素数据块,必须在selectobject函数之后,调用bitblt将原始设备描述表的颜色用
象素数据块拷贝到兼容设备描述表
总结:图形的保存和重绘,滚动的话,区别,坐标空间,页面(逻辑)空间到设备空间转换,
第十二章.指针类型:
1.指向常量的指针和指针常针
指向常量的指针
char ch[5]="lisi"//必须在数组定义的同时进行,因为要加一个\0,要以是5,
const char *pStr=ch //const 在char前,和后都是一样的,指向常量的指针变量,,字符数组给指针变量赋值,
数据名表示数据首地址,把数组的首地址赋给指针变量,
pStr=0088:4400//pstr指向指针常量的指针变量,不可以修改内存数据中的内容,但可以修改地址,
指向常针的指针,表示指向的对象是常量,
pStr="wangwu"//常量字符串的地址赋给pstr
2.数据一致性,
用指针传参,