如何用 atl 创建 activex 控件

如何用 atl 创建 activex 控件,第1张

如何用ATL创建ActiveX控件

实现了一个ActiveX控件,它在一个圆内部有个正多边形,当用户在多变形内部单击将会使多边形的边数在当前的基础上+1,在多变形外部单击将会使多边形的边数在当前的基础上-1,并能改变多边形的颜色.最后举了两个例子说明了如何使用这个刚刚生产得控件.一个是把该控件应用到网页中,一个则是用于一个基于对话框的程序中.详细代码请下载压缩包.

(一) 创建工程

(1) 打开VC6集成开发环境,按新建按钮,选择PROJECT标签。

(2) 选择ATL COM AppWizard。

(3) 在右侧Project Name下面的空白处输入"Polygon"。

按下OK按钮,ATL COM AppWizard将生成一系列的文件,现在描述如下:

Polygon.cpp:

包含了DllMain,DllCanUnloadNow, DllGetClassObject,DllRegisterServer,DllUnregisterServer的实现,

同时它也包含object map:

BEGIN_OBJECT_MAP(ObjectMap)

//这里将列出你的工程中将会用到的ATL对象,这里最初为空,

//因为我们目前还没有创建新的ATL对象

END_OBJECT_MAP()

Polygon.def DLL便准模块定义文件

Polygon.dsw 项目工作区文档

Polygon.dsp 项目设置文档

Polygon.idl 接口定义语言文件, 它详细的描述了您的工程中所有的接口

Polygon.rc 资源文件, 它包含了版本信息和工程名称字符串

Resource.h 资源文件的头文件

Polygonps.mk 这个就是make file,它能被用来创建代理存根DLL

Polygonps.def 代理存根DLL的模块定义文件

StdAfx.cpp 此文件包含ATL的执行档

StdAfx.h 此文件包含ATL的头文件

为了使它(Polygon DLL)变得有用,我们需要用ATL Object Wizard给它添加一个控件(control)。

你好~

默认情况下,ATL ActiveX 控件不支持工具提示。一些容器如 Microsoft Visual Basic 将工具提示添加为该 ActiveX 控件的扩展的控件属性 (工具提示文字)。但是,并不是所有的容器具有此功能。如果您想要支持多个容器中的工具提示,您需要亲自到 ATL ActiveX 控件添加工具提示的支持。这篇文章演示了如何添加到 ATL ActiveX 控件的工具提示的支持。

以下是三种方法来添加到 ATL ActiveX 控件的工具提示的支持。

使用工具提示 windows 公共控件。

使用 MFC 的CToolTipCtrl类。

使用 ATLCON 示例中的CToolTipCtrl ATL 类。

使用工具提示 windows 公共控件

将变量添加到 ATL 控件类的类型 cwindow 外。

CWindow m_wndToolTip

Stdafx.h 文件中包含 Commctrl.h。(包括 Afxcmn.h 如果应用程序支持的 MFC)。

#include <commctrl.h>

重写InplaceActive方法,然后添加以下代码以创建工具提示控件。

HRESULT InPlaceActivate(LONG iVerb, const RECT* prcPosRect=NULL)

{

HRESULT hr

hr = CComControlBase::InPlaceActivate(iVerb, prcPosRect)

if (m_wndToolTip.m_hWnd == NULL)

{

// If we're windowless we still need an HWND

if (m_bWndLess)

{

HDC hDC

// Get the HDC from the client

m_spInPlaceSite->GetDC(NULL, OLEDC_NODRAW, &hDC)

m_hTheWnd = WindowFromDC(hDC)

m_spInPlaceSite->ReleaseDC(hDC)

}

else

m_hTheWnd = m_hWnd

//Load the Common control library and create tooltip control

InitCommonControls()

m_wndToolTip.m_hWnd =

::CreateWindow(TOOLTIPS_CLASS, (LPTSTR)NULL, TTS_ALWAYSTIP,

CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,

NULL, (HMENU) NULL, _Module.GetModuleInstance(), NULL)

// Ensure the tooltip always appears above our window

::SetWindowPos(m_wndToolTip.m_hWnd, HWND_TOPMOST,0,0,0,0,

SWP_NOACTIVATE|SWP_NOMOVE|SWP_NOREDRAW|SWP_NOSIZE)

TOOLINFO    ti

ti.cbSize = sizeof(TOOLINFO)

ti.uFlags = 0

ti.hwnd   = m_hTheWnd

ti.uId    = 1

ti.hinst  = NULL

ti.lpszText = m_bWndLess ? ti.lpszText = _T("My Windowless Tip") : ti.lpszText = _T("My Windowed Tip")

m_wndToolTip.SendMessage(TTM_ADDTOOL, 0, (LPARAM)&ti)

}

return hr

}

创建变量m_hTheWnd类型的 HWND 的控件类中,然后向该控件的类为 WM_LBUTTONDOWN 和 WM_MOUSEMOVE 创建处理程序。中继到工具提示控件相应的消息。该代码示例所示:

void RelayEvent(UINT message, WPARAM wParam, LPARAM lParam)

{

if (NULL != m_wndToolTip.m_hWnd)

{

MSG msg

msg.hwnd= m_hTheWnd

msg.message= message

msg.wParam= wParam

msg.lParam= lParam

msg.time= 0

msg.pt.x= LOWORD (lParam)

msg.pt.y= HIWORD (lParam)

::SendMessage(m_wndToolTip.m_hWnd, TTM_RELAYEVENT, 0, (LPARAM)&msg)

}

}

LRESULT OnLButtonDown(UINT uMsg, WPARAM wParam, LPARAM lParam,BOOL bHandled)

{

bHandled = FALSE

RelayEvent(uMsg, (WPARAM)wParam,MAKELPARAM(LOWORD(lParam), HIWORD(lParam)))

return 0L

}

LRESULT OnMouseMove(UINT uMsg, WPARAM wParam, LPARAM lParam,BOOL&bHandled)

{

if (m_wndToolTip.m_hWnd)

{

POINT pt

static uId

pt.x = LOWORD(lParam)

pt.y = HIWORD(lParam)

TOOLINFO ti

ti.cbSize = sizeof(TOOLINFO)

ti.hwnd   = m_hTheWnd

ti.uId    = 1

ti.rect.left   = pt.x

ti.rect.right  = pt.x+1

ti.rect.top    = pt.y

ti.rect.bottom = pt.y+1

m_wndToolTip.SendMessage(TTM_NEWTOOLRECT,   0, (LPARAM)&ti)

RelayEvent(uMsg, wParam, lParam)

}

return 0

}

将项目链接到 Comctl32.lib。可以执行由手动向项目中添加此 LIB 通过指定该上的项目中的设置对话框的链接器设置的库名称 (或)。

使用 MFC 的 CToolTipCtrl 类

ATL 项目中添加 MFC 支持。若要使用 MFC 的CToolTipCtrl类,ATL 应用程序应首先支持 MFC。通过中选择支持 MFC应用程序向导步骤 1 的 ATL/COM 的 ATL Dll,无法执行此 *** 作。如果已创建了项目如果没有 MFC 支持,您将不得不手动添加 MFC 支持。以下文章说明如何添加 MFC 支持 ATL DLL/EXE:

173974如何向 ATL 项目中添加 MFC 支持

使用CToolTipCtrl而不是 cwindow 外m_wndToolTip控件类的成员。

而不是发送消息调用CToolTipCtrl方法。

HRESULT InPlaceActivate(LONG iVerb, const RECT* prcPosRect=NULL)

{

AFX_MANAGE_STATE(AfxGetStaticModuleState())

CWnd parent

HRESULT hr

hr = CComControlBase::InPlaceActivate(iVerb, prcPosRect)

if (m_wndToolTip.m_hWnd == NULL)

{

if (m_bWndLess)

{

HDC hDC

// Get the HDC from the client

m_spInPlaceSite->GetDC(NULL, OLEDC_NODRAW, &hDC)

m_hTheWnd = WindowFromDC(hDC)

m_spInPlaceSite->ReleaseDC(hDC)

}

else

m_hTheWnd = m_hWnd

::InitCommonControls()

parent.Attach(m_hTheWnd)

RECT rect = {0,0,0,0}

if (!m_wndToolTip.Create(&parent))

TRACE("Unable to create tip window.\n")

else if (!m_wndToolTip.AddTool(&parent, LPCTSTR("TTip2 Control"),&rect, 1))

TRACE("Unable to add tip for the control window.\n")

else

m_wndToolTip.Activate(TRUE)

parent.Detach()

}

return hr

}

void RelayEvent(UINT message, WPARAM wParam, LPARAM lParam)

{

if (NULL != m_wndToolTip.m_hWnd)

{

MSG msg

msg.hwnd= m_hTheWnd

   msg.message= message

msg.wParam= wParam

msg.lParam= lParam

msg.time= 0

msg.pt.x= LOWORD (lParam)

msg.pt.y= HIWORD (lParam)

m_ttip.RelayEvent(&msg)

}

}

LRESULT OnMouseMove(UINT uMsg, WPARAM wParam, LPARAM lParam,BOOL&bHandled)

{

if (m_wndToolTip.m_hWnd)

{

POINT pt

static uId

pt.x = LOWORD(lParam)

pt.y = HIWORD(lParam)

TOOLINFO ti

ti.cbSize = sizeof(TOOLINFO)

ti.hwnd   = m_hTheWnd

uId = 1

ti.uId    = uId

ti.rect.left   = pt.x

ti.rect.right  = pt.x+1

ti.rect.top    = pt.y

ti.rect.bottom = pt.y+1

m_ttip.SendMessage(TTM_NEWTOOLRECT,   0, (LPARAM)&ti)

}

RelayEvent(uMsg, wParam, lParam)

return 0

}

LRESULT OnLButtonDown(UINT uMsg, WPARAM wParam, LPARAM lParam,BOOL bHandled)

{

bHandled = FALSE

RelayEvent(uMsg, (WPARAM)wParam,MAKELPARAM(LOWORD(lParam), HIWORD(lParam)))

return 0L

}

使用 ATLCON 的 CToolTipCtrl 类

将 Atlcontrols.h 文件从 ATLCON 复制到您的控件项目目录并将其添加到项目中。

Stdafx.h 文件中包括它。

当您使用 MFC 的CToolTipCtrl类,请使用CToolTipCtrl 。

信息源自:http://support.microsoft.com/kb/201540/zh-cn

希望可以帮助到你~望采纳哦~谢谢~

窗体由控制框和标题栏组成;在窗体中添加绑定型控件

1、窗体的设计视图状态时通过控件工具箱上的工具按钮插入相应的控件(文本框、组合框等等)

2、然后双击控件打开属性窗口

3、对控件进行进一步的设置

4、通过指定数据选项卡上的记录源来把该控件绑定到窗体数据。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/bake/11326490.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-15
下一篇 2023-05-15

发表评论

登录后才能评论

评论列表(0条)

保存