如何用wpf调用mfc程序呢?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何用wpf调用mfc程序呢?相关的知识,希望对你有一定的参考价值。

现在需要将MFC程序用WPF做个界面,我不懂MFC,WPF也是刚学习, 请问应该怎么在WPF中调用原来的程序,不会是要用C#将原来的程序实现一遍吧?

不需要,你可以使用HwndHost来Host你原来内容。这是一个抽象类,需要你自己实现BuildWindowCore和DestoryWindowCore两个方法。

在BuildWindowCore里面创建你的MFC组件实例,然后返回它的指针;
DestoryWindowCore就是如何销毁你创建的组件。

HwndHost还提供一个WndProc的virutal方法,你可以重载这个方法来处理windows消息。

如果你想偷懒,也可以使用WindowsFormsHost,在里面放一个WinForm的Panel控件,接着创建你的MFC组件,然后调用SetParent API把你的MFC组件贴到这个Panel就行了
参考技术A 1.将MFC做的封装成dll或ActiveX控件。
2.使用C++/CLI,在一个工程下可以使用WPF,还能使用MFC本回答被提问者采纳

如何用3个视图拆分MFC对话框?

问题:如何使用3个视图拆分MFC对话框? 环境:Win10 RS5 x64 工具:Visual Studio 10.0 + Sp1

当我执行应用程序时,“Debug Assertion Failed!”错误已经发生。

错误信息 :

Debug Assertion Failed!  
File: f:ddvctoolsvc7libsshipatlmfcincludeafxwin2.inl  
Line: 82

我想像这样拆分对话框:

enter image description here

实施代码在这里:

// SampleDlg.h
class CSampleDlg : public CDialogEx
{
    //...
public:
    CSplitterWndEx m_wndSplitter;
};

// SampleDlg.cpp
BOOL CSampleDlg::OnInitDialog()
{
    CDialogEx::OnInitDialog();
    //...
    if (!m_wndSplitter.CreateStatic(this, 2, 1))
    {
        return FALSE;
    }
    if (!m_wndSplitter.CreateView(0, 0, RUNTIME_CLASS(CChild_NoteView), CSize(100, 100), 0) ||
        !m_wndSplitter.CreateView(1, 0, RUNTIME_CLASS(CChild_LogView), CSize(100, 100), 0))
    {
        m_wndSplitter.DestroyWindow();
        return FALSE;
    }

    return TRUE;
}

// Child_NoteView.h
class CChild_NoteView : public CView
{
    DECLARE_DYNCREATE(CChild_NoteView)
    //...
public:
    CFont           m_note_font;
    CRichEditCtrl   m_note_edit;
}

// Child_NoteView.cpp
Message : WM_CREATE
int CChild_NoteView::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
    if(CView::OnCreate(lpCreateStruct) == -1)
        return -1;

    CreateNoteEdit();

    return 0;
}
VOID CChild_NoteView::CreateNoteEdit()
{
    m_note_font.CreatePointFont(80, L"Consolas");
    m_note_edit.Create(ES_MULTILINE | WS_CHILD | WS_VISIBLE | WS_TABSTOP | WS_VSCROLL | WS_HSCROLL, 
        CRect(10, 10, 100, 100), this, IDD_EDIT_NOTE);
    m_note_edit.SetReadOnly(TRUE);

    m_note_edit.SetFont(&m_note_font, 1);

    return VOID();
}

我认为当我尝试创建空视图时发生此错误。所以,我实现了注释编辑,但仍然发生了相同的错误。

答案

当您收到这些调试错误时,调试器应该为您提供查看源代码的选项(较旧版本的Visual Studio可能会给您带来困难)。然后,您可以打开“调用堆栈”窗口并跟踪错误。

在这种情况下,调试器可能会告诉你CSplitterWndEx正在寻找CFrameWnd而无法找到它。

您可以派生自己的类CMySplitterWndEx并更改代码以返回主对话框而不是返回CFrameWnd

或者,您可以添加假框架窗口,如下所示:

BOOL CSampleDlg::OnInitDialog()
{
    CDialogEx::OnInitDialog();

    CRect rc;
    GetClientRect(&rc);

    CFrameWnd *frame = new CFrameWnd;
    CString framecls = AfxRegisterWndClass(0, NULL, NULL, NULL);
    frame->Create(framecls, L"", WS_VISIBLE | WS_CHILD, rc, this);

    m_wndSplitter.CreateStatic(frame, 2, 1);
    m_wndSplitter.CreateView(0, 0, RUNTIME_CLASS(CChild_NoteView), CSize(100, 100), NULL);
    m_wndSplitter.CreateView(1, 0, RUNTIME_CLASS(CChild_NoteView), CSize(100, 100), NULL);

    rc.MoveToXY(0, 0);
    m_wndSplitter.MoveWindow(rc);
    m_wndSplitter.ShowWindow(SW_SHOW);
    return TRUE;
}

您可能还想添加CCreateContext

以上是关于如何用wpf调用mfc程序呢?的主要内容,如果未能解决你的问题,请参考以下文章

如何用c语言作出有图形界面的小程序?

如何用C语言编写一个窗体应用程序?

已经写好的控制台应用如何用MFC来添加窗口?

如何用c语言编写图形操作的软件呢??

如何用IDA找到这个程序中特定函数地址

MFC编写DLL怎么用C风格