如何更改画布区域的颜色

时间:2018-12-30 16:32:21

标签: delphi canvas graphics c++builder vcl

我试图单击并拖动TCanvas,并在向下拖动时将背景色更改为clHighlight,如果要反转拖动方向,则将其更改回clWhite。如果您单击您正在阅读的文本并向下或向上拖动,无论如何都会发生几乎所有的事情。我已经从link

自从我第一次发布此代码以来,我已经对下面的代码进行了广泛的编辑,下面的代码现在可以执行我打算要做的事情,除了如果您不均匀拖动时所选内容中的文本可能会弄乱,这是不可接受的。如果您确实真正快速地上下移动鼠标,则肯定会弄乱它。如果您移动鼠标 它以稳定的速度运转良好,这使我担心可能无法解决该问题。如果有人有什么好建议,我会继续研究。我还遇到了几个“资源不足”错误,不确定是怎么回事,我正在释放位图,没有其他我知道的资源参与其中。

以下代码在MouseMove事件中。srect是TImage画布中的选定矩形。 drect与转换为0,0的相同rect。 bm1包含使用CopyRect从TImage的画布复制的选定矩形。 bm2包含bm1,并且使用BrushCopy将clWhite(背景)更改为clHighlight(或相反)。然后使用BitBlt将bm2复制回原始TImage的选定矩形。

    // vp is derived from TImage
    if (Y > sel_data->_last_y)
    {
      TRect srect = Rect(sel_data->_rect.Left,sel_data->_last_y,sel_data->_rect.Right, Y);
      TRect drect = Rect(sel_data->_rect.Left,0,sel_data->_rect.Right, sel_data->_rect.Height() - 1);
      Graphics::TBitmap* bm1 = new Graphics::TBitmap;
      bm1->Width = srect.Width();
      bm1->Height = srect.Height();
      Graphics::TBitmap* bm2 = new Graphics::TBitmap;
      bm2->Width = srect.Width();
      bm2->Height = srect.Height();

      bm1->Canvas->CopyRect(drect, vp->Canvas, srect);

      bm2->Canvas->Brush->Color = clHighlight;
      bm2->Canvas->BrushCopy(drect, bm1, drect, clWindow);

      BitBlt(vp->Canvas->Handle, srect.Left, srect.Top, srect.Width(), srect.Height(),
         bm2->Canvas->Handle, 0, 0, SRCCOPY);  
      vp->Refresh();
      delete bm1;
      delete bm2;
    }
    else if (Y < sel_data->_last_y)
    {
      TRect srect = Rect(sel_data->_rect.Left, Y,sel_data->_rect.Right, sel_data->_last_y);
      TRect drect = Rect(sel_data->_rect.Left,0,sel_data->_rect.Right, sel_data->_rect.Height() - 1);
      Graphics::TBitmap* bm1 = new Graphics::TBitmap;
      bm1->Width = srect.Width();
      bm1->Height = srect.Height();
      Graphics::TBitmap* bm2 = new Graphics::TBitmap;
      bm2->Width = srect.Width();
      bm2->Height = srect.Height();

      bm1->Canvas->CopyRect(drect, vp->Canvas, srect);

      bm2->Canvas->Brush->Color = clWhite;
      bm2->Canvas->BrushCopy(drect, bm1, drect, clHighlight);

      int w = srect.Width();
      int h = srect.Height();
      BitBlt(vp->Canvas->Handle, srect.Left, srect.Top, w, h, bm2->Canvas->Handle, 0, 0, SRCCOPY);  
      vp->Refresh();
      delete bm1;
      delete bm2;
    }
    sel_data->_last_y = Y;
  }

1 个答案:

答案 0 :(得分:0)

这就是我最终得到的结果,据我所知,所有故障已得到修复,包括整个MouseMove事件处理程序。上面提到的链接使我很困惑,因为我需要一个CopyRect,一个BrushCopy和一个BitBlt。

{{1}}