阅读:1931回复:4
Delphi 用位图生成自定义符号
<P>很多用 delphi 开发 GIS 的朋友 应该都曾经想到过 在动态图层中使用bmp等格式的图片来代表GPS设备(如汽车)</P>
<P>但是看了 MO的帮助发现是VB的代码 都注意到这行代码 Implements AFCustom.ICustomMarker 但是仍然不知道如何下手 </P> <P>其实这用到了MO的接口 需要 uses AFCustom_TLB 单元</P> <P>如果没有找到 可以Import Type Library 位置 C:\Program Files\Common Files\ESRI AFCust20.tlb 然后 Create Unit 就OK了</P> <P>对接口不了解的弟兄 需要知道 接口是只声明 而不给出具体功能实现的 ,想实现接口必须借助具体的类</P> <P>所以我们要定义一个类来实现这个接口</P> <P>uses AFCustom_TLBtype type TBmpCM=class(TInterfacedObject,ICustomMarker) private picname : string; function SetupDC(hDC: Integer; dpi: Double; const pBaseSym: IDispatch): HResult; stdcall; function ResetDC(hDC: Integer): HResult; stdcall; function Draw(hDC: Integer; x: Integer; y: Integer): HResult; stdcall; end;</P> <P>function TBmpCM.Draw(hDC: Integer; x: Integer; y: Integer): HResult; stdcall; var cnvCanvas : TCanvas; begin cnvCanvas := TCanvas.Create; cnvCanvas.Handle := hDC; cnvCanvas.Brush.Style := bsSolid ; cnvCanvas.BrushCopy( Rect( X - intSize, Y - intSize, X + intSize, Y + intSize ), bmpBitmap , Rect( 0, 0, bmpBitmap.Width, bmpBitmap.Height ), clWhite ); cnvCanvas.Free; Result := 0; end;</P> <P>function TBmpCM.ResetDC(hDC: Integer): HResult; stdcall; begin bmpBitmap.Free; Result := 0; end;</P> <P>function TBmpCM.SetupDC(hDC: Integer; dpi: Double; const pBaseSym: IDispatch): HResult; stdcall; begin intSize := Variant( pBaseSym ).Size; bmpBitmap := TBitmap.Create; bmpBitmap.LoadFromFile(picname); Result := 0; end;</P> <P>使用的时候 var bcm : TBmpCM; s : ICustomMarker; begin bcm := TBmpCM.Create; bcm.picname := 'c:\\1.bmp'; s := ICustomMarker(bcm) ; map1.TrackingLayer.Symbol[0].Custom := s ; map1.TrackingLayer.Symbol[0].Size := 12; end; </P> |
|
1楼#
发布于:2004-09-16 15:47
<img src="images/post/smile/dvbbs/em01.gif" /><img src="images/post/smile/dvbbs/em01.gif" />
|
|
|
2楼#
发布于:2004-09-16 16:17
<P>谢谢楼上大哥的支持
Shift + Enter 不小心 按成了 Ctrl + Enter 回车换行的时候 不小心把帖子发了 呵呵</P><P>补充一句 最后退出系统的时候 不要忘记 释放分配的资源 bcm.free;</P> |
|
3楼#
发布于:2005-01-19 11:54
老兄,我拿什么感谢你啊。你真是个好人
|
|
4楼#
发布于:2005-01-20 11:25
有例子可以看得
|
|
|