写了个小小的画图程序,但画了以后切换到别的窗口再切换回来或窗口被遮盖的话刚刚画的图都没了?要如何重绘刚刚的图片或如何保证不被画的图不消失?另外又如何清屏呢,就是画了很多图以后要清除掉.
解决方案 »
- RichEdit控件 OleCreateStaticFromData内存释放问题
- Picture上显示文字的问题
- vc调用telnet自动登录问题
- 12月16日有个java技术研讨会,那位已经报名了??
- 我用ATL实现了一个EXE的COM组件程序,然后用一个client去调用它,该client不是我写的,我该怎么在Server的源代码级别调试呢?
- 在CEditView视图中,如何设置光标的位置呢?
- 一个关于OnActivateView的问题?
- 用什么样的桌面数据库比较好?
- 为什么在我的一个程序里date$,time$,string()等函数不能用,而另一个程序里可以使用?
- 一个打印出进程快照的方法```大侠们来看看是哪里出了问题```拜谢`````````
- 关于_ConnectionPtr对象执行Execute的疑问
- 本人吃的是DELPHI饭,本来在犹豫改弄VC或JAVA,现在决定选择。。。
因为窗口切换会使窗口重绘
所以触发你之前画出来的那些代码是没有被执行了
http://www.vckbase.com/
那里有很多绘图方面的例子
谢谢楼上几位回答问题谢。
----------------你在OnLButtonDown 是不是点了两下? 然后有了一线??
OnLButtonDown 里点的时候把坐标记下来,再点的时候再记下来,(所以要有两个CPoint变量)
点完后调用InvalidateRect()
在OnDraw 里在连接这两个点~ ,这样就可以保存了
----------------你在OnLButtonDown 是不是点了两下? 然后有了一线??
OnLButtonDown 里点的时候把坐标记下来,再点的时候再记下来,(所以要有两个CPoint变量)
点完后调用InvalidateRect()
在OnDraw 里在连接这两个点~ ,这样就可以保存了
在OnDraw 里在连接这两个点是什么意思?请指教.
闪闪闪!~~呵呵
{
m_nStep++;//每次单击鼠标左键时操作步加1
switch(m_nStep)//根据操作步执行相应的操作
{
case 1:
{
m_begin = m_end = pos;
::Prompt("请输入直线的末端点:");
break;
}
case 2:
{
CDC* pDC = g_pView->GetDC(); CLine* pTempLine = new CLine(m_begin, m_end);
pTempLine->Draw(pDC, dmDrag);
delete pTempLine; if(nFlags & MK_SHIFT){
double dx = pos.x - m_begin.x;
double dy = pos.y - m_begin.y;
if(fabs(dx) <= fabs(dy))
m_end.Set(m_begin.x, pos.y);
else
m_end.Set(pos.x, m_begin.y);
}
else
m_end = pos;
CLine* pNewLine = new CLine(m_begin, m_end);
pNewLine->Draw(pDC, dmNormal);
g_pDoc->m_EntityList.AddTail(pNewLine);
// 设置文档修改标记
g_pDoc->SetModifiedFlag(TRUE); g_pView->ReleaseDC(pDC); m_nStep = 0;
::Prompt("请输入直线的起点"); break;
}
}
return 0;
}int CCreateLine::OnMouseMove(UINT nFlags, const Position& pos)
{
// 用一静态变量nPreRefresh记录进入OnMouseMove状态时的刷新次数
static int nPreRefresh = g_nRefresh;
// 布尔变量bRefresh说明在OnMouseMove过程中视窗是否被刷新
BOOL bRefresh = FALSE;
// nCurRefresh用于记录当前的刷新次数
int nCurRefresh = g_nRefresh;
// 如果nCurRefresh和nPreRefresh不相等,说明视窗曾被刷新过
if(nCurRefresh != nPreRefresh){
bRefresh = TRUE;
nPreRefresh = nCurRefresh;
}
switch(m_nStep)
{
case 0:
{
::Prompt("请输入直线的起点:");
break;
}
case 1:
{
Position prePos, curPos;
prePos = m_end;
if(nFlags & MK_SHIFT){
double dx = pos.x - m_begin.x;
double dy = pos.y - m_begin.y;
if(fabs(dx) >= fabs(dy))
curPos.Set(pos.x, m_begin.y);
else
curPos.Set(m_begin.x, pos.y);
}
else
curPos = pos;
CDC* pDC = g_pView->GetDC();
CLine* pTempLine1 = new CLine(m_begin, prePos);
if(!bRefresh)
// 当视窗没有被刷新时,重画原来的橡皮线使其被擦除
pTempLine1->Draw(pDC, dmDrag);
delete pTempLine1; CLine* pTempLine2 = new CLine(m_begin, curPos);
pTempLine2->Draw(pDC, dmDrag);
delete pTempLine2;
g_pView->ReleaseDC(pDC); m_end = curPos;
break;
}
}
return 0;
}int CCreateLine::OnRButtonDown(UINT nFlags, const Position& pos)
{
if(m_nStep ==1){
CDC* pDC = g_pView->GetDC();
Position prePos = m_end;
CLine* pTempLine = new CLine(m_begin, prePos);
pTempLine->Draw(pDC, dmDrag);
delete pTempLine;
g_pView->ReleaseDC(pDC); }
m_nStep = 0;
::Prompt("请输入直线的起点");
return 0;
}
/////////////////////////////////
void CLine::Draw(CDC * pDC, int drawMode /* = dmNormal */)
{
CPoint pt_begin, pt_end; // 屏幕坐标的起点和终点
// 将世界坐标转化为屏幕坐标
g_pView->WorldtoScreen(m_begin,pt_begin);
g_pView->WorldtoScreen(m_end,pt_end) ;
// 得到原来的绘图模式
int n = GetROP2(pDC->GetSafeHdc());
// 创建画笔的原则:
// 如果在正常的绘图模式下,使用成员变量创建画笔
// 如果是其它的模式,使用全局函数"SetDrawEnvir"创建画笔
CPen pen;
if( drawMode == dmNormal )
pen.CreatePen(m_lineStyle,m_lineWidth,m_color) ;
else
::SetDrawEnvir(pDC, drawMode, &pen);
// 得到原来的画笔
CPen* pOldPen = pDC->SelectObject(&pen);
pDC->SetMapMode(MM_LOENGLISH);
// 根据屏幕坐标绘制图元
pDC->MoveTo(pt_begin);
pDC->LineTo(pt_end);
// 恢复原来的画笔
pDC->SelectObject(pOldPen);
// 恢复原来的绘图模式
pDC->SetROP2(n);
}