none
MFCでPhotoshopのようなテキスト描画 RRS feed

  • 質問

  • MFCを使って、Photoshopの文字表示のように、自由に1文字ずつフォント装飾したテキストを描画するにはどうすればいいでしょうか?

    また、文字はいつでもテキストエディタのように変更できるようにしたいです。

    Visual Studio 2008 Professional

    Visual Studio 2012 Professional

    2013年6月14日 13:31

回答

  • フォントの装飾がCreateFontでできる範囲を超えているのであれば、そのための描画ロジックを自分で組むことになります。単に文字が大きい・小さい(フォントサイズで制御)、縦横比が100%ではない(幅で制御)、ボールドやイタリック(スタイルで制御)なら、フォントを作って、1文字ずつ描画するとなります。

    文字の編集がテキストエディタのように。。。というのは、エディットコントロールをどこかに貼っておいて。。。でしょうか?

    それとも、画面表示してる装飾文字部分で直接的に編集したいでしょうか?

    前者なら、画面のどこかにエディットコントロールを張り付けておいて、そこに文字列をセット・編集してもらえばいいですよね?

    後者なら、頑張って自分で作ることになると思います。インフラジスティックスさんやグレープシティさんなどコンポーネントベンダーで扱ってるコントロールにそういうのがあるかもしれませんが、MFCで使うやつはたぶん扱っていないと思います。


    わんくま同盟,Microsoft MVP for Visual C++(Oct 2005-) http://blogs.wankuma.com/tocchann/

    • 回答としてマーク たけし 2013年6月15日 10:31
    2013年6月15日 1:40

すべての返信

  • フォントの装飾がCreateFontでできる範囲を超えているのであれば、そのための描画ロジックを自分で組むことになります。単に文字が大きい・小さい(フォントサイズで制御)、縦横比が100%ではない(幅で制御)、ボールドやイタリック(スタイルで制御)なら、フォントを作って、1文字ずつ描画するとなります。

    文字の編集がテキストエディタのように。。。というのは、エディットコントロールをどこかに貼っておいて。。。でしょうか?

    それとも、画面表示してる装飾文字部分で直接的に編集したいでしょうか?

    前者なら、画面のどこかにエディットコントロールを張り付けておいて、そこに文字列をセット・編集してもらえばいいですよね?

    後者なら、頑張って自分で作ることになると思います。インフラジスティックスさんやグレープシティさんなどコンポーネントベンダーで扱ってるコントロールにそういうのがあるかもしれませんが、MFCで使うやつはたぶん扱っていないと思います。


    わんくま同盟,Microsoft MVP for Visual C++(Oct 2005-) http://blogs.wankuma.com/tocchann/

    • 回答としてマーク たけし 2013年6月15日 10:31
    2013年6月15日 1:40
  • 1文字という単位での処理であれば従来の方法で処理できたわけですが、1文字を更に細かく装飾するとなるともはや図形といってもいいでしょう。こうなってくると従来の処理方法ではパフォーマンス的に手に負えなくなるため何らかのブレイクスルーが必要になります。

    最近では、CPUで描画処理せず、直接GPU(ビデオアダプタ上)で描画処理するようになってきています。それが、DirectX(Direct3D、Direct2D、DirectWrite…)になります。これらを使うことで、パフォーマンスを維持したままフォント装飾が可能になります。

    というわけでMFCでは現実的には無理かと思います。

    2013年6月15日 2:47
  • とっちゃんさん、ありがとうございます。

    装飾というのは、フォントの種類・サイズ・太さ・イタリック・色を文字ごとに指定するだけです。

    文字の編集は後者ですが、エディットコントロールでも文字ごとに装飾したまま文章を編集できるでしょうか?

    やはり自力で実装ですか…。

    2013年6月15日 10:26
  • 佐祐理さん、ありがとうございます。

    FlashやIllustratorのように1文字ずつ分解して図形にするわけではありません。

    やはりMFCでは無理ですか…。

    ツール開発はずっとMFCを使ってるので、.NETとか他のやり方も勉強すべきですね。


    • 編集済み たけし 2013年6月15日 11:42
    2013年6月15日 10:31
  • 想定しているものがどういうものか?にもよりますが、リッチエディットコントロールを使うことで編集エリアで装飾することもできます。

    あと、佐祐理さんが提示した方法は、.NET のテクノロジではありません。Direct 2D や DirectWrite は Windows 7(Vista はSP1からだった気がする)から利用できるGPUのアクセラレータを利用した2Dグラフィックやテキスト描画ロジックです。

    MFCアプリで使うこともできますが、MFCのクラスライブラリにあるわけではないので、自分で接続部分を書いたりする必要はあります。

    場合によっては使いにくい(古いテクノロジと相性がいまいち)ということはあるかもしれませんが、使ったことがないのでそのあたりはよくわかりません。


    わんくま同盟,Microsoft MVP for Visual C++(Oct 2005-) http://blogs.wankuma.com/tocchann/

    2013年6月15日 11:53
  • とっちゃんさん、ありがとうございます。

    リッチエディットコントロールがありましたね。

    それと、もちろんDirectXのことは知っています。

    DirectXの入門書も今のところ3冊出版しています。

    MFCとDirect3Dで3DCGツールもいくつか作っています。

    でもこれからは.NETの時代になるのかな?と思って。

    2013年6月15日 20:13
  • 大勢を占めるのはという意味で言えば、.NET が多くなると思います。ですが、MFCが消えていくということはなく、ある程度の部分で生き残っていくし、今後も拡張は続いていくと思います。

    なので、なくなるということもないと思います。先々自分のアプリはどちらがいいか?という点では、正直に言えば、.NET は使ってもいいし使わなくてもいいと思います。それこそ自分の好きなものを選択すればよいかと。。。

    今やアプリケーションを動かせるようにするために越えなければいけないハードルは、.NET と Native C++ で違いはほとんどありません。

    どちらも、新規にインストールしたばかり(SPだけは適用済みでもよいとする)のOSを対象とする場合は、アプリケーションが責任をもってインストールしない限り利用できませんので。


    わんくま同盟,Microsoft MVP for Visual C++(Oct 2005-) http://blogs.wankuma.com/tocchann/

    2013年6月17日 2:13
  • 自アプリへの自由度の高いプラグインやプラグインSDKを作る予定の場合は、その作りやすさ・罠の少なさという点では、ネイティブC++より各言語レベルでdllへの配慮が大きく、またJITコンパイルがベースとなるためdll間での継承の使いやすさ、interfaceの存在と多重継承禁止などの綺麗さなどから、少なくともその点について.NETを使う方が上という結論になると思います。

    ネイティブC++と自作ライブラリで極力やっているという状況であれば、複数のプラットフォームを意識する必要がある場合では.NETよりその方が有利かもしれませんが、MFCと.NETの2択の場合はどちらにしてもWindowsがターゲットの可能性が高いと思うので(少なくとも.NETはWindows以外でもそれなりに整えてやれば使える環境もあるみたいですが)、そういう点では特に差はない可能性が高めと考えていい気がしますね。

    仮に関数型のスタイルを相当前面に持ってくるようなプログラミングをしつつ十分なパフォーマンスを維持したい場合は、この2択の場合はF#とC++11(およびVC++の対応状況)に対する知識量と、それぞれの今後にbetするかどうかで判断・・・となるのだと思うのですが、「MFCと.NET」が優先度ほぼ互角というプログラミングスタイルに持っていく場合は、つまりMFCはオブジェクト指向と呼ぶ方が相応しいと思うので、その状況はつまりF#はそれほど選択肢に入っていないということなのでは?

    という考えが浮かんできます。それならば、そういう点でも特に差はない可能性が高めと考えていい気がしますね。

    ・・・C++を使わざるを得ない要件がいくつかあるのですが、開発効率という点を加味するとかゆいところに手が届かないことも多々あるため、最近、個人的には各種パフォーマンス・開発、拡張の効率面でもうちょっと思い通りにできるプログラミング言語を開発したい気分にもなってきてます。

    それ自体が機械語レベルで出力できる言語であれば簡単にできるとは思えないですが、現実的には高性能・高開発効率のスクリプト言語として、既存の任意の言語に任意に読み替えるラッパー言語が出来れば、十分かもしれません。それなら.NETもMFCも内部で使うように読み替えることは可能かもしれません。(スクリプト言語でパフォーマンスへの犠牲を最小限にするのはそれもそれで難しいでしょうが、それでも作るなら初手としてはその方がより現実的な気がします。)

    2013年6月18日 2:29