在DrawItem中设置按钮的圆角有关问题
在DrawItem中设置按钮的圆角问题
一个派生于CButton的类,重载了OnMouseLeave、OnMouseHover、OnMouseMove等函数
为什么这个圆角效果只在鼠标第一次放到按钮上才有,第二次过去就没了?
还有,,如果我把CreateRoundRectRgn、SetWindowRgn放在DrawItem函数刚开始取得按钮rcItem后,却丝毫没有效果?
而且,创建按钮时设置圆角也没效果??
求解答
------解决方案--------------------
void MyButton::DrawItem(LPDRAWITEMSTRUCT lpDS)
{
CDC dc;
dc.Attach(lpDS->hDC);
CString text;
this->GetWindowText(text);
if(lpDS->itemState & ODS_SELECTED)
color = RGB(255,1,1);
else if(lpDS->itemState & ODS_FOCUS)
color = RGB(1,255,1);
else if(m_hover)
color = RGB(188,50,99);
else
color = RGB(100,100,255);
//
RECT rect = lpDS->rcItem;
CRgn rgn;
rgn.CreateRectRgn(rect.left,rect.top,rect.right,rect.bottom);
int ret=::GetWindowRgn(lpDS->hwndItem,rgn);
dc.SelectClipRgn(&rgn);
dc.FillRect(&rect,&CBrush(color));
DeleteObject(rgn);
SetBkMode(lpDS->hDC,TRANSPARENT);
HFONT oldFont=(HFONT)dc.SelectObject(m_font);
::DrawText(lpDS->hDC,text,text.GetLength(),&(lpDS->rcItem),DT_CENTER
------解决方案--------------------
DT_VCENTER
------解决方案--------------------
DT_SINGLELINE);
dc.SelectObject(oldFont);
dc.Detach();
}
void MyButton::OnMouseMove(UINT nFlags, CPoint point)
{
if(!m_tracking)
{
TRACKMOUSEEVENT tme;
tme.cbSize = sizeof(tme);
tme.dwFlags = TME_HOVER
------解决方案--------------------
TME_LEAVE;
tme.dwHoverTime =1;
tme.hwndTrack = m_hWnd;
m_tracking = _TrackMouseEvent(&tme);
}
//
if(MK_LBUTTON==nFlags)
{
CRect rc;
GetClientRect(&rc);
MapWindowPoints(GetParent(),&rc);
MapWindowPoints(GetParent(),&point,1);
MoveWindow(point.x-m_MouseLast.x, point.y-m_MouseLast.y, rc.Width(), rc.Height());
}
// CButton::OnMouseMove(nFlags, point);
}
LRESULT MyButton::OnMouseLeave(WPARAM wParam, LPARAM lParam)
{
//afxDump << "leave\n" ;
m_tracking = FALSE;
m_hover = false;
Invalidate();
return 0;
}
//
LRESULT MyButton::OnMouseHover(WPARAM wParam, LPARAM lParam)
{
//afxDump << "hover\n" ;
m_hover = true;
Invalidate();
m_tracking = FALSE;
return 0;
}
//
BOOL MyButton::OnEraseBkgnd(CDC* pDC)
{
return TRUE;
// return CButton::OnEraseBkgnd(pDC);
}
void MyButton::OnLButtonDown(UINT nFlags, CPoint point)
{
// transform left-top to point
CRect rc;
GetClientRect(&rc);
MapWindowPoints(GetParent(),&rc);
MapWindowPoints(GetParent(),&point,1);
m_MouseLast.x=point.x-rc.left;
m_MouseLast.y=point.y-rc.top;
// afxDump << m_MouseLast << "\n";
//
CButton::OnLButtonDown(nFlags, point);
}
初始化:
// MyButton *pBn[30];
// int m_iBn;
void CxxxxDlg::OnBnClickedMyButton()
{
m_iBn++;// from -1
if(m_iBn >BUTTONS_MAX-1) //30
{
m_iBn--;
AfxMessageBox("Maximun arrived !");
return ;
}
pBn[m_iBn] = new MyButton;
TCHAR ca[3];// '30'
_itoa(m_iBn,ca,10);
RECT rect;
rect.top = BUTTONS_PER_ROW * (m_iBn/BUTTONS_PER_ROW+1) + m_iBn/BUTTONS_PER_ROW*CIRCLE_DIA;
rect.left=(m_iBn%BUTTONS_PER_ROW)*CIRCLE_DIA;
rect.bottom = rect.top+60;
rect.right = rect.left+CIRCLE_DIA;
pBn[m_iBn]->Create(ca,WS_CHILD
------解决方案--------------------
WS_VISIBLE
------解决方案--------------------
WS_TABSTOP
------解决方案--------------------
BS_PUSHBUTTON
------解决方案--------------------
BS_OWNERDRAW,
rect,this,WM_USER+m_iBn);
一个派生于CButton的类,重载了OnMouseLeave、OnMouseHover、OnMouseMove等函数
void CBmpButton::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)
{
//此处略去N行代码
if(bIsDisabled)
pDC->SetTextColor(RGB(128,128,128));
else if(m_bIsHovering)//Hover生效
{
HRGN hRgnRct;
hRgnRct = CreateRoundRectRgn(0,0,rcItem.right-rcItem.left,rcItem.bottom-rcItem.top,5,5);
SetWindowRgn(hRgnRct,TRUE);
pDC->FillSolidRect(&rcItem,RGB(255,255,255));
pDC->SetTextColor(RGB(0,0,0));
}
}
为什么这个圆角效果只在鼠标第一次放到按钮上才有,第二次过去就没了?
还有,,如果我把CreateRoundRectRgn、SetWindowRgn放在DrawItem函数刚开始取得按钮rcItem后,却丝毫没有效果?
而且,创建按钮时设置圆角也没效果??
if(bShow)pBtn->ShowWindow(SW_SHOW);
HRGN hRgnRct;
hRgnRct = CreateRoundRectRgn(0,0,60,70,5,5);
pBtn->SetWindowRgn(hRgnRct,TRUE);
求解答
DrawItemSetWindowRgn
鼠标
------解决方案--------------------
void MyButton::DrawItem(LPDRAWITEMSTRUCT lpDS)
{
CDC dc;
dc.Attach(lpDS->hDC);
CString text;
this->GetWindowText(text);
if(lpDS->itemState & ODS_SELECTED)
color = RGB(255,1,1);
else if(lpDS->itemState & ODS_FOCUS)
color = RGB(1,255,1);
else if(m_hover)
color = RGB(188,50,99);
else
color = RGB(100,100,255);
//
RECT rect = lpDS->rcItem;
CRgn rgn;
rgn.CreateRectRgn(rect.left,rect.top,rect.right,rect.bottom);
int ret=::GetWindowRgn(lpDS->hwndItem,rgn);
dc.SelectClipRgn(&rgn);
dc.FillRect(&rect,&CBrush(color));
DeleteObject(rgn);
SetBkMode(lpDS->hDC,TRANSPARENT);
HFONT oldFont=(HFONT)dc.SelectObject(m_font);
::DrawText(lpDS->hDC,text,text.GetLength(),&(lpDS->rcItem),DT_CENTER
------解决方案--------------------
DT_VCENTER
------解决方案--------------------
DT_SINGLELINE);
dc.SelectObject(oldFont);
dc.Detach();
}
void MyButton::OnMouseMove(UINT nFlags, CPoint point)
{
if(!m_tracking)
{
TRACKMOUSEEVENT tme;
tme.cbSize = sizeof(tme);
tme.dwFlags = TME_HOVER
------解决方案--------------------
TME_LEAVE;
tme.dwHoverTime =1;
tme.hwndTrack = m_hWnd;
m_tracking = _TrackMouseEvent(&tme);
}
//
if(MK_LBUTTON==nFlags)
{
CRect rc;
GetClientRect(&rc);
MapWindowPoints(GetParent(),&rc);
MapWindowPoints(GetParent(),&point,1);
MoveWindow(point.x-m_MouseLast.x, point.y-m_MouseLast.y, rc.Width(), rc.Height());
}
// CButton::OnMouseMove(nFlags, point);
}
LRESULT MyButton::OnMouseLeave(WPARAM wParam, LPARAM lParam)
{
//afxDump << "leave\n" ;
m_tracking = FALSE;
m_hover = false;
Invalidate();
return 0;
}
//
LRESULT MyButton::OnMouseHover(WPARAM wParam, LPARAM lParam)
{
//afxDump << "hover\n" ;
m_hover = true;
Invalidate();
m_tracking = FALSE;
return 0;
}
//
BOOL MyButton::OnEraseBkgnd(CDC* pDC)
{
return TRUE;
// return CButton::OnEraseBkgnd(pDC);
}
void MyButton::OnLButtonDown(UINT nFlags, CPoint point)
{
// transform left-top to point
CRect rc;
GetClientRect(&rc);
MapWindowPoints(GetParent(),&rc);
MapWindowPoints(GetParent(),&point,1);
m_MouseLast.x=point.x-rc.left;
m_MouseLast.y=point.y-rc.top;
// afxDump << m_MouseLast << "\n";
//
CButton::OnLButtonDown(nFlags, point);
}
初始化:
// MyButton *pBn[30];
// int m_iBn;
void CxxxxDlg::OnBnClickedMyButton()
{
m_iBn++;// from -1
if(m_iBn >BUTTONS_MAX-1) //30
{
m_iBn--;
AfxMessageBox("Maximun arrived !");
return ;
}
pBn[m_iBn] = new MyButton;
TCHAR ca[3];// '30'
_itoa(m_iBn,ca,10);
RECT rect;
rect.top = BUTTONS_PER_ROW * (m_iBn/BUTTONS_PER_ROW+1) + m_iBn/BUTTONS_PER_ROW*CIRCLE_DIA;
rect.left=(m_iBn%BUTTONS_PER_ROW)*CIRCLE_DIA;
rect.bottom = rect.top+60;
rect.right = rect.left+CIRCLE_DIA;
pBn[m_iBn]->Create(ca,WS_CHILD
------解决方案--------------------
WS_VISIBLE
------解决方案--------------------
WS_TABSTOP
------解决方案--------------------
BS_PUSHBUTTON
------解决方案--------------------
BS_OWNERDRAW,
rect,this,WM_USER+m_iBn);