没有图形显示
// ************定义全局变量*************
#define NUM_SAMPLES 1024
HWAVEIN hWaveIn;
WAVEFORMATEX waveform;
short g_samples;
//位深=16,每个采样点两个字节
WAVEHDR waveHeader;
int zong = 0;
CWnd* pWnd;//picture控件句柄
HWND hWnd;
HDC hdc;
HDC hdcmen;//内存DC
HPEN hpen;
HPEN oldhpen;
RECT rect;
HBRUSH hbr;
HBRUSH oldhbr;
HANDLE mutex;//互斥锁句柄
int beisu ;//纵向缩小倍数
int beisu1;//横向放大倍数倍数
int nReturn;
WAVEINCAPS* pwic;
int suoyin = 0;//麦克风ID
int width = 0, height = 0;
CRect rectPicture;//picture控件客户区坐标
// TODO: 在此添加额外的初始化代码
// 设置音频格式
waveform.wFormatTag = WAVE_FORMAT_PCM;
waveform.nChannels = 1; // 声道数
waveform.nSamplesPerSec = 44100; // 采样频率
waveform.wBitsPerSample = 16; // 位深
waveform.nBlockAlign = waveform.nChannels * (waveform.wBitsPerSample / 8);
waveform.nAvgBytesPerSec = waveform.nSamplesPerSec * waveform.nBlockAlign;
waveform.cbSize = 0;
//创建并准备缓冲区
waveHeader.lpData = (LPSTR)g_samples;
waveHeader.dwBufferLength = NUM_SAMPLES * sizeof(short);
waveHeader.dwBytesRecorded = 0;
waveHeader.dwUser = 0;
waveHeader.dwFlags = 0;
waveHeader.dwLoops = 0;
pWnd = GetDlgItem(IDC_SOUND);//获取picture控件句柄
hWnd = ::GetDlgItem(GetSafeHwnd(), IDC_SOUND);
hdc = ::GetDC(hWnd);
hdcmen = ::CreateCompatibleDC(hdc);//内存DC
hpen = CreatePen(PS_SOLID, 2, RGB(0, 0, 255));//创建画笔
oldhpen= (HPEN)SelectObject(hdcmen, hpen);
::GetClientRect(hWnd, &rect);//获取picture控件客户区的坐标
hbr = CreateSolidBrush(RGB(255, 255, 255));
oldhbr =(HBRUSH)SelectObject(hdcmen, hbr);
FillRect(hdcmen, &rect, hbr);//绘制并填充矩形
myspin.SetRange32(0, 1000); //调节的范围
myspin.SetBase(10); //十进制
myspin.SetBuddy(GetDlgItem(IDC_EDIT1)); //设置关联的编辑框
myspin.SetPos(200);//设置当前值
beisu = 200;
beisu1 = 6;
int nReturn = waveInGetNumDevs();//获取系统中存在的波形音频输入设备数
if (nReturn==0) {
AfxMessageBox(_T("请插入麦克风!"));
return 0;
}
pwic = new WAVEINCAPS;
for (int i = 0; i < nReturn; i++) {
MMRESULT mmresult = waveInGetDevCaps(i, (pwic+i), sizeof(WAVEINCAPS)); //获取给定的波形音频输入设备的信息
m_cmbRec.AddString(pwic->szPname);
//m_cmbRec下拉列表框变量名
}
m_cmbRec.SetCurSel(0);
suoyin= m_cmbRec.GetCurSel();//获取选中项的索引号
pWnd->GetClientRect(&rectPicture);//获取picture控件客户区坐标
width = rectPicture.Width();
height = rectPicture.Height();
//代码
void CMFCyinpinDlg::OnBnClickedBtnStart()
{
//MMRESULT mm=waveInOpen(&hWaveIn, WAVE_MAPPER, &waveform, (DWORD)this->m_hWnd, NULL, CALLBACK_WINDOW);//打开录音设备
MMRESULT mm = waveInOpen(&hWaveIn, suoyin, &waveform, (DWORD)this->m_hWnd, NULL, CALLBACK_WINDOW);//打开录音设备
if (mm != MMSYSERR_NOERROR) {
AfxMessageBox(_T("打开失败"));
return;
}
waveInPrepareHeader(hWaveIn, &waveHeader, sizeof(WAVEHDR));//准备缓冲区
waveInAddBuffer(hWaveIn, &waveHeader, sizeof(WAVEHDR));// 添加缓冲区到音频输入设备
waveInStart(hWaveIn);//启动输入设备
}
void CMFCyinpinDlg::OnBnClickedBtnStop()
{
waveInReset(hWaveIn);//停止录音设备
waveInUnprepareHeader(hWaveIn, &waveHeader, sizeof(WAVEHDR));//去除缓冲区的准备
ReleaseMutex(mutex);//释放线程控制权
}
UINT func1(LPVOID pParam) //线程函数
{
FillRect(hdcmen, &rect, hbr);//绘制并填充矩形
int t = 1;//第一个点不能画直线
short* g = (short*)pParam;
DWORD d = WaitForSingleObject(mutex, INFINITE);
for (int i = 0; i < zong / sizeof(short); i++) {
if (t == 1) {
//移到起始点
::MoveToEx(hdcmen, i * beisu1, *(g + i) / beisu + 150, NULL);
t = 0;
}
else {
LineTo(hdcmen, i* beisu1, *(g + i)/beisu+150);//绘制直线
}
}
BOOL b =BitBlt(hdc, 0, 0, width, height, hdcmen, 0, 0, SRCCOPY);//把源DC拷贝到目标DC
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;
}
afx_msg LRESULT CMFCyinpinDlg::OnMM_WIM_CLOSE(WPARAM wParam, LPARAM lParam)
{
return 0;
}
void CMFCyinpinDlg::OnDeltaposSpin1(NMHDR* pNMHDR, LRESULT* pResult)
{
LPNMUPDOWN pNMUpDown = reinterpret_cast<LPNMUPDOWN>(pNMHDR);
// TODO: 在此添加控件通知处理程序代码
beisu = myspin.GetPos();//获取当前值
*pResult = 0;
}
我的问题:图形没有显示 ?
问题可能出在以下几个方面:
1. 图形绘制的代码没有被正确执行:请检查func1函数中的绘图代码是否被执行到。可以使用调试工具或者在关键位置添加输出语句来确认代码是否执行。
2. 绘图的目标 DC 或者源 DC 有问题:请检查hdc和hdcmen是否被正确初始化,以及BitBlt函数中的参数是否正确。
3. 图形绘制的位置或者大小有问题:请检查rect 、 width和height的值是否正确。可以使用调试工具或者在关键位置添加输出语句来确认这些值是否正确。
4. 线程没有正确启动:请检查AfxBeginThread函数的返回值是否为NULL ,如果是,则线程没有正确启动。可以使用调试工具或者在关键位置添加输出语句来确认线程是否正确启动。
请逐一检查上述问题,并根据具体情况进行调试和修改。如果问题仍然存在,请提供更多的代码和相关信息,以便更好地理解和解决问题。 isdkz 发表于 2023-8-18 06:47
问题可能出在以下几个方面:
1. 图形绘制的代码没有被正确执行:请检查func1函数中的绘图代码是否被 ...
你说的都正确? lm68140318 发表于 2023-8-18 06:50
你说的都正确?
不一定哦,因为是GPT回答的 根据你提供的代码,可能是以下几个原因导致图形没有显示:
1.确认你已经正确获取到了图片控件(IDC_SOUND)的句柄pWnd。
2.确认你已经正确获取到了图片控件(IDC_SOUND)的客户区坐标rectPicture。
3.确认你已经正确创建了内存DC(hdcmen)并且设置当前画笔(hpen)和填充矩形的画刷(hbr)。
4.确认你已经正确调用了BitBlt函数将内存DC上的图形拷贝到目标DC(hdc)上。
你可以逐步检查以上这些步骤,看看是否有任何错误或遗漏。另外,也可以在代码中添加一些调试信息,输出一些变量的值,以帮助你定位问题所在。
页:
[1]