• 全部
  • Windows SDK/API
  • 基础类
  • ActiveX
  • 数据库及相关技术
  • 网络及通讯开发
  • VCL组件使用和开发
  • 问答

做一个类似Ms 画图的程序,如何消除屏幕闪烁?

keikai 2002-03-18 08:11:56
画图代码如下:
//---------------------------------------------------------------------------
void __fastcall TFrmMain::ImageMouseDown(TObject *Sender,
TMouseButton Button, TShiftState Shift, int X, int Y)
{
if(Button != mbLeft)return;
Drawing = true;
Origin = Point(X,Y);
MovePt = Origin;
Image->Canvas->MoveTo(X, Y);
TVarRec tempvar[2] = {X, Y};
StatusBar->Panels->Items[0]->Text = Format("起点: (%d, %d)", tempvar, 2);

}
//---------------------------------------------------------------------------
void __fastcall TFrmMain::ImageMouseMove(TObject *Sender,
TShiftState Shift, int X, int Y)
{
if(!Shift.Contains(ssLeft))return;
if (Drawing){
if(DrawingTool == dtCurve)
Origin = MovePt;
DrawShape(Origin, MovePt, pmNotXor);
MovePt = Point(X, Y);
DrawShape(Origin, MovePt, pmNotXor);
}

TVarRec tempvar[2] = {X, Y};
StatusBar->Panels->Items[1]->Text = Format("终点: (%d, %d)", tempvar, 2);
}
//---------------------------------------------------------------------------
void __fastcall TFrmMain::ImageMouseUp(TObject *Sender,
TMouseButton Button, TShiftState Shift, int X, int Y)
{
if (Drawing)
{
DrawShape(Origin, Point(X, Y), pmCopy);
Drawing = False;
}

}
//---------------------------------------------------------------------------
void __fastcall TFrmMain::DrawShape(TPoint TopLeft, TPoint BottomRight, TPenMode AMode)
{
Image->Canvas->Pen->Mode = AMode;
switch(DrawingTool)
{
case dtText:
{
Image->Canvas->MoveTo(TopLeft.x,TopLeft.y);
break;
}
case dtLine:
{
Image->Canvas->MoveTo(TopLeft.x, TopLeft.y);
Image->Canvas->LineTo(BottomRight.x, BottomRight.y);
break;
}
case dtCurve:
{
Image->Canvas->MoveTo(TopLeft.x, TopLeft.y);
Image->Canvas->LineTo(BottomRight.x, BottomRight.y);
break;
}
case dtRect:
{
Image->Canvas->Rectangle(TopLeft.x, TopLeft.y, BottomRight.x, BottomRight.y);
break;
}
case dtEllipse:
{
Image->Canvas->Ellipse(TopLeft.x, TopLeft.y, BottomRight.x, BottomRight.y);
break;
}
case dtRoundRect:
{
Image->Canvas->RoundRect(TopLeft.x, TopLeft.y, BottomRight.x, BottomRight.y, (TopLeft.x - BottomRight.x)/10, (TopLeft.y - BottomRight.y)/10);
break;
}
case dtErase:
{
break;
}
case dtPict:
{
break;
}
}
}
...全文
16 点赞 收藏 6
写回复
6 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
keikai 2002-03-18
这个问题我检查了一下,发现原来是我的Image 的Transpanent属性为True 的缘故。
但是,我现在做的图片确实需要低下有一张背景图啊。
这可怎么办?100分求购啊。。。。。。
回复
keikai 2002-03-18
太感谢这几位大侠了。
尤其是那个dy_2000_abc(唐.吉柯德)老兄。
给分,给分。
呵呵,再问一个,
如何实现ms画板的那种在图片上面写文字的功能?橡皮的功能?
因为写文字,需要有一个可以接受输入焦点的控件。
是不是这个思路:
1、先Image->Canvas->DrawFocusRect(TRect&),
2、而后,将一个预先隐藏的TMemo控件放到这个框中。
3、让用户输入,等该控件失去焦点之后,将DrawFocusRect再作一次,消除
以前的选择框。
4、而后,将TMemo的的图形Copy 到我的Image上?
5、再将TMemo(清空)隐藏。
不知道各位大侠有没有什么好的主意?
不妨再多问一点,橡皮的功能如何实现?
回复
kingcaiyao 2002-03-18
重载窗口过程,MASK WM_ERASEBKGND消息:
class TForm1:public TForm
{
private:void __fastcall WMBK(TMessage &Message);
public:
BEGIN_MESSAGE_MAP
VCL_MESSAGE_HANDLER(WM_ERASEBKGND,TMessage,WMBK);
END_MESSAGE_MAP(TForm);

protected:

}

void __fastcall TForm1::WMBK(TMessage &Message)
{
HDC DC Image1->Canvas->Handle;
//add your code
TForm::Dispatch(&Message);


}
回复
dy_2000_abc 2002-03-18
也可以禁止其背景刷新,在头文件添加以下代码:
void __fastcall WMErasebkgnd(TMessage *Message)
{
//屏蔽WM_ERASEBKGND消息
}
BEGIN_MESSAGE_MAP
MESSAGE_HANDLER(WM_ERASEBKGND,TMessage *,WMErasebkgnd)
END_MESSAGE_MAP(TComponent)
回复
dy_2000_abc 2002-03-18
如果Image直接放在窗体上,Form1->DoubleBuffered=true;
如果Image放在其他控件上如:Panel,Panel->DoubleBuffered=true;
回复
我不懂电脑 2002-03-18
用两个TImage呀,一个作背景,一个装你的图片
回复
发帖
C++ Builder
创建于2007-08-02

1.3w+

社区成员

C++ Builder相关内容讨论区
申请成为版主
帖子事件
创建了帖子
2002-03-18 08:11
社区公告
暂无公告