Visual Studioのリソースエディタで特に何もせずダイアログを作る(※)と、かな漢字の表示には最新のWindows 8.1でもMS UI Gochicが使用されます。これをメイリオやMeiryo UIなどにしようというのが今日の内容です。

※ なお、何も考えずに作るダイアログはDS_SHELLFONTかつ”MS Shell Dlg”ということです。MS Shell DlgがTahomaになり、TahomaからのフォントリンクでMS UI Gothicが使われます。

今回もWTLを使ってそのようなことを実現するクラスを作り、Gistに置いています: gist: CDialogWithThemedFontImpl.h

フォントの取得には、以下のようにTheme APIを使用しています。TEXT_CONTROLLABELがこの用途に最もふさわしいものであるという確証を得られなかったのがちょっと気になるところです(その名前でいいだろうと判断しました)。

HTHEME hTheme = ::OpenThemeData(nullptr, VSCLASS_TEXTSTYLE);
// ……
HRESULT hr = ::GetThemeFont(hTheme, nullptr, TEXT_CONTROLLABEL, 0, TMT_FONT, &tmp);

この辺のAPIが失敗を返したら、もとのリソーススクリプトの内容そのままを使用するようにしています。Windows XPでも動きます。

フォントを取得したら、ダイアログテンプレートをメモリ上で書き換えて、あとはDialogBoxIndirectParamやCreateDialogIndirectParamで表示するだけです(実際にはWTL::CIndirectDialogImplを使っています)。

これを利用するサンプルコードは以下です。

#define WINVER 0x0501
#define _WIN32_WINNT 0x0501
 
#define _ATL_NO_AUTOMATIC_NAMESPACE
#define _WTL_NO_AUTOMATIC_NAMESPACE
 
#include <windows.h>
 
#include <atlbase.h>
#include <atlwin.h>
 
#include <atlapp.h>
#include <atlcrack.h>
 
#include "CDialogWithThemedFontImpl.h"
 
#pragma comment(linker, "\"/manifestdependency:type='Win32' "\
  "name='Microsoft.Windows.Common-Controls' version='6.0.0.0' "\
  "processorArchitecture='*' publicKeyToken='6595b64144ccf1df' "\
  "language='*'\"")
 
#define IDD_TEST 1
 
// WTL::CThemeが必要としている
class Module : public ATL::CAtlExeModuleT<Module> {};
Module module;
 
class TestDialog
#if 1
  : public CDialogWithThemedFontImpl<TestDialog>
#else
  : public ATL::CDialogImpl<TestDialog>
#endif
{
public:
  static const UINT IDD = IDD_TEST;
 
private:
  BEGIN_MSG_MAP(TestDialog)
    MSG_WM_INITDIALOG(OnInitDialog)
    COMMAND_ID_HANDLER_EX(IDOK, OnExit)
    COMMAND_ID_HANDLER_EX(IDCANCEL, OnExit)
  END_MSG_MAP()
 
  BOOL OnInitDialog(...)
  {
    return TRUE;
  }
 
  void OnExit(UINT uNotifyCode, int nID, HWND wndCtl)
  {
    EndDialog(nID);
  }
};
 
int WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int)
{
  InitCommonControls();
 
  TestDialog dlg;
  return dlg.DoModal();
}

また、ダイアログを定義するリソーススクリプトはこちらになります。

#include 
#include 

#define IDD_TEST 1

IDD_TEST DIALOGEX 0, 0, 120, 80
STYLE DS_SHELLFONT | DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU
CAPTION "Dialog"
FONT 8, "MS Shell Dlg", 400, 0, 0x1
BEGIN
	DEFPUSHBUTTON "OK", IDOK, 8, 38, 50, 14
	PUSHBUTTON "キャンセル", IDCANCEL, 60, 38, 50, 14
	LTEXT "テキストのテスト", IDC_STATIC, 36, 19, 60, 8
END

これを使うに当たっては、ちゃんと表示されることの確認が大変になることの覚悟をお願いいたします。日本語版Windowsだけに限っても、Meiryo UI、メイリオ、MS UI Gochicと3種類になります。

ダイアログリソースをメモリ上で加工する例は少ないので、苦労しました。ATLとMFCのソースコード、Old New Thingsを参考に書き上げました。フォント名のところのパディングは、起こらない場合(メイリオ)と起こる場合(游ゴシック)両方で動くことを確認済みです。


スポンサード リンク

この記事のカテゴリ

  • ⇒ ダイアログをメイリオなどで表示する
  • ⇒ ダイアログをメイリオなどで表示する
  • ⇒ ダイアログをメイリオなどで表示する