2009-12-23 82 views
1

我最近問了this question這讓我開始朝着正確的方向 - 至少是加載MFC DLL並試圖顯示一個dlg盒子。如何在MFC規則DLL中創建和使用CFormView? (visual studio 2008)

問題是,典型的對話框作爲一個APP的主窗口是可怕的。對我來說,創建一個新的exe項目來做我想做的事情是相當簡單的,但問題是我有一個DLL,而且這些工具似乎不允許我將這些類連接到資源中的窗體窗體上編輯。因此,我似乎無法處理我需要的事件。

我的問題:

  • 如何創建並在MFC DLL項目顯示一個CFormView(基於我在資源編輯器創建的IDD_FORMVIEW)?
  • 如何獲取表單並處理輸入?
  • 如何爲該窗口添加事件/消息處理程序? (從.rc編輯器執行該操作的菜單項灰顯)
  • 如何將菜單設置爲formview? (編輯器中資源的屬性不允許我將它與菜單資源相關聯(我弄不明白爲什麼)

我一直在尋找的鏈接是非常輕而且模糊的關於如何大多數人認爲我可以通過「嚮導」創建一個大型機作爲MFC單文檔應用程序 - 事實並非如此

現在我在我製作的窗口類上調用Create()作爲父母的桌面的CWnd

我不確定我已經正確地劃分了CFormView。事實上,我很確定我已經做了一些我所需要做的事情,儘管我試圖跟隨ins我見過的結構。

然後我打電話給ShowWindow(SW_SHOW),但我什麼都看不到。

我覺得這應該很簡單。我想要做的就是顯示我在表單編輯器中創建的表單。

我該怎麼做,最簡單的方法是什麼?

下面是一些代碼 - 調用它

MainForm *mf = new MainForm(); 

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

mf->ShowWindow(SW_SHOW); 

下面是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; 
}; 

這裏.h文件的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); 
} 
的CPP
+0

是的,我知道Qt是遠遠優越的,我已經下載它,並且正在努力學習它。但是現在我們沒有時間學習如何構建,使用和部署它。它將用於我們軟件的下一個版本。 – Tim 2009-12-23 05:53:08

回答

2

我會研究創建並在單獨的MFC UI線程中顯示您的窗口。 MFC有自己的機制將Windows消息傳遞給名爲消息泵的CWnd dervived對象,並且需要初始化它的內部結構才能工作。我認爲你需要使用框架函數調用來完成它。試試這個版本的AfxBeginThread的:

的CWinThread * AfxBeginThread(

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

);

並將您的表單作爲pThreadClass傳遞;有RUNTIME_CLASS宏會爲你做。然後,您可以使用框架代碼結束該線程。

至於消息處理,請嘗試在資源編輯器中打開表單的屬性,然後單擊頂部的消息按鈕。您可以將您的處理程序添加到需要處理的消息中。

我能夠將Menu屬性與菜單的資源ID相關聯。我不確定你爲什麼不能這樣做。如果您在樹視圖中選擇不同的資源,但您的主窗口顯示不同的資源,資源編輯器可能會感到困惑。

Regards

相關問題