这是一段橡皮筋操作的代码if (PressNum == 0) {//第一次按键将第一点保留在mPointOrign pDoc->group[PressNum] = point; PressNum++; mPointOrign = point; mPointOld = point;//记录第一点 SetCapture(); } else if (PressNum == 1) {//第二次按键调用文档类画圆程序画图 PressNum = 0; pDoc->BCircle(&ht, mPointOrign, point); ReleaseCapture(); } CView::OnLButtonDown(nFlags, point);怎么样修改它使得画完图后没有橡皮筋呢
时间: 2024-02-07 10:02:12 浏览: 15
要使画完图后没有橡皮筋,可以将以下两行代码注释掉:
```
mPointOld = point;//记录第一点
SetCapture();
```
这两行代码是用于记录鼠标按下的初始点并设置鼠标捕获,从而实现橡皮筋效果的。如果将它们注释掉,就不会再有橡皮筋效果了。同时,在最后调用`CView::OnLButtonDown(nFlags, point)`之前,需要添加一行代码:
```
Invalidate();
```
这行代码可以使得视图无效化,从而强制重绘,在画图结束后将橡皮筋清除。完整的修改后的代码如下:
```
if (PressNum == 0) {//第一次按键将第一点保留在mPointOrign
pDoc->group[PressNum] = point;
PressNum++;
mPointOrign = point;
//mPointOld = point;//记录第一点
//SetCapture();
}
else if (PressNum == 1) {//第二次按键调用文档类画圆程序画图
PressNum = 0;
pDoc->BCircle(&ht, mPointOrign, point);
ReleaseCapture();
Invalidate();
}
CView::OnLButtonDown(nFlags, point);
```
注意,这里只是简单地去掉了橡皮筋效果,如果需要完全去除橡皮筋功能,可能需要对其他部分的代码进行修改。
相关问题
使用mfc编程在窗口中一次绘制n=0~5的所有cantor集
好的,我理解了你的问题。首先,对于不了解 Cantor 集的人来说,它是由 Georg Cantor 发明的一类自相似的集合。Cantor 集是一个闭集,也就是说它包含所有的极限点。在 Cantor 集中,每个点都可以被表示为三进制数,其中每个数字可以是0、1或2。那么,我们可以使用 MFC 编程在窗口中一次性绘制 n=0~5 的所有 Cantor 集。
下面是代码示例:
```c++
void CCantorView::OnDraw(CDC* pDC)
{
CCantorDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
if (!pDoc)
return;
int nWidth = 700; // 窗口宽度
int nHeight = 400; // 窗口高度
int nMaxIter = 5; // 最大迭代次数
int nRectWidth = nWidth / pow(3, nMaxIter); // 矩形宽度
int nRectHeight = 20; // 矩形高度
int nXPos = 0; // 矩形起始横坐标
int nYPos = 50; // 矩形起始纵坐标
// 绘制 Cantor 集
for (int i = 0; i <= nMaxIter; i++)
{
for (int j = 0; j < pow(3, i); j++)
{
if (i == 0)
{
// 绘制第一级矩形
pDC->Rectangle(nXPos, nYPos, nXPos + nRectWidth, nYPos + nRectHeight);
nXPos += nRectWidth;
}
else
{
// 绘制更高级别的矩形
if (j % 3 != 1)
{
pDC->Rectangle(nXPos, nYPos, nXPos + nRectWidth, nYPos + nRectHeight);
}
nXPos += nRectWidth;
}
}
nXPos = 0;
nYPos += nRectHeight * 2;
nRectWidth /= 3;
}
}
```
这段代码会在窗口中绘制从 0 级到 5 级的所有 Cantor 集,其中每个级别的集合都在上一级别的集合上方。你可以在 `OnDraw` 函数中调用这个函数,然后在你的程序中使用该函数来绘制 Cantor 集。
void CDemoView::OnFileCreateCtl() { CDemoDoc* pDoc = GetDocument(); if (pDoc->GetCurrRgn() == NULL) { CRect rect(50, 50, 200, 200); CPanCtRgn *pRgn; // Create new region. TRY { pRgn = new CPanCtRgn(this, pDoc->GetCtrlID(), &rect); } CATCH(CMemoryException, memEx) { AfxMessageBox("Out of Memory"); return; } END_CATCH CObList* pList = pDoc->GetPanRgnList(); if (pList != NULL) { // Add region to list. pList->AddHead(pRgn); // Select new region. pDoc->Select(pRgn); } } }
这是一个在 "Create Control" 命令被触发时被调用的函数,用于创建一个新的控件区域。
首先,它获取文档对象的指针 `pDoc`,然后检查当前区域是否为NULL。如果当前区域为NULL,则进入条件语句。
在条件语句中,首先创建一个矩形区域 `rect`,表示新控件的位置和大小。然后,通过使用 `new` 运算符创建一个新的 `CPanCtRgn` 控件区域对象,并传递当前视图对象、控件ID和矩形参数。
接下来,通过异常处理机制(TRY-CATCH)检查内存分配是否成功。如果分配失败,则弹出一个消息框显示 "Out of Memory",并返回。
如果内存分配成功,获取文档对象中的控件区域列表 `pList`。如果列表不为空,则将新的控件区域添加到列表的头部,并通过 `Select()` 函数选中新创建的区域。
总之,这个函数的作用是创建一个新的控件区域,并将其添加到文档对象的控件区域列表中,并选中新创建的区域。