• win32使用ATL显示C#COM窗体


    显示效果如图:



    环境:win7 64、VS2013

    代码如下:

    #include <atlbase.h>
    #include <atlhost.h>
    // 导入
    #import "TestCtrl.tlb"
    
    // 定义全局对象
    HWND hMainWnd;
    CComModule _module; // COM服务器模块
    CAxWindow _ctrl; // ActiveX控件的容器
    
    int APIENTRY _tWinMain(_In_ HINSTANCE hInstance,
                         _In_opt_ HINSTANCE hPrevInstance,
                         _In_ LPTSTR    lpCmdLine,
                         _In_ int       nCmdShow)
    {
    	UNREFERENCED_PARAMETER(hPrevInstance);
    	UNREFERENCED_PARAMETER(lpCmdLine);
    
     	// TODO:  在此放置代码。
    	MSG msg;
    	HACCEL hAccelTable;
    
    	// 初始化全局字符串
    	LoadString(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING);
    	LoadString(hInstance, IDC_WIN32USECSHAPEFORM, szWindowClass, MAX_LOADSTRING);
    	MyRegisterClass(hInstance);
    
    	// 执行应用程序初始化,并<span style="color:#ff0000;">设置hMainWnd窗口句柄</span>
    	if (!InitInstance (hInstance, nCmdShow))
    	{
    		return FALSE;
    	}
    
    	// 初始化
    	_module.Init(NULL, hInstance);
    
    	// 创建ActiveX
    	RECT rcClient;
    	GetClientRect(hMainWnd, &rcClient);
    
    	LPOLESTR lpwProgID = nullptr;
    	IUnknown* unknown = nullptr;
    	// Create函数的第三个参数一定要是nullptr或NULL,否则创建窗口不成功
    	HWND hAtlWnd = _ctrl.Create(hMainWnd, rcClient, nullptr, WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS | WS_CLIPCHILDREN);
    	ProgIDFromCLSID(__uuidof(TestCtrl::TestCtrl), &lpwProgID);
    	_ctrl.CreateControlEx(lpwProgID, NULL, NULL, &unknown);
    
    	// 查询接口,然后调用接口函数
    	TestCtrl::ITestCtrlPtr webCtrl;
    	unknown->QueryInterface(__uuidof(TestCtrl::ITestCtrl), (LPVOID*)&webCtrl);
    	if (webCtrl) {
    		webCtrl->test();
    	}
    	
    	hAccelTable = LoadAccelerators(hInstance, MAKEINTRESOURCE(IDC_WIN32USECSHAPEFORM));
    
    	// 主消息循环: 
    	while (GetMessage(&msg, NULL, 0, 0))
    	{
    		if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))
    		{
    			TranslateMessage(&msg);
    			DispatchMessage(&msg);
    		}
    	}
    
    	// 释放
    	_module.Term();
    
    	return (int) msg.wParam;
    }


  • 相关阅读:
    9-python 的ProxyHandler处理器(代理设置)
    2018.2.7 css 的一些方法盒子模型
    2018.2.6 JS-判断用户浏览器
    2018.2.5 PHP如何写好一个程序用框架
    2018. 2.4 Java中集合嵌套集合的练习
    2018.2.3 Centos 的vim好看的主题配置及JDK的安装配置
    2018.2.2 java中的Date如何获取 年月日时分秒
    2018.2.2 JavaScript中的封装
    2018.1.30 PHP编程之验证码
    2018.1.29 计算机二级错题汇总(二)
  • 原文地址:https://www.cnblogs.com/dongc/p/5225105.html
Copyright © 2020-2023  润新知