几个简单的画图问题!(100分)

  • 主题发起人 主题发起人 草在墙头
  • 开始时间 开始时间

草在墙头

Unregistered / Unconfirmed
GUEST, unregistred user!
1、怎样画任意曲线,按下鼠标左键不放开始画图
2、画直线时,想然线条跟随鼠标,怎么实现?
3、怎样取颜色的反值?
在线等待!
 
哪位大哥有这方面C#的原码??
分不够可以再加!!!
 
高手给我指点指点!!!
两天来什么都没搞出来!!!
急啊!!
救命啊!!
 
高手!你在哪里??
继续等待!!
 
列位,现在已经上班了,帮我看看问题!!
 
别这么着急:)
用gdi+和gdi画图一样,大部分功能更简单了。
1、怎样画任意曲线,按下鼠标左键不放开始画图
2、画直线时,想然线条跟随鼠标,怎么实现?
3、怎样取颜色的反值?
你这三个问题,基本上是一个问题,就是想实现一种橡皮筋效果。
这里gdi+没有提供足够的支持,没提供异或笔SETROP2.(据说是为了和打印统一处理的缘故)
要实现异或有两种方法
1。通过调用API,直接调用SETROP2
2。调用ControlPaint类的静态方法DrawReversibleLine等。
下面是调用API的例子实现的矩形橡皮筋
aspx.net xingze老兄提供(想你啊)
----------------------------------------------
//更详细的例子:
class SelectRect
{
[StructLayout(LayoutKind.Sequential)]
private struct RECT
{
public int left;
public int top;
public int right;
public int bottom;
}
[DllImport("GDI32.DLL")]
static extern int SetROP2(IntPtr hdc,int nDrawMode);

[DllImport("USER32.DLL")]
static extern int DrawFocusRect(IntPtr hdc,ref RECT lpRect);
private const int R2_NOTXORPEN = 10;
//member
private RECT m_rect;
private Graphics m_g;
private IntPtr m_hDC;
public void begin
Move(Graphics g, int x,int y) //Call at MouseDown
{
m_g=g;
m_hDC=m_g.GetHdc();
m_rect.left = m_rect.right = x;
m_rect.top = m_rect.bottom = y;
DrawSelectRect();
//绘制
}
public void Move(int x,int y) //call at MouseMove
{
DrawSelectRect();
//清除
m_rect.right = x;
m_rect.bottom = y;
DrawSelectRect();
//绘制
}
public Rectangle EndMove() // call at MouseUp
{
DrawSelectRect();
//清除
m_g.ReleaseHdc(m_hDC);
m_g.Dispose();
RECT rc=NormalizeRect(m_rect);
return (new Rectangle(rc.left,rc.top,rc.right,rc.bottom));
}
private void DrawSelectRect()
{
int nOldDrawMode=SetROP2(m_hDC,R2_NOTXORPEN);
RECT rc=NormalizeRect(m_rect);
DrawFocusRect(m_hDC,ref rc);
SetROP2(m_hDC,nOldDrawMode);
}
//标准化RECT结构
private RECT NormalizeRect(RECT rc)
{
RECT tmpRc=rc;
if (rc.left>rc.right)
{
tmpRc.left = rc.right;
tmpRc.right = rc.left;
}
if(rc.top > rc.bottom)
{
tmpRc.top = rc.bottom ;
tmpRc.bottom = rc.top;
}
return tmpRc;
}
}
使用方法:
private SelectRect MySelRect=new SelectRect();
private void Form1_MouseDown(object sender, System.Windows.Forms.MouseEventArgs e)
{
if (e.Button == MouseButtons.Left)
MySelRect.begin
Move(this.CreateGraphics(),e.X,e.Y);
}
private void Form1_MouseMove(object sender, System.Windows.Forms.MouseEventArgs e)
{
if (e.Button == MouseButtons.Left)
MySelRect.Move(e.X,e.Y);
}
private void Form1_MouseUp(object sender, System.Windows.Forms.MouseEventArgs e)
{
Rectangle rc;
if (e.Button == MouseButtons.Left)
{
rc=MySelRect.EndMove();
}
}

 
to chinaplate:先谢谢你!
2、3两个问题就如你所说,试一个问题,根据你提供的方法已解决,但问题1不是你说的那样,
就像在“附件/画图”中当选中‘铅笔’来进行画图一样。
能有什么方法来实现吗?
 
to chinaplate:
您提供的方法也只能画简单的Rect啊,我要是画其他的东西如线条、椭圆呢?又该怎么做呢?
不好意思,本人实在太菜!
 
GDI+提供了画线和弧的操作。
要实现橡皮筋必须实现异或以前画的线。所以我们才调用setrop2

1。当选中‘铅笔’来进行画图一样
要画图,就不要setrop重画了,鼠标跑到哪里就在哪里画点就是了。
我给你找个例子去...
 
谢谢chinaplate!!可DrawFocusRect只能画rect啊??画其他图形怎么解决呢?
 
如果你看过jjhou的《深入浅出mfc 2e》,你肯定会对scribble有印象。
它是一个简单的想画板一样乱画线的小程序。
这是vb的实现,vs.net的默认安装应该有.
C:/Program Files/Microsoft Visual Studio .NET/Vb7/VB Samples/WinForms-Scribble/Scribble
你如果把vs.net的例子都装全的话,应该有csharp的例子
/Visual Studio Projects/samples/VCSharp/General/Scribble
它能解决你的第一个问题。
 
没错!我正在看这个小例子!
你有MSN的号码吗?
 
Graphics提供了若干画图的方法
graphics.DrawArc 画弧
graphics.DrawLine 画线
在msdn中输入
ms-help://MS.VSCC/MS.MSDNVS.2052/cpref/html/frlrfsystemdrawinggraphicsmemberstopic.htm
 
zguosir@hotmail.com
 
接受答案了.
 
后退
顶部