none
オブジェクトが埋め込まれたRTFファイルの編集 RRS feed

  • 質問

  • RichTextBox Control(System.Windows.Forms)を利用してRTFファイルの表示をしています。

    RTFにBitmapなど画像が埋め込まれている場合、そのオブジェクトをダブルクリックするとペイントが立ち上がり別ウィンドウで画像が編集できるようになります。

    これを自分のForm内で編集できるようにしたいのですが、可能でしょうか?

    あるいは、それを可能にする仕組みは用意されているのでしょうか?

     

    RTFファイルはワードパッドで作成しています。

    ちなみにOpenOffice 3.2.1のCalcを埋め込んだ場合、編集はできないようです。ダブルクリックしても何もおきません。ワードパッドの場合は編集可能でした。できれば、これも対応したいと思います。

    2010年11月5日 14:03

回答

  • あまりRTF関連は詳しくはないのですが、気になったので調べてみました。
    間違いがあれば、わかる方指摘して下さい。

    >それを可能にする仕組みは用意されているのでしょうか?

    以下を見る限りRichTextBox には、用意されていないと思われます。

    >これを自分のForm内で編集できるようにしたいのですが、可能でしょうか?

    結論から言えば可能ですが、非常に大変な作業かと思います。
    まず、RichTextBoxコントロールにビットマップが表示されている場合で、
    必ずしもダブルクリックでペイントが立ち上がる、というわけではありません。
    これは、RTF内で指定しているオブジェクト情報に応じて、RichTextBoxが
    対応するアプリケーションで外部起動するかどうかを判断している為の様です。

    例えば、以下のようにしてRichTextBox に追加したBitMapは、
    ダブルクリックで編集モードにはならないようです。
    Image img = Image.FromFile(@"c:\hoge.bmp");
    Clipboard.Clear();
    Clipboard.SetImage(img);
    richTextBox1.Paste();
    
    ワードパットで作成したRTFと、上記の方法で作成されたRTFを文字列として比較
    すればわかりますが、各OLEオブジェクトの情報として、同じBitMapでも違った
    情報で管理されています。(一部を抜粋)

    ・\object\objemb{\*\objclass Paint.Picture
    ・\pict\wmetafile8\picw264\pich264
    ※参考として以下

    つまり、RTF内のOLEオブジェクト定義の書き方によって、そのオブジェクトを
    ダブルクリックした際の挙動が変わるということになります。
    また、その挙動自体の動作(ペイントが外部起動する等)はRichTextBox の仕様と
    思われますので、変更したりする方法は無いと思います。

    ではどのように実現可能かといいますと、方法として、まずはRichTextBox を
    使用せずに、自分で同等の機能を持ったコントロールを作成する事が挙げられます。
    ※検索するとわかりますが、これは実際に自作されている方もいるようです。

    別の方法として、RichTextBox を使いますが、まずはダブルクリックした際に
    ペイントが立ち上がらないように、RTFのオブジェクト定義の箇所を編集し、
    RichTextBox のダブルクリックイベントにおいて、
    「richTextBox1.SelectionType == RichTextBoxSelectionTypes.Object」の場合に
    「richTextBox1.SelectedRtf」を取得して、それをフォーム内に配置しているコントロールに
    渡してビットマップを表示する方法です。
    当然、フォーム内に配置するPaintソフトのようなコントロールも、別途作成する
    必要があると思います。
    ペイント等の外部アプリケーションをフォーム内に埋め込む事は、基本的には無理です。
    ※以下のような方法もあるみたいですが・・・

    以上は、BitMapのみの話ですが、実際は以下も対応したいということですよね。

    OpenOffice 3.2.1のCalc

    こちらも、RTF内のOLEオブジェクトの書き方で、起動できる可能性もありますが、
    フォーム内にとなると、かなり厳しいと思います。
    ペイントソフトのようなコントロールは、頑張れば実現可能なレベルと思いますが、
    表計算ソフトを自作というのは現実的ではないと思いますので、そうなると
    外部起動が一番簡単な方法かと思います。
    現実的な落しどころとしては、OLEオブジェクトは外部起動というところではないでしょうか。

    ちなみに、エクセル、ワードなどを含むRTFをワードパッドで作成し、それを読み込んだ
    RichTextBox で、エクセル、ワードが外部起動することは確認しています。
    OpenOffice では未確認。
    • 回答としてマーク kozz 2010年11月9日 7:55
    2010年11月9日 1:36

すべての返信

  • >これを自分のForm内で編集できるようにしたいのですが、可能でしょうか?

     

    RichTextBox に表示されているビットマップをダブルクリックし、自フォームに配置

    してある、コントロール(イメージとしてペイントソフトのようなもの)に展開し、編集したい、

    ということでしょうか?

    2010年11月8日 11:10
  • はい、そうです。

     

    ワードパッドのような動作をイメージしています。

    ワードパッドの場合、ビットマップをダブルクリックするとOS付属のペイントが立ち上がり、自分のWindow内にペイントのUIを表示し編集できる状態になります。

    2010年11月8日 13:26
  • あまりRTF関連は詳しくはないのですが、気になったので調べてみました。
    間違いがあれば、わかる方指摘して下さい。

    >それを可能にする仕組みは用意されているのでしょうか?

    以下を見る限りRichTextBox には、用意されていないと思われます。

    >これを自分のForm内で編集できるようにしたいのですが、可能でしょうか?

    結論から言えば可能ですが、非常に大変な作業かと思います。
    まず、RichTextBoxコントロールにビットマップが表示されている場合で、
    必ずしもダブルクリックでペイントが立ち上がる、というわけではありません。
    これは、RTF内で指定しているオブジェクト情報に応じて、RichTextBoxが
    対応するアプリケーションで外部起動するかどうかを判断している為の様です。

    例えば、以下のようにしてRichTextBox に追加したBitMapは、
    ダブルクリックで編集モードにはならないようです。
    Image img = Image.FromFile(@"c:\hoge.bmp");
    Clipboard.Clear();
    Clipboard.SetImage(img);
    richTextBox1.Paste();
    
    ワードパットで作成したRTFと、上記の方法で作成されたRTFを文字列として比較
    すればわかりますが、各OLEオブジェクトの情報として、同じBitMapでも違った
    情報で管理されています。(一部を抜粋)

    ・\object\objemb{\*\objclass Paint.Picture
    ・\pict\wmetafile8\picw264\pich264
    ※参考として以下

    つまり、RTF内のOLEオブジェクト定義の書き方によって、そのオブジェクトを
    ダブルクリックした際の挙動が変わるということになります。
    また、その挙動自体の動作(ペイントが外部起動する等)はRichTextBox の仕様と
    思われますので、変更したりする方法は無いと思います。

    ではどのように実現可能かといいますと、方法として、まずはRichTextBox を
    使用せずに、自分で同等の機能を持ったコントロールを作成する事が挙げられます。
    ※検索するとわかりますが、これは実際に自作されている方もいるようです。

    別の方法として、RichTextBox を使いますが、まずはダブルクリックした際に
    ペイントが立ち上がらないように、RTFのオブジェクト定義の箇所を編集し、
    RichTextBox のダブルクリックイベントにおいて、
    「richTextBox1.SelectionType == RichTextBoxSelectionTypes.Object」の場合に
    「richTextBox1.SelectedRtf」を取得して、それをフォーム内に配置しているコントロールに
    渡してビットマップを表示する方法です。
    当然、フォーム内に配置するPaintソフトのようなコントロールも、別途作成する
    必要があると思います。
    ペイント等の外部アプリケーションをフォーム内に埋め込む事は、基本的には無理です。
    ※以下のような方法もあるみたいですが・・・

    以上は、BitMapのみの話ですが、実際は以下も対応したいということですよね。

    OpenOffice 3.2.1のCalc

    こちらも、RTF内のOLEオブジェクトの書き方で、起動できる可能性もありますが、
    フォーム内にとなると、かなり厳しいと思います。
    ペイントソフトのようなコントロールは、頑張れば実現可能なレベルと思いますが、
    表計算ソフトを自作というのは現実的ではないと思いますので、そうなると
    外部起動が一番簡単な方法かと思います。
    現実的な落しどころとしては、OLEオブジェクトは外部起動というところではないでしょうか。

    ちなみに、エクセル、ワードなどを含むRTFをワードパッドで作成し、それを読み込んだ
    RichTextBox で、エクセル、ワードが外部起動することは確認しています。
    OpenOffice では未確認。
    • 回答としてマーク kozz 2010年11月9日 7:55
    2010年11月9日 1:36
  • 詳しい情報ありがとうございます。

    なかなか困難な話なのですね。画像編集ぐらいなら自分で作れそうですが、Calcは厳しいですね。

     

    >必ずしもダブルクリックでペイントが立ち上がる、というわけではありません。

    >RTF内のOLEオブジェクト定義の書き方によって、そのオブジェクトを

    もともとのファイルの作りによるということですね。

     

    >BitMapのみの話ですが、実際は以下も対応したいということですよね。
    はい、そうです。

     
    >現実的な落しどころとしては、OLEオブジェクトは外部起動
    私もそれが現実的な解になりそうだと考えて始めています。
     
     
    ご提示頂いたLinkを参考に、どこまで実現できそうか考えて見ます。
    要件も練り直したほうがよさそうです。
     
    有難うございました。
    2010年11月9日 7:45