AutoCAD 2017 のカスタマイズ互換性 でご案内したとおり、AutoCAD 2017 では、RGB 値 192,192,192 の色指定でボタン背景を透明にして、ユーザ インタフェースの配色パターン(ダークテーマとライトテーマ)の差を吸収する機能が削除されています。代替方法として、透明色/透過性を指定できる PNG ファイルすることが推奨されています。
古くから AutoCAD をカスタマイズされている方の中には、カスタム ボタンで利用するビットマップ ファイルを 1 つの DLL ファイルにまとめてメニューファイル(.cuix)と一緒に使用されている方もいらっしゃると思います。ボタン イメージだけをまとめた DLL ファイルを、AutoCAD では リソース DLL (英語名:Resource Only DLL) と呼んでいますが、AutoCAD 2017 での仕様変更によって、リソース DLL 内のRGB 値 192,192,192 を持つ BMP イメージ ファイルを PNG ファイルに置き換えた場合、AutoCAD 2017 は透明色をカスタム ボタンに反映することが出来ません。今回は、PNG ファイルでリソース DLL を作成する際の手順と注意点について、簡単にまとめておきたいと思います。
リソース DLL の作成手順
ここでの作成手順では Visual Studio 2015 を利用しますが、AutoCAD が参照するリソース DLL を作成することが目的なので、Visual Studio のバージョンは問いません。また、32 ビット、64 ビットのターゲット プラットフォームの差も意識する必要はありません。32 ビット版のリソース DLL 内のイメージ リソースを 64 ビット版 AutoCAD 2017 は認識します。
- ボタンイメージに透過性を持たせる目的に作成した RGB 値 192,192,192 の背景色を持つ BMP ファイルを画像編集ツールで編集して透過性を持つ PNG ファイルとして保存します。大きいボタン イメージは 32 x 32 ピクセル、小さいボタン イメージは 16 x 16 ピクセルで、それぞれ、32 ビット深度でアルファ チャネルを持つ PNG 画像です。
- Visual Studio 2015 を起動して、[ファイル] >> [新規作成] >> [プロジェクト] を選択します。
- [新しいプロジェクト] ダイアログが表示されたら Visual C++ テンプレートを選択して、win32 プロジェクト をクリック後に [OK] ボタンをクリックします。
なお、ここではプロジェクト名を MyMenu とすることにします。このプロジェクトで生成されるリソース DLL ファイル名は、既定では MyMenu.dll になるため、AutoCAD で MyMenu.dll を利用する際には、MyMenu.cuix の名前でメニュー定義ファイルを作成する必要があることを意味します。このルールを守れば、ファイル名は任意でかまいません。 - ウィザードが起動して [win32 アプリケーション ウィザードへようこそ] 画面に遷移します。この画面は、[次へ] ボタンでスキップします。
- [ アプリケーション 設定] 画面が表示されたら、[アプリケーションの種類] に DLL(D) として、他のオプションは既定のまま、[完了] ボタンをクリックします。
- DLL ファイルのスケルトン プロジェクトが作成されて、Visual Studio 上にスケルトン プロジェクトがロードされます。
- [リソース ビュー] タブをアクティブにしたら、[プロジェクト] メニューの [リソースの追加] メニューを選択します。
- [リソースの追加] ダイアログが表示されたら [インポート] ボタンをクリックして、1. で作成済みの PNG ファイルをインポートします。
- [リソース ビュー] タブにインポートした PNG ファイルがリソース ID と共に PNG カテゴリ配下に表示されています。
- <重要>このままでは AutoCAD からの参照が正しく出来ないため、リソースの種類を書き換えます。インポート時に表示された画像をすべて閉じてから、[ソリューション エクスプローラ] 上で」の MyMenu.rc を右クリックして [コードの表示] メニューを選択します。
- MyMenu.rc がエディタ上に表示されたら、インポートされた PNG ファイルの種類を PNG から RCDATA に変更します。次のように PNG とあるコメント行下の PNG を RCDATA に書き換えて上書き保存してください(青字箇所)。
// Microsoft Visual C++ generated resource script.
//
#include "resource.h"
#define APSTUDIO_READONLY_SYMBOLS
/////////////////////////////////////////////////////////////////////////////
//
// Generated from the TEXTINCLUDE 2 resource.
//
#include "winres.h"
/////////////////////////////////////////////////////////////////////////////
#undef APSTUDIO_READONLY_SYMBOLS
/////////////////////////////////////////////////////////////////////////////
// 日本語 (日本) resources
#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_JPN)
LANGUAGE LANG_JAPANESE, SUBLANG_DEFAULT
#ifdef APSTUDIO_INVOKED
/////////////////////////////////////////////////////////////////////////////
//
// TEXTINCLUDE
//
1 TEXTINCLUDE
BEGIN
"resource.h\0"
END
2 TEXTINCLUDE
BEGIN
"#include ""winres.h""\r\n"
"\0"
END
3 TEXTINCLUDE
BEGIN
"\r\n"
"\0"
END
#endif // APSTUDIO_INVOKED
/////////////////////////////////////////////////////////////////////////////
//
// PNG
//
IDB_PNG1 RCDATA "Button_Image1.png"
IDB_PNG2 RCDATA "Button_Image2.png"
IDB_PNG3 RCDATA "Button_Image3.png"
IDB_PNG4 RCDATA "Button_Image4.png"
IDB_PNG5 RCDATA "Button_Image5.png"
IDB_PNG6 RCDATA "Button_Image6.png"
#endif // 日本語 (日本) resources
/////////////////////////////////////////////////////////////////////////////
#ifndef APSTUDIO_INVOKED
/////////////////////////////////////////////////////////////////////////////
//
// Generated from the TEXTINCLUDE 3 resource.
//
/////////////////////////////////////////////////////////////////////////////
#endif // not APSTUDIO_INVOKED - MyMenu.rc の上書き保存が完了したら、表示中の MyMenu.rc を閉じます。
- [ソリューション エクスプローラ] から resource.h を開いて、PNG ファイルのインポート時に自動的に振り当てられたリソース ID の記述を削除します(青字箇所)。
//{{NO_DEPENDENCIES}}
// Microsoft Visual C++ で生成されたインクルード ファイル。
// MyMenu.rc で使用
//
#define IDB_PNG1 101
#define IDB_PNG2 102
#define IDB_PNG3 103
#define IDB_PNG4 104
#define IDB_PNG5 105
#define IDB_PNG6 106
// Next default values for new objects
//
#ifdef APSTUDIO_INVOKED
#ifndef APSTUDIO_READONLY_SYMBOLS
#define _APS_NEXT_RESOURCE_VALUE 107
#define _APS_NEXT_COMMAND_VALUE 40001
#define _APS_NEXT_CONTROL_VALUE 1001
#define _APS_NEXT_SYMED_VALUE 101
#endif
#endif - resource.h を上書き保存します。
- [リソース ビュー] に表示されるPNG 画像のリソースが、RCDATA カテゴリ配下に表示されていることを確認してください。
- 個々のリソース ID がダブルクォーテーションで囲まれていなければ、[プロパティ] 画面に表示を切り替えなからダブルクォーテーションで囲みます、例えば、IDB_PNG1 は ”IDB_PNG1” となるように書き換えます。
- Visual Studio でプロジェクトをビルドして、MyMenu.dll が作成されることを確認してください。
CUIx ファイル作成とボタン指定:
拡張子を除く リソース DLL のファイル名とカスタマイズ ファイル名(.cuix)は、一致させる必要があります。ここでは、MyMenu.cuix を部分メニューとして作成することとします。新規にカスタマイズ ファイルを作成する際には、CUI[ユーザ インタフェースをカスタマイズ] コマンドで呼び出すことが出来る [ユーザ インタフェースをカスタマイズ] ダイアログの [転送] タブを利用します。
- AutoCAD 2017 のオンライン ヘルプにある手順に沿って、リソース DLL 内の PNG イメージをボタンに参照させます。この際、小さいイメージ と 大きいイメージ には、上記 18. にある ID をダブルクォーテーションを外して記入します。
- 1. で定義したカスタム コマンドをリボンやツールバーなどに割り当てます。
サンプル
上記でご紹介した Visual Studio 2015 プロジェクトとカスタマイズ ファイル MyMenu.cuix ファイルは、こちらからダウンロードすることが来ます。
運用:
- 他のカスタマイズ ファイルがインストールされているローミング フォルダ(C:\Users\<ログイン ユーザ名>\AppData\Roaming\Autodesk\AutoCAD 2017\R21.0\jpn\Support)などに、リソース DLL ファイルとメニュー定義ファイルを配置します。ここでは、MyMenu.dll と MyMenu.cuix を同じフォルダに保存しておきます。
- [ユーザ インタフェースをカスタマイズ] ダイアログの [カスタマイズ] タブを使って、MyMenu.cuix ファイルを部分カスタマイズ ファイルをロードします。もちろん、メイン カスタマイズ ファイルとして利用することも出来ますが、AutoCAD が既定で持っている acad.cuix としては利用できませんのでご注意ください。
この方法で作成したカスタム ボタンは、OPTIONS[オプション] コマンド の [表示] タブで配色パターンを変更しても、透過性を持つ PNG ファイルの参照によって、配色パターン毎に異なる PNG ファイルを用意する必要がありません。
制限事項と回避策:
カスタマイズ ファイル内のカスタム ボタンに リソース DLL 内のボタン イメージを割り当て、かつ、カスタム ボタンをドロップダウン ボタンで使用していると 、AutoCAD 2017 がクラッシュしてしまうことがあります。この現象は、2016年3月出荷当初の AutoCAD 2017 FCS(Final Customer Shipment)バージョン、いわゆる、出荷版で発生し、2016年7月にリリースされた AutoCAD 2017 Service Pack 1 で修正されていますので、リソース DLL をドロップダウン ボタンで利用している場合には、運用前に Service Pack 1 を適用することをお勧めします。
AutoCAD 2017 が RTM 版のものか、Service Pack 1 が適用されているかはビルド番号で確認することが出来ます。ビルド番号は、AutoCAD の隠しシステム変数 でご紹介した _VERNUM システム変数で参照することが出来ます。AutoCAD 2017 FCS のビルド番号は "N.52.0.0 (UNICODE)"、Service Pack 1 適用後のビルド番号は "N.104.0.0 (UNICODE)" となるはずです。
なお、PNG ファイルを利用したリソース DLL は、AutoCAD 2016 以前のバージョンではサポートされません。上記ソリューションは、AutoCAD 2017 以降のバージョンでのみ利用出来ます。
注意:
AutoCAD 2010 以降、イメージ ファイルは、それらが割り当てられたコマンドを含むカスタマイズ ファイル(.cuix)に読み込まれます。一度、カスタマイズ ファイル(.cuix)でカスタム コマンドにイメージを割り当てれば、外部に個別のイメージ ファイルやリソース DLL を保持する必要はありません。過去のカスタマイズ資産を移植するなどの明示的な理由がない限り、リソース DLL を利用し続ける必要はありません。
By Toshiaki Isezaki
コメント