2012-04-18 15 views
1

私はVisual Studio 2008 Professional Editionを使用しています。私はダイアログエディタで次のようなダイアログを設計しました。 - Dialog that I designedグループボックスの外観と感じ

[タスク]というダイアログのグループボックスには十分注意してください。されている Dialog box when displayed from application

突然、元青キャプションと、ダイアログエディタで指定されたエッジを丸め: - それはこっちに正常に見えるが、私は自分のアプリケーションからモードレスダイアログボックスとして表示するときにグループボックスのルックアンドフィールは突然に変わります黒い前景と四角いエッジで置き換えられます。 なぜこれが突然起きているのかを知りたいので、ダイアログエディタで指定されたルックアンドフィールで表示させたいのですが。

次のコードは、dialog-のための私のリソースファイル(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

+0

[アプリケーションでWindowsテーマを使用するにはどうすればいいですか?](http://stackoverflow.com/questions/3884525/how-do-i-make-my-application-use-the-windows-theme) – Deanna

答えて

3

明らかに、マニフェストおよび/またはInitCommonControls()への呼び出しが必要です。詳細については、Enabling Visual Stylesを参照してください。

+0

@ Joeyすみません。私はWindows XP Professionalを使用していますので、これらのスタイルはデフォルトで有効にしてください。私はなぜ今のOSのルック&フィールをアクティブにするためにこのすべてのトラブルに行くのか? – Sreyan

+0

@ Joey私は、コードの先頭に次の行を追加しました。 - #pragma comment(リンカ、 "\" /マニフェスト依存:type = 'win32' \ name = 'Microsoft.Windows.Common-Controls' version = ' 6.0.0.0' \ processorArchitecture = '*' なPublicKeyToken = '6595b64144ccf1df' 言語= '*' \ "") そして、私のプログラムにCommCtrl.hを含むが、私は以下のエラー - 得た: MAIN.OBJ:エラーLNK2019:未解決の外部シンボル__imp__InitCommonControls @ 0関数_WinMain @ 16 で参照されています。> C:¥Documents and Settings¥Sreyan¥My Documents¥Visual Studio 2008¥Projects¥Timer¥Debug¥Timer.exe:致命的なエラーLNK1120:未解決externals – Sreyan

+0

Sreyan、テーマコントロールは通常のものとは異なるため、agaiをリンクする必要があります共通コントロールの異なるバージョン – Joey

4

XPの共通コントロールスタイルを有効にする必要があります。

これを行う最も簡単な方法は、マニフェストファイルにこれを含めることです。 EDIT

#pragma comment(linker,"\"/manifestdependency:type='win32' \ 
name='Microsoft.Windows.Common-Controls' version='6.0.0.0' \ 
processorArchitecture='*' publicKeyToken='6595b64144ccf1df' language='*'\"") 
:リンカに追加するか、あなたのコード内でプラグマを追加することにより、このよう
また、明示的にこのような一般的なコントロールを(100%ではないことを確認)、初期化するために必要とされることがあります。

正しいバージョンのWindowsでコンパイルする必要がある場合もあります。私は、これらのコマンドラインオプションを使用してコンパイルします。

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

しかし、これは常にアプリケーションが最小のWindows XPで必要であることを意味します。

EDIT2(sreyanさんのコメントへの回答など):

cl /EHsc /MD /c test.cpp 
link test.obj 
:次のコマンドを使用して

#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; 
} 

:私は(と呼ばれます。test.cpp)次のソースファイルをコンパイルしようとした

次のファイルが生成されました:

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を.Common-コントロールバージョン= '6.0.0.0' \ processorArchitecture = '*' なPublicKeyToken = '6595b64144ccf1df' 言語= '*' \ "") LRESULT CALLBACK WindowFunc(HWND、UINT、WPARAM、LPARAM); BOOLコールバックDialogFunc(HWND、UINT、WPARAM、LPARAM); char szWinName [] = "タイマーメインウィンドウ"; のint WINAPI WinMain関数(HINSTANCE hThisInst、HINSTANCE hPrevInst、 \t \t \t \t LPSTR lpszArgs、nWinModeをint型)... は私が何かをしないのです? – Sreyan

+0

情報をありがとうございますが、私はWin 2000以降のアプリケーションを実行する必要があります。ところで、あなたが持っている#pragmaコメントとコマンドラインオプションの意味は何ですか?私はそれを理解できません。違反しません。私はWin32 APIを初めて知り、知りたいと思っています。 – Sreyan

+0

プラグマは、生成された.OBJファイルのどこかに(リンカ用の)テキストを追加するようにコンパイラに指示します。リンカーは.OBJファイルからこの情報を取り出し、追加のコマンドラインオプションとしてテキストを使用します(このトリックを使用してリンカーにオプションを追加できます)。/manifestdependencyオプションは、生成されたマニフェストファイルにこの依存関係を追加するようにリンカーに指示します(http://msdn.microsoft.com/en-us/library/ew0y5khy(v=vs.80).aspxを参照)。最後に、マニフェストツールを使用して、マニフェストを実行可能ファイルのリソースとして隠すことができます(http://msdn.microsoft.com/en-us/library/ms235591.aspxを参照)。 – Patrick

関連する問題