马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
UINT func1(LPVOID pParam) //线程函数
{
BOOL b = ::InvalidateRect(hWnd, &rect, TRUE); //使客户区矩形区域的图形变得无效
BOOL b1 = UpdateWindow(hWnd);//更新指定窗口的客户区
int t = 1;//第一个点不能画直线
short* g = (short*)pParam;
for (int i = 0; i < zong / sizeof(short); i++) {
if (t == 1) {
//移到起始点
::MoveToEx(hdc, i, *(g+i), NULL);
t = 0;
}
else {
LineTo(hdc, i, *(g + i));//绘制直线
}
}
return 0;
}
afx_msg LRESULT CMFCyinpinDlg::OnMM_WIM_DATA(WPARAM wParam, LPARAM lParam)
{
WAVEHDR* pWaveHdr = (WAVEHDR*)lParam;
memcpy(g_samples, pWaveHdr->lpData, pWaveHdr->dwBytesRecorded);//复制音频数据
zong = pWaveHdr->dwBytesRecorded;
CWinThread* pp = AfxBeginThread(func1, (short*)(g_samples), 0, 0, 0, NULL);//创建工作线程
waveInAddBuffer(hWaveIn, pWaveHdr, sizeof(WAVEHDR)); // 继续录制下一段音频数据
return 0;
}
我的问题:在OnMM_WIM_DATA消息函数中获得麦克风音频 数据 后,创建线程绘出波形图
每次需要清除重新绘制,
可是BOOL b = ::InvalidateRect(hWnd, &rect, TRUE); //使客户区矩形区域的图形变得无效
BOOL b1 = UpdateWindow(hWnd);//更新指定窗口的客户区
这两条 指令无效,没有清除原图像 ??
问题原因是在OnMM_WIM_DATA消息函数中,调用InvalidateRect和UpdateWindow函数无法清除原图像。这是因为这两个函数是用于窗口重绘的,而不是用于清除图像的。
要清除原图像,可以使用FillRect函数填充矩形区域。以下是修改后的代码:
afx_msg LRESULT CMFCyinpinDlg::OnMM_WIM_DATA(WPARAM wParam, LPARAM lParam)
{
WAVEHDR* pWaveHdr = (WAVEHDR*)lParam;
memcpy(g_samples, pWaveHdr->lpData, pWaveHdr->dwBytesRecorded); //复制音频数据
zong = pWaveHdr->dwBytesRecorded;
// 清除原图像
RECT clientRect;
GetClientRect(&clientRect);
HDC hdc = GetDC();
FillRect(hdc, &clientRect, (HBRUSH)GetStockObject(WHITE_BRUSH));
ReleaseDC(hdc);
CWinThread* pp = AfxBeginThread(func1, (short*)(g_samples), 0, 0, 0, NULL); //创建工作线程
waveInAddBuffer(hWaveIn, pWaveHdr, sizeof(WAVEHDR)); // 继续录制下一段音频数据
return 0;
}
在该代码中,首先通过GetClientRect函数获取客户区的矩形区域,然后使用GetDC函数获取设备上下文句柄,接着使用FillRect函数填充矩形区域为白色,最后使用ReleaseDC函数释放设备上下文句柄。
这样就能够清除原图像并重新绘制波形图了。
|