1、屏蔽烦人的4996警告,世界瞬间清静了
#pragma warning(disable:4996)
2、双缓存避免画面闪烁
void CEscapeBallDlg::BlueBallMove()
{
CDC cDc; //首显示设备对象
CBitmap cBitmap; //位图对象
//建立与屏幕显示兼容的内存显示设备
cDc.CreateCompatibleDC(NULL);
//建立一个与屏幕显示兼容的位图
cBitmap.CreateCompatibleBitmap(m_cDc, m_MaxX, m_MaxY);
//将位图选入到内存显示设备中
cDc.SelectObject(&cBitmap);
//设置背景色
cDc.FillSolidRect(0, 0, m_MaxX, m_MaxY, WRITE);
for (int i = 1; i < m_vBallInfo.size(); i++)
{
if (CheckBounder(m_vBallInfo[i]))
ComputeForward(m_vBallInfo[i], m_cBall);
int x = m_vBallInfo[i]->pos_x;
int y = m_vBallInfo[i]->pos_y;
m_vBallInfo[i]->pos_x += m_vBallInfo[i]->offset_x;
m_vBallInfo[i]->pos_y += m_vBallInfo[i]->offset_y;
//绘制移动后的篮球
DrawBall(m_vBallInfo[i]->pos_x, m_vBallInfo[i]->pos_y
, m_vBallInfo[i]->radius, m_vBallInfo[i]->color, &cDc);
}
DrawBall(m_cBall->pos_x, m_cBall->pos_y
, m_cBall->radius, m_cBall->color, &cDc);
//将内存中的图拷贝到屏幕上进行显示
m_cDc->BitBlt(0, 0, m_MaxX, m_MaxY, &cDc, 0, 0, SRCCOPY);
//绘图完成后的清理
cBitmap.DeleteObject();
cDc.DeleteDC();
}
3、协议大小端数据传输协议
void CDrawLineDlg::GetDataFromProtocal(_DRAW_DATA frame, unsigned int bit_start, unsigned int bit_off, int big_endian, unsigned int &data)
{
unsigned int remain, x, y, y1, tmp0, tmp1;
unsigned int bit_x, bit_y, bit_end;
if(big_endian)
{
bit_x = (16*(bit_start/8))+7-bit_start;
bit_y = bit_x - (bit_off-1);
bit_start = bit_y;
bit_end = bit_x;
}
else
{
bit_end = bit_start + bit_off - 1;
}
x = bit_start/8;
y = bit_start%8;
y1 = bit_end%8;
if(bit_start+(7-y) < bit_end)
{
if(big_endian)
{
tmp0 = ((frame.data[x] << y) &0xFF) >> y;
tmp1 = frame.data[x+1] >> (7-y1);
data = (tmp0<<(y1+1)) + tmp1;
}
else
{
tmp0 = ((frame.data[x] >> y)&0xFF);
tmp1 = frame.data[x+1] & ((2<<y1)-1);
data = tmp0 + (tmp1<<(8-y));
}
}
else
{
data = ((frame.data[x]<<(7-y1))&0xFF) >>(y+7-y1);
}
}