slider放到子窗体中怎么不能控件声音了?

yeyuanzhi2000 2009-06-29 01:33:23
原来的程序是基于对话框的,在窗体中放了两个slider控件,一个是控件声音IDC_SLD_AUDIO,一个是控件话筒声音IDC_SLD_PHONE。控件声音没问题,代码如下:
m_mainVolume.SubclassDlgItem( IDC_SLD_AUDIO, this );
m_mainVolume.Init( MIXERLINE_COMPONENTTYPE_DST_SPEAKERS,
NO_SOURCE,
MIXERCONTROL_CONTROLTYPE_VOLUME,
CMixerFader::MAIN );
m_mikeVolume.SubclassDlgItem( IDC_SLD_PHONE, this );
m_mikeVolume.Init( MIXERLINE_COMPONENTTYPE_DST_WAVEIN,
MIXERLINE_COMPONENTTYPE_SRC_MICROPHONE,
MIXERCONTROL_CONTROLTYPE_VOLUME,
CMixerFader::MAIN );

现在我把它转移到单方档程序中,两个slider控件放在子窗体中,下面的代码则放在CMainFrame中,修改代码如下:
this->dlgBar.m_mainVolume.SubclassDlgItem( IDC_SLD_AUDIO, this );
this->dlgBar.m_mainVolume.Init( MIXERLINE_COMPONENTTYPE_DST_SPEAKERS,
NO_SOURCE,
MIXERCONTROL_CONTROLTYPE_VOLUME,
CMixerFader::MAIN );
this->dlgBar.m_mikeVolume.SubclassDlgItem( IDC_SLD_PHONE, this );
this->dlgBar.m_mikeVolume.Init( MIXERLINE_COMPONENTTYPE_DST_WAVEIN,
MIXERLINE_COMPONENTTYPE_SRC_MICROPHONE,
MIXERCONTROL_CONTROLTYPE_VOLUME,
CMixerFader::MAIN );

但是控件失效。为什么?请高手指点。谢谢!!
...全文
139 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
spring203 2009-07-01
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 skyxie 的回复:]
引用 14 楼 yeyuanzhi2000 的回复:
代码错误:
warning C4248: 'CWnd::CWnd' : cannot access private member declared in class 'CWnd'


this->dlgBar.m_mainVolume.SubclassDlgItem( IDC_SLD_AUDIO, &((CWnd)this->dlgBar.m_hWnd) );
汗,这样肯定是不行的....

就是5F的方法, 在调用前确定 dlgBar创建成功了.

Assert(this->dlgBar.m_hWnd != NULL); // 如果这里assert失败,则说明还没有创建成功...
this-…
[/Quote]
&((CWnd)this->dlgBar.m_hWnd) 用法向楼主以及楼上诸位道歉,好长时间没用这个了,没仔细看CWnd,认为有构造函数CWnd(HWND),一般都会查阅msdn的,出于习惯这次没看仔细,下次一定注意(免得"祸害"其他人~~~),惭愧了!
yeyuanzhi2000 2009-07-01
  • 打赏
  • 举报
回复
哦,我知道原因了,是因为我又在dlgBar窗体中用classwizard对两个slider控件建立了不同的变量
CBitSlider m_Volume;
CBitSlider m_phone;
然后对slider控件进行重绘和定位,所以冲突了,怎么解决这个问题?
skyxie 2009-06-30
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 yeyuanzhi2000 的回复:]
代码错误:
warning C4248: 'CWnd::CWnd' : cannot access private member declared in class 'CWnd'
[/Quote]
this->dlgBar.m_mainVolume.SubclassDlgItem( IDC_SLD_AUDIO, &((CWnd)this->dlgBar.m_hWnd) );
汗,这样肯定是不行的....

就是5F的方法, 在调用前确定 dlgBar创建成功了.

Assert(this->dlgBar.m_hWnd != NULL); // 如果这里assert失败,则说明还没有创建成功...
this->dlgBar.m_mainVolume.SubclassDlgItem( IDC_SLD_AUDIO, (CWnd *)&(this->dlgBar) );
yeyuanzhi2000 2009-06-30
  • 打赏
  • 举报
回复
代码错误:
warning C4248: 'CWnd::CWnd' : cannot access private member declared in class 'CWnd'
yeyuanzhi2000 2009-06-30
  • 打赏
  • 举报
回复
崩溃对话框信息:DeBug Assertion failed!然后提示点“终止,重试 取消”按钮
yeyuanzhi2000 2009-06-30
  • 打赏
  • 举报
回复
dlgBar是基于CDialog类的浮动窗体
spring203 2009-06-30
  • 打赏
  • 举报
回复
dlgBar是什么窗口,创建代码贴下吧,SubclassDlgItem这样做是认为dlgBar是个dialog呀, 还有楼主顺便把崩溃的代码贴出来下。
yeyuanzhi2000 2009-06-30
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 skyxie 的回复:]
你是在什么地方调用的 this->dlgBar.m_mainVolume.SubclassDlgItem? 要保证 dlgBar 已经创建了
[/Quote]
在int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)中调用,dlgBar也已经创建了。
yeyuanzhi2000 2009-06-30
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 spring203 的回复:]
this->dlgBar.m_mainVolume.SubclassDlgItem( IDC_SLD_AUDIO, &((CWnd)this->dlgBar.m_hWnd) );
改(CWnd *)&(this->dlgBar)后,编译没问题,运行崩溃!!这样当然不行, hwnd指针可以初始化cwnd对象,但不能强制转换成cwnd指针对象。
[/Quote]
一样崩溃!!
spring203 2009-06-29
  • 打赏
  • 举报
回复
this->dlgBar.m_mainVolume.SubclassDlgItem( IDC_SLD_AUDIO, &((CWnd)this->dlgBar.m_hWnd) );
改(CWnd *)&(this->dlgBar)后,编译没问题,运行崩溃!!这样当然不行, hwnd指针可以初始化cwnd对象,但不能强制转换成cwnd指针对象。
skyxie 2009-06-29
  • 打赏
  • 举报
回复
你是在什么地方调用的 this->dlgBar.m_mainVolume.SubclassDlgItem? 要保证 dlgBar 已经创建了
yeyuanzhi2000 2009-06-29
  • 打赏
  • 举报
回复
改(CWnd *)&(this->dlgBar)后,编译没问题,运行崩溃!!
skyxie 2009-06-29
  • 打赏
  • 举报
回复
改成 (CWnd *)&(this->dlgBar)
yeyuanzhi2000 2009-06-29
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 skyxie 的回复:]

this->dlgBar.m_mainVolume.SubclassDlgItem( IDC_SLD_AUDIO, this->dlgBar.GetSafeHWnd() );
this->dlgBar.m_mainVolume.Init( MIXERLINE_COMPONENTTYPE_DST_SPEAKERS,
NO_SOURCE,
MIXERCONTROL_CONTROLTYPE_VOLUME,
CMixerFader::MAIN );
this->dlgBar.m_mikeVolume.SubclassDlgItem( IDC_SLD_PHONE, this->dlgBar.GetSafeHWnd() );
thi…
[/Quote]
谢谢,但出现一个错误“cannot convert parameter 2 from 'struct HWND__ *' to 'class CWnd *'”
skyxie 2009-06-29
  • 打赏
  • 举报
回复
上面写错了,是 GetSafeHwnd()
skyxie 2009-06-29
  • 打赏
  • 举报
回复

this->dlgBar.m_mainVolume.SubclassDlgItem( IDC_SLD_AUDIO, this->dlgBar.GetSafeHWnd() );
this->dlgBar.m_mainVolume.Init( MIXERLINE_COMPONENTTYPE_DST_SPEAKERS,
NO_SOURCE,
MIXERCONTROL_CONTROLTYPE_VOLUME,
CMixerFader::MAIN );
this->dlgBar.m_mikeVolume.SubclassDlgItem( IDC_SLD_PHONE, this->dlgBar.GetSafeHWnd() );
this->dlgBar.m_mikeVolume.Init( MIXERLINE_COMPONENTTYPE_DST_WAVEIN,
MIXERLINE_COMPONENTTYPE_SRC_MICROPHONE,
MIXERCONTROL_CONTROLTYPE_VOLUME,
CMixerFader::MAIN );
aa3000 2009-06-29
  • 打赏
  • 举报
回复
怎么失效?

16,551

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Creator Browser
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧