|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
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函数释放设备上下文句柄。
这样就能够清除原图像并重新绘制波形图了。
|
|