IViewObjectExImpl 类

此类实现 IUnknown 并提供 IViewObjectIViewObject2IViewObjectEx 接口的默认实现。

重要

无法在 Windows 运行时中执行的应用程序中使用此类及其成员。

语法

template<class T>
class ATL_NO_VTABLE IViewObjectExImpl
   : public IViewObjectEx

参数

T
你的类,派生自 IViewObjectExImpl

成员

公共方法

名称 描述
IViewObjectExImpl::Draw 将控件的表示形式绘制到设备上下文中。
IViewObjectExImpl::Freeze 冻结所绘制的控件表示形式,使其不会更改,直到 Unfreeze。 ATL 实现返回 E_NOTIMPL。
IViewObjectExImpl::GetAdvise 检索控件上的现有建议接收器连接(如果有)。
IViewObjectExImpl::GetColorSet 返回控件用于绘图的逻辑调色板。 ATL 实现返回 E_NOTIMPL。
IViewObjectExImpl::GetExtent 从控件类数据成员 CComControlBase::m_sizeExtent 检索控件的显示大小(以 HIMETRIC 为单位,每单位 0.01 毫米)。
IViewObjectExImpl::GetNaturalExtent 从容器中提供对象的大小调整提示,供用户在调整对象大小时使用。
IViewObjectExImpl::GetRect 返回描述所请求的绘图方位的矩形。 ATL 实现返回 E_NOTIMPL。
IViewObjectExImpl::GetViewStatus 返回有关对象的不透明度和所支持的绘图方位的信息。
IViewObjectExImpl::QueryHitPoint 检查指定的点是否位于指定的矩形中并在 pHitResult 中返回 HITRESULT 值。
IViewObjectExImpl::QueryHitRect 检查控件的显示矩形是否与指定位置矩形中的任何点重叠,并在 pHitResult 中返回 HITRESULT 值。
IViewObjectExImpl::SetAdvise 设置控件与建议接收器之间的连接,以便接收器可以接收控件视图中的更改通知。
IViewObjectExImpl::Unfreeze 取消冻结绘制的控件表示形式。 ATL 实现返回 E_NOTIMPL。

注解

IViewObjectIViewObject2IViewObjectEx 接口使控件能够直接自我显示,并创建和管理建议接收器,以通知容器控件显示中的更改。 IViewObjectEx 接口支持扩展控件功能,如无闪烁绘图、非矩形控件和透明控件,以及点击测试(例如,必须考虑鼠标点击控件的距离)。 类 IViewObjectExImpl 提供这些接口的默认实现,并通过在调试版本中将信息发送到转储设备来实现 IUnknown

继承层次结构

IViewObjectEx

IViewObjectExImpl

要求

标头:atlctl.h

IViewObjectExImpl::Draw

将控件的表示形式绘制到设备上下文中。

STDMETHOD(Draw)(
    DWORD dwDrawAspect,
    LONG lindex,
    void* pvAspect,
    DVTARGETDEVICE* ptd,
    HDC hicTargetDev,
    LPCRECTL prcBounds,
    LPCRECTL prcWBounds,
    BOOL(_stdcall* /* pfnContinue*/) (DWORD_PTR dwContinue),
    DWORD_PTR /* dwContinue */);

备注

此方法调用 CComControl::OnDrawAdvanced,其反过来调用控件类的 OnDraw 方法。 当你使用 ATL 控件向导创建控件时,系统会自动将 OnDraw 方法添加到控件类。 向导的默认 OnDraw 会绘制一个带有标签“ATL 3.0”的矩形。

请参阅 Windows SDK 中的 IViewObject::Draw

IViewObjectExImpl::Freeze

冻结所绘制的控件表示形式,使其不会更改,直到 Unfreeze。 ATL 实现返回 E_NOTIMPL。

STDMETHOD(Freeze)(
    DWORD /* dwAspect */,
    LONG /* lindex */,
    void* /* pvAspect */,
    DWORD* /* pdwFreeze */);

注解

请参阅 Windows SDK 中的 IViewObject::Freeze

IViewObjectExImpl::GetAdvise

检索控件上的现有建议接收器连接(如果有)。

STDMETHOD(GetAdvise)(
    DWORD* /* pAspects */,
    DWORD* /* pAdvf */,
    IAdviseSink** /* ppAdvSink */);

注解

建议接收器存储在控件类数据成员 CComControlBase::m_spAdviseSink中。

请参阅 Windows SDK 中的 IViewObject::GetAdvise

IViewObjectExImpl::GetColorSet

返回控件用于绘图的逻辑调色板。 ATL 实现返回 E_NOTIMPL。

STDMETHOD(GetColorSet)(
    DWORD /* dwAspect */,
    LONG /* lindex */,
    void* /* pvAspect */,
    DVTARGETDEVICE* /* ptd */,
    HDC /* hicTargetDevice */,
    LOGPALETTE** /* ppColorSet */);

备注

请参阅 Windows SDK 中的 IViewObject::GetColorSet

IViewObjectExImpl::GetExtent

从控件类数据成员 CComControlBase::m_sizeExtent 检索控件的显示大小(以 HIMETRIC 为单位,每单位 0.01 毫米)。

STDMETHOD(GetExtent)(
    DWORD /* dwDrawAspect */,
    LONG /* lindex */,
    DVTARGETDEVICE* /* ptd */,
    LPSIZEL* lpsizel);

注解

请参阅 Windows SDK 中的 IViewObject2::GetExtent

IViewObjectExImpl::GetNaturalExtent

从容器中提供对象的大小调整提示,供用户在调整对象大小时使用。

STDMETHOD(GetNaturalExtent)(
    DWORD dwAspect,
    LONG /* lindex */,
    DVTARGETDEVICE* /* ptd */,
    HDC /* hicTargetDevice */,
    DVEXTENTINFO* pExtentInfo,
    LPSIZEL psizel);

备注

如果 dwAspect 是 DVASPECT_CONTENT 且 pExtentInfo-dwExtentMode> 是DVEXTENT_CONTENT,则将 * psizel 设置为控件类的数据成员 CComControlBase::m_sizeNatural。 否则,返回错误 HRESULT。

请参阅 Windows SDK 中的 IViewObjectEx::GetNaturalExtent

IViewObjectExImpl::GetRect

返回描述所请求的绘图方位的矩形。 ATL 实现返回 E_NOTIMPL。

STDMETHOD(GetRect)(DWORD /* dwAspect */, LPRECTL /* pRect */);

注解

请参阅 Windows SDK 中的 IViewObjectEx::GetRect

IViewObjectExImpl::GetViewStatus

返回有关对象的不透明度和所支持的绘图方位的信息。

STDMETHOD(GetViewStatus)(DWORD* pdwStatus);

备注

默认情况下,ATL 设置 pdwStatus 为指示控件支持 VIEWSTATUS_OPAQUE(可能的值位于 VIEWSTATUS 枚举)中。

请参阅 Windows SDK 中的 IViewObjectEx::GetViewStatus

IViewObjectExImpl::QueryHitPoint

检查指定的点是否位于指定的矩形中并在 pHitResult 中返回 HITRESULT 值。

STDMETHOD(QueryHitPoint)(
    DWORD dwAspect,
    LPCRECT pRectBounds,
    POINT ptlLoc,
    LONG /* lCloseHit */,
    DWORD* /* pHitResult */);

备注

该值可以是 HITRESULT_HIT 或 HITRESULT_OUTSIDE。

如果 dwAspect 等于 DVASPECT_CONTENT,该方法将返回 S_OK。 否则,该方法将返回 E_FAIL。

请参阅 Windows SDK 中的 IViewObjectEx::QueryHitPoint

IViewObjectExImpl::QueryHitRect

检查控件的显示矩形是否与指定位置矩形中的任何点重叠,并在 pHitResult 中返回 HITRESULT 值。

STDMETHOD(QueryHitRect)(
    DWORD dwAspect,
    LPCRECT pRectBounds,
    LPRECT prcLoc,
    LONG /* lCloseHit */,
    DWORD* /* pHitResult */);

备注

该值可以是 HITRESULT_HIT 或 HITRESULT_OUTSIDE。

如果 dwAspect 等于 DVASPECT_CONTENT,该方法将返回 S_OK。 否则,该方法将返回 E_FAIL。

请参阅 Windows SDK 中的 IViewObjectEx::QueryHitRect

IViewObjectExImpl::SetAdvise

设置控件与建议接收器之间的连接,以便接收器可以接收控件视图中的更改通知。

STDMETHOD(SetAdvise)(
    DWORD /* aspects */,
    DWORD /* advf */,
    IAdviseSink* pAdvSink);

备注

指向建议接收器上 IAdviseSink 接口的指针存储在控件类数据成员 CComControlBase::m_spAdviseSink 中。

请参阅 Windows SDK 中的 IViewObject::SetAdvise

IViewObjectExImpl::Unfreeze

取消冻结绘制的控件表示形式。 ATL 实现返回 E_NOTIMPL。

STDMETHOD(Unfreeze)(DWORD /* dwFreeze */);

备注

请参阅 Windows SDK 中的 IViewObject::Unfreeze

IWorkerThreadClient::CloseHandle

实现此方法以关闭与此对象关联的句柄。

HRESULT CloseHandle(HANDLE hHandle);

参数

hHandle
要关闭的句柄。

返回值

如果成功,则返回 S_OK;否则返回错误 HRESULT。

备注

传递给此方法的句柄以前是通过调用 CWorkerThread::AddHandle 与此对象关联。

示例

以下代码演示了一个简单的 IWorkerThreadClient::CloseHandle 实现。

HRESULT CloseHandle(HANDLE hObject)
{
   // Users should do any shutdown operation required here.
   // Generally, this means just closing the handle.

   if (!::CloseHandle(hObject))
   {
      // Closing the handle failed for some reason.
      return AtlHresultFromLastError();
   }

   return S_OK;
}

IWorkerThreadClient::Execute

实现此方法可在与此对象关联的句柄发出信号时执行代码。

HRESULT Execute(DWORD_PTR dwParam, HANDLE hObject);

参数

dwParam
用户参数。

hObject
已发出信号的句柄。

返回值

如果成功,则返回 S_OK;否则返回错误 HRESULT。

注解

传递给此方法的句柄和 DWORD/指针以前是通过调用 CWorkerThread::AddHandle 与此对象关联。

示例

以下代码演示了一个简单的 IWorkerThreadClient::Execute 实现。

HRESULT Execute(DWORD_PTR dwParam, HANDLE hObject)
{
   // Cast the parameter to its known type.
   LONG* pn = reinterpret_cast<LONG*>(dwParam);

   // Increment the LONG.
   LONG n = InterlockedIncrement(pn);

   // Log the results.
   printf_s("Handle 0x%08X incremented value to : %d\n", (DWORD_PTR)hObject, n);

   return S_OK;
}

另请参阅

CComControl 类
ActiveX 控件接口
教程
创建 ATL 项目
类概述