2014-05-19 60 views
0

我的程序/環境... VS2010,C++,MFC100,CWinAppEx,CMDIFrameWndEx。 MFC功能包。CPreviewView和命令處理程序

我正在創建和處理CPreviewView派生。我的方法將此預覽視圖視爲用戶可以保持活動狀態的普通視圖。默認預覽視圖在當前視圖上繪畫並「接管」子框架。

我無法弄清楚的一件事是如何控制應該定向到所有CD文件的ON_UPDATE_COMMAND_UI消息映射。創建CPreviewView時,它會以某種方式禁用CDocuments的所有命令處理程序。 CView的命令處理程序仍處於運行狀態。

在我的MDI應用程序中打開的所有文檔都不會收到它們的ON_UPDATE_COMMAND_UI消息。我可以將這些消息處理程序移到視圖或框架中,但是這樣做太多了,無法有效地執行此操作。

有誰知道CPreviewView類在哪裏關閉文檔處理程序?

+0

嘗試在'CView :: OnCmdMsg(...)'中放置一個斷點,並按照邏輯來查看文檔消息映射被繞過的原因。 – user1793036

+0

這確實有幫助。我看着這些命令在MyDoc :: OnCmdMsg()中被我自己的程序拋在了地板上。謝謝! – diox8tony

回答

2

首先,MFC不是一個「鎖定」框架。它的完整源代碼位於您自己的PC上的以下文件夾中:「您的Visual Studio文件夾」\ VC \ atlmfc \ src \ mfc \(在我的PC上:c:\ Program Files文件(x86)\ Microsoft Visual Studio 11.0 \ VC \ atlmfc \ src \ mfc)CPreviewView的源文件位於viewprev.cpp文件中。我剛纔打開的文件,並在DoPrintPreview他們呼籲這一點:

pParent->OnSetPreviewMode(TRUE, pState); // Take over Frame Window 

根據MSDN這個方法:

默認實現禁止所有標準工具欄和隱藏在主菜單和主客戶端窗口。這將MDI框架窗口轉換爲臨時SDI框架窗口。

我打開了名爲winfrm.cpp的文件,並檢查此方法正在執行,並且它禁用了所有菜單。顯然,在預覽模式打開時,不會有更新消息發送到文檔。

在上面的超級鏈接的MSDN文章說,你需要重寫OnSetPreviewMode方法爲您的框架:

定製打印預覽中的隱藏和控制桿和其他框架窗口的部分表現。在重寫的版本中調用基類實現。

這應該不是問題。

+0

是的,註釋OnSetPreviewMode()函數調用起作用,並且是此問題的最佳答案。然而,我已經完成了這個任務,並且我發現我的代碼中存在MyDoc :: OnCmdMsg內部的問題,如果預覽窗口已啓動,它將自動禁用它。 – diox8tony

+0

順便說一句,我不建議你評論MFC庫中的任何代碼。這不是正確的做法。相反,你應該重寫你的類中的方法,並配置工具欄,因爲你準備好了 – cha

+0

。我有一個繼承類,我重載了函數,然後編輯我的類中的代碼。 – diox8tony