トップ回答者
Visual Studio 6(VB6)で作成したアプリをWindows10で実行した際、画面のラベルだけが黒くなります

質問
-
VB6で作成されたアプリをWindows10に持ってきて起動させた際、起動は出来たのですが画面に表示されるラベルが黒く塗りつぶされてしまい、
文字が表示できない状態となってしまいます。
(Windows10だけでなくWindows7のPCに持ってきても、同様の現象となりました)
同じアプリをWindowsXPで実行したら文字がきちんと表示されますので、Windows10でも文字を表示できるようにしたいと思っております。
下記にURLを貼ります。
[https://social.msdn.microsoft.com/Forums/getfile/1550069]
試しに、このアプリを互換モード(WindowsXP SP3)で動作させても同様の現象でした。
なお、ソースコードが無いので開発環境でソースを修正することができません。ですので、アプリ以外の設定などの変更で対応したいと思っています。
何か情報をお持ちの方がいらっしゃれば、ご連絡いただければ助かります。
よろしくお願いします。
- 編集済み aip-aip 2020年2月27日 6:43
回答
-
こちらのサイトによれば、Label コントロールのプロパティは、初期設定で下記が設定されているようです。
Appearance = 1 - 3D BorderStyle = 1 - 実線 BackStyle = 1 - 不透明 BackColor = &H8000000F& (vb3DFace, vbButtonFace) ForeColor = &H80000012& (vbButtonText)
もしかしたら、上記以外のシステム色———たとえばツール ヒントの背景色を示す vbInfoBackground (&H80000018&) など———が Label の背景色に設定されており、かつ、OS の設定色が、たまたま文字色と同じ「黒」になっていた……とか。
- 回答としてマーク aip-aip 2020年2月28日 2:56
-
また、不透明が指定されているLabelのBackColorは、「&H80000009&」となっていまして、
これは「アクティブタイトルバーの文字」という名前の色でした。
なおForeColorは「&H80000012&(ボタンの文字)」となっていました。同世代のソースコードにおいて、背景色なのに vbTitleBarText という「文字色」が割り当てられていたことから、作成したアプリのデザイン設計の不具合という可能性が高いですね…。
Windows XP であれば、「画面のプロパティ」からクラシックスタイル時におけるシステムカラーを設定できますが、現在の OS には同等画面が用意されていないと思います。
システムカラーの一時的な変更のためには、SetSysColors API を利用することができます。
システムカラーの恒久的な変更のためには、XP の頃だと、クラシック テーマであれば「画面のプロパティ」から指定できましたし、レジストリの HKEY_CURRENT_USER\Control Panel\Colors でも指定できたと思います。ただし TitleText 値の設定が Win10 でも有効なのかは未確認です。
Visual Style の場合は恐らく、Windows テーマで変更することになるのだと思いますが、テーマを自作したことは無いので、設定方法などは調べていません。といっても VB6 アプリの場合、意図的に manifest を用意しない限りは影響しないので、気にする必要は無いでしょう。もしも Visual Style で描画される設定にしていた場合、Windows 10 では、タイトルバーの色が DWM によって描かれるので、[個人用設定]-[色]-[アクセント カラー]-[タイトルバーとウィンドウの境界線]の設定にも左右されるかもしれません(未調査)。もっとも、設定しても影響しなかったとのことですので、今回確認すべきはクラシック スタイル時のカラー設定だと思います。
- 編集済み 魔界の仮面弁士MVP 2020年2月27日 12:43
- 回答としてマーク aip-aip 2020年2月28日 2:55
-
解決したようで何よりです。
(いまだに行間を詰めるやり方が分かっていないです・・・)
ブラウザーにもよりますが、PC からの投稿であれば、[Enter]で段落(<p></p>タグ)を分けるかわりに、[Shift]+[Enter] で物理改行(<br/>タグ)を入れれば行間が詰まります。
レイアウトが崩れた場合は、ツールバーの[HTML]アイコンを押して、タグを直接編集する必要があります。ブラウザーによっては、ツールバーが表示されない環境もありますが…。
それと aip-aip さんの投稿を見る限り、半角80~100文字前後で定期的に改行されているようですが、ある程度長い文章は自動的に画面幅で折り返されますので、必ずしも整形のために改行する必要は無いと思います。段落で分けるだけでも十分かと。
- 編集済み 魔界の仮面弁士MVP 2020年2月28日 3:20
- 回答としてマーク aip-aip 2020年2月28日 4:46
すべての返信
-
下記にURLを貼ります。
[https://social.msdn.microsoft.com/Forums/getfile/1550069]
画像タグとして貼らないと、一定期間経過後に削除されてしまう可能性があるようなので、念のため貼りなおしておきます。
試しに、このアプリを互換モード(WindowsXP SP3)で動作させても同様の現象でした。
となると、あまりできることは無いですね…。こちらでテストできないため、直接的なアドバイスはできないのですが、気になる点をいくつか挙げてみます。
- 日本語ランタイムを入れ忘れていたため、VB6 のコアランタイムのみで動作している状態になってしまっており、Font 未設定(あるいは Font.Charset ≠ 128)なコントロールの表示が崩れてしまっている。→ランタイムを再インストールしてみる
- 実際には Label ではなく UserControl にて表現されており、その描画処理に何らかの問題が生じている状態。→ソースが無いと対処不可
- Unicode 対応などを目的として、標準コントロールの Label の代わりに ActiveX コントロールの MSForms.Label が利用されていたが、Microsoft Forms 2.0 のバージョンが不整合を起こしており、正しく描画できていない。→ 32bit 版 Office をインストールしてみる
- XP Luna 対応(Visual Style)のため、コンパイルした exe 内に対して事後追加で manifest リソースが埋め込まれており、それが悪影響を及ぼしている。→ VS6 などで EXE を開いて、非正規のリソースがあれば削除してみる
- 駄目元で、グラフィックドライバーを最新版にしてみる(あるいは逆にバージョンダウンさせる)
- 他の Windows 10 環境でも再現するのか確認する(どのバージョンの Windows 10 なのかも確認しておく)
- 編集済み 魔界の仮面弁士MVP 2020年2月27日 8:37
-
こちらのサイトによれば、Label コントロールのプロパティは、初期設定で下記が設定されているようです。
Appearance = 1 - 3D BorderStyle = 1 - 実線 BackStyle = 1 - 不透明 BackColor = &H8000000F& (vb3DFace, vbButtonFace) ForeColor = &H80000012& (vbButtonText)
もしかしたら、上記以外のシステム色———たとえばツール ヒントの背景色を示す vbInfoBackground (&H80000018&) など———が Label の背景色に設定されており、かつ、OS の設定色が、たまたま文字色と同じ「黒」になっていた……とか。
- 回答としてマーク aip-aip 2020年2月28日 2:56
-
魔界の仮面弁士様
詳細にアドバイスを頂きありがとうございました。
この現象が発生しているアプリとは若干仕様が異なるのですが、同世代に開発された類似のソースが
見つかりましたので、WindowsXPのPC(仮想ですが)にVisual Studio 6(SP6)をインストールして
プロジェクトを開いてみました。
それを見たところ、Labelと思っているのが実はUserControlではないかとのご指摘を頂きましたが、
Labelコントロールでした。(済みません、早くソースを見つけていれば良かったのですが)
Visual Studioでフォームを見て分かったこととしましては、
BackStyleに「0 - 透明」が指定されているLabelはちゃんと文字が表示できていまして、
BackStyleが「1 - 不透明」となっているLabelだけが黒塗りとなっておりました。
また、不透明が指定されているLabelのBackColorは、「&H80000009&」となっていまして、
これは「アクティブタイトルバーの文字」という名前の色でした。
なおForeColorは「&H80000012&(ボタンの文字)」となっていました。
WindowsXP上のウィンドウのタイトルバーを見ますと、確かに文字は黒色だったので、
文字と背景が同じ黒となっているように見えました。
上記のことから、アクティブウィンドウのタイトルバーの色を変更したら変化があるのかと思い、
[設定]-[個人用設定]-[色]で、「タイトルバーに色を付ける」をオンにして、アクティブウィンドウの文字色が
白色になるように変更してみましたが、Labelの表示に変化はありませんでした。
Labelの前景色と背景色についてはまだ調査の余地があるのかわかっていませんが、
頂いたほかのご指摘についても引き続き確認していきたいと思っています。
-
また、不透明が指定されているLabelのBackColorは、「&H80000009&」となっていまして、
これは「アクティブタイトルバーの文字」という名前の色でした。
なおForeColorは「&H80000012&(ボタンの文字)」となっていました。同世代のソースコードにおいて、背景色なのに vbTitleBarText という「文字色」が割り当てられていたことから、作成したアプリのデザイン設計の不具合という可能性が高いですね…。
Windows XP であれば、「画面のプロパティ」からクラシックスタイル時におけるシステムカラーを設定できますが、現在の OS には同等画面が用意されていないと思います。
システムカラーの一時的な変更のためには、SetSysColors API を利用することができます。
システムカラーの恒久的な変更のためには、XP の頃だと、クラシック テーマであれば「画面のプロパティ」から指定できましたし、レジストリの HKEY_CURRENT_USER\Control Panel\Colors でも指定できたと思います。ただし TitleText 値の設定が Win10 でも有効なのかは未確認です。
Visual Style の場合は恐らく、Windows テーマで変更することになるのだと思いますが、テーマを自作したことは無いので、設定方法などは調べていません。といっても VB6 アプリの場合、意図的に manifest を用意しない限りは影響しないので、気にする必要は無いでしょう。もしも Visual Style で描画される設定にしていた場合、Windows 10 では、タイトルバーの色が DWM によって描かれるので、[個人用設定]-[色]-[アクセント カラー]-[タイトルバーとウィンドウの境界線]の設定にも左右されるかもしれません(未調査)。もっとも、設定しても影響しなかったとのことですので、今回確認すべきはクラシック スタイル時のカラー設定だと思います。
- 編集済み 魔界の仮面弁士MVP 2020年2月27日 12:43
- 回答としてマーク aip-aip 2020年2月28日 2:55
-
おっしゃる通り、設計時の不具合と思われます。
(担当者も今はいなくなってしまったので、なぜそんなことになったのかは辿れません・・・)
レジストリでシステムカラーの設定が出来るとのことでしたので確認しました。
Labelの背景色が「アクティブタイトルバーの文字」だったことから、
HKEY_CURRENT_USER\Control Panel\Colors\TitleText の値を確認したところ、
「0 0 0」(黒)が設定されていましたので、それを「255 255 255」(白)にして再起動しました。
すると、黒塗りだったLabelがきちんと表示できるようになり、文字が読めるようになりました。
(文字が黒色で、背景が白色)
もともとこの画面の背景色が白色なので、これで違和感なく表示されるようになりました。
他にもさまざまなアドバイスを頂きましたが、時間があまりないのでこの対策案で進めてみたいと思っています。
(このアプリをインストールするPCはこのアプリしか使わないので、レジストリを一度設定しておけば
他のアプリへの影響は無いという想定です)
初めてこのフォーラムに問合せさせていただいたので見苦しい文章だったと思いますが、
(いまだに行間を詰めるやり方が分かっていないです・・・)
多岐にわたるアドバイスを丁寧にしていただき大変感謝しております。
どうもありがとうございました。
-
解決したようで何よりです。
(いまだに行間を詰めるやり方が分かっていないです・・・)
ブラウザーにもよりますが、PC からの投稿であれば、[Enter]で段落(<p></p>タグ)を分けるかわりに、[Shift]+[Enter] で物理改行(<br/>タグ)を入れれば行間が詰まります。
レイアウトが崩れた場合は、ツールバーの[HTML]アイコンを押して、タグを直接編集する必要があります。ブラウザーによっては、ツールバーが表示されない環境もありますが…。
それと aip-aip さんの投稿を見る限り、半角80~100文字前後で定期的に改行されているようですが、ある程度長い文章は自動的に画面幅で折り返されますので、必ずしも整形のために改行する必要は無いと思います。段落で分けるだけでも十分かと。
- 編集済み 魔界の仮面弁士MVP 2020年2月28日 3:20
- 回答としてマーク aip-aip 2020年2月28日 4:46