在对话框中 实现重绘

1)  在对话框中重载重绘OnPaint() ,其中的CpaintDC dc(this) 是有自己的坐标系统的,看网络上说可以使用MapDialogRect 去掉模板单位到Screen单位。这个是在网络上看的,之后自己使用了CpaintDC dc(this), 

CPaintDC dc(this); // device context for painting
// TODO: 在此处添加消息处理程序代码
// 不为绘图消息调用 CDialogEx::OnPaint();
CRect rc; 
GetDlgItem(IDC_LINE_STATIC)->GetWindowRect(rc);
ScreenToClient(rc);
CPen pen(m_lineType,m_lineWidth,m_lineColor);
CPen *oldPen = dc.SelectObject(&pen);
dc.MoveTo(rc.left +10 ,(rc.bottom + rc.top)/2);
dc.LineTo(rc.right -10 ,(rc.bottom + rc.top)/2);
dc.SelectObject(oldPen);


GetDlgItem(IDC_FILL_STATIC)->GetWindowRect(rc);
ScreenToClient(rc);
CBrush writeBrush;   
if (m_fillType == 6)
{
writeBrush.CreateSolidBrush(m_fillColor);
}else
{
writeBrush.CreateHatchBrush(m_fillType,m_fillColor);
}
CRect  clientRect;
clientRect.left = rc.left +10;
clientRect.right = rc.right-10;
clientRect.top = rc.top +10;
clientRect.bottom = rc.bottom - 10;
dc.FillRect(clientRect,&writeBrush);

这个过程是正确的,只是之前画线时,画的线被一个控件覆盖,无法显示,后来自己去掉了这个控件,但是不太明白为什么会被其覆盖?

而下面的方法是,直接用了控件的DC 实现在控件上画线,但是当在另外弹出模式对话框时,由于要重绘,而无法显示对话框!

解释:CPaintDC用于响应窗口重绘消息(WM_PAINT)时的绘图输出。CPaintDC在构造函数中调用BeginPaint()取得设备上下文,在析构函数中调用EndPaint()释放设备上下文。EndPaint()除了释放设备上下文外,还负责从消息队列中清除WM_PAINT消息。因此,在处理窗口重画时,必须使用CPaintDC,否则WM_PAINT消息无法从消息队列中清除,将引起不断的窗口重画。CPaintDC也只能用在WM_PAINT消息处理之中。

2)自己的实现方法:

         //CpaintDC dc(this);

         CDC *pDC = m_lineEdit.GetDC();
CRect rc; 
m_lineEdit.GetRect(&rc);


CPen pen(m_lineType,m_lineWidth,m_lineColor);
CPen *oldPen = pDC->SelectObject(&pen);


pDC->MoveTo(rc.left +5,rc.bottom + rc.top +20);
       pDC->LineTo(rc.right -5,rc.bottom + rc.top +20);
pDC->SelectObject(oldPen);
m_lineEdit.ReleaseDC(pDC);

在这里当强制其重绘时,使用了UpdateWindow();


Invalidate  和 UpdateWindow的不同: Invalidate   刷新的是客户区,UpdateWindow刷新的是窗口元素

 

网上收集的其他对比

Invalidate()与UpdateWindow( )

void Invalidate( BOOL bErase = TRUE );
该函数的作用是使整个窗口客户区无效。窗口的客户区无效意味着需要重绘,例如,如果一个被其它窗口遮住的窗口变成了前台窗口,那么原来被遮住的部分就是无效的,需要重绘。这时Windows会在应用程序的消息队列中放置WM_PAINT消息。MFC为窗口类提供了WM_PAINT的消息处理函数OnPaint,OnPaint负责重绘窗口。视图类有一些例外,在视图类的OnPaint函数中调用了OnDraw函数,实际的重绘工作由OnDraw来完成。参数bErase为TRUE时,重绘区域内的背景将被擦除,否则,背景将保持不变。

它和 UpdateWindow( )区别在于:

UpdateWindow( )的作用是使窗口立即重绘。调用Invalidate等函数后窗口不会立即重绘,这是由于WM_PAINT消息的优先级很低,它需要等消息队列中的其它消息发送完后才能被处理。调用UpdateWindow函数可使WM_PAINT被直接发送到目标窗口,从而导致窗口立即重绘。



你可能感兴趣的:(在对话框中 实现重绘)