要完成的任务是显示wav波形,遇到的问题是当窗口被覆盖再显示的时候,在picture控件上的图像就没有了。 我的做法是在对话框中插入一个picture控件,设置type为Rectangle。当我点击选择的wav文件后,就在该控件中显示该文件的波形。在打开文件消息响应函数中我是这么写的。 void CDraw_WAVDlg::OnOK()
{
....//前面是对wav数据的加载,和在内存中画图。
CDC *dc;
CRect crect;
CWnd *pic;
pic=GetDlgItem(IDC_PICTURE); //IDC_PICTURE是picture控件的id
pic->GetClientRect(crect);
dc = pic->GetDC();
dc->BitBlt(crect.left,crect.top,crect.right,crect.bottom,&m_dcBuffer,0,0,SRCCOPY);
//m_dcBuffer是CDraw_WAVDlg的CDC类型的成员,用来在内存中画图
ReleaseDC(dc);
} 在OnPaint函数中的实现如下:
void CDraw_WAVDlg::OnPaint()
{if (IsIconic())
{
CPaintDC dc(this); // device context for painting
SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);
// Center icon in client rectangle
int cxIcon = GetSystemMetrics(SM_CXICON);
int cyIcon = GetSystemMetrics(SM_CYICON);
CRect rect;
GetClientRect(&rect);
int x = (rect.Width() - cxIcon + 1) / 2;
int y = (rect.Height() - cyIcon + 1) / 2; // Draw the icon
dc.DrawIcon(x, y, m_hIcon);
}
//上面这些是系统自动生成的,好像是对话框最小化的一些处理
else
{
CDC *dc;
CRect crect;
CWnd *pic;
pic=GetDlgItem(IDC_PICTURE); //IDC_PICTURE是picture控件的id
pic->GetClientRect(crect);
dc = pic->GetDC();
dc->BitBlt(crect.left,crect.top,crect.right,crect.bottom,&m_dcBuffer,0,0,SRCCOPY);
CDialog::OnPaint();
}
}分数不多了,大家帮帮忙看是哪里的问题吧。
{
....//前面是对wav数据的加载,和在内存中画图。
CDC *dc;
CRect crect;
CWnd *pic;
pic=GetDlgItem(IDC_PICTURE); //IDC_PICTURE是picture控件的id
pic->GetClientRect(crect);
dc = pic->GetDC();
dc->BitBlt(crect.left,crect.top,crect.right,crect.bottom,&m_dcBuffer,0,0,SRCCOPY);
//m_dcBuffer是CDraw_WAVDlg的CDC类型的成员,用来在内存中画图
ReleaseDC(dc);
} 在OnPaint函数中的实现如下:
void CDraw_WAVDlg::OnPaint()
{if (IsIconic())
{
CPaintDC dc(this); // device context for painting
SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);
// Center icon in client rectangle
int cxIcon = GetSystemMetrics(SM_CXICON);
int cyIcon = GetSystemMetrics(SM_CYICON);
CRect rect;
GetClientRect(&rect);
int x = (rect.Width() - cxIcon + 1) / 2;
int y = (rect.Height() - cyIcon + 1) / 2; // Draw the icon
dc.DrawIcon(x, y, m_hIcon);
}
//上面这些是系统自动生成的,好像是对话框最小化的一些处理
else
{
CDC *dc;
CRect crect;
CWnd *pic;
pic=GetDlgItem(IDC_PICTURE); //IDC_PICTURE是picture控件的id
pic->GetClientRect(crect);
dc = pic->GetDC();
dc->BitBlt(crect.left,crect.top,crect.right,crect.bottom,&m_dcBuffer,0,0,SRCCOPY);
CDialog::OnPaint();
}
}分数不多了,大家帮帮忙看是哪里的问题吧。
解决方案 »
- 使用OPENGL显示摄像头采集的实时图像
- 同样一段char 为什么messagebox 和输出在文件中不一样 谢谢
- windows下实现traceroute碰到的问题--原始套接口收不到icmp错误报文
- 界面,跪求帮忙跪求帮忙跪求帮忙跪求帮忙跪求帮忙
- CComboBox类的问题
- 想把51job的工作列表放在程序中,谁有办法
- XP sp2 OBDC API 出错
- 高分求救在VC中获取USB口的摄像头数据?
- VB调用DLL的问题,请教各位!
- VC能不能从CHtmlView的HTML文件的输入框中获取数据? (解决马上给100分,在送100)
- 网络编程里用自己声明的结构体有什么好处?
- CMainFrame里的滚动条如何滚动视图
dc-> BitBlt(crect.left,crect.top,crect.right,crect.bottom,&m_dcBuffer,0,0,SRCCOPY);
去实现绘图即可, 其他操作如dc = pic->GetDC();
是多余的,而且后边没有ReleaseDC
会导致内存泄露!
然后在CYourPic::OnPaint() 内执行绘图dc的操作,就可以了。
在空间的OnPaint函数中绘图,这样能避免你说的问题。q:是当窗口被覆盖再显示的时候,在picture控件上的图像就没有了。
问个叫弱的问题,在CStatic继承类中调用BitBlt函数时,
dc->BitBlt(rc.left,rc.top,rc.Width(),rc.Height(), ,0,0,SRCCOPY);
原本属于内存数据的那个参数不知道该填什么。在我的实现中它是CDraw_WAVDlg的一个公共成员。