当前位置:   article > 正文

WinForm窗口借助DLL显示MFC控件_mfc dll winform 窗口

mfc dll winform 窗口

1 DLL导出函数定义

注意示例代码使用.def文件定义导出函数


class ShowPropWndHelper
{
public:
    ShowPropWndHelper() : _unit(nullptr)
    {

    }

    ~ShowPropWndHelper()
    {
        Destroy();
    }

    bool Create(HWND parentWnd)
    {
        _wndAttach.Attach(parentWnd);
        CRect rcWnd;
        _wndAttach.GetClientRect(rcWnd);
        
 		//注意WinForm以DLL调用时直接使用父窗口,以源代码调用时需要使用父窗口的父窗口作为CMFCPropertyGridCtrl的父窗口
        CWnd* pwndParent = &_wndAttach;
#ifndef _USRDLL
        pwndParent = _wndAttach.GetParent();
        _wndAttach.ShowWindow(SW_HIDE);
        _wndAttach.MapWindowPoints(pwndParent, rcWnd);
#endif

        if (!_propCtrl.Create(WS_CHILD | WS_VISIBLE | WS_TABSTOP | WS_BORDER, rcWnd, pwndParent, _wndAttach.GetDlgCtrlID())) {
            _wndAttach.Detach();
            return false;
        }

        HDITEM hdItem;
        hdItem.mask = HDI_WIDTH;
        hdItem.cxy = 200;

        _propCtrl.SetVSDotNetLook(TRUE);
        _propCtrl.GetHeaderCtrl().SetItem(0, &hdItem);
        _propCtrl.EnableHeaderCtrl(TRUE, _T("参数"), _T("值"));
        _propCtrl.MarkModifiedProperties(TRUE);
        _propCtrl.EnableDescriptionArea(TRUE);
		
		//......
        return true;
    }

    void Destroy()
    {
        _propCtrl.DestroyWindow();
        _wndAttach.Detach();
    }

private:
    CMFCPropertyGridCtrl    _propCtrl;
    CWnd                    _wndAttach;
};

std::vector<ShowPropWndHelper*> s_vHelper;

bool AddItem(HWND parent)
{
    ShowPropWndHelper* it = new ShowPropWndHelper();
    if (nullptr == it) return false;

    it->Create(parent);
    s_vHelper.push_back(it);

    return true;
}

void ParamDestroyWnd();

bool ParamWndCreate(HWND hParentLeft, HWND hParentMiddle, HWND hParentRight)
{
    if (!IsWindow(hParentLeft) 
        || !IsWindow(hParentMiddle)
        || !IsWindow(hParentRight))
        return false;

    ParamDestroyWnd();

    return AddItem<CUnit_L>(hParentLeft) && AddItem<CUnit_M>(hParentMiddle) && AddItem<CUnit_R>(hParentRight);
}

void ParamDestroyWnd()
{
    std::for_each(s_vHelper.begin(), s_vHelper.end(), [](ShowPropWndHelper* it) {
        delete it;
        });
    s_vHelper.clear();
}

//DLL导出函数
bool __stdcall PLC_CreateWnd(HWND hParent)
{
    AFX_MANAGE_STATE(AfxGetStaticModuleState());

   return Create(hParent);
}

//DLL导出函数
void __stdcall PLC_DestroyWnd()
{
    AFX_MANAGE_STATE(AfxGetStaticModuleState());
    ParamDestroyWnd();
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96
  • 97
  • 98
  • 99
  • 100
  • 101
  • 102
  • 103
  • 104
  • 105
  • 106
  • 107

2 WinForm添加容器

在WinForm窗口中添加一个Panel作为显示DLL中窗口的容器。
在这里插入图片描述

3 添加代码显示窗口

#if DEBUG
	[DllImport("PLCControlD.dll", CallingConvention = CallingConvention.StdCall, CharSet = CharSet.Ansi)]
#else
	[DllImport("PLCControl.dll", CallingConvention = CallingConvention.StdCall, CharSet = CharSet.Ansi)]
#endif
	public static extern bool PLC_CreateWnd(IntPtr parent);

	public Form1()
	{
	    InitializeComponent();
	    PLC_CreateWnd(panel1.Handle);
	}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

4 运行效果

在这里插入图片描述

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/繁依Fanyi0/article/detail/690557
推荐阅读
相关标签
  

闽ICP备14008679号