本程序是通过画刷在界面上画出按钮框,然后捕获左击事件,根据其坐标来判断点击的是哪一个按钮。
void CWinceSendDlg::DrawCZButton(int number,int color,CString name)
{CRect rct;
CBrush m_FillActive;
CBrush* pOldBrush;
CDC *pDC=GetDC();
int num_row=(number-1)/column+1;
int num_column=(number-1)%column+1;
rct.left=start_x+(num_column-1)*(btn_width+space_x);
rct.top=start_y+(num_row-1)*(btn_height+space_y);
rct.right=btn_width+start_x+(num_column-1)*(btn_width+space_x);
rct.bottom=btn_height+start_y+(num_row-1)*(btn_height+space_y);
//画边框
CPen m_BoundryPen;
CPen* hOldPen;
m_BoundryPen.CreatePen(PS_SOLID, 1, RGB(0, 0, 255));
POINT pt ;
pt.x = 5;
pt.y = 5;
hOldPen = pDC->SelectObject(&m_BoundryPen);
pDC->RoundRect(&rct, pt);
pDC->SelectObject(hOldPen);
rct.DeflateRect(CSize(GetSystemMetrics(SM_CXEDGE), GetSystemMetrics(SM_CYEDGE)));
m_BoundryPen.DeleteObject();
填充矩形
pOldBrush = pDC->SelectObject(&m_FillActive);
if(color==1)//还原
{
CBrush br;
//CRect rect;
//int nWidth = rct.Width();
//int nHeight = rct.Height();
br.CreateSolidBrush(RGB(95, 115, 150));
//rect.SetRect(rct.left, rct.top, nWidth + 2, nHeight + 1);
pDC->FillRect(&rct, &br);
br.DeleteObject();
}
else
{
CBrush brBk[128];
int nWidth = rct.right-rct.left;
int nHeight = rct.bottom-rct.top;
int i;
CRect rect;
if(color==2)
{
for (i = 0; i < 128; i ++)
{
brBk[i].CreateSolidBrush(RGB(95 - (i / 2), 115 - (i / 3), 150 - (i / 4)));
}
}
else
{
for (i = 0; i < 128; i ++)
{
brBk[i].CreateSolidBrush(RGB(254 - (i / 3), 85 - (i / 3), 105 - (i / 4)));
}
}
for (i = rct.top; i < rct.bottom; i ++)
{
rect.SetRect(rct.left, i, rct.right, i+1);
pDC->FillRect(&rect, &brBk[(i-rct.top)*127/nHeight]);
}
for ( i = 0; i < 128; i ++)
brBk[i].DeleteObject();
}
pDC->SelectObject(pOldBrush);
m_FillActive.DeleteObject();
显示按钮的文本
CFont* hFont = GetFont();
CFont* hOldFont = pDC->SelectObject(hFont);
rct.OffsetRect((rct.Width() - rct.Width())/2, rct.Height() - rct.Height()/2);
int nMode = pDC->SetBkMode(TRANSPARENT);
rct.OffsetRect(1, -5);
pDC->SetTextColor(::GetSysColor(COLOR_3DSHADOW));
pDC->DrawText(name, -1, rct, DT_WORDBREAK | DT_CENTER);
rct.OffsetRect(-1, -1);
pDC->SetTextColor(::GetSysColor(COLOR_3DHILIGHT));
pDC->DrawText(name, -1, rct, DT_WORDBREAK | DT_CENTER);
pDC->SelectObject(hOldFont);
pDC->SetBkMode(nMode);
ReleaseDC(pDC);
//UpdateWindow();
}
void CWinceSendDlg::ClearArea(int x, int y)
{
CBrush cBrush(RGB(225,232,243));
RECT rect;
CDC* pDC = GetDC();
rect.left=x;
rect.top=y;
rect.right=x+460;
rect.bottom=y+300;
pDC->FillRect(&rect,&cBrush);
ReleaseDC(pDC);
}
void CWinceSendDlg::OnLButtonDown(UINT nFlags, CPoint point) //识别点击按钮
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
if(nFlags == MK_LBUTTON)
{
if(button_status == true)
{
for(int i=0;i<row;i++)
{
for(int j=0;j<column;j++)
{
if((point.x>=start_x+j*(space_x+btn_width))&&(point.x<=start_x+j*(space_x+btn_width)+btn_width)&&(point.y>=start_y+i*(btn_height+space_y))&&(point.y<=start_y+i*(btn_height+space_y)+btn_height))
{
//printf("%d %d\n",row,column);
station_number = i*column+j+1;
DrawCZButton(station_number,0,m_strZH[station_number]);
OnButton(station_number);
button_status = false;
}
}
}
}
}
__super::OnLButtonDown(nFlags, point);
}