上午已经发帖,经过更改,发现以下问题,现重新发帖:请大家耐心看完,不胜感激!!!!问题:我用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;
}
下划线问题也可以解决,为什么?
{
// 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;
}
下划线问题也可以解决,为什么?
如果没有pDC->SetBkMode(TRANSPARENT),CHyperLinkEdit控件不透明,当SetFont后它自己会重绘,下划线就没有了
我大致明白你的意思了,但是“重绘CHyperLinkEdit控件下面的视图窗口”,这个是什么意思?
我的OnEraseBkgnd(CDC* pDC) 是完成了重绘功能,所以下划线被取消是吗
如果不用
OnEraseBkgnd(CDC* pDC) ,有没有其他的重绘方法
是要重载CDialog的OnPAINT吧
{
// 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());
}如果最后不重绘父窗口,结果就和你所的一样
在SetUnderline函数里给父窗口发消息:::SendMessage(GetParent()->m_hWnd,WM_REPAINT,NULL,NULL);在父窗口里响应消息并作以下处理:CRect rc;
m_ctrlEdit.GetRect(&rc);
InvalidateRect(&rc,TRUE);无效。其中m_ctrlEdit就是编辑框控件。