Graphics.DrawString メソッドで文字が斜体にならないことがある

こんにちは、Visual Studio サポート チームです。 今回は、前回ご紹介した「Graphics.DrawString メソッドで游ゴシック・游明朝の文字を縦書きした際の描画位置が OS によって異なる」と同様に、Graphics.DrawString メソッドを利用した際の不具合についてお知らせします。 前回と重複した記載がありますこと、予めご了承ください。   現象 Graphics.DrawString メソッドでは、引数の Font クラスに対して、FontStyle.Italic を指定することにより、文字を斜体にすることができます。 しかしながら、FontStyle.Italic と FontStyle.Bold をともに指定した場合、Windows 8 以降の OS では、フォントによっては文字が斜体になりません。 本現象が発生するフォントは、以下の 4 種類です。 游明朝 游明朝 Light 游明朝 Demibold 游ゴシック Light Windows 7 では、以下のとおりです。 Windows 8 では、以下のとおりです。   原因 本現象は、Graphics.DrawString メソッドが内部で利用している GDI+ モジュールとフォントの組み合わせで発生する不具合に起因して発生しています。 弊社製品の不具合によりお客様にご迷惑をおかけしておりますこと、深くお詫び申し上げます。 .NET Framework のバージョンとの関連性はないため、.NET Framework のバージョンに関係なく発生します。 また、本現象に関する GDI+…


Graphics.DrawString メソッドで游ゴシック・游明朝の文字を縦書きした際の描画位置が OS によって異なる

こんにちは、Visual Studio サポート チームです。 .NET Framework アプリケーション上で文字列を描画する場合、最も利用されているメソッドは、Graphics.DrawString メソッドではないでしょうか。Graphics.DrawString メソッドでは、描画位置、フォント、色、書式の属性等を指定することができ、印刷にも対応しています。 今回は、Graphics.DrawString メソッドを利用して、游ゴシックまたは游明朝の文字を縦書きした場合に、Windows 7 と Windows 8 以降の OS で、文字の描画位置が異なる現象についてお知らせします。   現象 Graphics.DrawString メソッドでは、引数の Font クラスと StringFormat クラスで指定したフォントと書式属性を用いて文字列を描画することができます。 ここで「游ゴシック」または「游明朝」フォントを指定し、書式属性で縦書き (StringFormatFlags.DirectionVertical) を指定した場合、文字によっては Windows 7 と Windows 8 以降の OS で、描画される位置が異なる場合があります。 たとえば、鉤括弧 “「” を描画した場合、Windows 8 以降では Windows 7 よりも出力される位置が上寄りになります。本現象は、描画対象のコントロールには依存せず、PictureBox コントロールや PrintPreviewControl コントロール等に描画した場合も、現象が発生します。 Windows 7 では、以下のとおりです。 Windows 8 では、以下のとおりです。  …


高 DPI 環境下における印刷プレビュー ダイアログ表示時の問題について

こんにちは、Visual Studio サポート チームです。 今回は、Windows フォーム アプリケーションで、印刷プレビュー ダイアログを表示した場合に、高 DPI 環境下で生じる表示上の問題についてお知らせします。   前提 Windows フォーム アプリケーションでは、マニフェスト ファイルにて、dpiAware を true とすることにより、高 DPI に対応しているアプリケーション (DPI Aware なアプリケーション) であることを宣言することができます。 この場合、Windows 8.1 の高 DPI 設定下では、DPI 設定と一致するように、文字列のサイズ等が自動的にスケーリングされます。 DPI Aware なアプリケーションについては、以下の技術資料をご確認ください。   高 DPI アプリケーションの記述方法 <http://blogs.msdn.com/b/ttanaka/archive/2014/07/16/dpi-high-dpi-1-dpi.aspx>   High DPI <http://msdn.microsoft.com/en-us/library/windows/desktop/dd464646.aspx>   現象 Windows フォーム アプリケーションでは、PrintPreviewDialog クラスや PrintPreviewCotrol クラスを用いて、印刷プレビュー ダイアログを表示させることができます。 その際、印刷プレビューの初期化処理中を示すステータス ダイアログとして、以下のとおり「プレビューを生成しています。」ダイアログが表示されます。 DPIAware なアプリケーションの場合、高…


ListView の仮想モードを有効にした状態で、Shiftキーを押下しながらリスト上の要素を選択すると例外が発生する

こんにちは、Visual Studio サポート チームです。 今回は、仮想モード有効時の ListView コントロールで例外が発生する現象について、回避策とあわせてご案内します。   現象 .NET Framework の Windows フォーム アプリケーションにおいて、Shift キーを押下しながら ListView コントロールの要素を選択すると、以下の例外が発生することがあります。 発生する例外 : System.ArgumentException 発生元クラス : ListViewVirtualItemsSelectionRangeChangedEventArgs メッセージ : startIndex 値に endIndex 値より大きい値を指定することはできません。 本例外は、ListView コントロールの複数の要素のうち、最初以外の要素を Shift キーを押下しながら選択した後、最初の要素を Shift キーを押下しながら選択すると発生します。 また、この現象は、次の条件に当てはまる場合に発生します。 アプリケーションの実行環境が .NET Framework 4 である ListView コントロールの VirtualMode プロパティが True に設定されている   回避策 本現象は、.NET Framework 4 の不具合に起因して発生します。 回避策としては、以下の…


MaskedTextBox コントロールでキーボード入力を処理する場合の注意点について

こんにちは、Visual Studio サポート チームです。 今回は、MaskedTextBox コントロール (以下、MaskedTextBox) でキーボード入力を処理する場合の注意点についてご紹介します。 MaskedTextBox は、マスク パターンを指定して、入力制限を行うことができる TextBox です。 郵便番号、日時、電話番号などの標準的なマスクは、あらかじめ用意されており、マスクを設定しておくと、その形式に合わない入力を拒否できます。 入力が不可欠な文字スペース、英数字だけ受け付ける、など様々な条件を組み合わせて、マスクをきめ細かく作成することもできます。 また、パスワードなどの入力を受け付ける場合、画面に入力された文字を表示せず、代替文字を表示するような設定もできる非常に便利なコントロールです。 この MaskedTextBox の内部では、Enter キーの入力に対して他のキーとは異なる特別な処理が実装されていますので、ご注意いただく必要があります。 MaskedTextBox コントロールでの特別な処理について まず、キーが押された時に発生するキー イベントの順番は、次のようになります。    KeyDown → KeyPress → KeyUp MaskedTextBox では、 KeyDown イベントにおいて、Enter キーが検知されると、コントロール内部で特殊なフラグが設定されます。 このフラグは、KeyPress イベント内で再設定されます。 このように、MaskedTextBox が Enter キーを他のキーとは異なる特別なキーとして処理しています。 しかし、他のコントロールによるイベント処理の影響で、KeyPress イベントがキャンセルされると、上記フラグが設定されたままとなるため、次の文字入力以降で不整合が発生します。 Windows フォームでは、キーボード メッセージがコントロールに到達する前に、それらをフォーム レベルで処理できますが、この Enter キーに対する特別な処理のために、問題が発生することがあります。 注意が必要なケースについて、具体例と合わせてご説明します。 注意が必要な例 Form 上に、MaskedTextBox を配置し、Enter キーが押された際に、次のコントロールにフォーカスを移動する処理を実装します。…


DataGridView コントロール上でのタッチ操作について

こんにちは、Visual Studio サポートチームです。 今回は、Windows フォーム アプリケーション上でタッチ操作をした場合に、意図せぬ動作となる現象とその回避方法をご紹介します。 Windows フォーム アプリケーションでよく使われるコントロールの 1 つに、DataGridView コントロールがあります。.NET Framework 2.0 から登場したこのコントロールは、データを表形式で表示でき、セル内の値の編集、行や列の追加や削除が簡単にできる非常に柔軟性の高いコントロールのため、アプリケーションの規模を問わず幅広く利用されています。 今回は、この DataGridView コントロール上でフリック操作※ 1 によるスクロールをした場合の現象です。タッチ ジェスチャには様々なものがありますが、フリックとは 1 本または複数の指で移動したい方向に画面を素早くなぞるジェスチャのことで、マウスでのスクロールと似ています。下図のような動作です。 DataGridView コントロールに複数のデータを表示させるとき、スクロール バーを用いることができますが、フリック操作により単一ビュー内で移動することができ、たとえば表内に収まらないセル等を表示できます。 しかしながら、このフリック操作による縦方向のスクロールで、スクロール バーと表示内容が一致しない場合があります。 たとえば、要素数が 30 個の場合、スクロール バーが下端まで移動すれば、30 個目の最下端セルが表示されますが、本現象の場合、スクロール バーが下端まで移動しても最下端のセルが表示されません。上端に移動させた場合も同様に、最上端のセルが表示されません。 – 上方向にスクロールした場合 ——————————- 正常時は「1」が見えていますが、現象発生時は「3」までしか見えません。 ・正常時                                           ・現象発生時  – 下方向にスクロールした場合 ——————————- 正常時は「30」が見えていますが、現象発生時は「29」までしか見えません。 ・正常時                                           ・現象発生時    – 原 ==== この現象は、DataGridView コントロールにおける不具合によって必要なメッセージが送信されないため、表示領域とコントロールの座標との整合性が取れなくなり発生します。タッチ操作に起因するので、マウスによるスクロールでは発生しません。 – 回避方法 ======…