如何将所绘制图形保留在窗口上?
我在绘制一个图形后,改变窗口的大小或移动窗口,则图形就不见了,这是什么原因,应该怎样才能避免呢? 问题点数:0、回复次数:5Top
1 楼wangjinwang(王者之疯)回复于 2003-08-04 18:15:07 得分 0
把绘图的代码放在OnDraw()中
这样当变化发生时,系统自动调用OnDraw重新绘图
Top
2 楼autfx(边城浪子)回复于 2003-08-04 23:10:22 得分 0
我也有这个问题,如果我程序是一个动画演示程序怎么半呢?Top
3 楼lygfqy(风清扬)回复于 2003-08-04 23:14:24 得分 0
这是因为窗口收到WM_PAINT 消息,开始重绘窗口,要是想保持,就在WM_PAINT消息中绘制图形啊
这样每次刷新得时候,图象就被重新绘制在窗口中了Top
4 楼yjh8047(寒江飞鸿)回复于 2003-08-05 18:25:29 得分 0
// 以下是我编的一个简单的动画演示程序,假定在视图类CDrawView(继承CView)
// 的实例上绘制一个矩形,当你的鼠标在视图上移动,该矩形就会向右移动,
// 移动过程中不会影响背景位图,当你按下鼠标左键时,矩形就复原到初始位置,
// 而且OnDraw函数保证了图形的重绘,不会因改变窗口而图形消失
// 声明如下(DrawView.h):
class CDrawView : public CView
{
// Construction
public:
CDrawView();
DECLARE_DYNCREATE(CDrawView)
// Attributes
public:
CDC m_dcBack; // 存放背景的DC,用于刷新背景,保持背景不变
CDC m_dcMemory; // 内存DC,画图时先画在该内存DC上
CBitmap m_Bitmap1; // 将被选入背景DC的位图
CBitmap m_Bitmap2; // 将被选入内存DC的位图
int m_nBmpWidth; // 位图宽度,根据你加入的背景位图的实际宽度给定
int m_nBmpHeight; // 位图高度,根据你加入的背景位图的实际宽度给定
int m_nX; // 矩形的水平位置,可在CDrawView()中给定初始值
int m_nY; // 矩形的竖直位置,可在CDrawView()中给定初始值
int m_nRectWidth; // 矩形宽度,可在CDrawView()中给定初始值
// Operations
public:
void DrawRect();
virtual void OnDraw(CDC* pDC); // 重载重绘函数
afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct); // 重载OnCreate函数
afx_msg void OnMouseMove(UINT nFlags, CPoint point);
afx_msg void OnLButtonDown(UINT nFlags, CPoint point);
...
DECLARE_MESSAGE_MAP()
}
//定义如下:(DrawView.cpp)
CDrawView::CDrawView()
{
m_nBmpWidth = 621;
m_nBmpHeight = 403;
m_nX = 10;
m_nY = 190;
m_nRectWidth = 20;
}
int CDrawView::OnCreate(LPCREATESTRUCT lpCreateStruct) // 载入时初始化DC和位图
{
if (CView::OnCreate(lpCreateStruct) == -1)
return -1;
CPaintDC dc(this);
m_Bitmap1.LoadBitmap(IDB_BITMAP1); // 假定你加入资源的背景位图的ID是IDB_BITMAP1
m_Bitmap2.LoadBitmap(IDB_BITMAP1);
m_dcBack.CreateCompatibleDC(&dc);
m_dcMemory.CreateCompatibleDC(&dc);
m_dcBack.SelectObject(&m_Bitmap1);
m_dcMemory.SelectObject(&m_Bitmap2); // 将m_Bitmap选入m_dcMemory后,
// 在m_dcMemory上画图,就是画在了m_Bitmap2上
m_dcMemory.SelectStockObject(NULL_BRUSH); // 画矩形为空心
DrawRect();
return 0;
}
void CDrawView::OnDraw(CDC* pDC)
{
CDrawDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
pDC->BitBlt(0,0,m_nBmpWidth,m_nBmpHeight,&m_dcMemory,0,0,SRCCOPY);
//将内存DC中的位图画在屏幕上
}
void CDrawView::DrawRect()
{
CPen pen(PS_SOLID, 1, RGB(255,0,0)); // 该参数你可随意定
CPen *pOldPen = m_dcMemory.SelectObject(&pen);
m_dcMemory.Rectangle(m_nX,m_nY,m_nX+m_nRectWidth,m_nY+m_nRectWidth);
// 画矩形
m_dcMemory.SelectObject(pOldPen);
Invalidate(FALSE); // 更新视图,执行OnDraw()
}
void CDrawView::OnMouseMove(UINT nFlags, CPoint point)
{
m_dcMemory.BitBlt(m_nX,m_nY,m_nRectWidth,m_nRectWidth,
&m_dcBack,m_nX,m_nY,SRCCOPY); // 擦去当前矩形
m_nX += 2; // 矩形右移
DrawRect(); // 再画矩形并更新屏幕
CView::OnMouseMove(nFlags, point);
}
void CDrawView::OnLButtonDown(UINT nFlags, CPoint point)
{
m_dcMemory.BitBlt(m_nX,m_nY,m_nRectWidth,m_nRectWidth,
&m_dcBack,m_nX,m_nY,SRCCOPY); // 擦去当前矩形
m_nX = 10; // 矩形复位
DrawRect(); // 再画矩形并更新屏幕
CView::OnLButtonDown(nFlags, point);
}Top
5 楼newer3(恐龙世纪)回复于 2003-08-05 20:29:40 得分 0
你的DRAWRECT()无法保证会到原始位置,当然,你设定了他,
似乎保寸一个RECT变量,/CDC 成员变量,就可以了吧?Top



