Public Class cls_print_ '### 印刷用クラス ###################################################################### '2014/08/28 Ver1.3 印刷文字数計算訂正 '2014/10/06 Ver1.4 コメント・印刷位置補正方法訂正 'ます目に従って印刷する為のクラス '●初期設定(2種類) '○文字数を指定して印刷初期設定を行う 'Public Function Printer_Setting(ByRef e As System.Drawing.Printing.PrintPageEventArgs, _ ' ByRef Print_Document As System.Drawing.Printing.PrintDocument, _ ' ByVal Moku_Count As Point, _ ' Optional ByVal Font_N As String = "MS ゴシック", _ ' Optional ByVal Moji_Bai As Decimal = 1.07, _ ' Optional ByVal Moji_Hosei As Point = Nothing) As Boolean '○キャラクター単位で印刷初期設定を行う(専用伝票用) 'Public Function Printer_Setting_Character(ByRef e As System.Drawing.Printing.PrintPageEventArgs, _ ' ByRef Print_Document As System.Drawing.Printing.PrintDocument, _ ' Optional ByVal Font_N As String = "MS ゴシック", _ ' Optional ByVal Moji_Bai As Decimal = 1.07, _ ' Optional ByVal Moji_Hosei As Point = Nothing) As Boolean 'PrintDocumentのPrintPageイベントで使用する 'e : イベントに定義されている e をそのまま渡す 'Print_Document : 使用するPrintDocumentをそのまま渡す 'Moku_Count : Printer_Settingのみ。最低限印刷したい「文字数」を渡す(※計算上やや多くなる場合有り) 'Font_N : 使用するフォント名(省略した場合MS ゴシック) 'Moji_Bai : 文字の大きさを計算する時にそのままだと罫線にかかってしまう為、文字を大きめに計算する (省略した場合1.07) 'Moji_Hosei : 文字補正※若干左上よりなので文字割る値分、補正(X:右 Y:下)をかける(標準 X:30 Y:15)文字の大きさの1/30右に、1/15下に 'このルーチンで様々な初期設定を行い、印刷するので印刷を行う前に呼び出す事。 '例) 'Dim clsPrt As New cls_print 'clsPrt.Printer_Setting(e, Me.PrintDocument1, New Point(132, 48)) 'clsPrt.Printer_Setting_Character(e, Me.PrintDocument1) '最低限の設定で後は必要に応じて追加の設定を入れれば良い '●1行印刷 'Print_Moji_Line(ByRef e As System.Drawing.Printing.PrintPageEventArgs, _ ' ByVal Print_Line As String, _ ' ByVal Print_Gyo As Integer) 'e : イベントに定義されている e をそのまま渡す 'Print_Line : 印刷したい文字列 'Print_Gyo : 行(0〜) '初期設定の値を元に1行印刷する '●座標指定印刷 'Print_Moji( ) 'e : イベントに定義されている e をそのまま渡す 'St_Point : 開始位置 'Print_Line : 印刷したい文字列 'Print_Len : 印刷したい長さ 'Yose : 寄せ "L":左よせ "R":右寄せ 'W_Font : 印刷するフォント指定 '印刷位置を指定し、印刷を行う(オーバーライドで3種類作ってある) 'Print_Moji( e , St_Point , Print_Line ) ' 1 'Print_Moji( e , St_Point , Print_Line , W_Font ) ' 2 'Print_Moji( e , St_Point , Print_Line , Print_Line , Print_Len , Yose ) ' 3 ' 1が基本で座標指定印刷 ' 2はフォントを指定した物。簡易版でフォントを変えた事による余白の変更等には対応していない(大きな文字を印刷したい場合に使用) ' 3は印刷位置と長さを指定した物で寄せも指定しているので印刷したい範囲内に右、又は左寄せで印刷出来る '●線描画 'Overloads Draw_Line(ByRef e As System.Drawing.Printing.PrintPageEventArgs, ' ByVal St_Point As PointF, ' ByVal En_Point As PointF, ' Optional ByVal Line_Width As Single = 1) 'e : イベントに定義されている e をそのまま渡す 'St_Point : 開始座標 'En_Point : 終了座標 'Line_Width : 罫線の幅(省略した場合1とする) '初期設定の値を元に線を引く '例) 'clsPrt.Draw_Line(e, New PointF(1, 1), New PointF(10, 1)) '●線描画(破線用) 'Overloads Sub Draw_Line(ByRef e As System.Drawing.Printing.PrintPageEventArgs, _ ' ByVal St_Point As PointF, _ ' ByVal En_Point As PointF, _ ' ByVal Line_Width As Single, _ ' ByVal Dot_Len As Single) 'e : 印刷オブジェクト 'St_Point : 始点 'En_Point : 終点 'Line_Width : 罫線の幅 'Dot_Len : 破線の長さ '上のルーチンのOverload版罫線の幅、破線の長さは必ず指定する事 'clsPrt.Draw_Line(e, New PointF(1, 1), New PointF(10, 1), 1, 5.0F) '●文字列代入 'Dainyu(ByVal Moto As String, ' ByVal Kaisi As Integer, ' ByVal Dai_Len As Integer, ' ByVal Dai As String, ' ByVal Yose As String) As String '文字列代入ルーチン 'Moto : 代入先文字列 'Kaisi : 代入開始位置(0〜) 'Dai_Len : 代入する長さ 'Dai : 代入文字列 'Yose : 寄せ "L":左よせ "R":右寄せ '文字列の代入で代入する。長さより短ければスペース追加、大きければカットする '例) 's10 = clsPrt.Dainyu(s10, 1, 10, (1000).ToString("#,###"), "R") '### プロパティ ######################################################################## Dim _Pr_MTop As PointF '文字用の始点座標(グリフの突出等の余白等に対応する為、文字は微調整が必要) Dim _Pr_KTop As PointF '罫線用の始点座標(印刷始点座標) Dim _Pr_TTop As PointF '調整用始点座標(印刷始点座標) 1/300 インチ指定 Dim _Pr_Size As Size '印刷できる幅 Dim _Text_Size As SizeF 'テキスト1文字(半角)当たりの大きさ Dim _Text_Count As Point '実際印刷出来る横文字数 Dim _Text_FontN As String 'フォント名 Dim _Text_Font_Size As Decimal 'フォントサイズ Public Property Pr_MTop() As PointF '### プロパティ _Pr_MTop ##################################### Get Return _Pr_MTop End Get Set(ByVal value As PointF) _Pr_MTop = value End Set End Property Public Property Pr_KTop() As PointF '### プロパティ _Pr_KTop ##################################### Get Return _Pr_KTop End Get Set(ByVal value As PointF) _Pr_KTop = value End Set End Property Public Property Pr_TTop() As PointF '### プロパティ _Pr_TTop ##################################### Get Return _Pr_TTop End Get Set(ByVal value As PointF) _Pr_TTop = value End Set End Property Public Property Pr_Size() As Size '### プロパティ _Pr_Size ##################################### Get Return _Pr_Size End Get Set(ByVal value As Size) _Pr_Size = value End Set End Property Public Property Text_Size() As SizeF '### プロパティ _Text_Size ##################################### Get Return _Text_Size End Get Set(ByVal value As SizeF) _Text_Size = value End Set End Property Public Property Text_Count() As Point '### プロパティ _TText_Count ##################################### Get Return _Text_Count End Get Set(ByVal value As Point) _Text_Count = value End Set End Property Public Property Text_FontN() As String '### プロパティ _Text_FontN ##################################### Get Return _Text_FontN End Get Set(ByVal value As String) _Text_FontN = value End Set End Property Public Property Text_Font_Size() As Decimal '### プロパティ _Text_Font_Size ##################################### Get Return _Text_Font_Size End Get Set(ByVal value As Decimal) _Text_Font_Size = value End Set End Property Public Function Printer_Setting(ByRef e As System.Drawing.Printing.PrintPageEventArgs, _ ByRef Print_Document As System.Drawing.Printing.PrintDocument, _ ByVal Moku_Count As Point, _ Optional ByVal Font_N As String = "MS ゴシック", _ Optional ByVal Moji_Bai As Decimal = 1.07, _ Optional ByVal Moji_Hosei As Point = Nothing, _ Optional ByVal Prt_Margin As Integer = 8) As Boolean '### 指定桁数による印刷情報の取得と印刷開始位置の設定 印刷開始位置は紙の左上頂点 ########################################## '印刷出来る範囲÷印刷したい文字数で1文字辺りの大きさを計測し、その範囲に収まるフォントサイズとグリフの突出に対応した '文字用開始位置の取得を行う。 '大きさにおいて小数点以下の扱いが上手く行かない為、指定文字数よりも若干大きな値になる 'e :プリントイベントエリア 'Print_Document :プリントドキュメントコントロール 'Moku_Count :印刷したい文字数 'Font_N :使用するフォント(省略した場合 MS ゴシック とする) 'Moji_Bai :文字計測倍率(省略した場合 1.07 とする) 'Moji_Hosei :文字補正※若干左上よりなので文字割る値分、補正(X:右 Y:下)をかける(標準 X:30 Y:15)文字の大きさの1/30右に、1/15下に 'Prt_Margin :印刷範囲全て使うと罫線が半分になってしまう為マージンを取る(標準 8(1mm弱) ) Dim Text_Font As Font Dim w10 As Decimal Dim w20 As Decimal If Moji_Hosei = Nothing Then '初期値セット Moji_Hosei.X = 30 Moji_Hosei.Y = 15 End If If Moji_Hosei.X = 0 Then '0はありえない(0割り算になる)ので1セット Moji_Hosei.X = 1 End If If Moji_Hosei.Y = 0 Then '0はありえない(0割り算になる)ので1セット Moji_Hosei.Y = 1 End If _Pr_MTop.X = 0 '初期化 _Pr_MTop.Y = 0 _Pr_KTop.X = 0 _Pr_KTop.Y = 0 _Pr_TTop.X = 0 _Pr_TTop.Y = 0 _Pr_Size.Width = 0 _Pr_Size.Height = 0 _Text_Size.Width = 0 _Text_Size.Height = 0 _Text_Count.X = 0 _Text_Count.Y = 0 _Text_FontN = Font_N _Text_Font_Size = 0 '--- ドキュメントポイント単位(1/300)インチにする ---------------------------------------------------------------- e.Graphics.PageUnit = GraphicsUnit.Document '--- 印刷出来る開始座標取得 -------------------------------------------------------------------------------------- _Pr_KTop.X = Print_Document.DefaultPageSettings.HardMarginX '始点X座標はハードウェアマージンで取得(1/100インチ単位) _Pr_KTop.Y = Print_Document.DefaultPageSettings.HardMarginY '始点Y座標はハードウェアマージンで取得(1/100インチ単位) '--- HardMarginは1/100インチ単位なので1/300インチ単位に直す ------------------------------------------------------ If _Pr_KTop.X <> 0 Then _Pr_KTop.X = _Pr_KTop.X * 3 End If If _Pr_KTop.Y <> 0 Then _Pr_KTop.Y = _Pr_KTop.Y * 3 End If '--- 印刷始点を紙の頂点に ------------------------------------------------------------------------------------------ e.Graphics.TranslateTransform(_Pr_KTop.X * -1, _Pr_KTop.Y * -1) '--- 印刷可能範囲取得 ---------------------------------------------------------------------------------------------- '※印刷可能領域全部を使うと端に線を引いた場合線の中心が端に来る為か線の太さが半分近くになり細くなってしまう為、指定したマージンを取る _Pr_Size.Width = e.Graphics.VisibleClipBounds.Width - Prt_Margin '印刷できる「幅」をクリッピング領域を利用して取得 _Pr_Size.Height = e.Graphics.VisibleClipBounds.Height - Prt_Margin '印刷できる「高さ」をクリッピング領域を利用して取得 '--- 印刷開始座標訂正(上記でとったマージンの半分) ------------------------------------------------------------------ If Prt_Margin <> 0 Then _Pr_KTop.X = _Pr_KTop.X + (Prt_Margin / 2) _Pr_KTop.Y = _Pr_KTop.Y + (Prt_Margin / 2) End If '--- 計測する文字の範囲を指定する(配列必須) 文字余白計測用 --------------------------------------------------------- Dim characterRanges As CharacterRange() = {New CharacterRange(1, 1), New CharacterRange(2, 1)} '--- 文字列のレイアウト四角形を指定する ---------------------------------------------------------------------------- Dim layoutRect As New RectangleF(0, 0, 500, 100) Dim stringRegions As Region() Dim rect1 As RectangleF Dim sf As New StringFormat 'StringFormatオブジェクトの作成 Dim stringSize As SizeF '--- 1文字の大きさを印刷する桁・行数で設定する -------------------------------------------------------------------- _Text_Size.Width = _Pr_Size.Width / Moku_Count.X _Text_Size.Height = _Pr_Size.Height / Moku_Count.Y '--- 実際に印刷出来る桁・行数をセット ------------------------------------------------------------------------------ _Text_Count.X = Moku_Count.X _Text_Count.Y = Moku_Count.Y '--- 1文字の大きさから使用するフォントの大きさを決める ------------------------------------------------------------ _Text_Font_Size = 50 Do Text_Font = New Font(_Text_FontN, _Text_Font_Size) '--- 計測する文字の範囲を指定する(配列必須) ------------------------------------------------------------------- characterRanges = {New CharacterRange(0, 1), New CharacterRange(1, 1)} sf.SetMeasurableCharacterRanges(characterRanges) '--- 文字列に外接するRegion配列を取得する(グリフの突出の無い純粋な文字の大きさを取得出来る) -------------------- stringRegions = e.Graphics.MeasureCharacterRanges("0000000000", Text_Font, layoutRect, sf) rect1 = stringRegions(0).GetBounds(e.Graphics) '--- 目的とする幅・高さよりフォントの大きさが小さくなったらループから抜ける ------------------------------------ '--- ※文字計測倍率(デフォルト1.07)をかけて判定しているのは素のままだと罫線とくっつく為 ------------------------ If _Text_Size.Width > (rect1.Width * Moji_Bai) And _Text_Size.Height > (rect1.Height * Moji_Bai) Then Exit Do End If _Text_Font_Size = _Text_Font_Size - 0.1 Loop '--- 文字列の大きさを取得(グリフの突出に備えた大きな値の取得) -------------------------------------------------- stringSize = e.Graphics.MeasureString("0", Text_Font, 10000) '--- 文字X座標修正値計算 ---- '--- マス目と文字の大きさを計算し、文字を中央寄せする X座標 --- w10 = _Text_Size.Width - rect1.Width 'ます目のサイズ - 文字サイズ (ます目より文字のサイズが小さくなる) w10 = w10 / 2 'ます目の中央に来るように中央寄せ '--- グリフの突出と実際の文字の大きさの差額を計算し、中央寄せする --- w20 = stringSize.Width - rect1.Width 'グリフの突出込み文字サイズ - 文字サイズ w20 = w20 / 2 'ます目の中央に来るように中央寄せ _Pr_MTop.X = _Pr_KTop.X + w10 - w20 + (rect1.Width / Moji_Hosei.X) '--- 文字Y座標修正値計算 ---- '--- マス目と文字の大きさを差額を計算し、中央寄せする --- w10 = _Text_Size.Height - rect1.Height 'ます目のサイズ - 文字サイズ (ます目より文字のサイズが小さくなる) w10 = w10 / 2 'ます目の中央に来るように中央寄せ '--- グリフの突出と実際の文字の大きさの差額を計算し、中央寄せする --- w20 = stringSize.Height - rect1.Height 'グリフの突出込み文字サイズ - 文字サイズ w20 = w20 / 2 'ます目の中央に来るように中央寄せ _Pr_MTop.Y = _Pr_KTop.Y + w10 - w20 + (rect1.Height / Moji_Hosei.Y) Text_Font.Dispose() Return True End Function Public Function Printer_Setting_Character(ByRef e As System.Drawing.Printing.PrintPageEventArgs, _ ByRef Print_Document As System.Drawing.Printing.PrintDocument, _ Optional ByVal Font_N As String = "MS ゴシック", _ Optional ByVal Moji_Bai As Decimal = 1.07, _ Optional ByVal Moji_Hosei As Point = Nothing) As Boolean '### シリアルプリンタ用印刷情報の取得と印刷開始位置の設定 ############################################ 'e :プリントイベントエリア 'Print_Document :プリントドキュメントコントロール 'Font_N :使用するフォント(省略した場合 MS ゴシック とする) 'Moji_Bai :文字計測倍率(省略した場合 1.07 とする) 'Moji_Hosei :文字補正※若干左上よりなので文字割る値分、補正(X:右 Y:下)をかける(標準 X:30 Y:15)文字の大きさの1/30右に、1/15下に Dim Text_Font As Font Dim w10 As Decimal Dim w20 As Decimal If Moji_Hosei = Nothing Then '初期値セット Moji_Hosei.X = 30 Moji_Hosei.Y = 15 End If If Moji_Hosei.X = 0 Then '0はありえないので1セット Moji_Hosei.X = 1 End If If Moji_Hosei.Y = 0 Then '0はありえないので1セット Moji_Hosei.Y = 1 End If _Pr_MTop.X = 0 '初期化 _Pr_MTop.Y = 0 _Pr_KTop.X = 0 _Pr_KTop.Y = 0 _Pr_TTop.X = 0 _Pr_TTop.Y = 0 _Pr_Size.Width = 0 _Pr_Size.Height = 0 _Text_Size.Width = 0 _Text_Size.Height = 0 _Text_Count.X = 0 _Text_Count.Y = 0 _Text_FontN = Font_N _Text_Font_Size = 0 '--- ドキュメントポイント単位(1/300)インチにする ----------------------------------------------------------- e.Graphics.PageUnit = GraphicsUnit.Document '--- 印刷出来る大きさを取得 --------------------------------------------------------------------------------- _Pr_KTop.X = Print_Document.DefaultPageSettings.HardMarginX '始点X座標はハードウェアマージンで取得(1/100インチ単位) _Pr_KTop.Y = Print_Document.DefaultPageSettings.HardMarginY '始点Y座標はハードウェアマージンで取得(1/100インチ単位) 'HardMarginは1/100インチ単位なので1/300インチ単位に直す If _Pr_KTop.X <> 0 Then _Pr_KTop.X = _Pr_KTop.X * 3 End If If _Pr_KTop.Y <> 0 Then _Pr_KTop.Y = _Pr_KTop.Y * 3 End If '--- 印刷始点を紙の頂点に ---------------------------------------------------------------------------------- e.Graphics.TranslateTransform(_Pr_KTop.X * -1, _Pr_KTop.Y * -1) _Pr_Size.Width = e.Graphics.VisibleClipBounds.Width '印刷できる「幅」をクリッピング領域を利用して取得 _Pr_Size.Height = e.Graphics.VisibleClipBounds.Height '印刷できる「高さ」をクリッピング領域を利用して取得 '--- 計測する文字の範囲を指定する(配列必須) 文字余白計測用 --------------------------------------------------- Dim characterRanges As CharacterRange() = {New CharacterRange(1, 1), New CharacterRange(2, 1)} '--- 文字列のレイアウト四角形を指定する ---------------------------------------------------------------------- Dim layoutRect As New RectangleF(0, 0, 500, 100) Dim stringRegions As Region() Dim rect1 As RectangleF Dim sf As New StringFormat 'StringFormatオブジェクトの作成 Dim stringSize As SizeF '1文字の大きさを印刷する桁・行数で設定する ※インチ単位なので固定 _Text_Size.Width = 30 '幅1/10インチ _Text_Size.Height = 50 '縦1/6インチ '--- 実際に印刷出来る桁・行数を計算する ------------------------------------------------------------------------- _Text_Count.X = _Pr_Size.Width \ _Text_Size.Width _Text_Count.Y = _Pr_Size.Height \ _Text_Size.Height '--- 1文字の大きさから使用するフォントの大きさを決める --------------------------------------------------------- _Text_Font_Size = 50 Do Text_Font = New Font(_Text_FontN, _Text_Font_Size) '--- 計測する文字の範囲を指定する(配列必須) ----------------------------------------------------------------- characterRanges = {New CharacterRange(0, 1), New CharacterRange(1, 1)} sf.SetMeasurableCharacterRanges(characterRanges) '---- 文字列に外接するRegion配列を取得する ------------------------------------------------------------------ stringRegions = e.Graphics.MeasureCharacterRanges("0000000000", Text_Font, layoutRect, sf) rect1 = stringRegions(0).GetBounds(e.Graphics) '--- 目的とする幅・高さよりフォントの大きさが小さくなったらループから抜ける --------------------------------- '--- ※文字計測倍率(デフォルト1.07)をかけて判定しているのは素のままだと罫線とくっつく為 --------------------- If _Text_Size.Width > (rect1.Width * Moji_Bai) And _Text_Size.Height > (rect1.Height * Moji_Bai) Then Exit Do End If _Text_Font_Size = _Text_Font_Size - 0.1 Loop '--- 文字列の大きさを取得(グリフの突出に備えた大きな値の取得) -------------------------------------------------- stringSize = e.Graphics.MeasureString("0", Text_Font, 10000) '--- 文字X座標修正値計算 ---- '--- マス目と文字の大きさを計算し、文字を中央寄せする X座標 --- w10 = _Text_Size.Width - rect1.Width 'ます目のサイズ - 文字サイズ (ます目より文字のサイズが小さくなる) w10 = w10 / 2 'ます目の中央に来るように中央寄せ '--- グリフの突出と実際の文字の大きさの差額を計算し、中央寄せする --- w20 = stringSize.Width - rect1.Width 'グリフの突出込み文字サイズ - 文字サイズ w20 = w20 / 2 'ます目の中央に来るように中央寄せ _Pr_MTop.X = _Pr_KTop.X + w10 - w20 + (rect1.Width / Moji_Hosei.X) '--- 文字Y座標修正値計算 ---- '--- マス目と文字の大きさを差額を計算し、中央寄せする --- w10 = _Text_Size.Height - rect1.Height 'ます目のサイズ - 文字サイズ (ます目より文字のサイズが小さくなる) w10 = w10 / 2 'ます目の中央に来るように中央寄せ '--- グリフの突出と実際の文字の大きさの差額を計算し、中央寄せする --- w20 = stringSize.Height - rect1.Height 'グリフの突出込み文字サイズ - 文字サイズ w20 = w20 / 2 'ます目の中央に来るように中央寄せ _Pr_MTop.Y = _Pr_KTop.Y + w10 - w20 + (rect1.Height / Moji_Hosei.Y) Text_Font.Dispose() Return True End Function Function Dainyu(ByVal Moto As String, ByVal Kaisi As Integer, ByVal Dai_Len As Integer, ByVal Dai As String, ByVal Yose As String) As String '文字列代入ルーチン '代入先文字列 '代入開始位置 '代入する長さ '代入文字列 '寄せ "L":左よせ "R":右寄せ '単位は全てバイト単位とする 開始1文字目は0とする Dim W_Mae As String '代入する部分より前の文字列 Dim W_Ato As String '代入する部分より後の文字列 Dim sjis As System.Text.Encoding = System.Text.Encoding.GetEncoding("Shift_JIS") 'エンコードをShift-jisとして処理する '代入する部分より前の文字列取得 If Kaisi > 0 Then W_Mae = VB6_LeftB(Moto, Kaisi) Else W_Mae = "" End If '代入する部分より後の文字列取得 If (Kaisi + Dai_Len) > sjis.GetByteCount(Moto) Then W_Ato = "" Else W_Ato = VB6_RightB(Moto, sjis.GetByteCount(Moto) - (Kaisi + Dai_Len)) End If '代入する文字列のセット If sjis.GetByteCount(Dai) = Dai_Len Then '代入する文字列の長さが指定の長さの場合は何もしない ElseIf sjis.GetByteCount(Dai) > Dai_Len Then '指定の長さより代入する文字列の長さが長い場合はカットする If Yose = "R" Then '右寄せの場合左側をカットする Dai = VB6_RightB(Dai, Dai_Len) Else '左寄せの場合右側をカットする Dai = VB6_LeftB(Dai, Dai_Len) End If Else '指定の長さより代入する文字列が短い場合スペースを追加する If Yose = "R" Then '右寄せの場合左側にスペースを追加 Dai = New String(" "c, Dai_Len - sjis.GetByteCount(Dai)) & Dai Else '左寄せの場合右側にスペースを追加 Dai = Dai & New String(" "c, Dai_Len - sjis.GetByteCount(Dai)) End If End If Return W_Mae & Dai & W_Ato End Function Function VB6_MidB(ByVal myString As String, _ ByVal sByt As Integer, ByVal nByt As Integer) As String '指定バイト位置から指定バイト数分の文字列を取り出す関数 'myString : 取り出し元文字列 'sByt : 取り出し開始位置(1から) 'nByt : 取り出し長さ '全角文字を半分にした場合文字化け文字になるのを確認し、文字化けの場合はスペースを入れる 'ただし元の文字が文字数に満たない場合は足りない分しか返さない Dim Mae_Flag As Boolean = False Dim sjis As System.Text.Encoding = System.Text.Encoding.GetEncoding("Shift_JIS") 'エンコードをShift-jisとして処理する Dim tempByt() As Byte = sjis.GetBytes(myString) '取り出し元バイト長 Dim sumByt As Integer = sjis.GetByteCount(myString) '取り出し元バイト長 If sByt < 1 Or nByt <= 0 Or sByt > sumByt Then Return "" '取り出し開始1以下 取り出し長さ1以下 取り出し開始位置が文字列より後の場合は何も返さない Dim strTemp As String = sjis.GetString(tempByt, 0, sByt - 1) If sByt > 1 And strTemp.EndsWith("・"c) Then Mae_Flag = True '前文字化けフラグを立てる nByt = nByt - 1 '取り出す文字列の長さを減らす sByt = sByt + 1 '開始位置が漢字の中なら次(前)の文字から開始 End If If nByt = 0 Then '取り出す文字列が1で全角文字列だった場合 Return " " End If If (sByt - 1) + nByt > sumByt Then '文字長より多く取得しようとした場合 nByt = sumByt - (sByt - 1) '文字列の最後までの分とする End If VB6_MidB = sjis.GetString(tempByt, sByt - 1, nByt).Trim("・"c) VB6_MidB = VB6_MidB.Trim(""c) If Mae_Flag Then '前文字化けの場合スペースを1つ追加し、全体の長さを元に戻す VB6_MidB = " " & VB6_MidB nByt = nByt + 1 End If '長さが少ない場合(文字化けをカットした時)文字列の最後にスペースを追加して正しい長さにする If sjis.GetByteCount(VB6_MidB) < nByt Then VB6_MidB = VB6_MidB & New String(" "c, nByt - sjis.GetByteCount(VB6_MidB)) End If Return VB6_MidB End Function Function VB6_LeftB(ByVal myString As String, ByVal nByt As Integer) As String 'バイト単位のLeftB(最後の文字列が全角の半分で文字化けしてしまった場合は半角スペースで代用する) 'myString :取り出す文字列 'nByt :取り出すバイト数 Dim sjis As System.Text.Encoding = System.Text.Encoding.GetEncoding("Shift_JIS") 'エンコードをShift-jisとして処理する '取り出す文字列が無い、又は取り出す文字数が0の時は""を返す If myString = "" Or nByt = 0 Then Return "" End If '文字列より長い長さを指定した場合、文字列の長さを取得するようにする If nByt > sjis.GetByteCount(myString) Then nByt = sjis.GetByteCount(myString) End If Dim tempByt() As Byte = sjis.GetBytes(myString) '取り出し元バイト長 Dim strTemp As String = sjis.GetString(tempByt, 0, nByt) '文字列を取り出す If strTemp.EndsWith("・"c) Or strTemp.EndsWith(""c) Then '最後の文字が文字化けを起こしていた場合 If nByt = 1 Then '1文字の場合は半角スペース strTemp = " " Else '2文字以上の場合はスペースを足す strTemp = sjis.GetString(tempByt, 0, nByt - 1) & " " End If End If Return strTemp End Function Function VB6_RightB(ByVal myString As String, ByVal nByt As Integer) As String 'バイト単位のRightB(最後の文字列が全角の半分で文字化けしてしまった場合は半角スペースで代用する) 'myString :取り出す文字列 'nByt :取り出すバイト数 Dim sjis As System.Text.Encoding = System.Text.Encoding.GetEncoding("Shift_JIS") 'エンコードをShift-jisとして処理する '取り出す文字列が無い、又は取り出す文字数が0の時は""を返す If myString = "" Or nByt = 0 Then Return "" End If '文字列より長い長さを指定した場合、文字列の長さを取得するようにする If nByt > sjis.GetByteCount(myString) Then nByt = sjis.GetByteCount(myString) End If Dim tempByt() As Byte = sjis.GetBytes(myString) '取り出し元バイト長 Dim strTemp As String = sjis.GetString(tempByt, 0, sjis.GetByteCount(myString) - nByt) '文字列を取り出す(取り出す位置の「直前」まで) If strTemp.EndsWith("・"c) = True Or strTemp.EndsWith(""c) = True Then '最後の文字が文字化けを起こしていた場合 If nByt = 1 Then '1文字の場合は半角スペース strTemp = " " Else '2文字以上の場合はスペースを頭に足す strTemp = " " & sjis.GetString(tempByt, sjis.GetByteCount(myString) - nByt + 1, nByt - 1) End If Else strTemp = sjis.GetString(tempByt, sjis.GetByteCount(myString) - nByt, nByt) '文字列を取り出す End If Return strTemp End Function Sub Print_Moji_Line(ByRef e As System.Drawing.Printing.PrintPageEventArgs, _ ByVal Print_Line As String, _ ByVal Print_Gyo As Integer) '### 文字列印刷ルーチン(行単位) ########################################################################## '### プロパティに設定された値を元に1行印刷する ########################################################## 'e :印刷(ByRef) 'Print_Line :印刷文字列 'Print_Gyo :印刷行(縦) Dim W_Print_Line As System.Globalization.StringInfo 'サロゲートペア対応 Dim Print_Moji_Count As Integer '文字数カウント Dim Print_x_Count As Integer '横座標カウント Dim Moji_Count As Integer '文字数 Dim s10 As String Dim Text_Font As Font = New Font(_Text_FontN, _Text_Font_Size) '使用フォント初期化 '文字数の取得 W_Print_Line = New System.Globalization.StringInfo(Print_Line) Moji_Count = W_Print_Line.LengthInTextElements '各変数初期化 Print_Moji_Count = 0 Print_x_Count = -1 Do Print_Moji_Count = Print_Moji_Count + 1 '文字カウント Print_x_Count = Print_x_Count + 1 '印刷文字数カウント(全角文字は1文字2とする) If Print_Moji_Count > Moji_Count Then '文字列の最後まで繰り返し Exit Do End If s10 = W_Print_Line.SubstringByTextElements(Print_Moji_Count - 1, 1) '印刷文字(1文字)取得 If s10 <> " " And s10 <> " " Then '1文字印刷 '文字列・フォント・色 'X,Y座標 (文字幅 x 文字数) + 文字調整用X座標 + ユーザー調整用X座標 e.Graphics.DrawString(s10, _ Text_Font, _ Brushes.Black, _ (_Text_Size.Width * Print_x_Count) + _Pr_MTop.X + _Pr_TTop.X, _ (_Text_Size.Height * Print_Gyo) + _Pr_MTop.Y + _Pr_TTop.Y) End If If System.Text.Encoding.GetEncoding("Shift_JIS").GetByteCount(s10) <> 1 Then '漢字チェック Print_x_Count = Print_x_Count + 1 '(漢字の場合は横2文字分) End If Loop End Sub Public Overloads Sub Print_Moji(ByRef e As System.Drawing.Printing.PrintPageEventArgs, _ ByVal St_Point As PointF, _ ByVal Print_Line As String) '### 文字列印刷ルーチン位置指定 ########################################################################## '### 指定された位置に文字列を印刷する #################################################################### 'e : 'St_Point :印刷開始座標(0,0開始) 'Print_Line :印刷文字列 Dim W_Print_Line As System.Globalization.StringInfo 'サロゲートペア対応 Dim Print_Moji_Count As Integer '文字数カウント Dim Print_x_Count As Integer '横座標カウント Dim Moji_Count As Integer '文字数 Dim s10 As String Dim Text_Font As Font = New Font(_Text_FontN, _Text_Font_Size) '使用フォント初期化 '文字数の取得 W_Print_Line = New System.Globalization.StringInfo(Print_Line) Moji_Count = W_Print_Line.LengthInTextElements '各変数初期化 Print_Moji_Count = 0 Print_x_Count = -1 Do Print_Moji_Count = Print_Moji_Count + 1 '文字カウント Print_x_Count = Print_x_Count + 1 '印刷文字数カウント(全角文字は1文字2とする) If Print_Moji_Count > Moji_Count Then '文字列の最後まで繰り返し Exit Do End If s10 = W_Print_Line.SubstringByTextElements(Print_Moji_Count - 1, 1) '印刷文字(1文字)取得 If s10 <> " " And s10 <> " " Then '1文字印刷 '文字列・フォント・色 'X,Y座標 (文字幅 x 文字数) + 文字調整用X座標 + ユーザー調整用X座標 e.Graphics.DrawString(s10, _ Text_Font, _ Brushes.Black, _ (_Text_Size.Width * (St_Point.X + Print_x_Count)) + _Pr_MTop.X + _Pr_TTop.X, _ (_Text_Size.Height * St_Point.Y) + _Pr_MTop.Y + _Pr_TTop.Y) End If If System.Text.Encoding.GetEncoding("Shift_JIS").GetByteCount(s10) <> 1 Then '漢字チェック Print_x_Count = Print_x_Count + 1 '(漢字の場合は横2文字分) End If Loop End Sub Public Overloads Sub Print_Moji(ByRef e As System.Drawing.Printing.PrintPageEventArgs, _ ByVal St_Point As PointF, _ ByVal Print_Line As String, _ ByVal W_Font As Font) '### 文字列印刷ルーチン位置指定 ########################################################################## '### 指定された位置に文字列を印刷する #################################################################### '### フォントの指定を行う場合 ############################################################################ 'e : 'St_Point :印刷開始座標(0,0開始) 'St_Point :印刷開始座標(0,0開始) 'W_Font :印刷に使うフォント '1印刷 '文字列・フォント・色 'X,Y座標 (文字幅 x 文字数) + 文字調整用X座標 + ユーザー調整用X座標 e.Graphics.DrawString(Print_Line, _ W_Font, _ Brushes.Black, _ (_Text_Size.Width * St_Point.X) + _Pr_MTop.X + _Pr_TTop.X, _ (_Text_Size.Height * St_Point.Y) + _Pr_MTop.Y + _Pr_TTop.Y) End Sub Public Overloads Sub Print_Moji(ByRef e As System.Drawing.Printing.PrintPageEventArgs, _ ByVal St_Point As PointF, _ ByVal Print_Line As String, _ ByVal Print_Len As Integer, _ ByVal Yose As String) '### 文字列印刷ルーチン位置指定 ########################################################################## '### 指定された位置に文字列を印刷する #################################################################### 'e : 'St_Point :印刷開始座標(0,0開始) 'Print_Line :印刷文字列 'Print_Len :印刷したい長さ 'Yose :寄せ "L":左よせ "R":右寄せ Dim WPrint_Line As String ' Dim W_Print_Line As System.Globalization.StringInfo 'サロゲートペア対応 Dim Print_Moji_Count As Integer '文字数カウント Dim Print_x_Count As Integer '横座標カウント Dim Moji_Count As Integer '文字数 Dim s10 As String Dim Text_Font As Font = New Font(_Text_FontN, _Text_Font_Size) '使用フォント初期化 Dim sjis As System.Text.Encoding = System.Text.Encoding.GetEncoding("Shift_JIS") 'エンコードをShift-jisとして処理する '代入する文字列のセット If sjis.GetByteCount(Print_Line) = Print_Len Then '代入する文字列の長さが指定の長さの場合は何もしない WPrint_Line = Print_Line ElseIf sjis.GetByteCount(Print_Line) > Print_Len Then '指定の長さより代入する文字列の長さが長い場合はカットする If Yose = "R" Then '右寄せの場合左側をカットする WPrint_Line = VB6_RightB(Print_Line, Print_Len) Else '左寄せの場合右側をカットする WPrint_Line = VB6_LeftB(Print_Line, Print_Len) End If Else '指定の長さより代入する文字列が短い場合スペースを追加する If Yose = "R" Then '右寄せの場合左側にスペースを追加 WPrint_Line = New String(" "c, Print_Len - sjis.GetByteCount(Print_Line)) & Print_Line Else '左寄せの場合右側にスペースを追加 WPrint_Line = Print_Line & New String(" "c, Print_Len - sjis.GetByteCount(Print_Line)) End If End If '文字数の取得 W_Print_Line = New System.Globalization.StringInfo(WPrint_Line) Moji_Count = W_Print_Line.LengthInTextElements '各変数初期化 Print_Moji_Count = 0 Print_x_Count = -1 Do Print_Moji_Count = Print_Moji_Count + 1 '文字カウント Print_x_Count = Print_x_Count + 1 '印刷文字数カウント(全角文字は1文字2とする) If Print_Moji_Count > Moji_Count Then '文字列の最後まで繰り返し Exit Do End If s10 = W_Print_Line.SubstringByTextElements(Print_Moji_Count - 1, 1) '印刷文字(1文字)取得 If s10 <> " " And s10 <> " " Then '1文字印刷 '文字列・フォント・色 'X,Y座標 (文字幅 x 文字数) + 文字調整用X座標 + ユーザー調整用X座標 e.Graphics.DrawString(s10, _ Text_Font, _ Brushes.Black, _ (_Text_Size.Width * (St_Point.X + Print_x_Count)) + _Pr_MTop.X + _Pr_TTop.X, _ (_Text_Size.Height * St_Point.Y) + _Pr_MTop.Y + _Pr_TTop.Y) End If If System.Text.Encoding.GetEncoding("Shift_JIS").GetByteCount(s10) <> 1 Then '漢字チェック Print_x_Count = Print_x_Count + 1 '(漢字の場合は横2文字分) End If Loop End Sub Overloads Sub Draw_Line(ByRef e As System.Drawing.Printing.PrintPageEventArgs, _ ByVal St_Point As PointF, _ ByVal En_Point As PointF, _ Optional ByVal Line_Width As Single = 1) '罫線印刷 --- 簡易版 --- 'e : 印刷オブジェクト 'St_Point : 始点 'En_Point : 終点 'Line_Width : 罫線の幅(省略した場合1とする) '罫線は文字用の誤差チェックの無い座標で印刷する '罫線印刷横 'Penオブジェクトの作成 Dim p As New Pen(Color.Black, Line_Width) e.Graphics.DrawLine(p, _ New Point((St_Point.X * Text_Size.Width) + Pr_KTop.X + Pr_TTop.X, (St_Point.Y * Text_Size.Height) + Pr_KTop.Y + Pr_TTop.Y), _ New Point((En_Point.X * Text_Size.Width) + Pr_KTop.X + Pr_TTop.X, (En_Point.Y * Text_Size.Height) + Pr_KTop.Y + Pr_TTop.Y)) p.Dispose() End Sub Overloads Sub Draw_Line(ByRef e As System.Drawing.Printing.PrintPageEventArgs, _ ByVal St_Point As PointF, _ ByVal En_Point As PointF, _ ByVal Line_Width As Single, _ ByVal Dot_Len As Single) '罫線印刷 --- 簡易版 --- 'e : 印刷オブジェクト 'St_Point : 始点 'En_Point : 終点 'Line_Width : 罫線の幅 'Dot_Len : 破線の長さ ' '罫線は文字用の誤差チェックの無い座標で印刷する '罫線印刷横 'Penオブジェクトの作成(幅3黒色) Dim p As New Pen(Color.Black, Line_Width) p.DashStyle = System.Drawing.Drawing2D.DashStyle.Custom p.DashPattern = New Single() {Dot_Len, Dot_Len} e.Graphics.DrawLine(p, _ New Point((St_Point.X * Text_Size.Width) + Pr_KTop.X + Pr_TTop.X, (St_Point.Y * Text_Size.Height) + Pr_KTop.Y + Pr_TTop.Y), _ New Point((En_Point.X * Text_Size.Width) + Pr_KTop.X + Pr_TTop.X, (En_Point.Y * Text_Size.Height) + Pr_KTop.Y + Pr_TTop.Y)) p.Dispose() End Sub Protected Overrides Sub Finalize() MyBase.Finalize() End Sub End Class