1.ユーザーの方からの報告を総合すると...
Millennium G200とG400では若干現象が異なるため、ひとくくりにするのにはちょっと無理があるのですが、ユーザーの方からの報告を整理すると次のようになります。
- 印刷、印刷プレビュー、BMP・BID出力、選択時の描画でジャンクションが正しい位置に描画されない。
- 選択時の描画で縮小表示状態のコメントが正しい位置に描画されない。
- 印刷、印刷プレビュー、BMP出力、選択時の描画で縞や黒ベタが現れる。
- 大きな範囲の描画時に発生しやすい。
- 印刷、印刷プレビューでは、Version 0.58互換の方が軽症なことがある。
印刷に関してはプリンタドライバの問題が関係する場合もありますが、BMP・BID出力や選択時の描画にも問題が発生していることからビデオカードに依存する問題であると判断しました。
2.応急処置
Q&Aのページにも書きましたが、ビデオカードに依存する問題が発生した場合は、Windowsのグラフィックアクセラレータの設定を落とすことをお勧めしています。これはBSchに限ったことではなく、他のソフトでも有効な方法です。最近では、Visual C++ 6.0をノーブランドS3カードで使ったときに特定の操作で必ず飛ぶという現象を、この方法で回避したことがあります。
3.原因
BSchは内部で次の場合にモノクロビットマップを作り、そこに描画を行っています。
- 印刷
- BMP・BID出力
- 選択範囲の描画
印刷プレビューは印刷の手続きをそのまま使っているため、上の3点は今回の問題発生箇所と一致しています。内部でモノクロビットマップを使う場合には、必要な大きさのビットマップを作成したあとで、いったん白に初期化し、そこに黒ですべてのオブジェクトを描画します。
また、特に、ジャンクション、縮小表示状態のコメントの乱れが著しいことを併せ、これらで矩形塗りつぶしをするために共通で使っているPatBltというAPIのモノクロビットマップへの振る舞いが怪しいと考えました。
4.対策
BSch Version 0.784で、モノクロビットマップへの矩形塗りつぶしでPatBltを使っているところを、すべてFillSolidRectに置き換えました。ただし、FillSolidRectを実行すると、バックグラウンドカラーも変更されるため、FillSolidRectの実行前にバックグラウンドカラーを保存し、実行後に復帰するようにしています。
次の環境で確認しましたが、元の問題は発生しなくなりました。
- マザーボード GA586SGX
- CPU AMD K6 233MHz
- メモリ 64M
- ビデオカード Millennium G400 AGP 16M
- ディスプレイドライバ V5.20.013 1999/9/24版
世間では内部でモノクロビットマップを使うことが少ないのか、ディスプレイドライバのインプリメントが十分ではなかったのかもしれません。
このページの先頭に戻る
|