回 帖 发 新 帖 刷新版面

主题:关于OnCommand函数的问题,初学mfc,多谢赐教。

看孙鑫书,第6章,最后个例子练习下。 

问题是这样,在frame中重写了oncommand函数,来捕捉菜单消息,在客户区上显示一行字符串。代码如下。 
我想在显示字符串之前,清空客户区以前显示的内容,于是就用了 updatewindow()函数,但是不起作用, 
为什么? 

然后改用,Invalidate() 函数,让整个客户区无效,使得下一次WM_PAINT时,能重绘整个客户区,结果发现 
客户区就一直是白色的,dc.textout语句执行了,但是看不到任何我要显示的东西,为什么? 

我该如何做,才是正确的? 

最后一个问题,为什么 CMyView::OnCommand() 不能像 CMainFrame::OnCommand一样捕捉到 菜单命令? 
先谢过了,望赐教 

BOOL CMainFrame::OnCommand(WPARAM wParam, LPARAM lParam) 

        // TODO: Add your specialized code here and/or call the base class 
        
        int MenuCmdUI = LOWORD( wParam ); 

        Cmfc_phonebookdemoView *pView = dynamic_cast <Cmfc_phonebookdemoView *>( GetActiveView() ); 
        
        if( MenuCmdUI >= IDM_PHONE1 && MenuCmdUI < pView->m_strArray.GetSize()+IDM_PHONE1 ) { 
            //  MessageBox( "phone number clicked!" ); 
                CString str; 
                str.Format( "phonenumber:  %s", pView->m_strArray.GetAt( MenuCmdUI-IDM_PHONE1) ); 
         
                //下面2种方法都不行:
                //UpdateWindow(); 
                //Invalidate(); 

                CClientDC dc( pView ); 
                dc.TextOut( 0, 0, str ); 
              
                return true; 
                
        } 

        return CFrameWnd::OnCommand(wParam, lParam); 
}

回复列表 (共1个回复)

沙发

已经搞定了,我自己来回答好了。

应该用ReDrawWindow 函数。

UpdateWindow 虽然是 立即 重绘,但是在重绘前 要检查,是不是有无效区域, 而就这个问题来看,dc.TextOut,不会对 View产生无效区域, 所以没有重绘。

Invalidate会将整个区域设置为无效, 但是他不是立即重绘的,而是将wm_paint 消息放入消息队列,最后执行。所以每次 dc.textout之后,才重绘,我看不到输出的内容。

而ReDrawWindow函数具有上面二个函数的双特性,置为无效区域,然后马上重绘 - -!

我来回复

您尚未登录,请登录后再回复。点此登录或注册