2012-04-18 72 views
1

我正在使用Visual Studio 2008專業版。我在對話框編輯器中設計了以下對話框: Dialog that I designed組框外觀

請注意對話框中名爲「任務」的組框。它看起來很好,在這裏,但是當我顯示它從我的應用程序組框突然變成的外觀和感覺無模式對話框 - : Dialog box when displayed from application

突然原來的藍色標題和四捨五入在對話框編輯器中指定邊緣消失並用黑色前景和方形邊緣代替。 我想知道爲什麼這是突然發生的,我希望它顯示在對話框編輯器中指定的外觀和感覺。

下面的代碼中存在的對話框 - 我的資源文件(Timer.rc):提前

IDD_FORMVIEW DIALOGEX 0, 0, 204, 118 
STYLE DS_ABSALIGN | DS_SETFONT | DS_SETFOREGROUND | DS_CENTER | WS_MINIMIZEBOX | WS_VISIBLE | WS_CAPTION | WS_SYSMENU 
EXSTYLE WS_EX_APPWINDOW | WS_EX_NOACTIVATE 
CAPTION "SR-Timer(Work in Progress)" 
FONT 10, "Verdana", 400, 0, 0x0 
BEGIN 
    CONTROL   "Shutdown",IDC_RADIO1,"Button",BS_AUTORADIOBUTTON,73,37,48,10 
    CONTROL   "Restart",IDC_RADIO2,"Button",BS_AUTORADIOBUTTON,73,54,39,10 
    CONTROL   "Stand By",IDC_RADIO3,"Button",BS_AUTORADIOBUTTON,73,70,44,10 
    CONTROL   "Hibernate",IDC_RADIO4,"Button",BS_AUTORADIOBUTTON,73,87,47,10 
    GROUPBOX  "Tasks",IDC_STATIC,59,28,90,78 
END 

感謝。

+0

單選按鈕中也沒有視覺樣式,因爲您可以輕鬆看到它們。 – Joey 2012-04-18 10:22:16

+0

[我如何讓我的應用程序使用Windows主題?](http://stackoverflow.com/questions/3884525/how-do-i-make-my-application-use-the-windows-theme) – Deanna 2012-04-18 15:35:10

回答

3

顯然這需要清單和/或致電InitCommonControls()。有關更多信息,請參閱Enabling Visual Styles

+0

@ Joey對不起,我正在使用Windows XP Professional,所以不應該默認激活這些樣式。我的意思是爲什麼要解決所有這些問題只是爲了激活當前操作系統的外觀和感覺? – Sreyan 2012-04-18 14:10:07

+0

@ Joey我在代碼頂部添加了以下行: #pragma comment(linker,「\」/ manifestdependency:type ='win32'\ name ='Microsoft.Windows.Common-Controls'version =' 6.0.0.0' \ ProcessorArchitecture用於= '*' 公鑰= '6595b64144ccf1df' LANGUAGE = '*' \ 「」) 然後包括CommCtrl.h到我的計劃,但我得到了以下錯誤 - : Main.obj:錯誤LNK2019:無法解析的外部符號__imp__InitCommonControls @ 0在函數中引用_WinMain @ 16 1> C:\ Documents and Settings \ Sreyan \ My Documents \ Visual Studio 2008 \ Projects \ Timer \ Debug \ Timer.exe:致命錯誤LNK1120:1無法解析externals – Sreyan 2012-04-18 14:18:57

+0

Sreyan,主題控件與正常的控件不同,這就是爲什麼你需要鏈接到agai不同版本的通用控件。 – Joey 2012-04-18 15:36:18

4

您應該啓用XP通用控制風格。

最簡單的方法是將其包含在清單文件中,例如,通過將其添加到鏈接器,或者在你的代碼中添加編譯,就像這樣:

#pragma comment(linker,"\"/manifestdependency:type='win32' \ 
name='Microsoft.Windows.Common-Controls' version='6.0.0.0' \ 
processorArchitecture='*' publicKeyToken='6595b64144ccf1df' language='*'\"") 

編輯:它可能還需要明確初始化公共控件(不是100%確定),就像這樣:

INITCOMMONCONTROLSEX InitStr; 
InitStr.dwSize = sizeof(InitStr); 
InitStr.dwICC = ICC_WIN95_CLASSES|ICC_DATE_CLASSES|ICC_COOL_CLASSES; 
// Other classes are: ICC_COOL_CLASSES, ICC_INTERNET_CLASSES, ICC_PAGESCROLLER_CLASS, ICC_USEREX_CLASSES 
InitCommonControlsEx(&InitStr); 

也可能需要使用正確的windows版本定義進行編譯。我編譯使用這些命令行選項:

/D_WIN32_WINNT#0x0501 /DWINVER#0x0501 /D_WIN32_IE#0x0500 

但這總是意味着應用程序需要以最低的Windows XP。

EDIT2(作爲答案sreyan的評論):

我嘗試編譯下面的源文件(稱爲TEST.CPP):

#include <iostream> 

#pragma comment(linker,"\"/manifestdependency:type='win32' \ 
name='Microsoft.Windows.Common-Controls' version='6.0.0.0' \ 
processorArchitecture='*' publicKeyToken='6595b64144ccf1df' language='*'\"") 

void main() 
{ 
std::cout << "Hello World" << std::endl; 
} 

使用以下命令:

cl /EHsc /MD /c test.cpp 
link test.obj 

並生成以下文件:

23-04-12 10:49    9 728 test.exe 
23-04-12 10:49    638 test.exe.manifest 
23-04-12 10:49   16 812 test.obj 

的test.exe.manifest文件包含此:

<?xml version='1.0' encoding='UTF-8' standalone='yes'?> 
<assembly xmlns='urn:schemas-microsoft-com:asm.v1' manifestVersion='1.0'> 
    <trustInfo xmlns="urn:schemas-microsoft-com:asm.v3"> 
    <security> 
     <requestedPrivileges> 
     <requestedExecutionLevel level='asInvoker' uiAccess='false' /> 
     </requestedPrivileges> 
    </security> 
    </trustInfo> 
    <dependency> 
    <dependentAssembly> 
     <assemblyIdentity type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='*' publicKeyToken='6595b64144ccf1df' language='*' /> 
    </dependentAssembly> 
    </dependency> 
</assembly> 

因此,這似乎是正常工作。

重新檢查您在Visual Studio中填寫的選項以及您添加的編譯指示。 先嚐試一個小應用程序(如上面的那個),直到它正常工作。 然後轉到您的大型應用程序。如果它不起作用,請比較小應用程序的不同之處。

成功。

+0

這不起作用。我已粘貼在下面的way-的代碼: 的#include 的#include 「RESOURCE.H」 的#pragma評論(接頭, 「\」/ manifestdependency:類型= '的win32' \ 名='Microsoft.Windows處理器結構='*'publicKeyToken ='6595b64144ccf1df'language ='*'\「」) LRESULT CALLBACK WindowFunc(HWND,UINT,WPARAM,LPARAM); BOOL CALLBACK DialogFunc(HWND,UINT,WPARAM,LPARAM); char szWinName [] =「定時器主窗口」; INT WINAPI的WinMain(HINSTANCE hThisInst,HINSTANCE hPrevInst, \t \t \t \t LPSTR lpszArgs,INT nWinMode)... 我這麼想??? – Sreyan 2012-04-18 14:04:48

+0

感謝您的信息,但我需要我的應用程序從Win 2000以上運行。順便說一句,#pragma註釋和命令行選項的意義是什麼,你賦予我不能理解它,沒有冒犯我只是新的Win32 API,並想知道。 – Sreyan 2012-04-18 17:09:07

+0

該編譯指示告訴編譯器在生成的.OBJ文件中的某處添加文本(用於鏈接器)。鏈接器將從.OBJ文件中獲取這些信息,並使用該文本作爲附加命令行選項(您可以使用此技巧向鏈接器添加任何選項)。/manifestdependency選項告訴鏈接器將此依賴項添加到生成的清單文件中(請參閱http://msdn.microsoft.com/zh-cn/library/ew0y5khy(v=vs.80).aspx)。最後,您可以使用清單工具將清單作爲可執行文件中的資源來使用(請參閱http://msdn.microsoft.com/zh-cn/library/ms235591.aspx)。 – Patrick 2012-04-20 11:15:41