2012-05-16 87 views
2

我想繼承使用此代碼在對話框中的進度控制:WTL和CContainedWindow導致訪問衝突

ATL::CContainedWindowT<WTL::CProgressBarCtrl> progress; 
// ... 
progress.SubclassWindow(GetDlgItem(IDC_PROGRESS)); 

都好那裏。現在,如果我嘗試這樣做:

progress.SetRange(0, 100); 

我得到的訪問衝突異常的SendMessage在平凡的WTL的SetRange()實現。我一直在尋找上下,我能找到的所有這些都可能是Applications Using Older ATL Components May Experience Conflicts With DEP中提到的一些「thunking」問題,因爲我使用的是最新的ATL和WTL(Visual Studio 2010和WTL 8.1),所以這不應該適用於我。即使使用WTL 8.0,我也會遇到同樣的問題。

由於HWND是有效的,子類別已經完成。有任何想法嗎?

回答

2

WTL :: CProgressBarCtrl m_Progress; <〜使用它來附加進度條,而不是CContainedWindow。

+0

'CProgressBarCtrl'沒有實現'SubclassWindow',所以這是不行的。你可以說得更詳細點嗎? – wpfwannabe

+0

m_Progress.Attach(GetDlgItem(IDC_PROGRESS1)); \t m_Progress.SetPos(0); – johnathon

2

如果您創建了一個窗口的子類,那麼您應該爲這個子類控制實現一個消息映射。這包括將您的成員變量連接到構造函數中的消息映射,將ALT_MSG_MAP添加到類消息映射中。你在做這個嗎?我想你沒有。

你首先需要這個嗎?要只發送短信你不需要子類,你只需要真正HWND連接到CProgressBarCtrl實例:

WTL::CProgressBarCtrl m_ProgressBar; 
// ... 
m_ProgressBar = GetDlgItem(IDC_PROGRESS); 
m_ProgressBar.SetRange(... 

子類做確定爲HWND有效

不,這是不好。你迷上了窗口,但你沒有提供你的WindowProc。因此,這個問題。

+0

謝謝。來自[Code Project](http://www.codeproject.com/Articles/4028/WTL-for-MFC-Programmers-Part-IV-Dialogs-and-Contro)的文章誤導我相信我應該使用'CContainedWindow' 。文章確實使用了'ALT_MSG_MAP',但這並不是顯而易見的,這是強制性的,「訪問違規」當然是一個驚喜。即使你的回答更加詳盡,我將首先授予@johnathon。 – wpfwannabe

+1

順便說一句這篇文章確實在「ATL Way 2」一節中顯示了CContainedWindow的正確使用方法:http://www.codeproject.com/Articles/4028/WTL-for-MFC-Programmers-Part-IV-Dialogs-and -Contro#atl2 –

+0

是的,我現在可以看到,但簡單的'm_ProgressBar = GetDlgItem(IDC_PROGRESS)'方法並不明顯。謝謝! – wpfwannabe