C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[9]: 外部アプリ起動時のフォント指定


(過去ログ 120 を表示中)

[トピック内 13 記事 (1 - 13 表示)]  << 0 >>

■72219 / inTopicNo.1)  外部アプリ起動時のフォント指定
  
□投稿者/ くも (1回)-(2014/05/26(Mon) 16:26:08)

分類:[VB.NET/VB2005 以降] 

VB2013で作っています
VBからワードパッド(外部アプリ)を起動と同時に読み込みする事はできました
System.Diagnostics.Process.Start("C:\Program files\Windows NT\Accessories\wordpad.exe", FLD)
その時、フォントの種類とサイズを指定して起動したいのですが、どのように記述したらいいのでしょうか?
よろしくお願い致します
引用返信 編集キー/
■72221 / inTopicNo.2)  Re[1]: 外部アプリ起動時のフォント指定
□投稿者/ 魔界の仮面弁士 (23回)-(2014/05/26(Mon) 18:31:06)
No72219 (くも さん) に返信
> System.Diagnostics.Process.Start("C:\Program files\Windows NT\Accessories\wordpad.exe", FLD)
> その時、フォントの種類とサイズを指定して起動したいのですが、どのように記述したらいいのでしょうか?

フォント指定した RTF ファイルを作成しておき、それを開かせることで代用できないでしょうか。
引用返信 編集キー/
■72222 / inTopicNo.3)  Re[2]: 外部アプリ起動時のフォント指定
□投稿者/ くも (2回)-(2014/05/26(Mon) 20:02:20)
No72221 (魔界の仮面弁士 さん) に返信
> ■No72219 (くも さん) に返信
>>System.Diagnostics.Process.Start("C:\Program files\Windows NT\Accessories\wordpad.exe", FLD)
>>その時、フォントの種類とサイズを指定して起動したいのですが、どのように記述したらいいのでしょうか?
>
> フォント指定した RTF ファイルを作成しておき、それを開かせることで代用できないでしょうか。

未熟者で申し訳ありません
> フォント指定した RTF ファイルを作成しておき、…
というのが理解できません

もう少し補足説明させて戴きますと
VBで計算した結果をデータファイルに書込み
そのファイルをVBからワードパッドで開くようにしているのです

よろしくお願いいたします

引用返信 編集キー/
■72223 / inTopicNo.4)  Re[3]: 外部アプリ起動時のフォント指定
□投稿者/ 魔界の仮面弁士 (24回)-(2014/05/26(Mon) 20:59:49)
No72222 (くも さん) に返信
>>フォント指定した RTF ファイルを作成しておき、…
> というのが理解できません
> VBで計算した結果をデータファイルに書込み
> そのファイルをVBからワードパッドで開くようにしているのです


Imports System.IO
Public Class Form1

    Private rt As RichTextBox
    Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
        rt = New RichTextBox() With {.Visible = False}
        rt.Font = New Font("MS ゴシック", 9)
        rt.ForeColor = Color.Blue
        Controls.Add(rt)
    End Sub

    Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
        Dim dt As Date = Now

        Dim sampleFile As String = Path.Combine( _
            My.Computer.FileSystem.SpecialDirectories.Desktop, _
            String.Format("計算結果({0:yyyy\-MM\-dd HH\;mm\;ss\.ffff})", dt))

        Dim outTime As String = dt.ToString("yyyy-MM-dd HH:mm:ss")

        rt.Clear()
        rt.AppendText("乱数生成日時=" & outTime)

        'ダミーデータ300件
        Dim r As New Random()
        Dim value As Integer, Sum As Decimal
        For row As Integer = 1 To 300
            value = r.Next(-9999, 10000)
            Sum += value
            rt.AppendText(vbNewLine)
            rt.AppendText(String.Format("{0,3}回目の結果…{1,6:#,0}", row, value))
        Next

        'Selection系メンバーを用いて、「選択した範囲の書式を指定」していく
        rt.Select(0, outTime.Length + 9)
        rt.SelectionColor = Color.Black
        rt.Select(7, outTime.Length)
        rt.SelectionColor = Color.Red
        rt.SelectionFont = New Font(rt.Font, FontStyle.Bold)
        rt.AppendText(vbNewLine & vbNewLine)

        '末尾に、黄色背景の行を追加
        rt.Select(rt.TextLength, 0)
        rt.SelectionFont = New Font("MS 明朝", 18)
        rt.SelectionBackColor = Color.Yellow
        rt.SelectionColor = Color.Brown
        rt.SelectionAlignment = HorizontalAlignment.Center
        rt.AppendText("平均値=" & (Sum / 300D).ToString("#,0.00"))


        '書式指定した内容を、Rich Text Format ファイルとして保存して開く
        rt.SaveFile(sampleFile & ".RTF", RichTextBoxStreamType.RichText)
        Process.Start("wordpad.exe", """" & sampleFile & ".RTF""")

        'rt.SaveFile(sampleFile & ".TXT", RichTextBoxStreamType.PlainText)
        'Process.Start("notepad.exe", """" & sampleFile & ".TXT""")
    End Sub
End Class

引用返信 編集キー/
■72224 / inTopicNo.5)  Re[4]: 外部アプリ起動時のフォント指定
□投稿者/ くも (3回)-(2014/05/26(Mon) 21:07:40)
No72223 (魔界の仮面弁士 さん) に返信

早速の回答ありがとうございます
じっくり内容を把握して検討させていただきます

引用返信 編集キー/
■72226 / inTopicNo.6)  Re[5]: 外部アプリ起動時のフォント指定
□投稿者/ くも (4回)-(2014/05/27(Tue) 08:36:09)
度々申し訳ありません
リッチテキストファイルで対応ということですが…

単なるテキストファイルをVBからワードパッドを起動して読み込む場合
その時、フォントの指定はできないのでしょうか?
よろしくお願いいたします
※もしこれが可能であればとても助かります
引用返信 編集キー/
■72227 / inTopicNo.7)  Re[6]: 外部アプリ起動時のフォント指定
□投稿者/ 魔界の仮面弁士 (25回)-(2014/05/27(Tue) 10:20:56)
No72226 (くも さん) に返信
> 単なるテキストファイルをVBからワードパッドを起動して読み込む場合

Wordpad に拘るのには、何か理由がありますか?
自作アプリや WinWord.exe など、その他のアプリでは駄目ですか?
フォントを指定したいのは何故ですか?


> リッチテキストファイルで対応ということですが…

WordPad.exe / write.exe のテキストボックス欄は、内部で
「リッチテキストボックスコントロール」を使っています。
(正確には RichEdit Control ですが)

これは、VB.NET では System.Windows.Forms.RichTextBox コントロールにあたり、
先の私のサンプルで言うところの、「Private rt As RichTextBox」のことです。
(ツールボックスから画面上に貼って使うことも出来ます)


RichTextBox 自体は、プレーンテキストを読み込む機能もあります(LoadFile メソッド)ので、
既知の *.TXT ファイルを読み込んで、そこに色やフォントを指定することは可能です。


ただし、それを WordPad に Process.Start 経由で渡すとなると、書式情報を
『ファイル』として受け渡すために、どうしても *.RTF を生成しておく必要が生じます。


もし、どうしても RTF を作成することができない事情があり、かつ、テキストの表示を
WordPad に行わせる必要があるとすれば、『ファイル』以外の受け渡し手段として

(案1) リッチテキストデータをクリップボードにコピーし、それを WordPad 側にペーストする。

(案2) WordPad にはプレーンテキストを読み込ませた上で、SendMessage API を用いて
 内部の RichTextBox を制御して、着色処理などを行う。

などが考えられます。


たとえば 案1 であれば、先の No72223 のコードの最後で、
 rt.SaveFile(sampleFile & ".RTF", RichTextBoxStreamType.RichText)
 Process.Start("wordpad.exe", """" & sampleFile & ".RTF""")
と書いてあった 2 行を取り除き、それを下記のように変更してみて下さい。

'------------------------------
'書式指定した内容を、Rich Text Format ファイルとして保存して開く
'rt.SaveFile(sampleFile & ".RTF", RichTextBoxStreamType.RichText)
'Process.Start("wordpad.exe", """" & sampleFile & ".RTF""")

'クリップボードに RTF を転送する
Clipboard.Clear()
Clipboard.SetText(rt.Rtf, TextDataFormat.Rtf)

'ワードパッドを起動する
Dim p As Process = Process.Start("wordpad")
p.WaitForInputIdle()

'ワードパッドに「Ctrl+V」でクリップボードの内容を転送する
AppActivate(p.MainWindowTitle)
SendKeys.SendWait("^V")
'------------------------------


ただし、SendKeys に頼っていることもあり、必ずしも成功するとは限りません。
より確実なのは 案2 の方法ですが、リッチテキストボックスの制御を
すべて API で行うことになりますので、コード量は増加してしまいます。
http://msdn.microsoft.com/en-us/library/windows/desktop/ff486015.aspx
引用返信 編集キー/
■72228 / inTopicNo.8)  Re[7]: 外部アプリ起動時のフォント指定
□投稿者/ くも (6回)-(2014/05/27(Tue) 11:54:50)
>Wordpad に拘るのには、何か理由がありますか?
>自作アプリや WinWord.exe など、その他のアプリでは駄目ですか?
>フォントを指定したいのは何故ですか?

VBで技術計算ソフトを作っています
計算結果は↓このようにして(テキスト)ファイル保存しています
FileOpen(1, FLT, OpenMode.Output)
Print(1, " No", "x座標 λ fx σx")
PrintLine(1, " σy σz fb σ/f")
For I = 1 To NELEM
If XPOSI(J) = 0 Then Print(1, I) Else Print(1, SPC(1))
Print(1, TAB(15))
Print(1, Format(XPOSI(J), "####0.0###"))
Print(1, TAB(29))
Print(1, Format(ALMDA, "####0.0"))
     ・・・・・・・
↓保存したファイルの中です。これは印刷用のフアイルです
No x座標 λ fx σx σy σz fb σ/f
1 0.0 1.0 1.5999 -1.2712 0.6993 -0.0598 1.6 1.2689 ×
1.0 1.0 1.5999 -1.2712 0.2667 -0.5316 1.6 1.2935 ×
2 0.0 1.0 1.5999 -0.8753 0.2512 -0.5259 1.6 1.0328 ×
・・・・・・・

1行で表示したいデータが長いです
ゴシックでは列がズレます。
A4タテの場合、サイズ8以上ですと改行されたりして空白調整しないと見づらくなります
よってフォントを("MS 明朝", 8)にしたいです
またNoは1000近くいくこともありデータが膨大になることもあるので軽くしたいです

ワードパッドを立ち上げてフォントを変更すればいいこと
…といわれればそうなんですけど
このソフトは業務で使ったりします…そしてあまり分かってない人もいます
そういう人はそのまま印刷してしまい…見づらいものとなってしまいます
なるべく使いやすく簡単にしたいと思っています
また将来的にはエクセルに書き出したいとも思っていますが
これはもう少し先の問題にしようと思っています
魔界の仮面弁士様の回答はもうすこしよく理解して検討させて戴きます
ありがとうございます

引用返信 編集キー/
■72230 / inTopicNo.9)  Re[8]: 外部アプリ起動時のフォント指定
□投稿者/ くも (7回)-(2014/05/27(Tue) 12:01:51)
申し訳ありません
投稿に慣れてないもので…
データファイルの中…の表示…横の空白が詰まって見づらくなりました

引用返信 編集キー/
■72231 / inTopicNo.10)  Re[9]: 外部アプリ起動時のフォント指定
□投稿者/ PANG2 (33回)-(2014/05/27(Tue) 12:24:10)
(案1)
テキストファイルをRTFファイルに変換してWordpadで開く。

# 一番まともな案と思いますが



(案2)
フォントを指定しただけのRTFファイルをWordpadで開く。
WM_SETTEXTでテキストを流し込む。

Process p = Process.Start("WordPad.exe", @"c:\tmp\dmy.rtf");
p.WaitForInputIdle();
IntPtr hWnd = GetDlgItem(p.MainWindowHandle, 0xe900);
StringBuilder sb = new StringBuilder("テキスト");
SendMessage(hWnd, WM_SETTEXT, IntPtr.Zero, sb);


http://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q1493005769
http://qa.atmarkit.co.jp/q/3173
引用返信 編集キー/
■72234 / inTopicNo.11)  Re[8]: 外部アプリ起動時のフォント指定
□投稿者/ 魔界の仮面弁士 (27回)-(2014/05/27(Tue) 14:17:18)
No72228 (くも さん) に返信
> そういう人はそのまま印刷してしまい…見づらいものとなってしまいます
「データの出力」のためのテキストデータと、
「データの表示/印刷」のためのリッチテキストデータとを
分けて考えましょう。


> FileOpen(1, FLT, OpenMode.Output)
これは、旧BASIC互換のファイル出力命令ですね。

今回のような表データの場合、各列を何桁目から出力するかの調整が必要ですが、
FileSystem.Print メソッド(VB.NET) / Print ステートメント(BASIC) にて固定幅出力を行う場合には、
FileSystem.FileWidth メソッド(VB.NET) / Width ステートメント(BASIC) で指定すると便利かも。


'各列を、何桁目から書き始めるかの定義
Dim cols() As TabInfo = {TAB(1), TAB(12), TAB(27), TAB(40)}


'まとめて一行分ずつ出力しても良いし…
Print(1, cols(0), "1", cols(1), "0.0", cols(2), "1.0", cols(3), "-1.2712")
Print(1, cols(0), "", cols(1), "1.0", cols(2), "1.0", cols(3), "-1.2712")

'一行分を複数に分けて出力しても良い
Print(1, cols(0), "2")
Print(1, cols(1), "0.0")
Print(1, cols(2), "12.3")
Print(1, cols(3), "-0.8753")

Print(1, cols(0), "3", cols(1), "1.1")
Print(1, cols(2), "0.0", cols(3), "-1.2712")

'複数行分をまとめることもできる
Print(1, cols(0), "4", cols(1), "0.0", cols(2), "1.0", cols(3), "-1.2712", cols(0), "5", cols(1), "1.0", cols(2), "1.0", cols(3), "-1.2712")



> ゴシックでは列がズレます。
ゴシック体か否かは、直接の原因では無いと思います。
指定したフォントとサイズが原因でズレが生じたのでしょう。
(3の倍数ポイントのサイズを選択すると、ズレにくいとされています)


ちなみに、「MS ゴシック」や「MS 明朝」は固定幅フォント、
「MS Pゴシック」や「MS P明朝」はプロポーショナルフォントですが、
固定幅であっても、下記のような理由でズレが生じることがあります。
http://msdn.microsoft.com/ja-jp/library/cc979401.aspx



なお、表形式のデータの「表示」だけが問題な場合には、そのテキストファイルに
出力する内容を、DataGridView 等に表示させた方が読みやすいかと思います。


今回の場合、タブ区切りテキストとして出力する手法もあるかと思います。
RichTextBox であれば、「SelectionTabs プロパティ」を指定することで
各列の出力位置を調整できるので、表形式のデータを綺麗に纏められるでしょう。

ちなみにリッチテキストでは、「表」形式のデータもサポートしてます。
今回は出番が無いかもしれませんけれどね。

Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
  Me.RichTextBox1.Rtf = "{\rtf1\ansi\deff0" & vbCrLf _
    & "\trowd \cellx1000 \cellx2000 \cellx3000" & vbCrLf _
    & "cell 1\intbl\cell cell 2\intbl\cell cell 3\intbl\cell" & vbCrLf _
    & "\row}"
End Sub





> よってフォントを("MS 明朝", 8)にしたいです
> またNoは1000近くいくこともありデータが膨大になることもあるので軽くしたいです
表示だけならば、HTML という選択肢もありますね。

Imports System.IO
Public Class Form1

    Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click

        Dim sampleFile As String = Path.Combine( _
            My.Computer.FileSystem.SpecialDirectories.Desktop, _
            "RESULT.HTML")

        Using sw As New System.IO.StreamWriter(sampleFile, False)
            sw.WriteLine("<html><head><meta http-equiv='content-type' content='text/html;charset=utf-8'>")
            sw.WriteLine("<style>pre{font-family:'MS 明朝'; font-size:9pt; color:navy;}</style>")
            sw.WriteLine("</head><body><pre>")

            sw.WriteLine("No           x座標         λ            fx           σx          σy          σz        fb           σ/f")
            For dummy As Integer = 1 To 1000
                sw.WriteLine("1            0.0           1.0           1.5999        -1.2712       0.6993        -0.0598       1.6           1.2689 ×")
                sw.WriteLine("             1.0           1.0           1.5999        -1.2712       0.2667        -0.5316       1.6           1.2935 ×")
                sw.WriteLine("2            0.0           1.0           1.5999        -0.8753       0.2512        -0.5259       1.6           1.0328 ×")
            Next

            sw.WriteLine("</pre></body></html>")
        End Using

        Process.Start(sampleFile)
    End Sub
End Class




> ワードパッドを立ち上げてフォントを変更すればいいこと
> …といわれればそうなんですけど
> このソフトは業務で使ったりします…そしてあまり分かってない人もいます

業務での利用であるならば、表示や印刷を汎用のワードパッドに頼るのではなく、
読みやすく表示するためのビューワー(あるいは編集用のビューワー)を作成するのも手かと思います。

引用返信 編集キー/
■72238 / inTopicNo.12)  Re[10]: 外部アプリ起動時のフォント指定
□投稿者/ くも (8回)-(2014/05/27(Tue) 17:29:58)
No72231 (PANG2 さん) に返信

ありがとうございます
どの方法がいいか…これからいろいろと試してみたいと思います
引用返信 編集キー/
■72239 / inTopicNo.13)  Re[9]: 外部アプリ起動時のフォント指定
□投稿者/ くも (9回)-(2014/05/27(Tue) 17:42:55)
No72234 (魔界の仮面弁士 さん) に返信

いつも詳細の説明…ありがとうございます

>これは、旧BASIC互換のファイル出力命令ですね。

そうなんです
N88BASIC時代からもう30年近くなります…時々更新しています
OSと言語の進化に遅れないように追いかけています

ここまでの回答(説明)を私の知識では理解するのに少々時間が必要です
暫くじっくりと検討したいと思います

ありがとうございました

また分からないことがありましたら、よろしくお願いいたします





引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -