// 核心介面 (匯出)
class __declspec(dllexport) COscilloscopeCtrl : public CWnd {
public:
void SetChannelCount(int n);
void SetSampleRate(double rate);
void AddData(int ch, const double* samples, int count);
void SetDisplayMode(Mode mode); // Wave / Bar
void SetTimeBase(double secPerDiv);
void SetVoltageScale(double voltPerDiv);
bool SaveToFile(LPCTSTR path);
bool LoadFromFile(LPCTSTR path);
protected:
afx_msg void OnPaint(); // 雙緩衝繪製
afx_msg void OnMouseMove(...); // 拖曳調整刻度
afx_msg void OnLButtonDown/Up();
DECLARE_MESSAGE_MAP()
};
CMemDC 避免閃爍,OnPaint 中繪製網格、波形、游標。std::vector> 或環形緩衝區存儲各通道波形。OnLButtonDown 記錄起始點,OnMouseMove 計算位移 → 更新時基/電壓刻度 → Invalidate() 重繪。CArchive 或自定義二進制格式存檔,含版本號、通道數、採樣率、原始資料。CWaveFormCtrl、COscilloscope、ChartCtrl (通用圖表控件可改造)// OscilloscopeCtrl.h
#ifdef OSCILLOSCOPE_EXPORTS
#define OSC_API __declspec(dllexport)
#else
#define OSC_API __declspec(dllimport)
#endif
class OSC_API COscilloscopeCtrl : public CWnd { ... };
專案屬性 → C/C++ → Preprocessor → OSCILLOSCOPE_EXPORTS。
// MFC 對話框專案
COscilloscopeCtrl m_scope;
BOOL OnInitDialog() {
m_scope.SubclassDlgItem(IDC_OSC_PLACEHOLDER, this);
m_scope.SetChannelCount(4);
m_scope.SetTimeBase(0.001); // 1ms/div
m_scope.SetVoltageScale(1.0); // 1V/div
// 模擬資料
std::vector sine(1024);
for (int i=0;i<1024;i++) sine[i]=sin(i*0.1);
m_scope.AddData(0, sine.data(), 1024);
return TRUE;
}