在SDI的定时器画图,画直线给出的参数和实际绘出的图形有很大的出入?(希望用过MSCom控件的大侠多多留意)
把来自串口的字符串分解转换为一系列整数之后存在链表中。
把这些数据绘成曲线在兼容内存位图中,再把位图拷贝的显示设备上。
我调试发现直线的参数就是给出的参数,但是实际绘出的图形和我想要的有很大的出入,根本就不对,不知问题出在那里?
问题点数:50、回复次数:3Top
1 楼huwei001982(凶猛的小狗)回复于 2004-09-04 09:52:39 得分 50
代码贴一些出来!
有可能是映射模式的问题!Top
2 楼piperliu(阿流)回复于 2004-09-04 19:42:19 得分 0
从串口获取字符串:
void CMainView::OnComm()
{
VARIANT vResponse;
char *str;
char *str1;
int k, nEvent, i;
nEvent = m_MSComm.GetCommEvent();
switch(nEvent)
{
case 2: //收到大于RTHresshold个字符
{
k = m_MSComm.GetInBufferCount(); //接收到的字符数目
if(k > 0)
{
vResponse=m_MSComm.GetInput(); //read
//对数据进行其他处理
str = (char*)(unsigned char*) vResponse.parray->pvData;
}
//接收到字符,MSComm控件发送
//清除字符串中的不必要字符
i = 0;
str1 = str;
while( i < k )
{
i++;
str1++;
}
*str1 = '\0';
StringToInt( str );//分解字符串并转换为整数
}
break;
case 3: //CTS线状态发生了变化
break;
case 4: //DSR线状态发生了变化
break;
case 5: //CD线状态发生了变化
break;
case 6: //Ring Indicator发生变化
break;
}
}
分解字符串并转换为整数:
void CMainView::StringToInt( char a[120] )
{
char *tokenPtr;
tokenPtr = strtok( a, " ");
for( int i = 0; tokenPtr != NULL; i++ )
{
//MediumTemp.TempVel[i] = ( int )fabs( atoi( tokenPtr ) );
if( TempList[ i ].GetCount() <= PointNum )
{
TempList[ i ].AddTail( ( int )fabs( atoi( tokenPtr ) ) );
}
tokenPtr = strtok(NULL, " ");
}
//数据存完毕之后才开始绘图,防止同时访问链表
BeginDrawGraph = TRUE;
}
//定时器中绘图:
CDC* pDC = GetDC();
CPen pen, *pOldPen;
pen.CreatePen( PS_SOLID, Linewidth, color );
pOldPen = m_pdcMem->SelectObject( &pen );
CBitmap* pOldBitmap;
pOldBitmap = m_pdcMem->SelectObject( m_pBitmap );
for( int j = 1; j <= AreaNum; j++ )
{
if( j % 2 == 0 )
NewX = OffSet + DrawAreaX/2 + 10*TempList[ j-1 ].GetCount();
else
NewX = OffSet+10*TempList[ j-1 ].GetCount();
NewY = 125+DrawAreaY/6*((j-1)/2)-(int)TempList[ j-1 ].GetTail( );
m_pdcMem->MoveTo( OldX[j-1], OldY[j-1] );
m_pdcMem->LineTo( NewX, NewY );
OldX[j-1] = NewX;
OldY[j-1] = NewY;
}
m_pdcMem->SelectObject( pOldPen );
m_pdcMem->SelectObject( pOldBitmap );
ReleaseDC( pDC );Top
3 楼piperliu(阿流)回复于 2004-09-04 19:45:34 得分 0
应该与映射模式没有关系。
我用rand随机数模拟过了,可以Top




