如何向 ActiveX 控件添加工具栏和工具提示求答案

如何向 ActiveX 控件添加工具栏和工具提示求答案,第1张

2该控件的项目中创建工具栏资源。 3工具栏中添加工具提示字符串资源对每个按钮。 因为 ActiveX 控件是像 inproc 服务器 ] [ ASCII 151 发现没有消息泵挂钩过程需要: HHOOK hHook = NULL; // Hook procedure for WH_GETMESSAGE hook type LRESULT CALLBACK GetMessageProc(int nCode, WPARAM wParam, LPARAM lParam) { // Switch the module state for the correct handle to be used AFX_MANAGE_STATE(AfxGetStaticModuleState( )); // If this is a keystrokes message, translate it in controls' // PreTranslateMessage() LPMSG lpMsg = (LPMSG) lParam; if( (nCode >= 0) && PM_REMOVE == wParam && AfxGetApp()->PreTranslateMessage(lpMsg)) { lpMsg->message = WM_NULL; lpMsg->lParam = 0L; lpMsg->wParam = 0; } // Passes the hook information to the next hook procedure in // the current hook chain return ::CallNextHookEx(hHook, nCode, wParam, lParam); } 5创建工具栏窗口 (CToolBar 类), 它是子窗口的 ActiveX 控件。 int CCToolBarCtrl::OnCreate(LPCREATESTRUCT lpCreateStruct) { if (COleControl::OnCreate(lpCreateStruct) == -1) return -1; // Create a CToolBar window which is a child of ActiveX control if (!m_ToolBarCreate(this, WS_CHILD | WS_VISIBLE | CBRS_TOP | CBRS_TOOLTIPS) || !m_ToolBarLoadToolBar(IDR_TOOLBAR)) { TRACE0("Failed to create toolbar/n"); return -1; // fail to create } // Toolbar has to have TBSTYLE_TOOLTIPS style Otherwise, // notification handler for TTN_NEXTTEXT won't be called m_ToolBarModifyStyle (0, TBSTYLE_TOOLTIPS); // Move the toolbar so it is VISIBLE on the screen CRect rc; GetClientRect(&rc); rcbottom = rctop + 34; m_ToolBarMoveWindow(&rc); // Because ActiveX control is an inproc server, it does not have a // message pump So, messages to child windows created by the // ActiveX control are not going to be received by the control // Thus, we set up a message hook to call PreTranslateMessage() // This results in the call to FilterToolTipMessage(), which // activates tooltips hHook = ::SetWindowsHookEx( WH_GETMESSAGE, GetMessageProc, AfxGetInstanceHandle(), GetCurrentThreadId()); ASSERT (hHook); return 0; } 6卸载消息挂钩函数以响应 WM_DESTROY 消息: void CCToolBarCtrl::OnDestroy() { // Remove the message hook function VERIFY (::UnhookWindowsHookEx (hHook)); COleControl::OnDestroy(); } 7添加到 ActiveX 控件派生类 TTN_NEEDTEXTW (对于 Unicode 通知代码) 或 TTN_NEEDTEXTA (对于 ANSI 通知代码) 通知处理程序。 加载此通知代码处理中要显示工具提示字符串: BEGIN_MESSAGE_MAP(CCToolBarCtrl, COleControl) //{{AFX_MSG_MAP(CCToolBarCtrl) ON_WM_CREATE() ON_COMMAND(ID_BUTTON1, OnButton1) // first button on toolbar ON_COMMAND(ID_BUTTON2, OnButton2) // second button on toolbar ON_COMMAND(ID_BUTTON3, OnButton3) // third button on toolbar ON_WM_DESTROY() //}}AFX_MSG_MAP ON_OLEVERB(AFX_IDS_VERB_PROPERTIES, OnProperties) // ANSI notification code (for Windows 95) ON_NOTIFY_EX_RANGE(TTN_NEEDTEXTA, 0, 0xFFFF, OnToolTipNotify) // Unicode notification code (for NT) ON_NOTIFY_EX_RANGE(TTN_NEEDTEXTW, 0, 0xFFFF, OnToolTipNotify) END_MESSAGE_MAP() // Notification handler for tooltips - determine which tooltip // string resource to be displayed BOOL CCToolBarCtrl::OnToolTipNotify( UINT id, NMHDR pNMHDR, LRESULT pResult) { TOOLTIPTEXTA pTTTA = (TOOLTIPTEXTA) pNMHDR; TOOLTIPTEXTW pTTTW = (TOOLTIPTEXTW) pNMHDR; int strid = 0; switch (pNMHDR->idFrom) { case ID_BUTTON1: strid = IDS_BUTTON1; break; case ID_BUTTON2: strid = IDS_BUTTON2; break; case ID_BUTTON3: strid = IDS_BUTTON3; break; } if (strid) { pResult = 0; CString str; strLoadString(strid); #define _countof(array) (sizeof(array)/sizeof(array[0])) #ifndef _UNICODE if (pNMHDR->code == TTN_NEEDTEXTA) lstrcpyn(pTTTA->szText, str, _countof(pTTTA->szText)); else _mbstowcsz(pTTTW->szText, str, _countof(pTTTW->szText)); #else if (pNMHDR->code == TTN_NEEDTEXTA) _wcstombsz(pTTTA->szText, str, _countof(pTTTA->szText)); else lstrcpyn(pTTTW->szText, str, _countof(pTTTW->szText)); #endif return TRUE; } return FALSE; }

软件激活的,过不了多长时间就会这样的,还需要重新激活。

我是在淘宝买过几个不同系统的密钥都很好用,5-10元都买过,您进入搜索您需要系统的密钥就可以了。

密钥是一机一号,用过就不能在用。     

Windows 10 系列 MAK激活密钥:[注意]:次数为0的适用于“电话激活”,有次数的适用于“在线联网激活”。Windows 10 Professional 专业版 MAK激活密钥:NXRQM-CXV6P-PBGVJ-293T4-R3KTY [适用于电话激活]---------------------------------------------------------------------Windows 10企业版密钥,Windows 10 Enterprise LTSB N 企业版 MAK激活密钥:B38NV-VKQ3Q-H87WD-D4WBF-VMH2F84333-N23HF-CP6QV-DC9RT-P7JW9 [适用于电话激活]7N3X7-BMGFF-QP34T-CHP2K-2YT44---------------------------------------------------------------------Windows 10 Education 教育版 MAK激活密钥:97NG2-32WJM-Y7FHC-47P4Y-3GPJD [适用于电话激活]Windows 10 系列 零售 激活密钥:[PID检测]:零售版密钥激活,适用于在线联网激活或电话激活。Windows 10 Professional 专业版 零售 激活密钥:R7VPR-RNR68-DD9GD-DH4HX-XKX2PWindows 10 Education 教育版 零售 激活密钥:GNGHJ-7RCT8-K2WJV-96284-844BY---------------------------------------------------------------------Windows 10 KMS激活密钥:方法(一):注意:如果需要“在线联网激活”或“电话激活”,必须卸载KMS。KMS服务器地址:3rss:20439kmszhkmsdigiboyirWindows 10 KMS密钥:Win10家庭版:Windows 10 Home:TX9XD-98N7V-6WMQ6-BX7FG-H8Q99Windows 10 Home N:3KHY7-WNT83-DGQKR-F7HPR-844BMWindows 10 Home Single Language:7HNRX-D7KGG-3K4RQ-4WPJ4-YTDFHWindows 10 Home Country Specific:PVMJN-6DFY6-9CCP6-7BKTT-D3WVRWin10专业版:Windows 10 Professional:W269N-WFGWX-YVC9B-4J6C9-T83GXWindows 10 Professional N:MH37W-N47XK-V7XM9-C7227-GCQG9Win10教育版:Windows 10 Education:NW6C2-QMPVW-D7KKK-3GKT6-VCFB2Windows 10 Education N:2WH4N-8QGBV-H22JP-CT43Q-MDWWJWin10企业版:Windows 10 Enterprise:NPPR9-FWDCX-D2C8J-H872K-2YT43Windows 10 Enterprise N:DPH2V-TTNVB-4X9Q3-TJR4H-KHJW4Windows 10 Enterprise 2015 LTSB:WNMTR-4C88C-JK8YV-HQ7T2-76DF9Windows 10 Enterprise 2015 LTSB N:2F77B-TNFGY-69QQF-B8YKP-D69TJWin10 KMS激活方法:1管理员身份运行命令提示符2输入slmgrvbs -ipk xxxxx(xxxxx用key密钥代替)3输入slmgrvbs -skms xxxxx(xxxxx用KMS服务器地址代替)4输入slmgrvbs -ato5输入slmgrvbs -dlv(查看激活状态,可选)Win10 KMS卸载方法:1如果是KMSPico,则自带服务卸载批处理,2不管是哪种KMS工具,卸载掉软件之后请执行以下命令3slmgrvbs -upk4slmgrvbs -ckms5slmgrvbs -rearm6重启电脑 方法(二):Windows 10安装完毕后:1、Windows键 + R键(键盘上,同时按 Windows键 和 R键)。2、输入CMD,单击确定,进入CMD命令行窗口(MS-DOS窗口):专业版用户请依次输入:slmgr /ipk W269N-WFGWX-YVC9B-4J6C9-T83GXslmgr /skms kmsxspaceinslmgr /ato企业版用户请依次输入:slmgr /ipk NPPR9-FWDCX-D2C8J-H872K-2YT43slmgr /skms kmsxspaceinslmgr /ato3、按回车键(Enter),Windows 10被激活。相关激活密钥,部分如下:专业版:VK7JG-NPHTM-C97JM-9MPGT-3V66T企业版:XGVPP-NMH47-7TTHJ-W3FW7-8HV2C教育版:YNMGQ-8RYV3-4PGQ3-C8XTP-7CFBY专业版N:2B87N-8KFHP-DKV6R-Y2C8J-PKCKT企业版N:WGGHN-J84D6-QYCPR-T7PJ7-X766F教育版N:84NGF-MHBT6-FXBX8-QWJK7-DRR8H企业版S:FWN7H-PF93Q-4GGP8-M8RF3-MD>ActiveX是Microsoft提出的一组使用COM(ComponentObjectModel,部件对象模型)使得软件部件在网络环境中进行交互的技术集。它与具体的编程语言无关。作为针对Internet应用开发的技术,ActiveX被广泛应用于WEB服务器以及客户端的各个方面。本文着重介绍以Visual C++ 50为工具,利用系统提供的AppWizard快速构造一个简单的ActiveX控件。
通常VC++50提供两个途径开发ActiveX控制:MFC和ATL(ActiveXTemplateLibrary)。使用MFC,可以不必理会控制接口的细节,把注意力集中在控制本身的功能上,但是生成的控制比较大。而且,客户端如果要运行此ActiveX控制,必须拥有相应版本的MFC类库的DLL,否则,必须同时下载这些巨大的类库;使用ATL,由于不汲及MFC的标准类库,生成的控制相对较小,但开发者必须了解COM、OLE技术的细节。这里,我们主要说明一下使用MFC开发ActiveX控制的方法,因为这种方法相对比较容易。
在Microsoft Developer Studio环境下,按如下的 *** 作步骤可以快速生成一个标准的ActiveX控件。首先,启动系统的AppWizard,用File菜单下的New菜单项创建新的项目。注意:我们选择的是列表框中的MFC ActiveX ControlWizard项。也可以使用ATL COM AppWizard项来产生ActiveX控件,这样实现的控件的最终代码量较小,但由于用这种方法加入的ActiveX控件对象从最基本的COM对象出发,故不能使用MFC类库中的COleControl所提供的强大功能。而用MFC ActiveX ControlWizard项则产生以COleControl为基类的控件对象类,它继承了所有COleControl类中实现的OLE控件的特性,包括窗口对象特性和方法、属性及事件等。接着,按照系统给出的提示信息逐步完成创建工作。用户可根据实际应用的要求定制控件的各项特性。
我们假定项目名为Test。创建工作完成后,打开Workspace文件Testdsw,可以看到系统生成的Test控件框架,主要的类及实现功能描述见下表:
派生类 基类 实现功能
CTestApp COleControlModule 控件实例的初始化和撤消
CTestCtrl COleControl 控件窗口的创建、更新及消息处理
CTestPropPage COlePropertyPage 控件属性页的设置及与实际属性值的交换
编译此项目,生成Testocx。在当前的Developer Studio环境下,这个控件已经被自动注册了。用系统提供的工具ActiveX Control Test Container可以立即进行测试,在已提供的可插入OLE控件列表中,Test Control就是我们生成的控件名。如果想在其它环境下使用它,则必须先对Testocx文件进行注册,具体做法是在命令行方式下键入命令:“regsvr32 …/Testocx”。此后,我们就可在任何支持ActiveX控件的环境中使用它了。注意:ocx文件应该随时更新和注册。
当然,这样生成的控件没有什么实质性的用处,若在任何一个包容器中测试它,则只可见一个矩形框和一个内切椭圆,除了缩放和位置移动功能外不能进行任何 *** 作。
然而,我们希望开发出来的控件就像一个通常的编辑环境一样:用户可以在窗口内进行文本的输入和编辑,而且有工具条来支持各项 *** 作。
1、为控件添加工具条和子窗口
VC++的模板常常是很有用的工具,我们设计一个类CToolbar,为控件类T添加工具条,显示每个按钮及提示信息。我们的控件类CtestCtrl是从这个类派生出来的,从而可为控件加上设计好了的工具条。
以下是实现工具条模板类的定义 (在Toolbarh文件中) :
template
class CToolbar
{
public:
CToolbar();
void CreateToolbar(HWND hParent);// 创建工具条
void AddButtons();// 逐个加入按钮
void DestroyToolbar();// 撤消工具条
LRESULT OnToolbarNeedText(WPARAM, LPNMHDR pnmh, BOOL&);
// 工具条上按钮的提示信息
protected:
HWND m_hwndToolbar;// 工具条的窗口句柄
};
接着,要对TestCtlh和TestCtlcpp作相应的修改。在TestCtlh中要先包含Toolbarh文件,并将控件类定义为:
class CTestCtrl : public COleControl, public CToolbar
然后,再加进消息映射宏:
BEGIN_TOOLBAR_MAP(CTestCtrl)
TOOLBAR_BUTTON(ID_New)
TOOLBAR_SEPARATOR()
TOOLBAR_BUTTON(ID_CUT)

TOOLBAR_SEPARATOR()

END_TOOLBAR_MAP()
以响应定制的工具条上的各个按钮消息。上面的宏在Toolbarh文件中被定义。于是,在CTestCtrl类的成员函数中就可以灵活使用CToolbar类的各项 *** 作了。
另外,我们再为控件设计一个可编辑的子窗口。这实现起来很方便,在控件类定义中直接加入CEdit类的对象作为成员变量m_TestEdit即可。
要想真正生成我们自己的控件窗口,则需重载COleControl::CreateControlWindow函数。控件窗口被创建时,该函数被调用,函数中先调用基类同名函数,再依次调用CreateToolbar和CreateTestEdit 生成控件中的工具条和子窗口。自然,我们不再需要系统缺省调用的画图函数,将CTestCtrl::OnDraw 中画矩形框和椭圆的部分去掉。CreateToolbar在工具条模板类中实现;CreateTestEdit 在控件类中自定义,函数先计算控件窗口的客户区和工具条的窗口大小,得到子窗口的位置,使之填满控件中工具条以外的全部区域,然后调用m_TestEditCreate函数,设置参数使子窗口具有用户所希望的各项风格。
2、调整控件窗口中各个对象的位置
工具条和子窗口已经在控件中生成后,还有一项重要的工作就是当控件位置移动或大小改变时,要相应地调整工具条和子窗口的位置和大校
COleControl类为我们提供了这样的函数:
COleControl::OnSetObjectRects(LPCRECT lpRectPos, LPCRECT lpRectClip);
其中的参数给出了控件的新位置。重载此函数,先按系统提供的功能自动调整工具条,调用:
::SendMessage(m_hwndToolbar, TB_AUTOSIZE, 0L, 0L)
然后,同创建时一样计算控件窗口的客户区(参数lpRectPos已给出),调用GetWindowRect获得工具条的窗口大校为使子窗口填满控件中工具条以外的全部区域,应先计算出相应的矩形位置并调用m_TestEditSetWindowPos来 实现子窗口的位置调整。为了美观起见,也可在子窗口的四边留出少许富余。最后,调用基类的OnSetObjectRects函数。
3、实现对控件内对象的控制
因为有了子窗口,实际上用户的各项功能 *** 作都是由子窗口来控制完成的。我们将焦点的控制权交给子窗口,使用户能进行输入和编辑 *** 作,在CTestCtrl::OnSetFocus中调用m_TestEditSetFocus。同样,当控件对象捕获到工具条上的按钮被按下的消息时,要调用 m_TestEdit 的相应函数以执行用户的命令。
工具条上提示信息的显示也由控件对象来控制。在CTestCtrl::OnNotify函数中加入如下代码:
NMHDR pNMHDR = (NMHDR )lParam;
BOOL tmp;
if (pNMHDR->code == TTN_NEEDTEXT)
return OnToolbarNeedText(wParam, pNMHDR, tmp);
这样,当鼠标移动并停留在工具条的某个按钮上时,控件对象就会调用工具条模板类中的OnToolbarNeedText 函数以获得相应的提示信息。
4、控件窗口及内部对象的撤消
最后需要说明的是,如果我们在控件中创建了新的工具条和子窗口,则也应该及时撤消控件窗口及其内部对象。撤消控件窗口,即是在 CTestEdit::OnDestroy函数中依次调用DestroyToolbar和 m_TestEditDestroyWindow 来清除工具条和子窗口。
遵循以上四个工作步骤就可以很好地创建一个带有工具条和编辑子窗口的ActiveX控件。子窗口可由用户自己定义,象通常的应用程序那样去实现各种各样或简单或复杂的功能。工具条的存在使用户执行各项 *** 作更加方便。此外,在控件中加进其它各种所需的对象并进行控制也是可能的。

最新放出来的win10 64位专业版密钥:

VK7JG-NPHTM-C97JM-9MPGT-3V66T

NPPR9-FWDCX-D2C8J-H872K-2YT43

W269N-WFGWX-YVC9B-4J6C9-T83GX

NYW94-47Q7H-7X9TT-W7TXD-JTYPM

NJ4MX-VQQ7Q-FP3DB-VDGHX-7XM87

MH37W-N47XK-V7XM9-C7227-GCQG9

VK7JG-NPHTM-C97JM-9MPGT-3V66T

查看当前Win10正式版版本号的方法:

打开“控制面板”,依次进入“系统和安全”-“系统”界面,从中就可以查看到当前系统的版本号以及位数。如图所示:

右击桌面左下角的“Windows”按钮,从d出的右键菜单中选择“命令提示符(管理员)”项。

从打开的“命令提示符”窗口中,输入命令:slmgrvbs /upk按回车键即可d出如图所示的“已成功卸载了产品密钥”的提示。注:也可以通过先复制以上命令,然后在MSDOW窗口中右击鼠标即可完成命令的粘贴 *** 作。

接下来再输入以下命令:slmgr /ipk W269N-WFGWX-YVC9B-4J6C9-T83GX按回车键后将d出“成功的安装了产品密钥”的提示窗口。注:此步骤非常重要,需要根据所安装的 *** 作系统版本选择正确的密钥。

然后继续输入以下命令:slmgr /skms zhusto按回车后将d出“密钥管理服务计算机名成功的设置为zhusto”的提示。

当再输入以下命令时:slmgr /ato按回车键后将d出“成功的激活了产品”的提示窗口。

在此我们可以查看一下此密钥的激活天数,输入以下命令:slmgr /xpr按回车键后,将d出窗口,提示”批量激活的过期时间”。

当此激活 *** 作过期后,我们只需要重新激活一次,即可再享受180天激活机会。

最后我们通过Win10系统来查看一下Windows当前激活状态:点击“开始”-“设置”项,

从打开的“设置”界面中,点击“更新和安全”按钮进入,切换到“激活”选项卡,就可以看到当前Win10正式版已激活。


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

原文地址: http://outofmemory.cn/zz/10571482.html

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

发表评论

登录后才能评论

评论列表(0条)

保存