c语言control表题目,CMFCControl 问题
解決CMFCMenuButton無法顯示右邊箭頭以及多字節編碼下堆破壞的問題
有時候覺得MFC真TM惡心,就這兩個問題花了我好長時間才找到解決辦法,記下來以避免搞忘,如果能給讀者帶來方便那是更好,廢話不多說,說正事!
1.無法顯示右邊箭頭的問題(Can't?load?bitmap:?42b8.?GetLastError()?=?716?有時)
無論怎么折騰都沒顯示不出來,微軟給的示例又能顯示,度娘和谷歌也都不知道,經過不斷地探索總算找到解決辦法了:在rc2文件中加上下面的內容即可
#ifndef?_AFXDLL//許多其他CMFCCOntrol類型的問題?都需要此處更改
#include?"afxribbon.rc"??????//?Ribbon?and?control?bars
#endif
當然,要想按鈕有XP的風格,還需要在App類的InitInstance中加上
CMFCVisualManager::SetDefaultManager(RUNTIME_CLASS(CMFCVisualManagerWindows));
然而這樣在關閉程序時會發現有內存泄漏,輸出窗口中出現如下內容:
Init?CriticalSection?spin?count?CDLPShareMemConfig::Close()CDLPShareMemConfig::Close()TSWebDownLoadProtect.dll?is?Load?failedTSWebMon.dat?is?Load?failedDetected?memory?leaks!
Dumping?objects?->
f:\dd\vctools\vc7libs\ship\atlmfc\src\mfc\afxvisualmanagerwindows.cpp(35)?:?{487}?client?block?at?0x001C9318,?subtype?c0,?376?bytes?long.
a?CMFCVisualManagerWindows?object?at?$001C9318,?376?bytes?long
Object?dump?complete.
顯然,這是由于RUNTIME_CLASS(CMFCVisualManagerWindows)動態創建了一個CMFCVisualManagerWindows的實例沒有釋放,不知道CMFCVisualManager在搞什么,在吃SHI嗎,還需要我們手動釋放,既然它不作為,那我們只有自己干了,在ExitInstance中加上CMFCVisualManagerWindows::DestroyInstance();就好了
2.?多字節編碼下堆破壞
如果你建的項目是使用的Unicode編碼,那么在Debug模式下沒有問題,Release模式下同樣會出現堆破壞的錯誤,程序根本沒法啟動!如果是多字節編碼,那么對不起,任何模式都不行,不知道MFC怎么搞的!
沒辦法,總得知道原因出在哪里吧,找到MFC的源碼(源碼怎么找相信大家都知道,就在VS安裝目錄下\VC\atlmfc\src\mfc下面,查找包含CMFCMenuButton字符串的文件,怎么搜索不用我說了吧,在Win7下改一下搜索選項就可以了),在OnDraw里面打斷點,發現問題出在CMFCButton::OnDraw那一行,繼續調CMFCButton::OnDraw,發現問題出在GetWindowText,用一個大一點的緩沖區來存獲得的文本吧,發現文本后面被填入了"\0?MFCMenuButton",乖乖,多出這么長一截,堆能不被破壞嗎?
解決辦法有兩個:
(1)重載CMFCMenuButton,自己實現OnDraw(可以將CMFCButton和CMFCMenuButton的OnDraw合并起來),在GetWindowText那里自己分配一個大一點的緩沖區就行了;這種辦法太笨拙了,不推薦。
(2)不寫任何代碼,直接將Button控件拖入到對話框中,添加變量時變量類型改成CMFCMenuButton就可以了,只不過需要自己設置按鈕的一些屬性。
好了,就這么多,如果誰有更好的解決辦法請指教!
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
以上是生活随笔為你收集整理的c语言control表题目,CMFCControl 问题的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: c语言ox32左移一位的值,程序设计基础
- 下一篇: 0ppo手机怎么取电池