Top > Programmingとか > VB / VB.NET > WindowsXPがやってきた

2002年08月27日

VB6の開発環境はXPデスクトップテーマに対応できるかⅡ

答:いろいろできません。

8ヶ月前のネタを今ごろ引っ張り出してくるさるですこんばんは。

さる2001.12.18にvb6.exe.manifestをvb6.exeと同じフォルダに置くことで、VBの開発環境がLunaインターフェイスになるよ」と書いたわけなんですが。

これがもぅ実際に使い込んでみると、動作不具合ありまくり。使いもんになりません(T-T)。



まず、TextBoxのMaxLength。これが効きません。
いゃ、IME-Offの状態でなら正常に文字数の制限が効くんですが、IME-Onで全角文字を入力すると。文字数制限を突き抜けて、なんぼでも文字が入力されてしまうんです。IME-Onでも半角(カナとか)ならきちんと効くんですけどね。

次、Ctrl+Break。
これもmanifestでLuna対応させると、効かなくなります。無限ループ時にタスクマネージャから強制終了させなければならない状況ってのはけっこぅイタいです。

「置換」ダイアログ。
「検索する文字列」「置換後の文字列」の入力欄に全角文字を入力すると、バケます。コメントの単語を一気に置き換えたくてもできません。

スクロールバー。
これはちょっとイレギュラーな使い方なんですけど、コードエディタのスクロールをホイールマウスでできるよぅに、私、自分の開発マシンにチューチューマウスを入れてるんですね。で、VB6はSDI環境で使ってます。
この状態で実際にホイールスクロールをかけると、コードエディタウィンドウがフリーズしちゃうんです。



TextBoxのMaxLength以外は開発環境だけの話で、EXE実行時には原則無関係なんですけど…こんな調子で不具合がぼこぼこ出てくるんでは、Lunaインターフェイス対応にしたEXEなんか怖くて納品できません(T-T)。

VS.NETではまだ使い込んでいないのでこのへんどうなるかまだよくわかっていないんですが…基本動作回りのテストをかなり深くやらないと、こちらも安心できなくなってしまいました。

まじでまずいぞこれ。

2002年01月15日

manifest抜きでVB6-XPスタイルアプリケーションを (3)

ってことで今度はMSDN Libraryへ。

どこに書いてあるかわからないので、とりあえずXPThemes TypeLibrary(めんどくさいので以下XPT-TL)の中の適当な関数名をキーに検索。

検索結果はありません。

…MSJPじゃだめか(T-T)。あいかわらずうすら寒いぞMSJP-MSDN Library。いゃ、英語圏の技術を使ってなんだかしよぅとしているのに日本語でないばやだとか言っている私が悪いのかきっとそぅだ。

ではMSUSではどぅでしょぅか。

おぉ。がっちりヒット。[User Interface Design and Development]-[Windows Shell and Common Controls]-[SDK Documentation]-[Windows Shell]-[Shell Reference]-[Visual Styles]がそれだっ。

ざくっと目を通してみると、ほとんどのAPI&定数&構造体がuxtheme.hで定義されていることがわかります。(たぶん構造体1つだけTmschema.h。)
このヘッダ、WinXPにあるuxtheme.dllと直で結びついているよぅな感じです。

XPT-TLの中身を推敲する前に、やはりMSの原本は必要でしょう。
前述のURL以下には一通りのAPIや構造体の宣言は載っていましたが、ここはひとつヘッダファイルそのものも欲しいところ。

ってわけで、今度はPlatform SDKそのものをダウンロード。まぁcore SDKのBuild environmentに限ればダウンロードサイズ36.5MB、インストールサイズ77.6MBなのでADSL環境の私にはさほどでも。ってちょっといばりんぼ。

とは言いながらやはり相当の時間はかかりますので。

しかもなんだかSDKのインストールにWindows Installer2.0が必要とか言われて、そっちが先にインストールされた上に一度再起動がかかってしまったといぅ回り道もしたんですが。いつのまにWindows Installerって2.0になったの?VS.netβに付属していた奴もまだ2.0βだったよぅな気がするんですけど。

今度はVB6のオブジェクトブラウザを使ってXPT-TLの中で定義されているAPIとか構造体とかを総チェック。ExcelにひとつずつCopy&Pasteで貼り付けながら整理…これが意外としんどいっす。一気に定義を全部コピー取れるよぅなプログラムも探してみたんですけど、どぅにも私のサーチ能力では見つけられませんでした(T-T)。

そぅこぅしているうちにSDKインストール完了。uxtheme.hは入っているかなぁ…あぁ、ありましたありました。デフォルトパスでインストールしましたので、C:\Program Files\Microsoft SDK\Includeの中にきちんと入っていますね。

さて、これで前準備は完了。あとはXPT-TLの要素をひとつひとつ原本や資料と突き合わせて、使い方をあぶり出せばいいんです。

…って。

なぜにXPT-TLの中でRECTが定義されていますか。

RECTは、Windef.hで定義され従来のAPIでも多用されているちょー基本的な構造体なんですね。

これをXPT-TLの中でで定義されちゃってるってことは、今まで使っていた従来のAPI宣言を集めたモジュール(標準モジュールとかタイプライブラリとか)とカブるってことです。

うわーこれ他モジュールとの併用を考慮してないよ。

Windowsプログラムを作っている方ならAPIの実装を自作の標準モジュール(ライブラリ扱い)で持ってる場合が多いでしょうし、インターネットの中を徘徊すればそれ系のDLLとかTypeLibraryとかいっぱい見つかりますんでそれ使ってる方もいらっしゃるでしょぅし。

いったいどれがカブってるんだ。いゃわかったところで。ソースレベルなら一歩譲ってカブり宣言をコメントアウトすればいいでしょぅけど、DLLやTLで実装している方の立場は。

ぱっと見でもLOGFONTとかSIZEとか、定数の方でもBF_系とかWinUser.hでお見かけしたちょー定番が散見できちゃうし…。

カブり宣言を全部洗い出すべきなのか。それとも、ざっと見TLにしなければならないAPIも見あたらないので、自力で全部DeclareとConstに書き起こしてしまぅか。

いずれにせよいきなり前途多難。
きびしー。(>"<)

2001年12月21日

manifest抜きでVB6-XPスタイルアプリケーションを (2)

こぅなると問題は、ソースなし・説明なしのタイプライブラリをどこまで活用できるかです。
試しに、オブジェクトブラウザでタイプライブラリの定義をのぞいてみましょう。

このタイプライブラリは、XPThemesといぅ名前で参照設定がかけられています。定数群は置いといて、API周りはだいたいThemesFunctionクラスにまとめられていますね。

各々のFunction名からその機能を推察できるよぅなものもけっこぅありますが…やはりきちんとしたAPIの資料がほしいなぁ。当てずっぽで使っていくには(たぶん)制御手順がめんどっぽいので少々苦労しすぎそぅ。

で、まずは作ったご本人は当然その仕様を知っているはずですし。提供してくれているページでなんか言ってはいないかしら、とそのページを改めてきちんと読んでみました。

お、下部に作者と使用者のコメントが載っている。どれどれ。

  • このサンプルを動作させるためには、WinXPが必須だ。それ以前のバージョンでは動かない。

  • http://www.allapi.net/vbtutor/xpthemes.php もチェックしてみること。
    (このURLではmanifestファイル外置きによる対応手法を説明している)

  • (ソースコードを提供してもらえないか?といぅ声に対して)
    なんのソースコードだ?タイプライブラリのか?タイプライブラリってのはあなたのプロジェクトに組み込んでも、アプリケーション配布時に添付する必要はないってことを忘れないでほしいな。
    (そぅ言っているよぅな気がするんですが…ちょっと意味が通りませんね?)

  • (できあがったアプリケーションはWin98でも動くか?といぅ声に対して)
    残念ながらNoだ。これはテーマ対応のOS上でしか動作しないし、今のところそれはWinXPしかない。
(私の訳文ですので、どこまで正確なのかはちょっとあれですね。)

…なんか期待していた方向と違う。
各関数/定数の使用法がピンとこないのでソースコードからさかのぼって理解しようとして(だろぅと思うんですが)の要望に対して「再配布しないんだから必要ないだろ」ってなんとなく論旨をすり替えた解答をしているよぅに読みとれてしまぅのは私の英語読解力の浅さのせいでしょぅか。

うーん。いずれにせよ作者 Pieter Philippaerts 氏(感謝っ)はXpThemes.tlbしか提供する気はなさそげですね。困ったなぁ。

って。よく見るとサンプルプロジェクトの中にXpThemes.txtってのがあるじゃないですか。

  • XpThemes.tlbとそのサンプルプロジェクトを自由に再配布して構わない。

  • XpThemesタイプライブラリをあなたのアプリケーションに使用して、そのソースコードとといっしょに再配布することもおっけーだ。
あ。だから「tlbの再配布おっけーだっつってんのになんでさらにソースコードが必要なんだ?」って言い回しになるのか。納得。
  • しかし、XpThemesタイプライブラリやサンプルプロジェクトを「私が作った」と主張してはならない。
…当たり前ですね。
  • WinXP テーマAPIについてのより詳しい情報はMSDN Libraryを参照すること。
そりゃそぅでした。

2001年12月20日

manifest抜きでVB6-XPスタイルアプリケーションを (1)

その前に、XPアイコンはどぅなったのか?を。
とりあえず、まずは会社にあるPhotoshopで使い方を覚えてみることに。なんせ無用に重たいソフトなので、今まで使ったことがなかったんです(てゅうか使う気がしなかったんです)。

GMGがシャドウレイヤーをどぅ受けとめるのか。それは他のグラフィックソフトでも提供可能なのか。とまぁそのへんから調べてみよぅといぅことでひとつ。
次回このテーマでお話ができるのはいつになるんでしょうか(T-T)。



さて、以外と評判が悪ぃぞmanifestファイル。と言ってる私にしてもなんだかいまいちなぁな感じがしてますし。

もっとも今までだって。たとえばプログラムファイルのショートカットファイルをエクスプローラからのドラッグ&ドロップで作成する際に、そのプログラムファイルのアイコンが自動的に反映されるのはなぜなのかといぅと。プログラムファイルのアイコンリソースの一番最初のデータをプログラムそのものとは無関係に読み出して表示しているわけですね。これ、Windowsの起動とかデスクトップの再描画のつど読み出しているんです(アイコンキャッシュの存在は別として)。

manifestだって同じこと。プログラムを起動する際に、まずはそのプログラムファイルの中のmanifestリソースがあるかどぅかを確認し、あれば一番最初のデータの記述に基づいて。なければさらに同フォルダに(プログラムファイル名).manifestといぅファイルがあるかどぅかを確認し、あればそのファイルの記述に基づいて。どちらのComCtl32.dllを使用するかを判断した上で当のプログラムの実行を開始させる、といぅ手順で動作するんです。

つまり、プログラムがその動作や表示をすべて決定するわけではなく、ある時はプログラムファイルとして、またある時はデータファイルとしてWindowsにいいよぅに使われているわけです。Win95の最初から。

それが今になってアイコンの表示はOSに任せてもいいけどTextBoxの表示はプログラムコードから制御できなきゃやだって何様だ > 私σ^^;)。
まぁそれがスジだとしても、やなもんはやですので、心のおもむくままになんとかしてみよぅかな、と。



で。VB6はデスクトップテーマに対応できるか(決定版)でもちょろりと述べましたが、ComCtl32.dll Ver6のタイプライブラリを作った御仁がいらっしゃる。こいつをなんとかしたらなんとかなるんではないかしら。それにしても私は妙にタイプライブラリにまつわるあたりでちょろちょろしているよぅな気がするのは気のせいかしら。

で、件のページからサンプルプログラムをダウンロード→展開→実行。おぉ。ただのPictureBoxがXPデスクトップテーマに対応したWindowに早変わりだ。しかもmanifestでは未対応のプログレスバーまでかっきり対応しているぞ。イケるかも。

2001年12月19日

VB6はXPのアイコンに対応できるか (1)

まぁここまで間断的に、VB6のいろいろはWinXPのデスクトップテーマに対応できるかといぅ切り口でいろいろ試してきたわけですが。
作成したプログラムもOK、IDEでのデザイン時もOKとくれば、次は当然アイコンとなりましょぅ。
さてアイコンはどぅやって作ればいいんだ



てなわけで、まずは正攻法でMSJPのサイトへ。[msdn online]→[MSDN Online Site 更新情報]とたどっていって、新しい順からXP用プログラミングっぽいタイトルの記事を探していきます。と、そのものずばりのWindows XP 用アイコン作成法ってのがありました。よし、ここのとおりまずはアイコンファイルを作ってみればいいんだ。

で、このコンテンツでやれと言っていることを簡単に列挙すると。

  • XPのアイコンサイズは482、322、162の3サイズが必要。
    加えて242があればなおよし。

  • 色深度は24bits+8bitsアルファチャネル(32bits)、8bits+1bits透明色(9bits)、4bits+1bits透明色(5bits)の3種類が必要。

  • 基調となるカラーパターンが決まっている。

  • アイコン画像の斜め具合は固定。
    さまざまなアイコンが並んだ時の傾き具合に統一感を持たせる。

  • 原画は拡大縮小に伴う劣化を防ぐために、ベクトルイメージで作成することが望ましい。
    Macromedia FreeHandやAdobe Illustratorなどが適切。

  • ベクトルイメージをPhotoshopにインポートしてドロップシャドウを作成。
    このドロップシャドウがアルファチャネルとなる。
    他ソフトでアルファチャネルを作成できるどうかは不明。

  • 8ビットおよび4ビットイメージを作成する。
    ギャザを消しておくのがコツ。

  • 上記で作成した各イメージをGif Movie Gear(GMG)というソフトにインポートしてICOファイルを作成。
…うわぁーむちゃくちゃ大変

パースの角度まで決まってるし、私ゃFreeHandもPhotoshopも持ってないし、なんだGMGって。
GMGについてはGamaniからダウンロードできるってんで行ってみると30日間無料トライアル版(オーダー$39.95)だし、カード決済するにも北アメリカ以外からの注文を受け付けてくれるかどぅか不明だし、アイコンひとつ作るのに5,000円もかけてられないし、他のアイコン作成ソフトがアルファチャネルやレイヤーに対応しているかどぅかもわからないし。
コンテンツ内では「イメージを作成する際には、優れたグラフィックデザイナーと作業すること」をお勧めされちゃってるし。



だめだ、こいつはギブ。技術だの情報だのいぅ前に、作業のためのソフトが全然手元にないです。もぅちょいXPのアイコンデータの取り扱いを調べてから、相当品で代用できるかどぅかも考慮してみないと手が出ません。

今日はこのくらいにしといてやる。(ノ-T)

2001年12月18日

VB6の開発環境はXPデスクトップテーマに対応できるか

実は。左に並べてあるコンテンツ群は、けっこぅ長い期間いろいろ調べたり確かめたり失敗したり力つきたりしたあげく、なんとかかんとかお話しできるレベルまでまとめられる形になったものなんですね。いぇ決してコンテンツ数の少なさに対する言い訳ではなく。
しかし。必ずしもうまくいく場合ばかりだとは限りませんし、面白いエピソードであっても話が脇道に逸れすぎる恐れがある場合には泣く泣く切り捨ててたりもしてるんです。
ので。ここではプログラミング周りで試したり遊んだりしてみたことを結果は別としてお話ししちゃおぅと。
あまりにもとほほで笑っちゃぅことはあるかもしれませんが技術的にお役には立てないかも。万が一お役に立っちゃうよぅな結果になったとしたら、そのうちきれい(?)にまとめて左のコンテンツ群に追加することとします。



さて。
XPのデスクトップテーマ対応第三弾を考えてみました。
ちなみに、XPのLuna I/Fに代表される新しいデザインをなんと呼べばいいのか。本サイトでは一応デスクトップテーマといぅMicrosoftの表現に準じた呼称にしてみましたが、当のMicrosoft自身がページによってビジュアルスタイルなど別の呼称も使っているもんですからさてどーしたもんだか。いゃ、なんだかどんどんビジュアルスタイルとか呼ぶ方が正しくてかっこいいよぅな気がしてきました。まずぃかなぁ。このままでは少数派かなぁ。Microsoftの新コンテンツが「ビジュアルスタイル」で呼称統一され始めてきているよぅな気がするのは気のせいかなぁ。まぁいぃゃ、意味がわかんなくなるまでデスクトップテーマで通しちゃえ。


といぅ逡巡を経た上で改めて。XPのデスクトップテーマ対応第三弾を考えてみました。
2001.10~11月くらいにかけて、VB6製プログラムをXPデスクトップテーマに対応させるべくじたばたしてみたわけですが。その結果はWindowsXPがやってきたのあたりで述べておりますので、よろしければご参照ください。
で、やはり曲がりなりにもテーマ対応がとれるとわかれば、やっぱデザイン時にもXP風コントロールで作業したいのが人情なのではないかと。


ではさっそく。まず手始めに、vb6.exe.manifestをこしらえてvb6.exeのあるフォルダにおいて起動してみましょう。

…あ。できちゃった。

ネタにならん(T-T)。

2001年11月11日

02 VB6はデスクトップテーマに対応できるか(決定版)

検証環境 自作ATX(Cerelon533/VT6X4/384MB) WindowsXPPro/IE6.00Jp/VS6

えー、先日VB6はデスクトップテーマに対応できるか(暫定版)を書いてから、あんまり悔しぃんで 連日のように世界中のWebサイトやらニュースグループやらを探しまくっておりました。

…どぅしても見つかんない。
無理もないです。日本ではまだ(建前上)発売が開始されていませんし、本家アメリカでも発売されたばかり。
英語圏の掲示板やニュースグループでも、「VB製プログラムをWinXPのテーマに対応させる方法はありませんか」との質問が一切レスが付かずにむなしく書き込まれている状態です。
唯一手法を提示していたページは、私の前項に記述したのと同じ方法でした…。



さて、そんな四苦八苦を続けていたら、面白いツールを見つけました。

PE Explorer。これ、簡単に言っちゃぅと、EXE/DLL/OCXなどのデバッガです。売り元が www.heaventools.com なんていかにもな名前なところがアレなんですが。

で、このPE Explorer。最新版(Ver1.50)の新機能のひとつに、XP Manifest Wizardってのがあったんです。
さっそく体験版をダウンロードしてみましたとも。インストールしてみましたとも。前項で提供した XPControls1.exe に適用してみましたとも。

…大成功。

いゃ、前項の最後と同じ表示でしかないので、改めてここで提示はしませんが。
これで私もばりばりWinXPのデスクトップテーマに対応したプログラムを書き放題!

って、別に結果オーライなんであれば前項の手法でもいっこうに構わないわけで。
私は自分のプログラミング作業だけでデスクトップテーマに対応させる手法を探していたはずなので、これではやはりいまいち収まりが悪いですね。むぅぅ。
しかもこのPE Explorer、できあがった実行ファイルに対してWizardかけるので、ソースレベルでどぅのといぅ話ではないんですね。

ってことで結局自力組み込みの方法はわからずじまい。だめじゃん。



泣きながら一晩寝たら、思いつきました。
元々manifestデータをリソースとして組み込むって基本ラインは Microsoftのコンテンツですでにわかっているわけで。
「リソースとしてどぅ用意するか」と「用意したリソースをどぅ使用するのか」がよくわからなくって断念していたんです。
ってことは、PE Explorerでデスクトップテーマに対応した実行ファイルのリソースを解析すれば、リソースの用意のしかたの正解はわかるはず。
実行ファイルの中のリソースを直接引っぱり出していじくる手法は、実はOutLookのカスタマイズの仕事をした時に知ってたんですね。いゃ、VC++で実行ファイルをリソースファイルとして読み込んじゃえばいいだけなんですけど。
たぶんPE ExplorerもVC++のそれと同じ手法でmanifestデータを実行ファイルに追加しているんではないのかしら、との推測も成り立ったりします。とすると、実際に実行するコード部はいじくってないはず。ならば、manifestデータをリソースとして用意さえすればおっけーなのか?

まぁ楽観的な推測は置いといて。
PE Explorerでデスクトップテーマ対応化したXPControls1.exeをXPControls1PE.exeと名前を変えて、対応前のXPControls1PE.exeと両方Visual Studioでリソースファイルとして読み込んでみました。

vb4-fig07.gif
fig.7 Visual Studioでリソースファイルとして読み込んだXPControls1.exe(対応前/後)


これだっ。

そーかリソースタイプ=24/ID=1でmanifestデータを埋め込めばいいんだっ。

さっそくVBのリソースエディタで作ってみました。

変わらない。(T-T)

…おかしいなぁ。
今作ってみたXPControls2.exeを先ほどの対応済プログラムとリソースを見比べてみると、

vb4-fig08.gif
fig.8 PE Explorerでデスクトップテーマ対応させたXPControls1.exeと自作XPControls2.exe
24に「"」が 付いてはるっ!

…いゃ、別に私京都の人ではないんですが。

これがどーしてもだめ。VB付属のリソースエディタだと、リソースタイプが数値になりません。なにをどーやっても 絶対文字列になってしまいます。
なにか私が知らない方法があるんでしょうか。ご存じの方はご一報ください。

しかたがないのでVC++でリソースファイルを作成、でVBでリソースファイルとして読み込んで再度コンパイル。
これでどぅだっ!

vb4-fig09.gif
fig.9 manifestリソース付きでコンパイルしたXPControls2.exeの実行結果
(クリックで拡大します)
なんかもっと すごいことに。(T-T)

リソースファイルは完璧なはずなんですが…。ほら。

vb4-fig10.gif
fig.10 PE Explorerでデスクトップテーマ対応させたXPControls1.exeと自作XPControls2.exe(2)
(クリックで拡大します)

リソースの中身だって同じはずなんですが…あら?

vb4-fig11.gif
fig.11 PE Explorerでデスクトップテーマ対応させたXPControls1.exeと
自作XPControls2.exeのリソースの中身
(クリックで拡大します)
VBのバグだ。
(T-T)(T-T)(T-T)

リソースを埋め込む時に、お尻によけいなデータがくっつく。

manifestデータの文字列をいろいろ変えて試してみると、「00」が1~4バイト程度ランダムにくっつくことがわかりました。 もちろんくっつかない時もたまにあって、その場合は正常に動作します。

では、VC++で読み込んで直接リソース末尾の「00」を削除すると。うぅむ、ちゃんと起動します。



以上より、結論。

VBでは、XPデスクトップテーマに 対応したプログラムは作れない。

正確には、作れるときもあるが不安定で使い物になりません。ちくしょー。

VBでmanifestリソース込みでコンパイルしてから埋め込まれたりソースの末尾のゴミをVC++で取り除く、って手もありますが。
元々のリソースファイルをVC++で作らなければならないこともあり、なんのためにVBを経由してリソースを埋め込まなければならないのかまったく必然性のない状態ではあります。

ので、ここはひとつ単純にできあがったEXEファイルに後からmanifestリソースを埋め込むのがベスト、といぅ結論とします。

ってことで、以下具体的な手順です。

  1. ふつーにVBでコンパイル、EXEファイルを作成する。

  2. 作成したEXEファイルをVC++で、リソースファイルとして読み込む。

  3. 表示されたツリー構造の一番上、EXE名の部分を右クリック。

  4. [挿入(I)...]-[カスタム(C)...]と選択、リソースのタイプを 24 とする。
    (ここまで操作すると、バイナリエディットウィンドウが新規作成の状態で開く。)

  5. 前項で用意したmanifestファイルを バイナリエディタ で開き、VC++のバイナリエディットウィンドウへカット&ペーストする。
    (これ以外の方法では文字列がバイナリレベルでUTF-8にならず、正常に動作しない。)

  6. バイナリエディットウィンドウを閉じ、24フォルダの下にできたリソースデータを右クリック。

  7. [プロパティ(P)...]を選択、カスタムリソースプロパティで[ID(I):]を「1」に書き換えて閉じる。

  8. リソースを追加したEXEを保存終了し、VC++を終了する。
さぁ、この作業が完了したら、できあがったEXEを実行してみましょう。
ちゃんと起動しましたよね。コントロールもそれぞれXPのデスクトップテーマを反映していることを確認してみましょう。

VC++を持っていない方は、VECTORあたりでバイナリエディタとリソースエディタを入手すれば同じことができますよ。



さて。
ここまで長々と説明してきておいてなんですが、実はこの方法、manifestデータに依存しているって点では前項で説明した方法と本質は変わっておりません。
要は動作形態をXMLとして記述するわけで、自分のEXEの機能ではなく、XMLパーサのお世話でデスクトップテーマに対応しているんです。

まぁXMLはXP以降のWindowsではプログラムを動作させる手法のひとつとして完全にOSに組み込まれているわけですから別に困るわけではないんですが。

やはりプログラムは自分のEXEで完全に制御したい。
外部機能として取り込むことを許容できるのはせいぜいDLL-APIまでだ。

なんて方には、別の手法をお教えしましょう。

Allapi.net - VB examples - General Source Codes - Intermediate/THEMES

ここで紹介されている方法はむっちゃくちゃ正攻法です。
具体的には、CommonControl6の全機能を扱うためのタイプライブラリを作成し、そこからコントロールをひとつずつがしがしフェイス適応させていくんですね。
パワーのある方は、ぜひお試しください。XPのデスクトップテーマ、といぅかビジュアルスタイルの仕組みが理解できまくりますよ。

2001年10月29日

01 VB6はデスクトップテーマに対応できるか(暫定版)

検証環境 自作ATX(Cerelon533/VT6X4/384MB) WindowsXPPro/IE6.00Jp/VS6

2001.11.16の日本語版発売を待たずして何の拍子にか入手してしまいました、WindowsXP。ふっふっふ、うれしー。

WinXPとVS.netが手に入っちゃったわけですから、こりゃぁもぅ遊ぶしかないでしょう。
ってことでいろいろ遊ぶことにしました。
…身が持つのかしら。



しかしその前に。
VS.netが未だβ版であることを考えると、当然お仕事には使えません。ので、やはりここはひとまずWinXP+VB6でしばらく攻めてみたいと思います。
WinXPは来月には正式に発売が開始されちゃうわけですし、少なくとも来年の春まではVS6/VB6がメジャーな開発ツールになるんでしょうし。Microsoftも正式に対応していると 表明していますしね。

で、とりあえず気になるのは画面のふちと各コントロールのデザインの違い。
全っ然変わっちゃっています。

vb4-fig01.gif
fig.1 Windows2000で起動したWordPad(クリックで拡大します)

vb4-fig02.gif
fig.2 WindowsXPで起動したWordPad(クリックで拡大します)

では、VB6で自分で作ったプログラムはどんなもんでしょうか。
基本的なコントロールを貼っつけて実行してみましょう。

vb4-fig03.gif
fig.3 WindowsXPで起動した自作プログラム

…むちゃくちゃかっこ悪い。

WinXPのテーマに対応していないならしていないで統一してほしかったところです。

なんだTextBoxの中途半端なスクロールバーは。

WinXPのテーマに対応するしない以前に、せめてまずWin2000風のデザインをきちんとしないば恥ずかしすぎですね。

まず、今作ったプログラムを一度コンパイルしてEXEにしてみます。
で、WinXPにはプログラム互換性ウィザードのがありますので、こいつでWin2000風になるよぅに設定してみましょう。
(スタートメニューから[すべてのプログラム]→[アクセサリ]→[プログラム互換性ウィザード])

  • [手動でプログラムを選択する]→先ほど作成したEXEを指定します。

  • [プログラムの互換性モード]→とりあえず[Microsoft Windows 2000(2)]でいいでしょう。

  • [プログラムのディスプレイの設定を選択]は、「視覚テーマを無効にする(D)」にチェックをつけます。
vb4-fig04.gif
fig.4 WindowsXPで起動した自作プログラム(Win2000風)

…おぉ。何とかなったよぅな。

では、このプログラム互換性ウィザードは、このWin2000/視覚テーマ無効の情報をどこにセットしているんでしょう。
探してみたら、レジストリの中にありました。

[HKEY_CURRENT_USER\Software\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers]→[WIN2000 DISABLETHEMES]

です。…ほんと?
試しに、レジストリエディタで手動設定をしてみましょう。
ターゲットはWordPad.exe(C:\Program Files\Windows NT\Accessories\wordpad.exe)。同じキー内にWordPad.exeのフルパスで文字列値として新規作成、値を[WIN2000 DISABLETHEMES]としてからWordPad.exeを起動してみます。
…おぉ。WordPadがWin2000風になったぞ。



ちょっと余談。

WinXPでは、ComCtl32.dllが2種類同梱されています。

ひとつは~Win2000までで使用していたものと互換のバージョン5.82.2600.0のもの(ちなみにWin2000に同梱されているComCtl32.dllはバージョン5.81.4704.1100)。C:\WINDOWS\system32に格納されています。

もぅひとつはWinXPのテーマに対応して表示を変えるバージョン6.0.2600.0。
これはWinXPの紹介記事などでコモンコントロール バージョン6として紹介していることも多いので、ご存じの方もわりといらっしゃるのではないかと思います。格納位置は、C:\WINDOWS\WinSxS\x86_Microsoft.Windows.Common-Controls_6595b64144ccf1df_6.0.0.0_x-ww_1382d70a。
…うわぁ。

実は私、この2つのComCtl32.dllがどぅ動き分けているのかよくわかっていません。
てゅうか、どぅもVer.5の方は動作していないよぅな気が。VB6が無条件にVer5を参照するのなら、TextBoxが中途半端にデスクトップテーマに対応するわけはないと思うんですね。何も設定しない素の時点で、すでにVer6を参照しているんではないでしょうか。で、デフォルトの動作がDISABLETHEMESではないために、ちょいとちぐはぐな反応をするのではないか、くらいの推測をしているのですが…。
この調査の浅さが暫定版、といぅことでお許しください。



さて、今度はばりばりWinXPのデスクトップテーマに対応させたい、といぅお話。

先ほどのレジストリ値を削除したってだめです。元の中途半端な表示に戻るだけですね。

デスクトップテーマに完全対応させる場合は、まずEXEと同じフォルダに、以下の内容を持つファイルをひとつ作成します。

<?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="X86"
name="Salvage.VB SickHack04.XPControls1"
type="win32"
/>
<description>VB6でWinXPのデスクトップテーマに対応したいなぁ</description>
<dependency>
<dependentAssembly>
<assemblyIdentity
type="win32"
name="Microsoft.Windows.Common-Controls"
version="6.0.0.0"
processorArchitecture="X86"
publicKeyToken="6595b64144ccf1df"
language="*"
/>
</dependentAssembly>
</dependency>
</assembly>
これを、(プログラム名).exe.manifestといぅファイル名で保存します。しかもUTF-8で。
(UTF-8形式を扱えるテキストエディタを使いましょうね。私は秀丸ひとつでUTF-8もEUCも対応しています。超便利。)

あ。assemblyIdentityのnameは[会社名].[プロダクト名].[アプリケーション名]を、descriptionは説明文を、つど任意に記述してください。ここで提示しているのサンプルですので、こんなとぼけた文章をそのまま流用するとあとで恥ずかしいかもしれません。

準備はこれだけです。では実行してみましょう。

vb4-fig05.gif
fig.5 WindowsXPで起動した自作プログラム(WinXPフル対応 - 失敗例)

…まだなんかやだなぁ。

CommandButtonとOptionの表示が変ですね。CommandButtonは妙にフチが黒いし、Optionなんか真っ黒です。
いろいろいじくってみると、どぅもFrameをコンテナとして置いた時に表示がおかしくなるよぅです。

ので、Frameコンテナから外して再度チャレンジ。

vb4-fig06.gif
fig.6 WindowsXPで起動した自作プログラム(WinXPフル対応 - 成功例?)

まぁだいたいOKでしょう。でも、

Frameをコンテナに使えないと
Optionなどのグルーピングに困りゃしないか。

…困りますよね。
ので、上に提示したプログラムでは、CommandButton、Check、OptionをPinctureBoxをコンテナとして貼り付けてみました。 PictureBoxなら表示がバケないよぅです。
Frameの中にさらにPictureBoxを貼るのがちょっとアレで負けたよぅな気がしますが、とりあえずは妥協しておきましょう。

さらに。
Toolbar、Slider、StatudBarなんかはこれでもまだ元の表示のままです。
どぅもこれ、ComCtl32.dllで用意したコントロールではなく、MSComCtl.ocxが独自に用意した似非コントロールのよぅです。
これも極めればなんとかなるのかもしれませんが、現時点では私にはわかりません。
ここらへんもまぁ暫定版だといぅことでひとつ。



いちおぅ、まとめ。
  • 従来どおりの表示をさせるなら、レジストリにその旨登録する。

  • WinXPのデスクトップテーマの表示に準拠するなら、.manifestファイルをEXEファイルと同じフォルダに置く。
って感じでなんとかそれなりの効果はあげられるだろぅ、ってことですね。

しかしだ。
なんともかっちょ悪い手法ではあります。

前者は初回起動時にレジストリ登録してから再起動かけなきゃなりません。もしくはインストーラを加工して、インストール時に行うかですね。
どっちにしてもなぁ。
インストーラ不要なプログラムを作成配布したい需要は多いでしょうし(VBだって別途ランタイムを導入してあるマシンにならインストーラなしで組み込めます)、初回起動時にださださウィンドウがちらとでも出るのであればやっぱ不本意ですしねぇ。

後者はXMLを別ファイルとして同梱しなきゃならないところがいまいちアレ。
VC++6だとリソースとしてプログラム内に組み込む手法がすでに提供されているんですが(手順はこちら、サンプルはこちら、VBでの実装はDr.GUIが答えてくれていますが…肝心のXMLの組み込みについてはお茶を濁されてしまっています)、これをVBに流用できないのが今んとこの私の限界です。とほほ。

ってこともあって、本項はあちこち暫定版です。
も少しスマートな手法がわかった時点で随時書き換えていきますね。

悪戦苦闘の痕跡はこちら