Win32 建立控制項風格不是Win XP解決方案

2021-07-15 10:18:30 字數 2684 閱讀 6779

有時候我有在用win32 api來向窗體上新增控制項時,通過createwindow或createwindowex建立出來的控制項的風格不像xp風格,而是像windows 2000的風格,介面很難看。注意,是動態呼叫createwindow來建立控制項,不是從資源中載入。

這種情況下,我們怎麼辦呢,通常說來,造成這種情況都是由於沒有正確載入資源,我們知道,像button, combobox, listbox等這些控制項都是放在comctl32這個dll裡面的,所以有時候在用這些系統自定義的控制項時,需要我們首先呼叫initcommoncontrol***函式。這個dll的版本有很多,存放在windows\winsxs目錄下面,或者你直接檢索:common control,結果如下:

好了,下面說一下解決方案吧:

這個根本辦法就是加乙個manifest檔案,其內容如下:  

<?xml version="1.0" encoding="utf-8" standalone="yes"?>

name="xp style manifest"

processorarchitecture="x86"

version="1.0.0.0"

type="win32"/>

type="win32"

name="microsoft.windows.common-controls"

version="6.0.0.0"

processorarchitecture="x86"

publickeytoken="6595b64144ccf1df"

language="*"

/>  

儲存成乙個字尾為:.manifest的檔案,引入到.res檔案中。

這樣就行了。 

還需要在資源檔案中加一行:

// 1 rt_manifest "testctrlstyle.manifest"

1>linking...

1>cvtres : fatal error cvt1100: duplicate resource.  type:manifest, name:1, language:0x0409

1>link : fatal error lnk1123: failure during conversion to coff: file invalid or corrupt

這個錯誤是說工程中已經包括了rt_manifest檔案。那麼此時,就不要加這句話,直接把這個.manifest檔案加入到工程中就行了。

修改過後的介面如下:

上面這種方法是用manifest來設定引入的comctl32的版本,但注意上面的manifest,裡面指定了這個comctl32的平台:processorarchitecture="x86",如果這個應用程式想在x64下面執行,就會導致乙個問題:這個64位的程式鏈結的是32位的comctl32庫,建立控制項就會失敗。所以最好的解決方案就是下面這種做法:

在標頭檔案裡面加入下面的語句:

#ifdef _unicode

#if defined _m_ix86

#pragma comment(linker,"/manifestdependency:\"type='win32' name='microsoft.windows.common-controls' version='6.0.0.0' processorarchitecture='x86' publickeytoken='6595b64144ccf1df' language='*'\"")

#elif defined _m_ia64

#pragma comment(linker,"/manifestdependency:\"type='win32' name='microsoft.windows.common-controls' version='6.0.0.0' processorarchitecture='ia64' publickeytoken='6595b64144ccf1df' language='*'\"")

#elif defined _m_x64

#pragma comment(linker,"/manifestdependency:\"type='win32' name='microsoft.windows.common-controls' version='6.0.0.0' processorarchitecture='amd64' publickeytoken='6595b64144ccf1df' language='*'\"")

#else

#pragma comment(linker,"/manifestdependency:\"type='win32' name='microsoft.windows.common-controls' version='6.0.0.0' processorarchitecture='*' publickeytoken='6595b64144ccf1df' language='*'\"")

#endif

#endif

這裡就是根據編譯選項來指定鏈結什麼版本的庫,這樣編譯出來的程式就不會有上述的問題。

win32 控制項操作

int getwindowtext hwnd hwnd,lptstr lpstring,int nmaxcount boolsetwindowtext hwndhwnd,lpctstrlpstring 問題 如下,vc6 問題描述請看注釋.char sztext 256 wparam wparam ...

Win32控制項使用 Edit控制項

drecik學習經驗分享 edit控制項是乙個很強大的輸入控制項,可以處理很多樣式,通過vs的控制項屬性來設定,有單行,多行,密碼框,滾動條等。其中通知碼可以如下所示 獲得edit控制項輸入的內容可以通過之前討論過的通用函式 參考前面的博文 getwindowtext等。剪下,複製,刪除當前選擇內容...

WIN32視窗建立

win32視窗建立過程 1 定義視窗類 在msdn中找到函式原型 winmain 2 定義視窗處理函式 在msdn中找到原型 windowproc 3 設計視窗類 4 註冊視窗類 registerclass registerclas 5 建立視窗 createwindow createwindowe...