是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分送上。
现在对鼠标的响应部分,判断是否过线已经完成,可是显示字时出现的重绘问题让我一筹莫展。
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分送上。
ClientDC.TextOut(point.x+20,point.y+20,m_strName);两句中间加上类似下面的一句ClientDC。FillRect(&Rect, (HBRUSH) CBPCOLOR_WHITE);
2。你的方法简化一下就是先绘制,然后擦除再重绘制,不过这种方法不好,
视图大小变化之后就什么也没有了
擦除效果还是不好
而且,当鼠标离开线时,仍然会有数行文字留在那儿。算了吧,谁有当鼠标移动时,鼠标旁边有一行文字跟着移动的例子?
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;
}