位图 矢量图 计算机图像
二磐÷≮。,;,。≯i≥。≯、’‘争∥臻囊镒誉警整纂_
霎酩躅像囊蛩翟;
”.,
一.:■
、,
,,S
-r
‘
r、+‘。ph、~
”
,
‘jj!+~二…….÷:i、“。x_:。
_
‘
G疑Ap娃ieS虿I:
¨.
G辍ApHlCS
的成员变量bb,在0nDmw()中实现绘图。主要代码为:
pDC一>SetMapMode(MM上OMETRIC):
CRectrectl:
BEGIN—MESSAGE—MAP(CRadarVlew,CScro||View)
//设置映射模式
//ffAF)<—MSG—MAP(CRadarVjew)
ON上OMMAND《lD-FILE-PRINT.OnF¨e刚nt)ON工OMMAND(1D.FILE_PRlNT—PREVIEW,
view)
rectl=bb.m上itRect;
pDC一>LPtoDP(&rectl):
CSizesize(rectl.Width(),一rectl.Height()):
On剐e刚ntPre—
州m』BjtmapIsNone==true)//如果位图未创建则创建位图
(
//))AFX_MSG』AP
//Standardprintingcommands
//ONjOMMAND(1D-FILE_PRINT,CScro||View::0n—
Fi|ePrint)
//创建空位图
bb.CreateBitmapE×(size)://仓l建位图
CBrushbrush:
brush.CreateSoIidBrush(m—BkColor):
bb
ON』OMMAND(ID_FlLE_PRINT上lRECT,CSc删View::On一
剐ePrjnt)
GetDC()一>F…Rect(CRect(0,0.size.c×,
//ON』OMMAND(ID_FILE_PRINT.PREVlEW,
1Vlew::OnFilePrintPreview)
CScro|.
size.cy),&brush)://为位图//设置背景
bb.GetDC()一>SetMapMode(MM-LOMETRJC):CPenPen(NULL1,m—yvaveCoJor):bb.GetDC()一>SelectObiect(&Pen):
END—MESSAGE—MAP()
填充0nFile蹦nt()和OnFile蹦ntPrevjew()函数以实现打印
预览和打印:
vojdCRadarVjew::OnFjIePrjntf){
CScro||View::OnFi|ePrint():
)
voidCRadarView::OnFiIePrintPreview(){
CScro||View::OnFiIePr.ntPreview():
)
//自画位图
switch(m_para.m_page4.m』ispIaySefect)
{
case
0:
1:2:
ShowWave(bb.GetDC()):break;//画波形图
casecase
ShowGrav(bb.GetDC()):break://画画灰度图
ShowColor(bb.GetDC()):break://画伪彩色图
)
{
{
重载0n蹦nt()函数实现位图的打印:
vojdCRadarVjew::OnPr|nt{CDC丰pDC,CPrintInfo爿=pInfo)
.f(!m上BitmaplsNone)
pDC一>SetMapMode(MM_LOMETRIC):
bb.Print(pDC):
bb.PrepareBitmap():
m_bBitmapIsNone=faIse://位图完成则不再创建
}
//设置打印机设备环境的映射模式
)
CScro|IVIew::OnPrint(pDC.pInfo):)
//粘贴位图到视图区
CDCdcComp:
dcComp.CreateCompatibleDC(pDC);
dcComp.SeIectObject(&bb):
//drawbitmaD
pDC一>DPtoLP(&rect2):
’
CRectrect2(O.O.bb.m—yv{dth.bb.m』eight):
这样,整个功能就基本实现了。大家在运行应用程序的时候就会发现,位图绘制时会稍微用一点时间,这个时间跟直接在0nDraw()下初始绘图的时间是几乎一样的。但是,当我们拖动滑块时,我们会发现,图像就象在平滑移动,丝毫没有滞留不动
0n—
pDC一>StretchBIt(O,0,rect2.Widthf).rect2.Height(),&
dcCOmp,
0,0,size.cx,size.cv,SRCCOPY):
4.实现图像的保存。在视图类中添加成员函数voidlmagesave()用来保存图像。代码为:
CStrinqSaveF¨e:
CfiIeDiaIog
0FN
的感觉,更不会有在onDraw()下绘图时重新绘制的现象,预览速度和打印速度也比直接利用0nDmw()的设备环境绘图要快得多,这是因为图像已经在位图中绘制好了的缘故。
dIg(faIse.“}”,”m.bmp。.
OFNOVERWRlTEPROMPT,”
data
HIDEREADONLY
三、结论
本方法利用位图设备环境,能在位图中自由绘制自己的图像,尤其是大数据量的计算绘图,在拖动时能快速地实现显示、预览和打印,特别解决了利用setPixelV()函数绘制的灰度和伪彩色图像的保存和打印(这在onDraw()下直接绘制并利用缺省打印是不能实现的)问题。
(收稿日期:2004年4月25日)
FiIes({.bmp)I{.bmpII。):
if(!m—bBitmapIsNone){}f(dIg.DoModaI()==IDOK)f
SaveFiIe=dlg.GetPathName():
bb
SaveBhmap(SaveF¨e);
)
}
5.在视图中实现打印。在视类执行文件中注释掉缺省的ID-FILE_PRINT和ID-FILE』RINTjREVIEw命令处理函数并使用CIasswizard来添加自己的命令处理函数。
2004.6
技鹰与肇护≯‰曛万方数据
;:蠢冀差辫{氅繁警蒜霾毯笺缀帮