如何使窗体改变大小时虚线框显示,而不是不停刷新内容?
做了一个关于MSHFG的程序,由于有些列嵌入了自定义的超链接控件,在响应窗口OnSize时候grid的列宽要变化,对所有的控件也要进行SetWindowPos,使得窗口刷新的时候非常闪烁,想用虚框表示避免这个问题,当然那位大侠能帮我找到解决闪烁问题的办法更好了,我曾想把整列控件放到一个什么容器上,移动的时候一个SetWindowPos就好但是不会实现,请大家来帮忙
------解决方案--------------------http://dev.yesky.com/475/2667475_1.shtml
------解决方案--------------------up
------解决方案--------------------帮你UP
我想不出来
------解决方案--------------------还没解决吗?再帮你UP 呵呵
------解决方案--------------------so many up
------解决方案--------------------我也在想这个问题,UP
------解决方案--------------------在鼠标拖动过程中用异或模式绘制虚线框,在鼠标WM_LBUTTONUP后才实际挪动你的子控件。
大体实现代码如下:
pDC-> SetRop2(R2_XORPEN);
pDC-> DrawFocusRect(CRect(point-size,point+size));
------解决方案--------------------我也up!
哈哈!
------解决方案--------------------处理WM_MOVING ,画虚框
处理WM_MOVE 重画窗口内容
------解决方案--------------------移动子控件前调用父窗口SetRedraw(FALSE),调用完SetWindowPos后再调用父窗口SetRedraw(TRUE)
------解决方案--------------------新手学VC,现在只能做做苦力(能力有限),帮顶,这个问题以后也会遇到,关注!
------解决方案--------------------添加 以下代码在 .h中:
//member variable
CPoint m_oldPt;
CPoint m_offsetPt;
CRect m_wndRc;
CRect m_newRc;
CRect m_newSizeRect;
CRect m_oldSizeRect;
BOOL m_bDrawFrame;
BOOL m_needFinish;
BOOL m_bDrawSize;
BOOL m_needSize;
LRESULT OnMoving(WPARAM,LPARAM);
LRESULT OnExitSizeMove(WPARAM,LPARAM);
LRESULT OnEnterSizeMove(WPARAM, LPARAM);
LRESULT OnSizing(WPARAM,LPARAM);
DECLARE_MESSAGE_MAP()
添加 以下代码在 .CPP中:
ON_MESSAGE(WM_MOVING,OnMoving)
ON_MESSAGE(WM_EXITSIZEMOVE,OnExitSizeMove)
ON_MESSAGE(WM_ENTERSIZEMOVE,OnEnterSizeMove)
ON_MESSAGE(WM_SIZING,OnSizing)
END_MESSAGE_MAP()
下面是简单的处理函数,你可以扩展
LRESULT CPrimeNumDlg::OnEnterSizeMove(WPARAM, LPARAM){
GetWindowRect(&m_wndRc);
m_oldSizeRect = m_wndRc;
m_oldPt = CPoint(m_wndRc.left,m_wndRc.top);
m_offsetPt = CPoint(0,0);
m_bDrawFrame = FALSE;
return TRUE; //we don 't process this message
}
LRESULT CPrimeNumDlg::OnExitSizeMove(WPARAM,LPARAM){
if(m_needFinish){
CRect rect;
rect.left = m_oldPt.x - m_offsetPt.x;
rect.top = m_oldPt.y - m_offsetPt.y;
rect.right = rect.left + m_wndRc.Width();
rect.bottom = rect.top + m_wndRc.Height();
DrawDashFrame(rect);
m_needFinish = FALSE;
SetWindowPos(NULL,m_oldPt.x,m_oldPt.y,m_wndRc.Width(),m_wndRc.Height(),\
SWP_NOSENDCHANGING ); //prevent receiving more moving message
GetWindowRect(&m_wndRc);
m_oldPt = CPoint(m_wndRc.left,m_wndRc.top);
m_offsetPt = CPoint(0,0);
m_bDrawFrame = FALSE;
}
if(m_needSize){
m_bDrawSize = FALSE;
m_needSize = FALSE;
DrawDashFrame(m_oldSizeRect);
SetWindowPos(NULL,m_newSizeRect.left,m_newSizeRect.top,m_newSizeRect.Width(),m_newSizeRect.Height(),\