CFormView 在改变大小时,控件闪烁的问题

原创 2015年11月17日 12:21:44

下面是 这个问题的 解决办法:

/////////////////////////////////////////////////////////////////////////////
// CFormView 在改变大小时,控件闪烁的问题
//#define VIEW_NO_BORDER
 
BOOL CSizingFormViewView::PreCreateWindow(CREATESTRUCT& cs)
{
// TODO: Modify the Window class or styles here by modifying
//  the CREATESTRUCT cs
#ifdef VIEW_NO_BORDER
cs.style &= ~WS_BORDER;// no border 
#endif
return CFormView::PreCreateWindow(cs);
}
//
void CSizingFormViewView::OnPaint() 
{
CPaintDC dc(this); // device context for painting
// get size , 
CRect rc;
GetWindowRect(&rc);
rc.OffsetRect(-rc.left,-rc.top);
#ifndef VIEW_NO_BORDER
rc.OffsetRect(-2,-2);// offset -2,-2
#endif
// Create a compatible memory DC 
CDC memDC;
memDC.CreateCompatibleDC(&dc);
// Select a compatible bitmap into the memory DC
CBitmap bitmap;
bitmap.CreateCompatibleBitmap( &dc, rc.Width(), rc.Height());
HBITMAP oldBmp=(HBITMAP)memDC.SelectObject(&bitmap);
// Erase bkg
memDC.FillSolidRect(&rc,GetSysColor(COLOR_MENU));// RGB(210,210,210));
// Let the dialog draw everything into memDC.
SendMessage(WM_PRINT,(WPARAM)memDC.m_hDC,
(LPARAM)(PRF_CHILDREN | PRF_CLIENT ));//| PRF_NONCLIENT | PRF_ERASEBKGND | PRF_OWNED));
// copy to CB for checking
#ifdef TEST
memDC.SelectObject(oldBmp);
OpenClipboard();
EmptyClipboard(); 
SetClipboardData(CF_BITMAP,bitmap);
CloseClipboard();
oldBmp=(HBITMAP)memDC.SelectObject(&bitmap);
#endif
dc.BitBlt(rc.left,rc.top, rc.Width(), rc.Height(),&memDC,0,0,SRCCOPY);
// set back
memDC.SelectObject(oldBmp);
// free
DeleteObject(bitmap.m_hObject);
DeleteObject(memDC);
// do not draw all Ctls ! 
#if 1
UINT id=0;
CWnd *pWnd=0;
//
pWnd=GetDlgItem(IDC_BUTTON1);
pWnd->GetClientRect(&rc);
pWnd->ValidateRect(&rc);
//
pWnd=GetDlgItem(IDC_BUTTON2);
pWnd->GetClientRect(&rc);
pWnd->ValidateRect(&rc);
//
pWnd=GetDlgItem(IDC_GROUP);
pWnd->GetClientRect(&rc);
pWnd->ValidateRect(&rc);
//
pWnd=GetDlgItem(IDC_RADIO1);
pWnd->GetClientRect(&rc);
pWnd->ValidateRect(&rc);
//
pWnd=GetDlgItem(IDC_RADIO2);
pWnd->GetClientRect(&rc);
pWnd->ValidateRect(&rc);
// 
pWnd=GetDlgItem(IDC_STATIC1);
pWnd->GetClientRect(&rc);
pWnd->ValidateRect(&rc);
//
pWnd=GetDlgItem(IDC_PICTURE);
pWnd->GetClientRect(&rc);
pWnd->ValidateRect(&rc);
//
pWnd=GetDlgItem(IDC_EDIT1);
pWnd->GetClientRect(&rc);
pWnd->ValidateRect(&rc);
#endif
// CFormView::OnPaint();
}

BOOL CSizingFormViewView::OnEraseBkgnd(CDC* pDC) 
{
// TODO: Add your message handler code here and/or call default
return TRUE;
// return CFormView::OnEraseBkgnd(pDC);
}
/////////////////////////////////////////////////////////////////

相关文章推荐

VC 固定窗口大小

在对话框的OnIntDialog中使用SetWindowPos   SetWindowPos(NULL,宽,高,SWP_NOZORDER|SWP_NOMOVE)就行了。   void ...

VC 编译boost方法

官网下载好boost,解压出来,用vc的命令提示符cd到目录下 执行:bootstrap.bat 生成bjam.exe 然后执行: bjam --toolset=msvc-9.0 stage d...

C#控件改变大小时闪烁问题

首先是一段窗体控件随窗体大小改变代码,但是在使用这段代码后,当窗体中控件较多时每次改变窗体大小后都会出现闪烁情况 private float X; private float Y; priv...

CFormView创建后有时不显示控件

运新环境:VS2012 测试程序:MFC下创建的多文档程序(默认设置) 附加条件: 1.程序中的button使用自定义的btn类继承并扩展重写了CButton的部分函数(Draw...
  • dudu97
  • dudu97
  • 2015年02月03日 01:35
  • 658

【VS开发】关于在CFormView中实现CListCtrl控件的注意事项

【VS开发】关于在CFormView中实现CListCtrl控件的注意事项标签(空格分隔): 【VS开发】今天调试中发现了一项非常令人恼怒的事情,本来早都知道在CFormView中没有了像在对话框中的...

CFormView随着窗口的变化,Control及OLE控件自动居中窗体

CFormView随着窗口的变化,Control及OLE控件自动调整位自动居中 //网上也没有找到,通过自己努力看原代码,本问题已经解决。现贡献自己的一点力量,有不宜之处,望凉解; //问题主...

一个SDI程序基于CFormView视。上面放一个CStatic控件,给视图添加双击消息,运行程序后,双击视图,会有弹出消息响应。 但是双击CStatic类控件,却没有响应

一个SDI程序基于CFormView视。上面放一个CStatic控件,给视图添加双击消息,运行程序后,双击视图,会有弹出消息响应。 但是双击CStatic类控件,却没有响应,请问如何添加这个消息?? ...

强大的JS日期/时间选择控件(精确到天、小时、分钟都可以)

"JavaScript"> /**//** *本日历选择控件由tiannet根据前人经验完善而得。大部分代码来自meizz的日历控件。 *tiannet添加了时间选择功能、selec...

带小时分钟的日历控件

  • 2008年04月14日 16:21
  • 6KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:CFormView 在改变大小时,控件闪烁的问题
举报原因:
原因补充:

(最多只允许输入30个字)