上午已经发帖,经过更改,发现以下问题,现重新发帖:请大家耐心看完,不胜感激!!!!问题:我用CEdit显示文本,希望做到这样的效果:鼠标滑过加下划线,鼠标离开后把下划线取消。代码如下:(CHyperLinkEdit的基类为CEdit)HBRUSH CHyperLinkEdit::CtlColor(CDC* pDC, UINT nCtlColor) 
{
// TODO: Change any attributes of the DC here
    if (m_bOverControl)
{
        pDC->SetTextColor(m_crHoverColour);
}
    else
{
        pDC->SetTextColor(m_crLinkColour);
}
    // transparent text.
    pDC->SetBkMode(TRANSPARENT);
    return (HBRUSH)GetStockObject(NULL_BRUSH);
}
void CHyperLinkEdit::OnMouseMove(UINT nFlags, CPoint point) 
{
// TODO: Add your message handler code here and/or call default

CEdit::OnMouseMove(nFlags, point);
if (bMouseTrack)    //若允许追踪,则。
{
      TRACKMOUSEEVENT csTME;
      csTME.cbSize = sizeof(csTME);
      csTME.dwFlags = TME_LEAVE|TME_HOVER;
      csTME.hwndTrack = m_hWnd;//指定要追踪的窗口
      csTME.dwHoverTime = 10;  //鼠标在按钮上停留超过10ms,才认为状态为HOVER
      ::_TrackMouseEvent(&csTME); //开启Windows的WM_MOUSELEAVE,WM_MOUSEHOVER事件支持
      bMouseTrack=FALSE;   //若已经追踪,则停止追踪
}
}void CHyperLinkEdit::SetUnderline(BOOL bUnderline)
{
    m_bUnderline = bUnderline;
    if (::IsWindow(GetSafeHwnd()))
    {
        LOGFONT lf;
        GetFont()->GetLogFont(&lf);        lf.lfUnderline = m_bUnderline;
        m_Font.DeleteObject();
        BOOL B=m_Font.CreateFontIndirect(&lf);
SetFont(&m_Font,FALSE);
SetWindowText("news.sina.com.cn");
    }
}LRESULT CHyperLinkEdit::OnMouseLeave(WPARAM, LPARAM)
{
m_bOverControl = FALSE;
m_bUnderline=FALSE;    
SetUnderline(m_bUnderline);
bMouseTrack=TRUE;
return 0;
}LRESULT CHyperLinkEdit::OnMouseHover(WPARAM, LPARAM)
{
m_bOverControl = TRUE;
m_bUnderline=TRUE;
SetUnderline(m_bUnderline);
bMouseTrack=TRUE;
return 0;
}问题是:我加入下划线后,下划线就取消不了了。

经过多次更改发现:去掉pDC->SetBkMode(TRANSPARENT);下划线问题可以解决,但是编辑框变成不透明.
请问为什么?当我加入后BOOL CHyperLinkEdit::OnEraseBkgnd(CDC* pDC) 
{
CDC MemDC; 
    //CBitmap对象
    CBitmap Bitmap,*pOldBitmap; 
    //BITMAP句柄
    BITMAP bm; 
    //加载位图
    Bitmap.LoadBitmap(IDB_BITMAP1); 
    //将位图资源与句柄绑定
    Bitmap.GetObject(sizeof(BITMAP),&bm); 
    //创建与内存兼容的DC
    MemDC.CreateCompatibleDC(pDC); 
    //替换原位图
    pOldBitmap=(CBitmap*)(MemDC.SelectObject(&Bitmap)); 
    //获取绘制的区域
    CRect rcClient;
    GetClientRect(&rcClient); 
    //绘制到客户区
    pDC->BitBlt(0,0,rcClient.Width(),rcClient.Height(),&MemDC,0,0,SRCCOPY);
    MemDC.SelectObject(pOldBitmap);
    MemDC.DeleteDC(); 
    return TRUE; 
}
下划线问题也可以解决,为什么?

解决方案 »

  1.   

    有pDC->SetBkMode(TRANSPARENT)的话需要重绘CHyperLinkEdit控件下面的视图窗口才能把下划线去掉,我上午不是建议你把CHyperLinkEdit窗口下面的视图类也重绘一下吗?你试一下吧,我也遇到过这个问题,我个人认为透明情况下,下划线会留在CHyperLinkEdit控件下面的视图窗口上,当SetFont后CHyperLinkEdit控件自己会重绘,但视图窗口仍有下划线,就导致下划线取消不了
    如果没有pDC->SetBkMode(TRANSPARENT),CHyperLinkEdit控件不透明,当SetFont后它自己会重绘,下划线就没有了
      

  2.   

    你GetLogFont得到的字体,只改了lfUnderline,应该是对的你试试memset把lf都清了,看看什么效果
      

  3.   


    我大致明白你的意思了,但是“重绘CHyperLinkEdit控件下面的视图窗口”,这个是什么意思?
      

  4.   


    我的OnEraseBkgnd(CDC* pDC) 是完成了重绘功能,所以下划线被取消是吗
    如果不用
    OnEraseBkgnd(CDC* pDC) ,有没有其他的重绘方法
      

  5.   

    CHyperLinkEdit只是一个控件,他应该是在一个单/多文档的视图上面,或者是依托在一个对话框上,所以它下面应该还有一个窗口吧,你把这个窗口重绘一下试试
      

  6.   


    是要重载CDialog的OnPAINT吧
      

  7.   

    下面是我的代码,m_pActiveText相当于一个CEdit类对象,COutPutView就是控件CEdit下面的视图,即父窗口void COutPutView::OnEditFont() 
    {
    // TODO: Add your command handler code here
    LOGFONT  lfT;
    ASSERT(m_pActiveText->GetFont()->m_hObject);
    m_pActiveText->GetFont()->GetLogFont(&lfT);
    CFontDialog dlg(&lfT);
    dlg.m_cf.rgbColors = m_pActiveText->GetTextColor();
    LOGFONT lf;
    if(dlg.DoModal()==IDOK)
    {
    CFont font;
    dlg.GetCurrentFont(&lf);
    if(font.m_hObject)
    {
    font.DeleteObject();
    font.CreateFontIndirect(&lf);
    }
    else
    font.CreateFontIndirect(&lf);
    if (m_pActiveText->IsEdited())
    {
    if(m_pActiveText->m_hWnd)
    {
    m_pActiveText->SetFont(&font);
    }
    m_pActiveText->SetTextColor(dlg.GetColor());
    }
    }
    InvalidateRect(m_pActiveText->GetRect());
    }如果最后不重绘父窗口,结果就和你所的一样
      

  8.   

    已经试了,不行。
    在SetUnderline函数里给父窗口发消息:::SendMessage(GetParent()->m_hWnd,WM_REPAINT,NULL,NULL);在父窗口里响应消息并作以下处理:CRect rc;
    m_ctrlEdit.GetRect(&rc);
    InvalidateRect(&rc,TRUE);无效。其中m_ctrlEdit就是编辑框控件。
      

  9.   

    我现在使用CEdit的OnEraseBkgnd,在这个函数里贴图(和对话框背景一样的图片)来解决这个问题。有没有更好的办法。各位高手明示啊。