2010-09-23 40 views
0

我正在嘗試製作一個應用程序,該應用程序的大部分開發都是在Visual C++ 6.0中完成的,並堅持使用Windows主題,或者確切地說它是視覺樣式方面。有問題的應用程序是具有MBCS字符集的MFC應用程序。首先獲得主音需要將InitCommonControlsEx(...);技巧與適用於Common Controls 6.0的清單結合在一起。迄今爲止沒有特別的。使用清單導致窗口保持部分空白

所有這一切,我有大量的窗口有一些畫圖故障的表現 - 在背景上的白色矩形,以前像在窗口的其餘部分一樣是灰色的,但它們不會妨礙。

最大的麻煩製造者是CDialog後代,它實現了一個(古老的)'你知道......'提示對話框。除非按鈕,複選框和裝飾框在清單到位的時刻拒絕繪製其他任何東西。但是,如果我將OUT顯示出來,一切正常。

Comparison images right after invoking the dialog

我已經通過OnPaint代碼階梯(其中繪製圖標和「你知道嗎?」的文字,並且所有的函數返回明智和成功的價值。我也試圖消除整個customdrawn位(評論出映射爲WM_PAINTWM_CTLCOLOR消息),但即使這造成沒有顯示或行爲對於這個問題不同。

當我點擊「下一提示」按鈕,它正確繪製的下一個提示但是,帶有燈泡圖標的customdrawn標題仍然不正確唱。

該代碼真的沒有什麼特別的,我可以發現,而且我很茫然。因爲我懷疑對話定義是最有幫助的,所以我會將其包含在內,儘管如果人們對問題隱藏的位置有了解,我可以發佈其他內容。

IDD_TIP DIALOG DISCARDABLE 0, 0, 231, 164 
STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU 
CAPTION "Tip of the Day" 
FONT 8, "MS Sans Serif" 
BEGIN 
    CONTROL   "",IDC_STATIC,"Static",SS_BLACKFRAME,12,11,207,123 
    LTEXT   "Some String",IDC_TIPSTRING,28,63,177,60 
    CONTROL   "&Show Tips on StartUp",IDC_STARTUP,"Button", 
        BS_AUTOCHECKBOX | WS_GROUP | WS_TABSTOP,13,146,85,10 
    PUSHBUTTON  "&Next Tip",IDC_NEXTTIP,109,143,50,14,WS_GROUP 
    DEFPUSHBUTTON "&Close",IDOK,168,143,50,14,WS_GROUP 
    CONTROL   "",IDC_BULB,"Static",SS_BITMAP,20,17,190,111 
END 

我正在測試的機器是運行VS2010的W7 64位機器。有問題的應用程序本身是32位的。

編輯:

新的一天提供了新的見解。不知何故,問題是處理WM_CTLCOLOR消息。當我將其設置爲返回NULL_BRUSH時,我終於看到了正在繪製的東西(在初始繪製後當然會模糊不清)。更進一步地說,它似乎是當nCtlColor == CTLCOLOR_STATIC,如果我返回一個NULL_BRUSH,東西會顯示。然而,當我將它變成WHITE_BRUSH時,再也沒有任何東西能夠被吸引。

原始代碼:

 
HBRUSH CTipDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor) 
{ 
    if (pWnd->GetDlgCtrlID() == IDC_TIPSTRING) 
     return (HBRUSH)GetStockObject(WHITE_BRUSH); 
else if (nCtlColor == CTLCOLOR_STATIC) 
     /* Visual styles enabled causes the things we draw in our WM_PAINT 
     * to get cleared (and not redrawn) if we do not use a hollow brush here. 
     * Likely the default behaviour differs when using theming. */ 
     return (HBRUSH)GetStockObject(HOLLOW_BRUSH); 
   
    return CDialog::OnCtlColor(pDC, pWnd, nCtlColor); 
} 

問題解決了!大膽的線條是我爲解決問題而改變的,包括強制性評論。 :)

回答

1

據我所知,公共控件版本6只正式支持Unicode。

根據a blog entry by Raymond Chen,這些控件與ANSI字符集一起工作到一定程度,但僅出於向下兼容性的原因。沒有人應該故意使用它。

如果您是ANSI應用程序並且您從公共控件庫創建控件,則可能會遇到奇怪的行爲。它主要是工作,但在邊緣可能有些奇怪。

...

而且這意味着所有你們這些人誰正在使用公共控件6版本,但還沒有轉換成Unicode是依靠兼容性漏洞。 ANSI的支持是有原來以爲他們在談論到版本5共同控制的舊程序;它不適合你。

我從來沒有嘗試過這樣的事情,所以我不能肯定地說,但是你可能會遇到一些這種「奇怪的行爲」。如果是這樣的話,那麼唯一正式支持的選項將是要麼轉換爲Unicode或返回到使用控件的5.0版本。否則,你將留下試圖找到解決方法的任何奇怪的行爲你可能會發現,那聽起來不像一個良好的局面是,

+0

我知道的Unicode <-> MBCS問題,我開始之前。然而,我理解它的方式是關於字符集會出現怪癖;特別是Raymond在他的博客文章中指出的編輯控制。轉換爲Unicode可能是東西掉在地平線上,但現在我有點不相信有詭詐這個平凡的對話,因爲所有的輸入/輸出,此時留在ASCII範圍。我有與時髦的繪圖東西_far_更復雜的窗戶,工作得很好。 – Stigma 2010-09-24 09:20:47

+0

既然你是唯一的答案,並且它是一個有用的答案(儘管沒有回答或解決我的問題的根源),我會接受你的答案。感謝您抽出時間回覆。 :) – Stigma 2010-09-24 12:27:07