看孙鑫书,第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) ); //UpdateWindow();
//Invalidate();
CClientDC dc( pView );
dc.TextOut( 0, 0, str );
return true;
} return CFrameWnd::OnCommand(wParam, lParam);
}
我想在显示字符串之前,清空客户区以前显示的内容,于是就用了 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) ); //UpdateWindow();
//Invalidate();
CClientDC dc( pView );
dc.TextOut( 0, 0, str );
return true;
} return CFrameWnd::OnCommand(wParam, lParam);
}
解决方案 »
- com组件 CPoint CRect CSize 不明确的符号
- 如何获取CFormView类中控件的指针
- SDI中如何去掉标题栏 谁指点一下 谢谢
- 请教用TCP发送和接受数据的问题
- 【【一个简单的问题,大家帮帮我吧。】】
- 各位大哥帮个忙啊,谁可以告诉我一个现在还可以申请免费空间的地方,只支持html就行了。谢谢了!(无内容)
- 请教高手一个巨难的问题(附源码)??
- 在VC的程序中我该如何嵌套一个可执行文件及汇编语言上去?
- 用ATL和MFC(DLL)的自动化做出来的COM有什么不同呢?
- 在消息处理函数中发送消息无法被处理,求大神解惑
- 怎样判断文件是否传输完整?
- 关于缩放:在内存DC中StretchBlt 了,然后能直接BITBLT吗
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) );
CClientDC dc( pView );
dc.TextOut( 0, 0, str );
return true;
}
解决办法你可以试下下面两个:
不要用TextOut,添加一个Static控件用于输出字符串,可以用Invalidate()刷新。在OnDraw里
if(m_bShow)
{
dc.TextOut(m_str);
}
//在按钮只修改字符串,然后用Invalidate()刷新