綜合前八課知識,本課實作完整的即時數據顯示系統。模擬場景:儀器每 200ms 輸出兩組溫度——環境溫度(恆定)與加熱溫度(週期性變化)。
依第八課方法建立 Lesson09,新增選單資源:
ID_REALTIME_STARTID_REALTIME_STOPstatic CChart chart; static unsigned int nCount; // 數據計數器 static bool bRun; // 定時器狀態 static int nTimer; // 定時器 ID
case WM_CREATE:
chart.SetType(kTypeXY);
chart.SetUseLegend(true);
chart.SetAxisTitle(_T("時間(分)"), 1);
chart.SetAxisTitle(_T("溫度(度)"), 0);
chart.SetTitle(_T("烘箱溫度變化圖"));
nCount = 0; bRun = false; nTimer = 0;
srand((unsigned)time(NULL));
break;
case WM_TIMER:
if (bRun) {
double Pi = 3.1415926536;
double x = nCount / 10.0;
double y1 = 20.0 * sin(2.0 * Pi / 400.0 * nCount) + 40.0 + (2.0 * rand() / RAND_MAX - 1.0);
double y2 = 20.0 + (2.0 * rand() / RAND_MAX - 1.0) / 2.0;
nCount++;
if (nCount == 1) {
double pX[1] = {x}, pY[1] = {y1};
chart.AddCurve(pX, pY, 1);
pY[0] = y2;
chart.AddCurve(pX, pY, 1);
chart.SetDataTitle(_T("加熱溫度"), 0);
chart.SetDataTitle(_T("環境溫度"), 1);
break;
}
chart.AddPoint2D(x, y1, 0);
chart.AddPoint2D(x, y2, 1);
RECT rt; GetClientRect(hWnd, &rt);
InvalidateRect(hWnd, &rt, TRUE);
}
break;
case ID_REALTIME_START:
nTimer = SetTimer(hWnd, 1, 200, 0);
bRun = true;
break;
case ID_REALTIME_STOP:
if (nTimer > 0) { KillTimer(hWnd, nTimer); nTimer = 0; }
bRun = false;
break;
case WM_ERASEBKGND: return 0;
編譯執行,點選「開始」即見即時曲線:
本課整合定時器、隨機數模擬、動態加點等技術,為儀表監控類應用奠定基礎。