mao__mao_
路人甲
路人甲
  • 注册日期2004-09-19
  • 发帖数41
  • QQ
  • 铜币219枚
  • 威望0点
  • 贡献值0点
  • 银元0个
阅读:3667回复:17

Mo,VB转VC关于Renderer

楼主#
更多 发布于:2004-09-20 14:46
<P>我想把一段VB程序翻译成VC程序,翻译下段时遇到问题</P>
<P>Dim lyr As MapObjects2.MapLayer</P>
<P>.......</P>
<P>  Select Case True
    Case lyr.Renderer Is Nothing
      ......
    Case TypeOf lyr.Renderer Is MapObjects2.ValueMapRenderer
      .......
    Case TypeOf lyr.Renderer Is MapObjects2.ClassBreaksRenderer
      .......
  End Select</P>
<P>请问我在VC中怎么才能得知一个图层的Renderer是否为Nothing,如何得到一个图层Renderer的类型(例如,是ValueMapRenderer还是ClassBreaksRenderer)?</P>
<P>请多多指教,最好能给出关键代码,先行谢过!</P>
[此贴子已经被作者于2004-9-20 14:49:03编辑过]
喜欢0 评分0
mao__mao_
路人甲
路人甲
  • 注册日期2004-09-19
  • 发帖数41
  • QQ
  • 铜币219枚
  • 威望0点
  • 贡献值0点
  • 银元0个
1楼#
发布于:2004-09-22 09:45
<P>自己顶一下</P><img src="images/post/smile/dvbbs/em15.gif" />
举报 回复(0) 喜欢(0)     评分
gis
gis
管理员
管理员
  • 注册日期2003-07-16
  • 发帖数15951
  • QQ
  • 铜币25345枚
  • 威望15368点
  • 贡献值0点
  • 银元0个
  • GIS帝国居民
  • 帝国沙发管家
  • GIS帝国明星
  • GIS帝国铁杆
2楼#
发布于:2004-09-22 09:51
<P>很久没装mo玩了,只能帮顶下先</P><P>不知道Renderer有type属性吗?</P><P>都try一下,看看如何获得啦</P>
GIS麦田守望者,期待与您交流。
举报 回复(0) 喜欢(0)     评分
lixaokui
路人甲
路人甲
  • 注册日期2003-12-25
  • 发帖数768
  • QQ28796446
  • 铜币27枚
  • 威望0点
  • 贡献值0点
  • 银元0个
3楼#
发布于:2004-09-22 14:56
Nothing在VC中是NULL,类型在做的时候你就要自己记录了。
西门吹血,有了鼓风机,就不用吹啦!
举报 回复(0) 喜欢(0)     评分
mao__mao_
路人甲
路人甲
  • 注册日期2004-09-19
  • 发帖数41
  • QQ
  • 铜币219枚
  • 威望0点
  • 贡献值0点
  • 银元0个
4楼#
发布于:2004-09-23 10:07
<P>请楼上两位看看,程序运行时只能得到lyr,得不到Renderer的类型,所以好像无法自己记录啊。只能通过上边的语句获得吧?</P><P>我看VC中有这么一个函数lyr.GetRenderer()->GetTypeInfo(UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo)</P><P>很像是用来获得Renderer的类型的,可我弄了好长时间也没弄明白,还请高手指教。</P>
举报 回复(0) 喜欢(0)     评分
lixaokui
路人甲
路人甲
  • 注册日期2003-12-25
  • 发帖数768
  • QQ28796446
  • 铜币27枚
  • 威望0点
  • 贡献值0点
  • 银元0个
5楼#
发布于:2004-09-23 11:12
你在生成专题的时候记录啦!这个函数没用过,我也用用试试。
西门吹血,有了鼓风机,就不用吹啦!
举报 回复(0) 喜欢(0)     评分
walkly
路人甲
路人甲
  • 注册日期2004-02-08
  • 发帖数16
  • QQ
  • 铜币192枚
  • 威望0点
  • 贡献值0点
  • 银元0个
6楼#
发布于:2004-09-23 14:24
LPDISPATCH lpDisp=m_layer->GetRenderer();
HRESULT hr=lpDisp->QueryInterface(IID_GetRenderer,...);
if(SUCCEEDED(hr))
{
...
}
还是先看看COM吧
举报 回复(0) 喜欢(0)     评分
walkly
路人甲
路人甲
  • 注册日期2004-02-08
  • 发帖数16
  • QQ
  • 铜币192枚
  • 威望0点
  • 贡献值0点
  • 银元0个
7楼#
发布于:2004-09-23 14:35
如果用 pdisp->GetTypeInfoCount(;icount);得到的icount为0,这是因为该对象不提供类型信息,只能用QueryInterface的原始方法来判断.
举报 回复(0) 喜欢(0)     评分
mao__mao_
路人甲
路人甲
  • 注册日期2004-09-19
  • 发帖数41
  • QQ
  • 铜币219枚
  • 威望0点
  • 贡献值0点
  • 银元0个
8楼#
发布于:2004-09-23 15:09
<P>请楼上看一下,小弟未学过COM,VC也是刚刚起步,还请多多指教。</P><P><B>HRESULT QueryInterface(  REFIID</B><I> <a href="" target="_blank" >iid</A></I><B>,</B><B>  void </B>**<EM> </EM><a href="" target="_blank" ><EM>ppvObject</EM></A><b>);</b>函数中第二个参数是用来存放指向Renderer类型的指针吗?应该怎样定义啊?还有,是当ppvObject==NULL时对应lyr.Renderer Is Nothing吗?还是hr==E_NOINTERFACE 与之对应啊?在if语句中又是怎么样判断是什么类型的呢?</P><P>实在因为是急用,迫不得已,还烦请给出详细一点的代码。</P><P>小弟日后一定会好好看书自己得出答案的!</P>
举报 回复(0) 喜欢(0)     评分
walkly
路人甲
路人甲
  • 注册日期2004-02-08
  • 发帖数16
  • QQ
  • 铜币192枚
  • 威望0点
  • 贡献值0点
  • 银元0个
9楼#
发布于:2004-09-23 16:27
<P>#define SIMPLESYMBOL  1
#define VALUERENDERER 2
#define CLASSRENDERER 3</P><P>UINT CDrawLayer::GetRendererType()
{
 //仅列出两种易于在图例上表达的着色方法
 const IID IID_IValueMapRenderere =
 {0x9BD6A670, 0xCE75, 0x11D1,
 {0xAF, 0x04, 0x20, 0x4C, 0x4F, 0x4F, 0x50, 0x20}};</P><P> const IID IID_IClassBreaksRenderer =
 {0x9BD6A676, 0xCE75, 0x11D1,
 {0xAF, 0x04, 0x20, 0x4C, 0x4F, 0x4F, 0x50, 0x20}};</P><P> LPDISPATCH lpDisp = m_layer.GetRenderer();
 if (!lpDisp)
 {
  return SIMPLESYMBOL;
 }
 else
 {
  IUnknown* pTemp;
  LPDISPATCH pDispTemp = NULL;
  HRESULT hrValue = lpDisp->QueryInterface (IID_IValueMapRenderere,
             (void**);pTemp);
  HRESULT hrClass = lpDisp->QueryInterface (IID_IClassBreaksRenderer,
             (void**);pTemp);
  lpDisp->Release ();
  lpDisp->Release ();
  
  if (SUCCEEDED(hrValue))
  {
   return VALUERENDERER;
  }
  else if (SUCCEEDED(hrClass))
  {
   return CLASSRENDERER;
  }
  else
  {
   return SIMPLESYMBOL;
  }
 }
}</P><P>以上代码尚未编译验证;</P>
举报 回复(0) 喜欢(0)     评分
上一页
游客

返回顶部