none
自前でキャレットを点滅させるには RRS feed

  • 質問

  • Direct2DとキャレットAPIを組み合わせると一定距離を移動するごとにずれが発生してしまいます

    自前で描写したところずれがなくなったので、キャレットAPIを使わないことにしたいのですが、キャレットの点滅をどうやれば実装できるのかがわかりません

    どうも調べても出てこないので、点滅を実装する方法を教えてほしいしいです

    キャレットはカーソルを動かす→Refresh()メソッドを呼び出し、OnPaint()でキャレットや行の内容を描くという感じで描写しています

     

    • 編集済み jbh03215 2011年8月8日 9:05 描写方法の追加
    2011年8月6日 16:15

回答

  • 点滅なのですから、キャレットを描いた状態と、描いていない状態を相互に描画しないとだめでしょう。
    自力でやるなら、その点滅の間隔を取得して、表示・非表示を自前で実現することになると思います。

    # 描画速度によっては、描画情報をキャッシュしておくなどの工夫がいるかもしれませんね。


    質問スレッドで解決した場合は、解決の参考になった投稿に対して「回答としてマーク」のボタンを押すことで、同じ問題に遭遇した別のユーザが役立つ投稿を見つけやすくなります。
    • 回答としてマーク jbh03215 2011年8月12日 12:13
    2011年8月11日 15:10
    モデレータ
  • メモ帳をSpyで見ると、定期的にWindow MessageをPostし、
    そのMessageを受け取ったタイミングでCaretの描画処理(点滅)を行っています。
    Timerに類似した仕組みを利用していると思います。

    点滅のタイミングは、同じようにTimerで定期的に処理を行ってみては如何でしょうか。

     

    あと、Caretの描画はXORで描画できると良いのですが、
    Direct2Dでそのような方法は見つけられませんでした。

    参考までに以下のblogのcommentに少し情報があるので紹介しておきますね。
    [Comparing Direct2D and GDI]
      http://blogs.msdn.com/b/directx/archive/2009/09/28/comparing-direct2d-and-gdi.aspx?PageIndex=9&title=TITLE_REPLACE&desc=&h=TITLE_REPLACE&h=TITLE_REPLACE

    ----------------------

    Q: What is the Direct2D equivalent of GDI's SetROP2 function?

    A: For the functionality of blending a source with a destination, Direct2D uses opacity and source-over blending. You can set the opacity on any brush and the DrawBitmap call also has an opacity value. Some ROPs, such as R2_XORPEN have usage outside of blending, however, since these are pixel-based they only work well with some kind of integer or normalized pixel-format. What ROP functions were you wanting to use?

    ----------------------

    もしその点で困っているのであれば、上記blogにcommentすれば、なにか情報が頂けるかも知れません。

    • 回答としてマーク jbh03215 2011年8月12日 12:13
    2011年8月12日 6:10

すべての返信

  • えっと、まずどうやって自前描画してるんでしょうか??

     


    かずき Blog:http://d.hatena.ne.jp/okazuki/ VS 2010のデザイナでBlendのBehaviorをサポートするツール公開してます。 http://vsbehaviorsupport.codeplex.com/
    2011年8月7日 12:53
  • カーソルキーを動かすたびにControl.Invaildrect()で領域を無効化して、

    OnPaint()イベントで行を描くときにキャレットも描いています

     

    2011年8月11日 14:29
  • 点滅なのですから、キャレットを描いた状態と、描いていない状態を相互に描画しないとだめでしょう。
    自力でやるなら、その点滅の間隔を取得して、表示・非表示を自前で実現することになると思います。

    # 描画速度によっては、描画情報をキャッシュしておくなどの工夫がいるかもしれませんね。


    質問スレッドで解決した場合は、解決の参考になった投稿に対して「回答としてマーク」のボタンを押すことで、同じ問題に遭遇した別のユーザが役立つ投稿を見つけやすくなります。
    • 回答としてマーク jbh03215 2011年8月12日 12:13
    2011年8月11日 15:10
    モデレータ
  • メモ帳をSpyで見ると、定期的にWindow MessageをPostし、
    そのMessageを受け取ったタイミングでCaretの描画処理(点滅)を行っています。
    Timerに類似した仕組みを利用していると思います。

    点滅のタイミングは、同じようにTimerで定期的に処理を行ってみては如何でしょうか。

     

    あと、Caretの描画はXORで描画できると良いのですが、
    Direct2Dでそのような方法は見つけられませんでした。

    参考までに以下のblogのcommentに少し情報があるので紹介しておきますね。
    [Comparing Direct2D and GDI]
      http://blogs.msdn.com/b/directx/archive/2009/09/28/comparing-direct2d-and-gdi.aspx?PageIndex=9&title=TITLE_REPLACE&desc=&h=TITLE_REPLACE&h=TITLE_REPLACE

    ----------------------

    Q: What is the Direct2D equivalent of GDI's SetROP2 function?

    A: For the functionality of blending a source with a destination, Direct2D uses opacity and source-over blending. You can set the opacity on any brush and the DrawBitmap call also has an opacity value. Some ROPs, such as R2_XORPEN have usage outside of blending, however, since these are pixel-based they only work well with some kind of integer or normalized pixel-format. What ROP functions were you wanting to use?

    ----------------------

    もしその点で困っているのであれば、上記blogにcommentすれば、なにか情報が頂けるかも知れません。

    • 回答としてマーク jbh03215 2011年8月12日 12:13
    2011年8月12日 6:10
  • 返信ありがとうございます

    その方法で試してみたいと思います

     

    2011年8月12日 12:13