web-dev-qa-db-ja.com

C + Win APIでのプログラミング:Windows 7でコントロールを探す方法は?

私は厳密にCとWinAPIでプログラミングしており、C++やC#は使用していません。私は初心者で、コントロールなどの描画を学んでいます。Windowsやコマンドボタンなどの他のコントロールを作成すると、Windowsネイティブの外観になります。これを見てください:

This is look I am getting!

ただし、Windows 7では、コマンドボタンは次のようになります。

enter image description here

では、プログラムのコマンドボタンをそのようにするにはどうすればよいですか。それも可能ですか?参考までに、このチュートリアルに従っています: http://zetcode.com/gui/winapi/

ありがとう。

29
Ishan Sharma

個別のファイルまたは埋め込みリソースとしてXMLマニフェストを提供することにより、アプリの視覚スタイルを有効にします。詳細については、 ビジュアルスタイルの有効化 を参照してください。

18
GSerg

これが、テーマ(視覚スタイル)が発明される前の1990年代のコントロールの振り返りです。お気づきのように、現代のボタンは、グラデーションやズキズキするようなすべての派手なパンツに描かれています。ただし、下位互換性の理由から、コントロールがその処理を受けるように具体的に要求する必要があります。そうしないと、従来のスタイルにフォールバックします。

マニフェストを指定することでそれを行います。プレーンテキスト形式でアプリケーションのルートディレクトリに追加するか、Visual Studio(2005以降)でEXEに自動的に埋め込むことができます。

2番目のルートは私が行く方法です。次のコードをstdafx.hファイルに追加して、プロジェクトのビルド時にマニフェストを自動的に追加することをコンパイラーに通知します。

#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

このMSDNの記事 視覚的なスタイルに関する情報がこれまでにないほど多くあります。


アプリケーションを本当にネイティブに見せたい場合は、メインウィンドウに使用する背景ブラシを変更する必要があります。デフォルトでは、テキストボックスの背景と同じ色(白)を使用するように設定されています。

代わりに、3Dコントロールのペイントに使用される色を使用する必要があります。次に示すように、hbrBackground(またはWNDCLASS)構造体のWNDCLASSEXメンバーを変更します。

wc.hbrBackground = (HBRUSH)(COLOR_BTNFACE + 1);

なぜ1を追加する必要があるのですか?下位互換性の理由から、繰り返します。詳細は退屈です。 :-)

24
Cody Gray

Windows XPがその新鮮な新しい外観で到着したとき、それをWindows 95/2000のクラシックな外観に戻すか、カラーテーマを変更することができたのをおそらく覚えているでしょう。それは ビジュアルスタイル 。これにより、Windowsのテーマサポートが向上しました。

Classic, Luna, Aero and Metro

それ以来、視覚スタイル は機能 として残っています。 Windows Vistaおよび7ではAeroが導入されましたが、それでもクラシックテーマの使用は許可されていました。 Windows 8では、Aeroとクラシックの両方のテーマが削除され、Metroテーマが追加されました。ハイコントラストのテーマはビジュアルスタイルの一部になり、クラシックな外観はなくなりました。

したがって、Aeroスタイルが期待されていたWindows 7の古典的なテーマのアプリケーションは、アプリケーションの視覚的なスタイルの問題です。理由はわかりませんが、Microsoftは、APIを新しい外観に移行する際に、古いクラシックテーマをオプションのままにしませんでした。

では、どうすればモダンスタイルを適用できますか?

enter image description here

いずれにせよ このMSDNの記事 では、アプリケーションのビジュアルスタイルを有効にする方法について説明しています。 Unicodeを有効にする(UNICODEを定義する)とそれができると言う人を見たことがありますが、それは必須ではありません。基本的には、共通コントロールのバージョン6 DLLを要件として指定するマニフェストファイルを作成し、それをリソースとして埋め込むか、実行可能ファイルのディレクトリのappname.exe.manifestの下に配置するだけです。サンプルマニフェストは次のようになります。

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<Assembly xmlns="urn:schemas-Microsoft-com:asm.v1" manifestVersion="1.0">
    <assemblyIdentity version="1.0.0.0" processorArchitecture="*"
        name="CompanyName.ProductName.YourApplication" type="win32"/>
    <description>Your application description here.</description>
    <dependency>
        <dependentAssembly>
            <assemblyIdentity name="Microsoft.Windows.Common-Controls"
                version="6.0.0.0" type="win32" processorArchitecture="*"
                publicKeyToken="6595b64144ccf1df" language="*"/>
        </dependentAssembly>
    </dependency>
</Assembly>

埋め込みオプションを選択する場合は、リソースファイルにwinuser.hを含めることを忘れないでください。 このMinGWガイド に従って、WinMain内の共通コントロールDLLを初期化することもできます。

いくつかの例でこの手順を見逃しているのを見てきました。特定のオペレーティングシステムのバージョンや、ボタンが表示されない、ダイアログが作成されないなどの特定の条件下では、奇妙な動作が発生する可能性があります。

INITCOMMONCONTROLSEX icc;
icc.dwSize = sizeof(icc);
icc.dwICC = ICC_WIN95_CLASSES;
InitCommonControlsEx(&icc);
14
Renato Silva