現在、私のアプリケーションで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);
}
これは確かに私が欲しいのポリゴンを描画しないが、それはそれは同様、塗装を行う唯一のものです。なぜこれが起こっているのか、私は確信しています。私はペイントメッセージを受け取り、それを処理しています。私は、たとえば背景の白を描くデフォルトのルーチンを通らない。
しかし、私は実際にこのようにそれを持ってしたいと思います:
私はルーチンのカスタムペイント- 行く事をペイントI
FileEdit::OnPaint
の方法でリクエストしてください。
私はまだ普通のペイントルーチンが欲しいですが、後で「上に」いくつか追加したいだけです。
これを行う方法はありますか?多分PAINTSTRUCT
をベースメソッドに渡すことができますか?事前
可能なオプション: 'WM_PAINT'を扱いますあなたのサブクラスハンドラであなたが必要とする 'PAINTSTRUCT'の部分を再構築した後、スーパークラスの' OnPaint() '(ATL/WTLでどうやってどういうことがわかりません)を呼び出し、' GetDC() 'を使って余分な描画をしますか? 'PAINTSTRUCT'のフィールドの' hdc'は 'GetDC()'から得られ、 'rcPaint'は' GetUpdateRect() 'からのものです。 'EndPaint()'が(更新矩形を削除する以外の)いくつかの魔法をしていない限り、*悪影響はありません。おそらく私が知らないWTLにフックする方法があります。存在しない場合、これは純粋なWin32の最後の手段になります。 – andlabs
私のコメントが示唆しているように、スーパークラスハンドラが実行される前に 'GetDC()'を呼び出すべきかどうかもわかりません。私は個人的にはしませんが、... – andlabs