Как мне создать и использовать CFormView в обычной MFC DLL? (визуальная студия 2008) - PullRequest
1 голос
/ 23 декабря 2009

Я недавно задал этот вопрос , который заставил меня начать в правильном направлении - по крайней мере, для загрузки MFC DLL и попытки показать окно dlg.

Проблема в том, что типичное диалоговое окно ужасно как главное окно для приложения. Мне довольно просто создать новый exe-проект, чтобы делать то, что я хочу, но проблема в том, что у меня есть DLL, а инструменты просто не позволяют мне подключать классы к формам окон в ресурсе редактор. Поэтому я не могу справиться с нужными мне событиями.

Мои вопросы:

  • Как мне создать и отобразить CFormView (на основе IDD_FORMVIEW, который я создал в редакторе ресурсов) в проекте MFC DLL?
  • Как получить форму для отображения и обработки ввода?
  • Как добавить обработчики событий / сообщений для этого окна? (Пункт меню для этого из редактора .rc выделен серым цветом)
  • Как настроить меню для формы? (свойства ресурса в редакторе не позволяют мне связать его с ресурсом меню. (Я не могу понять, почему)

Ссылки, на которые я смотрел, довольно легки и неоднозначны относительно того, как это сделать. Большинство из них предполагают, что я могу создать мэйнфрейм как приложение MFC для одного документа с помощью «мастера», что не так.

Прямо сейчас я вызываю Create () для класса окна, который я создал, и передаю CWnd рабочего стола в качестве родителя.

Я не уверен, что правильно классифицировал CFormView. На самом деле, я почти уверен, что сделал мало того, что мне нужно, хотя я пытался следовать инструкциям, которые видел.

Затем я вызываю ShowWindow (SW_SHOW), но все равно ничего не вижу.

Я думаю, это ДОЛЖНО быть простым. Все, что я хочу сделать, это показать форму, которую я создал в редакторе форм.

Как мне это сделать и какой самый простой способ?

Вот некоторый код - код cpp, который вызывает его

MainForm *mf = new MainForm();

mf->Create(CWnd::GetDesktopWindow());

mf->ShowWindow(SW_SHOW);

Вот файл .h для класса MainForm

#include "afxcmn.h"



// MainForm form view

class MainForm : public CFormView
{
    DECLARE_DYNCREATE(MainForm)

public:
    MainForm();
    virtual ~MainForm();


public: 
    virtual BOOL Create(CWnd* pParent);

public:
    enum { IDD = IDD_FORMVIEW_MAIN };
#ifdef _DEBUG
    virtual void AssertValid() const;
#ifndef _WIN32_WCE
    virtual void Dump(CDumpContext& dc) const;
#endif
#endif

protected:
    virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV support

    DECLARE_MESSAGE_MAP()
public:
    CListCtrl m_SymbolSetList;
};

и вот cpp для MainForm

#include "stdafx.h"
#include "MainForm.h"


// MainForm

IMPLEMENT_DYNCREATE(MainForm, CFormView)

MainForm::MainForm()
    : CFormView(MainForm::IDD)
{

}

MainForm::~MainForm()
{
}

void MainForm::DoDataExchange(CDataExchange* pDX)
{
    CFormView::DoDataExchange(pDX);
    DDX_Control(pDX, IDC_LIST_SYMBOLSETS, m_SymbolSetList);
}

BEGIN_MESSAGE_MAP(MainForm, CFormView)
END_MESSAGE_MAP()


// MainForm diagnostics

#ifdef _DEBUG
void MainForm::AssertValid() const
{
    CFormView::AssertValid();
}

#ifndef _WIN32_WCE
void MainForm::Dump(CDumpContext& dc) const
{
    CFormView::Dump(dc);
}
#endif
#endif //_DEBUG

BOOL MainForm::Create(CWnd* pParent)
{
    CRect rect; 
    //pParent->GetClientRect(rect);
    return CFormView::Create(NULL, NULL, WS_CHILD | WS_VISIBLE, rect, pParent, 0, NULL);
}

1 Ответ

2 голосов
/ 31 декабря 2009

Я бы исследовал создание и отображение вашего окна в отдельном потоке пользовательского интерфейса MFC. MFC имеет свой собственный механизм доставки сообщений Windows в объекты CWnd, называемый насосом сообщений, и для его работы ему необходимо инициализировать свои внутренние структуры. Я думаю, что вам нужно использовать вызов функции фреймворка, чтобы сделать это. Попробуйте эту версию AfxBeginThread:

CWinThread * AfxBeginThread (

CRuntimeClass* pThreadClass,
int nPriority=HREAD_PRIORITY_NORMAL,
UINT nStackSize = 0,
DWORD dwCreateFlags = 0,
LPSECURITY_ATTRIBUTES lpSecurityAttrs = NULL 

);

и передайте вашу форму как pThreadClass; есть макрос RUNTIME_CLASS, который сделает это за вас. Затем вы завершаете поток с помощью кода кадра.

Что касается обработки сообщений, попробуйте открыть свойства вашей формы в редакторе ресурсов и нажмите кнопку Сообщения в верхней части. Затем вы можете добавить свои обработчики к сообщениям, которые вам нужно обработать.

Мне удалось связать свойство Menu с идентификатором ресурса меню. Я не уверен, почему вы не можете это сделать. Редактор ресурсов может иногда запутаться, если вы выберете другой ресурс в древовидном представлении, но ваше главное окно отобразит другой ресурс.

Привет

...