Tauruser

Enjoy Every Day
posts - 34, comments - 95, trackbacks - 0, articles - 5
  C++博客 :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理

  一个窗体,在窗体上添加了Windows Media Player控件,想实现窗体大小调整时,WMP也随着变化。于是在窗体OnSize()信息下,添加m_wmpplayer.MoveWindow(0,0,cx,cy)函数。

void  CSysuTVFormView::OnSize(UINT nType,  int  cx,  int  cy)
{
        CFormView::OnSize(nType, cx, cy);

        
//  TODO: 在此处添加消息处理程序代码
        m_wmpplayer.MoveWindow( 0 , 0 ,cx,cy);

}

但是DEBUG时总是提示出错。如果忽略错误的话可以正常通过运行,如果才可以让解决DEBUG时出现错误?提示debug assertion failed! 位置如下。

void  CWnd::MoveWindow( int  x,  int  y,  int  nWidth,  int  nHeight, BOOL bRepaint)
{
ASSERT(::IsWindow(m_hWnd) 
||  (m_pCtrlSite  !=  NULL));

if  (m_pCtrlSite  ==  NULL)
 ::MoveWindow(m_hWnd, x, y, nWidth, nHeight, bRepaint);
else
m_pCtrlSite
-> MoveWindow(x, y, nWidth, nHeight);
}

另外,运行的时候,如果我变大窗体,没有问题。但是如果调小窗体的时候就会出现水平和垂直滚动条。这并不是我想要的,怎样才可去掉那两个滚动条呢?

对于第一个问题,在CSDN上问了三天,还没有人给也我解决方案。但是小明给了我一个解决方案。
在窗体的资源上删除WMP控件。并在OnCreate()用Create方法创建WMP。

int  CSysuTVFormView::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
    
if  (CFormView::OnCreate(lpCreateStruct)  ==   - 1 )
        
return   - 1 ;

    m_wmpplayer.Create(NULL, WS_VISIBLE, 
    CRect(
50 , 50 , 100 , 100 ),  this 0 ); //
     return   0 ;
}

这样子之后,再DEBUG就再没有提示报错了。但是,新的问题还是继续出现。
随便再窗体上加一个控件,如输入框,按钮等。DEBUG的时候,又重新报错了。当然RELEASE时没有报错。继续想不明白中……

对于第二个问题,问过学校教MFC的一个老师,他倒是给我这样的答复。这个答复和PX给我的一样。都是跟我说,网络电视的界面并不一定要提供可以自由拉伸的功能。只要可以提供固定大小,和全屏播放就行了。再一方面说,很多这方面的软件,为了美观对是要求固定大小的。
  所以,在考虑因定大小中。但这个问题总应该有解决的方法,不能因为这样就放弃去了解如果解决这个问题吧。

Feedback

# re: OnSize()加入处理函数后,DEBUG报告出错  回复  更多评论   

2006-04-01 22:57 by 沐枫
我没看到onsize,只看到oncreate,是不是楼主写错了?

# re: OnSize()加入处理函数后,DEBUG报告出错  回复  更多评论   

2006-04-01 22:59 by Tauruser
还真的是COPY错了。呵呵,改回来。

# re: OnSize()加入处理函数后,DEBUG报告出错  回复  更多评论   

2006-04-01 23:48 by flyingxu
我不知道你m_wmpplayer是什么类型哦,
如果是CWnd,我会这么写

if(m_wmpplayer.GetSafeHand() ) //先判断是否已经创建
m_wmpplayer.MoveWindow( 0 , 0 ,cx,cy);


你这个assert错误很容易找到原因的啊,csdn居然没有人回?

# re: OnSize()加入处理函数后,DEBUG报告出错  回复  更多评论   

2006-04-02 00:07 by Tauruser
CSDN,有两个人回了,但是问题并没有解决。
m_wmpplayer是CWMPPlayer4类的实例,从CWnd继承过来的。
class CWMPPlayer4 : public CWnd
刚才用你的代码试了一下,编译无法通过。

d:\my documents\visual studio 2005\projects\sysutv\sysutv@form\sysutv@formview.cpp(201) : error C2039: “GetSafeHand”: 不是“CWMPPlayer4”的成员

# re: OnSize()加入处理函数后,DEBUG报告出错  回复  更多评论   

2006-04-03 10:00 by 小明
Debug报错,而release不报错的原因是因为Assert断言的存在

MFC的窗口类很多函数调用后都会检查ASSERT(m_hwnd!=0),这个只在Debug版本有效

# re: OnSize()加入处理函数后,DEBUG报告出错  回复  更多评论   

2006-04-03 11:24 by 小明
如果你把wmpplayer控件都放在form上面

请将m_wmpplayer.MoveWindow( 0 , 0 ,cx,cy); 换成

if(m_wmpplayer.GetControlSite()!=0)
{
m_wmpplayer.GetControlSite()->MoveWindow(0,0,cx,cy);
}

# re: OnSize()加入处理函数后,DEBUG报告出错  回复  更多评论   

2008-12-11 14:28 by 青碧竹
和我遇到的问题类似啊...

其实只要OnSize像下面这样
{
CDialog::OnSize(nType, cx, cy);

// TODO: Add your message handler code here
Invalidate();
}
然后把原本要在OnSize完成的内容放到OnPaint内去,你上面的两个问题就都解决掉了,只是中间的原理我就不清楚了...

# re: OnSize()加入处理函数后,DEBUG报告出错  回复  更多评论   

2011-05-03 14:31 by NULL
m_wmpplayer没初始化的时候已经有OnSize消息了,MoveWindow时候的句柄当然是空,当然导致断言崩溃,解决办法是:
BOOL falg;


falg=FALSE;
m_wmpplayer.Create(...)
...
falg=TRUE;

OnSize(...)
{
if(falg)
{
...
}
}

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理