2017-02-11 5 views
1

現在、私のアプリケーションでCRichEditCtrlをサブクラス化しようとしています。これは、サブクラスのクラスです:サブクラス化されたコントロールのペイントメソッドで、デフォルトのペイント結果の上に何かを描画するにはどうすればよいですか?

class FileEdit : public CWindowImpl<FileEdit, CRichEditCtrl> 
{ 
    DECLARE_WND_CLASS(L"FileEdit"); 
public: 
    BEGIN_MSG_MAP_EX(FileEdit) 
     MSG_WM_PAINT(OnPaint) 
     MSG_WM_LBUTTONUP(OnLButtonUp) 
    END_MSG_MAP() 

    bool Init(); 

private: 
    void OnPaint(CDCHandle dc); 
    void OnLButtonUp(UINT nFlags, CPoint point); 
}; 

私のpaintメソッドは次のようになります。

void FileEdit::OnPaint(CDCHandle dc) 
{ 
    PAINTSTRUCT ps; 
    if (!dc) 
    { 
     dc = BeginPaint(&ps); 
    } 
    POINT p[2]; 
    p[0].x = 1; 
    p[0].y = 1; 

    p[1].x = 5; 
    p[1].y = 5; 
    Polygon(dc, p, 2); 

    EndPaint(&ps); 
} 

これは確かに私が欲しいのポリゴンを描画しないが、それはそれは同様、塗装を行う唯一のものです。なぜこれが起こっているのか、私は確信しています。私はペイントメッセージを受け取り、それを処理しています。私は、たとえば背景の白を描くデフォルトのルーチンを通らない。

しかし、私は実際にこのようにそれを持ってしたいと思います:

私はルーチンのカスタムペイント
  • を指定しない場合、どうなるデフォルトのペイントルーチンを通して
    1. 行く事をペイントI FileEdit::OnPaintの方法でリクエストしてください。

    私はまだ普通のペイントルーチンが欲しいですが、後で「上に」いくつか追加したいだけです。

    これを行う方法はありますか?多分PAINTSTRUCTをベースメソッドに渡すことができますか?事前

  • +0

    可能なオプション: 'WM_PAINT'を扱いますあなたのサブクラスハンドラであなたが必要とする 'PAINTSTRUCT'の部分を再構築した後、スーパークラスの' OnPaint() '(ATL/WTLでどうやってどういうことがわかりません)を呼び出し、' GetDC() 'を使って余分な描画をしますか? 'PAINTSTRUCT'のフィールドの' hdc'は 'GetDC()'から得られ、 'rcPaint'は' GetUpdateRect() 'からのものです。 'EndPaint()'が(更新矩形を削除する以外の)いくつかの魔法をしていない限り、*悪影響はありません。おそらく私が知らないWTLにフックする方法があります。存在しない場合、これは純粋なWin32の最後の手段になります。 – andlabs

    +0

    私のコメントが示唆しているように、スーパークラスハンドラが実行される前に 'GetDC()'を呼び出すべきかどうかもわかりません。私は個人的にはしませんが、... – andlabs

    答えて

    1

    WM_PAINTハンドラをカスタマイズするためのクリーンな方法で

    おかげでBeginPaintEndPaintペアの途中で、あなたのコードを挿入する方法を見つけることです。標準の制御ハンドラには独自の呼び出しがあるため、そのような機会が存在する場合には、それらの間でコールバックするのが最善です。たとえば、リストビューやツリービューなどの一般的なコントロールは、NM_CUSTOMDRAW通知を送信することでこの機会を提供しますが、編集コントロールは柔軟性がありません。

    もちろん、絵を完全に扱うと、タスクは非常に簡単です。この場合、標準のハンドラについてあまり考えずにメッセージを自分で処理するだけです。

    標準的なコントロール実装と互換性があり、他のコントロールには当てはまりませんが、リッチエディットコントロールではなく簡単なエディットコントロールのための編集固有のソリューションは次のとおりです。

    1. を使用してHDCを取得することにより、制御がBeginPaint
    2. EndPaintは、その後、あなたのハンドラで続け、独自に標準絵をやらせるために、独自のWM_PAINTハンドラ
    3. コールDefWindowProcを提供0とReleaseDCBeginPaintおよびEndPaintと対照的に)、カスタマイズして取得したDCを更新します。サブクラスのエディットコントロールの

    A WTLハンドラは次のようになります。

    LRESULT OnPaint(CDCHandle) 
    { 
        if(!(GetStyle() & ES_READONLY)) // Just an example how to make custom draw optional 
        { 
         DefWindowProc(); 
         CClientDC Dc(m_hWnd); 
         // TODO: Paint using Dc 
        } else 
         SetMsgHandled(FALSE); 
        return 0; 
    } 
    

    も参照してください:

    関連する問題