您的位置:首页 > 其它

使用com组件快速实现批注功能

2016-06-28 17:55 477 查看

使用com组件快速实现批注功能

一、组件简介

通常情况下想要做出一个还看得过去批注可不是一件容易的事,渲染效率,笔记的连贯、圆滑都不是一件容易做到的事情。但是windows提供了一个com组件可以让你轻易的在程序里获得一个优秀的批注。

windows的批注组件涉及到两个com组件,接口都包含在头文件里rtscom.h

两个组件分别是RealTimeStylus和DynamicRenderer,从名字上可以看出一个是笔迹,一个是渲染器。

二、使用流程简介

要进行批注首先要有一个窗口,然后将创建一个RealTimeStylus对象并附加到窗口上去,此时RealTimeStylus对象就已经赋予了这个窗口用鼠标进行批注的功能,但是还需要将批注显示出来,这就需要另一个对象—DynamicRenderer,这是用来渲染笔迹的渲染器。将DynamicRenderer对象和RealTimeStylus对象关联起来,就可以开始批注了,RealTimeStylus对象负责处理批注笔迹的数据,DynamicRenderer对象负责把这些笔迹渲染出来,当然有一些选项可以让你对笔迹和渲染做一些设置,后面会讲到

三、使用详解

首先要包含rtscom.h头文件,这是com对象,初始化com环境,这就不细讲了。

笔迹对象的建立与附加

接着使用GUID创建对象然后附加到接收鼠标事件的窗口句柄上

IRealTimeStylus* m_pRealTimeStylus;
CoCreateInstance(CLSID_RealTimeStylus, NULL, CLSCTX_ALL, IID_PPV_ARGS(&m_pRealTimeStylus));
m_pRealTimeStylus->put_HWND((HANDLE_PTR)hwnd);


渲染对象的建立与附加

使用GUID创建对象然后附加到要渲染的窗口句柄上,注意这里批注的窗口和渲染的窗口可以不同,但是渲染的大小是按照批注窗口的大小来渲染的

IDynamicRenderer* m_pDynamicRenderer;
CoCreateInstance(CLSID_DynamicRenderer, NULL, CLSCTX_ALL, IID_PPV_ARGS(&m_pDynamicRenderer));
m_pDynamicRenderer->put_HWND((HANDLE_PTR)hwnd);


关联笔记对象和渲染对象,这两个对象之间的关联是通过一个插件接口实现的

IStylusSyncPlugin* pStylusSyncPlugin = NULL;
m_pDynamicRenderer->QueryInterface(&pStylusSyncPlugin);
m_pRealTimeStylus->AddStylusSyncPlugin(0, pStylusSyncPlugin);
m_pRealTimeStylus->put_Enabled(TRUE);
pStylusSyncPlugin->Release();
m_pDynamicRenderer->put_Enabled(TRUE);


IStylusSyncPlugin顾名思义是同步笔迹插件,有同步自然就有异步,这里只讲同步。使用完后遵循com对象的使用原则调用release将引用计数减1.

设置笔迹渲染的粗细与颜色

COLORREF color;
IInkDrawingAttributes* pDrawingAttributesDynamicRenderer;
m_pDynamicRenderer->get_DrawingAttributes(&pDrawingAttributesDynamicRenderer);
pDrawingAttributesDynamicRenderer->put_Color(color);
pDrawingAttributesDynamicRenderer->put_Width(200);
pDrawingAttributesDynamicRenderer->Release();


我也不知道宽度的单位是什么只能看效果再调整,200是我认为比较舒服的一个值。

设置渲染缓存,设置缓存通常是必须的,不然的话每次渲染只渲染一笔,之前的笔迹全没了,当然如果你就是要这种效果就当我没说

m_pDynamicRenderer->put_DataCacheEnabled(true);


渲染以及重画,渲染是再每次进行批注后自动的,但是当窗口的内容刷新(例如处理WM_PAINT后)以后批注笔迹就会消失,此时需要重绘,使用Draw并传入DC来重绘笔迹内容。

m_pDynamicRenderer->Draw(reinterpret_cast<HANDLE_PTR>(hdc));


四、总结

此篇文章只是对windows的批注对象做一个基本的入门介绍,我自己对此方面内容也只是浅尝辄止,还有很多高级的用法和选项,例如多点触控、获取笔迹数据等,具体可以再微软的官方实例和msdn中查询。

如有发现错误的地方,欢迎指正。如果有什么疑问也希望大家多多交流。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  windows 批注