MFC画矩形,只能画一个,画第二个的时候第一个就不见了,为什么?

u010705341 2015-07-20 12:23:04

#include "StdAfx.h"
#include "MarkDrawrectanglePlugin.h"
#include "RemoteSensingImageSystem.h"
#include "FrameworkTool/ViewArgs.h"
#include "FrameworkTool/ScrollHelper.h"
#include "FrameworkTool/ViewHelper.h"
#include "resource.h"
#include "afxwin.h"
#include <list>

namespace Plugins
{
CMarkDrawrectanglePlugin::CMarkDrawrectanglePlugin(ImageTool::CImage *&pImg,
FrameworkTool::CHistoryController* &pHistoryCntroller,
FrameworkTool::CViewArgs *pCurViewArgs,
UINT ID,
FrameworkTool::PluginPriority pluginPriority)
:m_pCurImg(pImg),m_pHistoryCntroller(pHistoryCntroller),CPluginInterface(pCurViewArgs,ID,pluginPriority)
{
p_count=1;
p_num=0;

}

void CMarkDrawrectanglePlugin::Execute()
{
//FrameworkTool::CCommandInterface *command = new Command::CCheckerCornerCommand(m_pCurImg,m_pHistoryCntroller);
//command->Execute(); //执行的是BackupFullImgToFileCommand::Execute()
//m_pHistoryCntroller->AddToUndoList(command);
}
void CMarkDrawrectanglePlugin::DoMouseLBtnUp(const CPoint &mousePos)
{
HCURSOR m_HCross=AfxGetApp()->LoadStandardCursor(IDC_CROSS);;
::SetCursor(m_HCross);
m_cLatterPoint = mousePos;
CPoint posInImg;
if (p_count)
{
m_bIsRefPointInImg = m_pViewArgs->GetViewHelper()->GetImagePos(mousePos,posInImg,m_pCurImg->GetImageWidth(),m_pCurImg->GetImageHeight());
if (m_bIsRefPointInImg)
{
p_corners[p_count]=posInImg;
switch(p_count)
{
case 2:
//m_pCurImg->RightUp=p_corners[1];
m_pCurImg->RightUp.x=p_corners[1].y;
m_pCurImg->RightUp.y=p_corners[1].x;
RDpoint.push_back(p_corners[1]);
p_count--;
p_num++;
break;
default:
break;
}

}
}
}
void CMarkDrawrectanglePlugin::DoMouseLBtnDown(const CPoint &mousePos )
{
HCURSOR m_HCross=AfxGetApp()->LoadStandardCursor(IDC_CROSS);;
::SetCursor(m_HCross);
m_cCurPoint = mousePos;
CPoint posInImg;
if (p_count)
{
m_bIsRefPointInImg = m_pViewArgs->GetViewHelper()->GetImagePos(mousePos,posInImg,m_pCurImg->GetImageWidth(),m_pCurImg->GetImageHeight());
if (m_bIsRefPointInImg)
{
p_corners[p_count]=posInImg;
switch(p_count)
{
case 1:
//m_pCurImg->LeftUp=p_corners[0];
m_pCurImg->LeftUp.x=p_corners[0].y;
m_pCurImg->LeftUp.y=p_corners[0].x;
LUpoint.push_back(p_corners[0]);
p_count++;
default:
break;
}

}
}
}

void CMarkDrawrectanglePlugin::DoMouseMove(const CPoint &mousePos )
{
mousePoint=mousePos;
}
void CMarkDrawrectanglePlugin::DoDraw(CDC *pDC,const CPoint &bltOffset)
{
#define coordinate(i,j) coordinate[m_pCurImg->GetImageWidth()*(j)+(i)]

int scale=m_pViewArgs->GetViewHelper()->GetViewScale();
int i,j,m,n;
CPoint A;
CPoint B;
CPoint scrollPos=m_pViewArgs->GetScrollHelper()->GetScrollPosition();
CPen pPenRed;

pPenRed.CreatePen(PS_SOLID,1,RGB(255,0,0));
pDC->SelectObject(&pPenRed);
CBrush *pBrush=CBrush::FromHandle((HBRUSH)GetStockObject(NULL_BRUSH));
pDC->SelectObject(&pBrush);

if (scale>100) //精确
{
float accurateScale = scale/100;
int offsetX=-scrollPos.x + bltOffset.x;
int offsetY=-scrollPos.y + bltOffset.y;
CPoint A;
CPoint B;


for (int ip=0;ip<p_num;ip++)
{
A=m_cCurPoint;
B=m_cLatterPoint;
i=A.x;
j=A.y;
m=B.x;
n=B.y;
/* if(RDpoint.size()==0||LUpoint.size()==0)break;
B=RDpoint.back();
A=LUpoint.back();
RDpoint.pop_back();
LUpoint.pop_back();
pDC->Rectangle(A.x,A.y,B.x,B.y);*/
/*CPoint leftPosInDC=CPoint(int(i*accurateScale+offsetX-1+0.5f),int(j*accurateScale+offsetY+0.5f));
CPoint rightPosInDC=CPoint(int(i*accurateScale+offsetX+1+0.5f),int(j*accurateScale+offsetY+0.5f));
CPoint topPosInDC=CPoint(int(i*accurateScale+offsetX+0.5f),int(j*accurateScale+offsetY-1+0.5f));
CPoint buttomPosInDC=CPoint(int(i*accurateScale+offsetX+0.5f),int(j*accurateScale+offsetY+1+0.5f));
pDC->MoveTo(leftPosInDC);
pDC->LineTo(rightPosInDC);
pDC->MoveTo(topPosInDC);
pDC->LineTo(buttomPosInDC);*/

pDC->MoveTo(A);
pDC->LineTo(A.x,B.y);
pDC->MoveTo(A.x,B.y);
pDC->LineTo(B.x,B.y);
pDC->MoveTo(B.x,B.y);
pDC->LineTo(B.x,A.y);
pDC->MoveTo(B.x,A.y);
pDC->LineTo(A);

}


}
else
{

float accurateScale=scale/100.0f;
int offsetX=-scrollPos.x + bltOffset.x;
int offsetY=-scrollPos.y + bltOffset.y;
CPoint C,D;
for (int ip=0;ip<p_num;ip++)
{

i=A.x;
j=A.y;
A=m_cCurPoint;
B=m_cLatterPoint;
pDC->MoveTo(A);
pDC->LineTo(A.x,B.y);
pDC->MoveTo(A.x,B.y);
pDC->LineTo(B.x,B.y);
pDC->MoveTo(B.x,B.y);
pDC->LineTo(B.x,A.y);
pDC->MoveTo(B.x,A.y);
pDC->LineTo(A);

}

}
}
}


...全文
520 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
向立天 2015-09-19
  • 打赏
  • 举报
回复
您好 我是本版版主 此帖已多日无人关注 请您及时结帖 如您认为问题没有解决可按无满意结帖处理 另外本版设置了疑难问题汇总帖 并已在版面置顶 相关规定其帖子中有说明 您可以根据规定提交您帖子的链接 如您目前不想结帖只需回帖说明 我们会删除此结帖通知 见此回复三日内无回应 我们将强制结帖 相关规定详见界面界面版关于版主结帖工作的具体办法
zyw067 2015-08-19
  • 打赏
  • 举报
回复
引用 17 楼 zhao4zhong1 的回复:
崩溃的时候在弹出的对话框按相应按钮进入调试,按Alt+7键查看Call Stack即“调用堆栈”里面从上到下列出的对应从里层到外层的函数调用历史。双击某一行可将光标定位到此次调用的源代码或汇编指令处,看不懂时双击下一行,直到能看懂为止。
多谢赵老师!
赵4老师 2015-08-18
  • 打赏
  • 举报
回复
崩溃的时候在弹出的对话框按相应按钮进入调试,按Alt+7键查看Call Stack即“调用堆栈”里面从上到下列出的对应从里层到外层的函数调用历史。双击某一行可将光标定位到此次调用的源代码或汇编指令处,看不懂时双击下一行,直到能看懂为止。
u010705341 2015-08-18
  • 打赏
  • 举报
回复
运行MFC,弹出提示框显示: Debug Assertion Failed! Program: D:... File: f:\dd\vctools\vc7libs\ship\atlmfc\src\mfc\appcore.cpp Line :280 Line:287 我查找本地库,发现appcore.cpp 280行和287行是两个断言: ASSERT (afxGetThread() == NULL); 和 ASSERT (afxCurrentWinApp == NULL); 这个怎么破啊,大神们
u010705341 2015-08-11
  • 打赏
  • 举报
回复
还有个问题,就是怎么保存矩形框的位置,难道就是保存四个点么?如果要保存很多矩形框的位置信息,应该怎么存储呢?
xiaolu_727 2015-08-05
  • 打赏
  • 举报
回复
我的理解: 默认绘制范围是整个客户区,OnDraw函数或者OnPaint函数应该会有参数说明要绘制的区域矩形范围,看代码我感觉第二次和第一次绘制区域相同,等于重新绘制。 Rectangle函数除了绘制矩形,它还有一个功能就是填充,默认是白色画刷,这点和MoveToEx和LineTo组合行为不同,后者仅仅是画线。
u010705341 2015-08-04
  • 打赏
  • 举报
回复
之前一直尝试使用空白画刷,画矩形,可是矩形并不是透明的,还是有白色的填充
大树学长 2015-07-28
  • 打赏
  • 举报
回复
记得要背景透明,不然会遮住绘制过的区域
二班的码农 2015-07-28
  • 打赏
  • 举报
回复
在画第二个图时,会引起窗口重绘,第一个当然就消失了,可以用一个类成员变量,变量为RECT数组,存储所有画过的矩形区域信息,再在OnPaint对其全部重绘
u010705341 2015-07-28
  • 打赏
  • 举报
回复
没有窗口挡在前面 还有我好奇为什么画空心矩形只能用四条边来话,不能直接rectangle函数,即使画刷是null,依然填充白色
Eleven 2015-07-22
  • 打赏
  • 举报
回复
引用 8 楼 u010420126 的回复:
楼主 你的MFC程序是没进行任何手动操作,一直在循环调用OnDraw里的DoDraw嘛 ?我也是遇到了类似情况,等大神解答。
因为一直在要求刷新,应该是有窗口挡在它前面了。
schlafenhamster 2015-07-22
  • 打赏
  • 举报
回复
“调试了,发现一直在调用OnDraw的 Dodraw,一直在重画一个矩形” 因为调试时, 显示在 主程序 与 调试程序间不断 切换 会 不断地有 OnDraw。 所以 要在for (int ip=0;ip<p_num;ip++) 里 调试, 一步一步看 程序 执行 情况, 要耐心。
此马非马 2015-07-22
  • 打赏
  • 举报
回复
楼主 你的MFC程序是没进行任何手动操作,一直在循环调用OnDraw里的DoDraw嘛 ?我也是遇到了类似情况,等大神解答。
u010705341 2015-07-21
  • 打赏
  • 举报
回复
调试了,发现一直在调用OnDraw的 Dodraw,一直在重画一个矩形
schlafenhamster 2015-07-21
  • 打赏
  • 举报
回复
在 for (int ip=0;ip<p_num;ip++) 里 单步 调试F10
u010705341 2015-07-20
  • 打赏
  • 举报
回复
也没发现有什么错呀,请问你能看出来哪里有错吗?
schlafenhamster 2015-07-20
  • 打赏
  • 举报
回复
for (int ip=0;ip<p_num;ip++) 是 主要语句 。 检查 p_num 及 各个 point
u010705341 2015-07-20
  • 打赏
  • 举报
回复
onpaint不行的哎,根本画不出来。。。。Dodraw可以画出来,只能画一个,第二个就擦去第一个了
schlafenhamster 2015-07-20
  • 打赏
  • 举报
回复
代码要放OnPaint中 click 只是 改变 绘制项 (Invalidate)

15,979

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧