是ScrollView,要在鼠标经过一条线时鼠标旁边出来一行字。
现在对鼠标的响应部分,判断是否过线已经完成,可是显示字时出现的重绘问题让我一筹莫展。
void CResultLine::OnMouseMove(UINT nFlags, CPoint point) 
{
CClientDC ClientDC(this);
OnPrepareDC (&ClientDC);
ClientDC.DPtoLP(&point); CPoint PointOld;
PointOld=point;
         CString strName;
         strName.Format("beijing");
if(rgn.PtInRegion(point))
{
//附注:前面省略一些,可以正确判断是否鼠标经过线上。
LOGFONT logFont;
logFont.lfHeight=40;
logFont.lfWidth=0;
logFont.lfEscapement=0;
logFont.lfOrientation=0;
logFont.lfWeight=FW_NORMAL;
logFont.lfItalic=0;
logFont.lfUnderline=0;
logFont.lfStrikeOut=0;
logFont.lfCharSet=ANSI_CHARSET;
logFont.lfOutPrecision=OUT_DEFAULT_PRECIS;
logFont.lfClipPrecision=CLIP_DEFAULT_PRECIS;
logFont.lfQuality=PROOF_QUALITY;
logFont.lfPitchAndFamily=VARIABLE_PITCH|FF_ROMAN;
strcpy(logFont.lfFaceName,"宋体"); CFont font;
font.CreateFontIndirect(&logFont);
CFont *oldFont=ClientDC.SelectObject(&font); ClientDC.SetROP2(R2_NOT);
ClientDC.TextOut(PointOld.x+20,PointOld.y+20,m_strPipeName);
ClientDC.TextOut(point.x+20,point.y+20,m_strName); PointOld=point;
ClientDC.SelectObject(&oldFont); return;

} CScrollView::OnMouseMove(nFlags, point);
}现在编译通过,可是重绘效果很差:随着鼠标移动,新的文字出现,可是旧文字消除的不彻底。尤其是,当鼠标离开线时,会有一行字仍然显示。
我看过鼠标单击、托动和放开的代码,与我的不太一样。高分求解,完成了100分送上。

解决方案 »

  1.   

    试试InvalidateRect或者用背景图片擦除原先的文字。
      

  2.   

    ClientDC.TextOut(PointOld.x+20,PointOld.y+20,m_strPipeName);
    ClientDC.TextOut(point.x+20,point.y+20,m_strName);两句中间加上类似下面的一句ClientDC。FillRect(&Rect, (HBRUSH) CBPCOLOR_WHITE);
      

  3.   

    1.使用一标记或参数,在OnDraw中绘制
    2。你的方法简化一下就是先绘制,然后擦除再重绘制,不过这种方法不好,
    视图大小变化之后就什么也没有了
      

  4.   

    可惜没这么简单。视图上有很多线段,如果使用InvalidateRect()的话容易把线擦掉一块。
    擦除效果还是不好
    而且,当鼠标离开线时,仍然会有数行文字留在那儿。算了吧,谁有当鼠标移动时,鼠标旁边有一行文字跟着移动的例子?
      

  5.   

    使用位图啊,首先创建一个位图.再创建一个兼容DC,每次重画的时候再从兼容DC中将位图画出来.
      

  6.   

    代码如下: //获得客户区的尺寸
    CRect rect;
    GetClientRect(&rect);
    if(m_RcBitmap.Height()<rect.Height() ||
    m_RcBitmap.Width() < rect.Width())
    {
    if(m_pCacheBitmap)
    delete m_pCacheBitmap;
    m_pCacheBitmap = new CBitmap;//位图的大小恰好是一个客户区域的大小
    m_pCacheBitmap->CreateCompatibleBitmap(pDC,rect.Width(),rect.Height());
    } //获得显示区域
    CSize sizeTotal;
    sizeTotal.cy = m_TextScreenHeight + 2 * m_nFontHeight;
    sizeTotal.cx = m_TextScreenWidth + 50;//在末尾留出50的空隙 //若客户区域尺寸比文件显示尺寸要大,取客户尺寸
    sizeTotal.cx = sizeTotal.cx < rect.Width() ?
    rect.Width() : sizeTotal.cx;
    sizeTotal.cy = sizeTotal.cy < rect.Height()?
    rect.Height() : sizeTotal.cy; //点击滚动条时滚动一行的长度,翻页时滚动5行的长度
    SetScrollSizes(MM_TEXT, sizeTotal,
    CSize(m_nFontHeight * 5,m_nFontHeight * 5),
    CSize(m_nFontHeight,m_nFontHeight)); //获得系统背景颜色
    COLORREF crBkgnd;
    crBkgnd =  pDC->GetBkColor();//GetSysColor(COLOR_WINDOW); //创建画刷
    CBrush brBk;
    brBk.CreateSolidBrush(crBkgnd); //创建兼容DC与位图
    CDC CacheDC;
    CacheDC.CreateCompatibleDC(pDC);
    //选择新字体
    CFont * pOldFont;
    pOldFont = CacheDC.SelectObject(m_pJpFont); CBitmap *pOldBitmap = CacheDC.SelectObject(m_pCacheBitmap);// CacheDC.SetBkMode(TRANSPARENT);
    CacheDC.SelectObject(&brBk);
    CacheDC.FillSolidRect(0,0,rect.Width(),rect.Height(),crBkgnd);
    //往兼容DC里边写入输出文本
    m_pTextFile->PrintText(&CacheDC);
    //获得当前滚动条的位置
    CPoint ScrollPos = GetScrollPosition();
    pDC->BitBlt(ScrollPos.x,ScrollPos.y,
    rect.Width(),rect.Height(),
    &CacheDC,0,0,SRCCOPY); //释放兼容DC与位图
    CacheDC.SelectObject(pOldBitmap);
    CacheDC.SelectObject(pOldFont);
    CacheDC.DeleteDC();不过要重载函数
    BOOL ::OnEraseBkgnd(CDC* pDC) 
    {
    // TODO: Add your message handler code here and/or call default

    if(m_pTextFile ->GetSize() <= 0)
    return CScrollView::OnEraseBkgnd(pDC);
    return TRUE;
    }