...ing logging 4.0

はてなブログに移行しました。D言語の話とかいろいろ。

DFL: ビジュアルスタイルの有効化

追記あり

続・追記あり


DFLに限らないけれども。

VisualStyle有効:

VisualStyle無効:

以下のコードをソースファイルに追加してdmdでビルドすれば、実行ファイルと同時にマニフェストファイルが生成される。 実行ファイルを起動すれば、ビジュアルスタイルが有効になっている。

でもビジュアルスタイルを有効にすると、なぜかタブストップのフォーカスの表示が見えなくなっている???

version(X86_64)
{
    pragma(linkerDirective, "/manifestdependency:\"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='amd64' publicKeyToken='6595b64144ccf1df' language='*'\"");
}
version(X86)
{
    pragma(linkerDirective, "/manifestdependency:\"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='x86' publicKeyToken='6595b64144ccf1df' language='*'\"");
}

マニフェストと実行ファイルを別にしたくない場合は、リソースファイルを作ってリソースコンパイラコンパイルしてリンクするらしい。こっちはめんどくさいのでまだ試していない。

ところで最近のアプリケーションはコモンコントロールを使わないのが増えたなあ。

追記

DFL の場合、 Application.enableVisualStyles() を最初に呼び出せばいいだけだった。 でもやっぱりフォーカスが見えなくなってしまう。

void main()
{
    Application.enableVisualStyles();
    Application.run(new MainForm());
}

続・追記

ビジュアルスタイルを有効にしたとき、フォーカスの点線枠が表示されていなかったが、実行する度に違う結果になる。 どうもコントロールを初めて作成するよりも早く Application.enableVisualStyles() が呼ばれるときと、その逆順になるときがあるように思える。

そこで、ビジュアルスタイル有効化のタイミングをもっと早めればいいのかも、と思って試してみたところ、static this() 内で呼び出すのが一番簡単そうだ。今のところ、安定している。

static this()
{
    Application.enableVisualStyles();
}

void main()
{
    // Don't call this here!!
    // Application.enableVisualStyles();

    Application.run(new MainForm());
}

参考

フォーカスを自前で描画する方法をついでに調べたときのメモ。結局、使うことはなかった。