トップ回答者
オブジェクトが埋め込まれたRTFファイルの編集

質問
-
RichTextBox Control(System.Windows.Forms)を利用してRTFファイルの表示をしています。
RTFにBitmapなど画像が埋め込まれている場合、そのオブジェクトをダブルクリックするとペイントが立ち上がり別ウィンドウで画像が編集できるようになります。
これを自分のForm内で編集できるようにしたいのですが、可能でしょうか?
あるいは、それを可能にする仕組みは用意されているのでしょうか?
RTFファイルはワードパッドで作成しています。
ちなみにOpenOffice 3.2.1のCalcを埋め込んだ場合、編集はできないようです。ダブルクリックしても何もおきません。ワードパッドの場合は編集可能でした。できれば、これも対応したいと思います。
回答
-
あまり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
すべての返信
-
あまり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
-
詳しい情報ありがとうございます。
なかなか困難な話なのですね。画像編集ぐらいなら自分で作れそうですが、Calcは厳しいですね。
>必ずしもダブルクリックでペイントが立ち上がる、というわけではありません。
>RTF内のOLEオブジェクト定義の書き方によって、そのオブジェクトを
もともとのファイルの作りによるということですね。
>BitMapのみの話ですが、実際は以下も対応したいということですよね。
はい、そうです。>現実的な落しどころとしては、OLEオブジェクトは外部起動私もそれが現実的な解になりそうだと考えて始めています。ご提示頂いたLinkを参考に、どこまで実現できそうか考えて見ます。要件も練り直したほうがよさそうです。有難うございました。