ATL控件怎么调整自身的大小

黄璋全 2019-12-21 18:09:00

推荐回答

用ATL做的ActiveX控件,要想方便的在资源中使用,必须注册控件。有一种传统的方法DLL方法,可以通过LoadLibrary加载资源的方式,直接使用dll文件中的资源。但这种方法不方便,不能两套资源组合着用,只能是一个对话框全部在DLL中。这种方法不是ATL做的,就是一个标准DLL,主工程需要包含dll的头文件,使用LoadLibrary动态加载。
齐春春2019-12-21 18:38:35

提示您:回答为网友贡献,仅供参考。

其他回答

  • 在B/S结构的系统中,出于安全性考虑一般不准许浏览器访问客户端的硬件资源,如控制打印机,照相机等。对于一个完善系统来说,往往很多时候又需要控制这些资源。通过在浏览器中插入ActiveX插件是一种很好的解决方式。在实际的项目开发中,遇到系统登录需要增加物理身份识别。即在系统登录的时候,除了要验证用户名和密码外,还需要验证硬件USBKEY上的信息。具体业务流程为:客户端程序读取用户硬件USBKEY里的个人信息,提交给认证服务器进行认证,认证服务器通过身份识别后,业务系统通过解析返回的XML信息判断用户是否合法有效,建立起用户和业务系统的信任通道。读取硬件USBKEY的信息我们通过本例的ActiveX控件来完成。硬件USBKEY选用飞天诚信的ePass1000ND产品。
    黄石凤2019-12-21 19:12:25
  • 1打开VC6集成开发环境,按新建按钮,选择PROJECT标签。2选择ATLCOMAppWizard。3在右侧ProjectName下面的空白处输入"Polygon"。如下图所示:图1按下OK按钮,出现如下对话框:图2按Finish按钮,接受默认设置,出现如下对话框:图3按下OK按钮,ATLCOMAppWizard将生成一系列的文件,现在描述如下:Polygon.cpp:包含了DllMain,DllCanUnloadNow,DllGetClassObject,DllRegisterServer,DllUnregisterServer的实现,同时它也包含objectmap:BEGIN_OBJECT_MAPObjectMap//这里将列出你的工程中将会用到的ATL对象,这里最初为空,//因为我们目前还没有创建新的ATL对象END_OBJECT_MAPPolygon.defDLL便准模块定义文件Polygon.dsw项目工作区文档Polygon.dsp项目设置文档Polygon.idl接口定义语言文件,它详细的描述了您的工程中所有的接口Polygon.rc资源文件,它包含了版本信息和工程名称字符串Resource.h资源文件的头文件Polygonps.mk这个就是makefile,它能被用来创建代理存根DLLPolygonps.def代理存根DLL的模块定义文件StdAfx.cpp此文件包含ATL的执行档StdAfx.h此文件包含ATL的头文件为了使它PolygonDLL变得有用,我们需要用ATLObjectWizard给它添加一个控件control。二添加一个控件1打开INSERT菜单,选择NewATLObject项,出现如下对话框:图42我们在左边选择"Controls",右边选择FullControl,按下NEXT按钮,出现如下所示对话框:图53我们在Names标签页,"ShortName"后面的空白中输入"PolyCtl",这时你将注意到其他的空白将会自动完成。Class域显示控件将会使用的类名称。CoClass是控件的组件类IDInterface是接口名称,我们将会在此接口中实现一些方法和属性Type是控件描述ProgID是易记的类ID名称,用它可以得到控件的CLSID4为了激活错误提示信息和connectionpoints支持,我们选择Attributes标签页,选择SupportISupportErrorInfo和SupportConnectionPoints,结果如下图所示:图65由于我们将会在多变形内部染色,所以我们需要增加一个FillColor属性支持。我们选择stockproperty标签页,在左边的列表框中双击FillColor,结果如下图所示:图76按下“确定”按钮,结束创建控件。VC6将会生成如下新的文件:PolyCtl.h/cpp:包含了C++类CPolyCtl的实现PolyCtl.rgs:一个包含了注册控件所需要的注册信息的文本文件PolyCtl.htm:一个HTML文件,其中有关于这个控件的引用的代码。例如在我这个例子中有:同时Wizard也改变了以下几处:a在StdAfx.h和StdAfx.cpp文件中增加了一条include语句,它把控件必需的ATL文件包含进来了b注册脚本文件PolyCtl.rgs被增加到工程资源中。cPolygon.idl被修改以便包括新的控件细节信息。文件PolyCtl.h是最有趣的,因为它包含实现你的控件主要的代码。现在,你已经准备好了建立你的控件:1.在Build菜单点击BuildPolygon.dll。2.一旦你的控件已经完成Build,你就可以点击在Tools菜单上的ActiveXControlTestContainer,控件测试容器工具将启动。3.在ActiveXControlTestContainer中,选择Edit菜单的InsertNewControl,InsertControl会话框出现。如下所示:图84.从InsertControl会话框的列表框中选择PolyCtlclass,按下OK,你将看到ActiveXControlTestContainer客户区出现一个长方形,在其中央显示了本文"ATL3.0:PolyCtl",如下所示:图95.关闭ActiveXControlTestContainer。然后,你将会在控件中加入定制属性。三为控件添加一个属性1IPolyCtl是包含你定制的方法和属性的接口。要把属性加入这一个接口的最容易的方法是在ClassView中右击它,而且选择AddProperty。如下所示:图102AddPropertytoInterface会话框出现,允许你加入你的属性细节:1.在属性类型的下拉列表框中选择short。2.输入"Sides"作为我们的属性名称。当你编辑属性名字域的时候,Implementation下面的编辑框将会出现一些信息,这些信息将被增加到你的IDL文件。如下所示:图113.按下OK按钮。MIDL编译idl文件的程序定义了一个Get和一个Put方法,他们将分别取得和设定属性。当MIDL编译文件的时候,它对属性名字加前缀put_和get_,在接口中自动地定义那二个方法。连同把必需的信息加入.idl文件,AddPropertytoInterface对话框也在类定义文件PolyCtl.h中加入Get和Put函数原型,并在类实现文件PolyCtl.cpp中加入相应的空的实现函数。3为了能设定并且取回属性值,我们需要一个地方来储存它。从FileView,打开PolyCtl.h,在类定义结尾即在m_clrFillColor定义之后加入如下一行代码:shortm_nSides;4现在你能实现Get和Put方法。get_Sides和put_Sides函数定义已经被增加到PolyCtl.h。你把代码加入PolyCtl.cpp如下列各项:STDMETHODIMPCPolyCtl::get_Sidesshort*pVal{*pVal=m_nSides;returnS_OK;}STDMETHODIMPCPolyCtl::put_SidesshortnewVal{ifnewVal>2&&newVal#include"resource.h"//mainsymbols在Releasebuilds时需要注意:当ATLCOMAppWizard产生内定工程的时候,它定义了_ATL_MIN_CRT宏。这个宏的作用是,在你不需要CRun-TimeLibrary支持的时候,CRun-TimeLibrary不被带到你的代码之内。多角形控件需要CRun-TimeLibrarystart-upcode设定浮点函数初值。因此,如果你建立一个释放版本,你需要除去_ATL_MIN_CRT宏。为了要除去该宏,点击Project菜单上的Settings。在SettingsFor:下拉框中选择MultipleConfigurations。在跳出来的Selectprojectconfigurationstomodify对话框中,为所有的四个释放版本按复选框,如图所示:图12然后点击OK。在C/C++标签页,选择General,除去Preprocessordefinitions定义结尾的",_ATL_MIN_CRT"图132一旦多边形顶点计算出来了,你就可以通过增加一个POINT类型的数组来保存所有的点,在PolyCtl.h中:OLE_COLORm_clrFillColor;shortm_nSides;POINTm_arrPoint,riidreturnS_OK。
    黄石华2019-12-21 18:55:06
  • ATL和MFC创建ActiveX控件的区别在visualC++6.0中,ATL和MFC代表了两种不同的框架,分别面向不同类型的基于Windows的开发。ATL提供了一种框架来实现创建COM客户机和服务器所必须的样板文件代码;MFC代表了创建独立的Windows应用的一种简单。
    齐晓敏2019-12-21 18:21:28

相关问答

// TestBrowser.cpp : Defines the entry point for the application.//#include "stdafx.h"#include "TestBrowser.h"////////////////////////////////////////////////////////#include #include #include #include #include ////////////////////////////////////////////////////////#define MAX_LOADSTRING 100// Global Variables:HINSTANCE hInst;        // current instanceTCHAR szTitle;   // the main window class name// Forward declarations of functions included in this code module:ATOM    MyRegisterClassHINSTANCE hInstance;BOOL    InitInstanceHINSTANCE, int;LRESULT CALLBACK WndProcHWND, UINT, WPARAM, LPARAM;INT_PTR CALLBACK AboutHWND, UINT, WPARAM, LPARAM;////////////////////////////////////////////////////////CComModule _Module;CAxWindow WinContainer; CComPtr  pWebBrowser;#pragma commentlib,"atl"////////////////////////////////////////////////////////int APIENTRY _tWinMainHINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR    lpCmdLine, int       nCmdShow{ UNREFERENCED_PARAMETERhPrevInstance; UNREFERENCED_PARAMETERlpCmdLine; ////////////////////////////////////////////////////// // CoInitializeNULL;  AtlAxWinInit;  // ////////////////////////////////////////////////////// MSG msg; HACCEL hAccelTable; // Initialize global strings LoadStringhInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING; LoadStringhInstance, IDC_TESTBROWSER, szWindowClass, MAX_LOADSTRING; MyRegisterClasshInstance; // Perform application initialization: if !InitInstance hInstance, nCmdShow {  return FALSE; } hAccelTable = LoadAcceleratorshInstance, MAKEINTRESOURCEIDC_TESTBROWSER; // Main message loop: while GetMessage&msg, NULL, 0, 0 {  if !TranslateAcceleratormsg.hwnd, hAccelTable, &msg  {   TranslateMessage&msg;   DispatchMessage&msg;  } } ////////////////////////////////////////////////////// // CoUninitialize; // ////////////////////////////////////////////////////// return int msg.wParam;}////  FUNCTION: MyRegisterClass////  PURPOSE: Registers the window class.////  COMMENTS:////    This function and its usage are only necessary if you want this code//    to be compatible with Win32 systems prior to the ''RegisterClassEx''//    function that was added to Windows 95. It is important to call this function//    so that the application will get ''well formed'' small icons associated//    with it.//ATOM MyRegisterClassHINSTANCE hInstance{ WNDCLASSEX wcex; wcex.cbSize = sizeofWNDCLASSEX; wcex.style   = CS_HREDRAW | CS_VREDRAW; wcex.lpfnWndProc = WndProc; wcex.cbClsExtra  = 0; wcex.cbWndExtra  = 0; wcex.hInstance  = hInstance; wcex.hIcon   = LoadIconhInstance, MAKEINTRESOURCEIDI_TESTBROWSER; wcex.hCursor  = LoadCursorNULL, IDC_ARROW; wcex.hbrBackground = HBRUSHCOLOR_WINDOW+1; wcex.lpszMenuName = MAKEINTRESOURCEIDC_TESTBROWSER; wcex.lpszClassName = szWindowClass; wcex.hIconSm  = LoadIconwcex.hInstance, MAKEINTRESOURCEIDI_SMALL; return RegisterClassEx&wcex;}////   FUNCTION: InitInstanceHINSTANCE, int////   PURPOSE: Saves instance handle and creates main window////   COMMENTS:////        In this function, we save the instance handle in a global variable and//        create and display the main program window.//BOOL InitInstanceHINSTANCE hInstance, int nCmdShow{ HWND hWnd; hInst = hInstance; // Store instance handle in our global variable hWnd = CreateWindowszWindowClass, szTitle, WS_OVERLAPPEDWINDOW,  CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL; if !hWnd {  return FALSE; } ShowWindowhWnd, nCmdShow; UpdateWindowhWnd; return TRUE;}////  FUNCTION: WndProcHWND, UINT, WPARAM, LPARAM////  PURPOSE:  Processes messages for the main window.////  WM_COMMAND - process the application menu//  WM_PAINT - Paint the main window//  WM_DESTROY - post a quit message and return////LRESULT CALLBACK WndProcHWND hWnd, UINT message, WPARAM wParam, LPARAM lParam{ int wmId, wmEvent; PAINTSTRUCT ps; HDC hdc; HRESULT hr; RECT rc; switch message { ///////////////////////////////////////////////// // case WM_CREATE:  {   GetClientRecthWnd,&rc;    WinContainer.CreatehWnd, &rc, L"Shell.Explorer", WS_CHILD | WS_VISIBLE;    hr = WinContainer.QueryControl__uuidofIWebBrowser2, void**&pWebBrowser;    if FAILEDhr   {    return   -1L;   }   VARIANT vt;   vt.vt = VT_BSTR;   vt.bstrVal = L"http://www.bing.com";   hr = pWebBrowser->Navigate2&vt, NULL, NULL, NULL, NULL;  }  break; case WM_SIZE:  {   int cx, cy;   cx = LOWORDlParam;   cy = HIWORDlParam;   WinContainer.MoveWindow0, 0, cx, cy;  }  break; /// ////////////////////////////////////////////////////// case WM_COMMAND:  wmId    = LOWORDwParam;  wmEvent = HIWORDwParam;  // Parse the menu selections:  switch wmId  {  case IDM_ABOUT:   DialogBoxhInst, MAKEINTRESOURCEIDD_ABOUTBOX, hWnd, About;   break;  case IDM_EXIT:   DestroyWindowhWnd;   break;  default:   return DefWindowProchWnd, message, wParam, lParam;  }  break; case WM_PAINT:  hdc = BeginPainthWnd, &ps;  // TODO: Add any drawing code here...  EndPainthWnd, &ps;  break; case WM_DESTROY:  /////////////////////////////////////////////  //        pWebBrowser.Release;         WinContainer.DestroyWindow;   //  /////////////////////////////////////////////  PostQuitMessage0;  break; default:  return DefWindowProchWnd, message, wParam, lParam; } return 0;}// Message handler for about box.INT_PTR CALLBACK AboutHWND hDlg, UINT message, WPARAM wParam, LPARAM lParam{ UNREFERENCED_PARAMETERlParam; switch message { case WM_INITDIALOG:  return INT_PTRTRUE; case WM_COMMAND:  if LOWORDwParam == IDOK || LOWORDwParam == IDCANCEL  {   EndDialoghDlg, LOWORDwParam;   return INT_PTRTRUE;  }  break; } return INT_PTRFALSE;}随手给你写了一个。看看是不是你所需要的。大部分代码是自动生成的,我写的代码都通过注释方式给括起来了,希望能理解。
随着外汇交易的时间、经验增长,心态如何调整也是投资者经常要面对的问题。在这里我们分三个阶段来形容一下心态的变化。 外汇交易初期,无论是赚钱还是亏损都会伴随着“心跳加速”、“过于紧张”的心情,往往是赚了钱就高兴,亏损了就伤心,有“患得患失”的表现。这种心情会持续很长一段时间,直到出现一次严重的亏损,才会让自己的心踏实下来。以后交易看到小的亏损,就会想到过去很大的亏损都经历过了,小的亏损算不了什么。当出现一次大的赢利之后,未来看到小的赢利也会比较坦然,不再兴奋,这就是一个心态调整的历程。 外汇交易中期,会出现很多次赚钱的单子如果不及时平仓,利润还会退还给市场,甚至造成再亏损的情形。这种情况最打击交易者的信心了,心态不成熟的交易者最容易在此阶段“爆仓”。而心态成熟的交易者则会努力地总结不足之处,尽快改进交易方法。心态不成熟的交易者在“被打掉止损就回头”的刺激下,采用了不止损的办法。而心态成熟的交易者则采取了有效的止损方法。不设定止损的交易者如果遇到反向的大波动,就可能宣布帐户结束了。职业炒汇者知道什么时候该入场,止损设置在哪里,怎么出场。 外汇交易后期,已经看不到“冲动的交易者”或者“不上进的交易者”了。留下来的都是心态经过无数次锤炼、感受过无数次不眠之夜的“勤奋学习的交易者。他们此时已经能够很好的掌握亏损与赢利关系。而且知道在汇市中避免亏损是不可能的。只有把亏损调整在小风险范围内,把赢利的单子放到大利润之中才是最可行的。钱”在成熟的交易者眼里,只是一种波动的数字。 人还是那个人,枪还是那杆枪,由于心态成熟了,认知正确了,过去的懦夫将会变成今天的英雄。