是这样的,我想在datagrid中突显当前行,想来想去,就是在当前行的边框上画上一个有色长方形最简单一开始,我不知道怎么能在上面画线,在onpaint里面画,但却是被控件覆盖了
我想会不会是因为它重绘完对话框在重绘子窗口(控件),所以onpaint中画的被遮盖了
于是我试了下,在onpaint中发送消息,打算让其重绘结束捕获这个消息
void CTrygridDlg::OnPaint() 
{
if (IsIconic())
{
CPaintDC dc(this); // device context for painting SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0); // Center icon in client rectangle
int cxIcon = GetSystemMetrics(SM_CXICON);
int cyIcon = GetSystemMetrics(SM_CYICON);
CRect rect;
GetClientRect(&rect);
int x = (rect.Width() - cxIcon + 1) / 2;
int y = (rect.Height() - cyIcon + 1) / 2;

// Draw the icon
dc.DrawIcon(x, y, m_hIcon);
PostMessage(UM_DRAWLINE,0,0);
}
else
{

// m_grid.Invalidate();*/

PostMessage(UM_DRAWLINE,0,0);
CDialog::OnPaint();

}

}void CTrygridDlg::OnDrawLine(WPARAM wParam, LPARAM lParam)
{
CDC* dc=GetDC();

dc->MoveTo(0,0);
dc->LineTo(500,500);
DeleteObject(&dc);

}
发现的确可行!!
但是如果真的是在datagrid中作图,也就是把CDC* dc=GetDC();改成CDC* dc=m_grid.GetDC();
也的确如所愿出现那条直线,但是一旦切换窗口在切换回来,直线消失,甚至能够看到它消失(一闪),如果是获得对话框的设备上下文,却没有这回事
不知道这是为什么?或者有没有更好的解决方法,就是作图而不被覆盖
谢谢

解决方案 »

  1.   

    datagrid 不能设置 highlight 当前行吗?
      

  2.   

    能看到消失的原因是,重绘的先后顺序引起的,一般是先执行对话框里的OnPaint,在执行控件的OnPaint,你把顺序改变一下就OK了,先让datagrid更新,用这句话GetDlgItem(IDC_DATAGRID)->UpdateWindow就OK了,就能改变WM_PAINT消息的优先级
      

  3.   

    555
    发现非得捕捉datagrid的刷新不可
    否则一旦我在datagrid中操作,好像就会重绘
    此时我在dialog中的捕捉不到
    也就是前面的作图被覆盖了
      

  4.   

    不能重载DrawItem这个函数吗?
    在这个函数里做,应该就可以了。