【发布时间】:2017-06-29 18:50:17
【问题描述】:
我目前正在尝试在我的应用程序中对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);
};
我的绘画方法如下所示:
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);
}
这确实绘制了我想要的多边形,但这也是它唯一绘制的东西。我很确定为什么会这样。我正在接受 Paint 消息,我正在处理它,然后它就完成了。例如,我没有使用将背景涂成白色的默认例程。
但是,我实际上想要这样:
- 如果我不指定自定义绘制例程,则会执行默认绘制例程
- 在
FileEdit::OnPaint-method 中绘制我要求的东西。
我仍然想要通常的绘画程序,但我只是想在之后“在上面”添加一些东西。
有没有办法做到这一点?也许我可以将PAINTSTRUCT 传递给基本方法?
提前致谢
【问题讨论】:
-
可能的选项:在子类处理程序中处理
WM_PAINT,方法是重构您需要的PAINTSTRUCT的部分,然后调用超类的OnPaint()(我不确定如何使用ATL/WTL,抱歉),然后使用GetDC()进行额外的绘图?对于PAINTSTRUCT的字段,hdc来自GetDC(),rcPaint来自GetUpdateRect()。这不应该有任何不良影响,除非EndPaint()正在做一些魔术(除了删除更新矩形)...?可能有一种方法可以连接到我不知道的 WTL;如果没有,这将是纯 Win32 的最后手段。 -
也不确定是否应该在超类处理程序运行之前调用
GetDC(),正如我的评论所暗示的那样。我个人不会,但是...