精华内容
下载资源
问答
  • 模拟windows画图,基本功能可以实现,可以实现对图片的编辑
  • JS Paint一个用JS实现类似于windows画图工具
  • C# 高仿 Windows 画图

    2016-06-12 23:30:16
    C# 高仿 Windows 画图板,实现图片的打开/保存/文字绘制/矩形/圆形/椭圆形/圆角矩形/画刷/画笔/喷枪/曲线/取色等功能
  • jspaint是一款高仿windows画图工具的web端html5画图工具。jspaint以windows xp画图工具为原型,制作html5 canvas画图工具,并在此基础上增加新的功能
  • 7、画图颜色选择:可以画任何颜色的线条,通过OnEditColor()函数实现。 8、读取bmp位图:可以在电脑中选择一个bmp位图,在程序中显示出来,通过新建一个Cdib类来读取bmp文件信息再view类和Doc类调用来显示该位图。 9...
  • windows画图程序交互式

    2014-12-21 15:46:34
    一个windows画图程序,交互式,可实现图形的选中、放大缩小、拖拽、删除等功能;有图形圆,椭圆,矩形,直线等;
  • 类似windows画图板的功能 实现画直线 曲线 矩形 设置字体 颜色等功能
  • 模拟windows画图

    2015-03-17 12:29:45
    总的来说是一个画图程序,能够画出"直线","矩开","椭圆","圆角矩形","贝氏曲线","扇型","多边形"等一系列规则图形,还有工具"铅笔","橡皮擦","文字","选取",功能有新建(N)|78","打开(O)|79","保存(S)|83","另存为(A)...
  • 本程序功能Windows下附件中的画图软件功能相近。本程序是在VC6.0平台上用MFC所编,支持多文档和多视图结构,视图为滚动视图,允许分割窗口。绘制方面的功能主要包括绘制各种图元,包括直线、Bezier曲线、矩形、...
  • VC 仿Windows画图程序,源码可编译于VS2010环境,功能实现手绘线、文字输入、简单图形、图块及拖放、重复撤销、画面缩放、打开保存图片文件,另外为了直接从数据库或者XML中存取图片以及从Base64编码存取图片的...
  • 点击鼠标左键,然后拖动,松开左键,第一个坐标点会与后面各个点用彩色线条连接,若鼠标移动,线条颜色会随着改变
  • windows画图软件课程设计报告. 绘图工具主要的功能实现画图中所用的画点,直线,矩形,椭圆,折线及橡皮这些工具的使用,以及画板颜色的选择。当鼠标选择了这些工具时就可以根据需求做出想要的图画。
  • html5 canvas 模拟Windows 画图程序,初看上去,你会不会觉得这就是windows 的画图程序呢?界面和功能布局几乎是一样的,而且用起来也和Windows画图没啥区别,真心模拟的很像。运用Canvas技术来实现的画图程序。
  • ![图片说明](https://img-ask.csdn.net/upload/201905/18/1558162421_110003.png)
  • 仿WINDOWS画图

    2013-10-22 04:44:04
    Java SE学习完成后,自己练手项目五,《仿WINDOWS画图》,功能实现完毕,可以改进的地方,接口实现类可以用反射的方法生成对应的实例,这样似乎更省劲了。
  • 用vs2010编程,实现在窗口上画图功能。   void CDrawView::OnLButtonDown(UINT nFlags, CPoint point) { // TODO: Add your message handler code here and/or call default m_ptOrigin = point; m_...
  • windows程序画图,大体上有3种方法: (1)你告诉系统点的坐标和颜色,系统通过SetPixel来画。类似的,通过GetPixel来获取某一点像素值。 (2)使用MoveToEx、LineTo来划线,MoveToEx设置起点坐标,LineTo设置终点...

    本文将实现对基本图形的绘制:

    windows程序画图,大体上有3种方法:

    (1)你告诉系统点的坐标和颜色,系统通过SetPixel来画。类似的,通过GetPixel来获取某一点像素值。

    (2)使用MoveToEx、LineTo来划线,MoveToEx设置起点坐标,LineTo设置终点坐标,或者使用Polyline函数,这个函数接受一个POINT类型的数组,通过数组里的点连线。

    (3)windows提供了一些基本图形绘制的函数供我们直接调用,比如Rectangle绘制矩形,Ellipse绘制椭圆,RoundRect绘制圆角椭圆。

    有几点需要特别注意:

    (1)实际上画椭圆也是先画矩形,然后计算内接椭圆得出的。

    (2)画矩形(椭圆)时都是指定左上角和右下角画图,这与我们平时使用的画图软件(画图、visio)里是同样的,可以想象,他们实现的画图的方法应该与这里相同。

    (3)程序运行的结果,使得对角线被椭圆遮挡住了。如果改变顺序,最后画对角线,就没有遮挡发生。这说明,画出的图,是“实心的”,不能简单的理解为只有轮廓。

    对以上基本功能实现的代码如下:

    #include <windows.h>
    #include <math.h>
    #define NUM 1000
    #define TWOPI (2*3.14159)
    
    LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
    
    int WINAPI WinMain(HINSTANCE hInstance,		//当前实例句柄
    	HINSTANCE hPrevInstance, //先前实例句柄
    	LPSTR lpCmdLine,			//命令行
    	int iCmdShow)			//显示状态
    {
    	static TCHAR szAppName[] = TEXT("画图");
    	//窗口句柄
    	HWND hwnd;
    	//消息
    	MSG msg;
    	//窗口类
    	WNDCLASS wndclass;
    	//窗口风格:当移动窗口或者改变大小时重绘窗口
    	wndclass.style = CS_HREDRAW | CS_VREDRAW;
    	//指明回调函数
    	wndclass.lpfnWndProc = WndProc;
    	//额外的比特用来确认下一个窗口类的位置,暂时不用
    	wndclass.cbClsExtra = 0;
    	//额外的比特用来确认下一个窗口实例的位置,暂时不用
    	wndclass.cbWndExtra = 0;
    	//实例句柄
    	wndclass.hInstance = hInstance;
    	//装载图标
    	wndclass.hIcon = LoadIcon(NULL, IDI_APPLICATION);
    	//装载光标
    	wndclass.hCursor = LoadCursor(NULL, IDC_ARROW);
    	//背景为白色
    	wndclass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
    	//菜单:暂时没有
    	wndclass.lpszMenuName = NULL;
    	//窗口类名
    	wndclass.lpszClassName = szAppName;
    
    	//注册窗口
    	if (!RegisterClass(&wndclass))
    	{
    		return -1;
    	}
    
    	//创建窗口
    	hwnd = CreateWindow(
    		szAppName,				//窗口类的名称,必须是已经注册的
    		TEXT("我的画图"),		//窗口标题
    		WS_OVERLAPPEDWINDOW,	//窗口风格
    		CW_USEDEFAULT,			//X坐标
    		CW_USEDEFAULT,			//Y坐标
    		CW_USEDEFAULT,			//宽度
    		CW_USEDEFAULT,			//高度
    		NULL,					//父窗口句柄
    		NULL,					//菜单窗口句柄
    		hInstance,				//高级版本的windos忽略
    		NULL);
    
    	//显示窗口
    	//ShowWindow(hwnd,SW_SHOWNA);
    	ShowWindow(hwnd, iCmdShow);
    
    	//更新窗口
    	UpdateWindow(hwnd);
    
    	//消息循环
    	while (GetMessage(&msg, NULL, 0, 0))
    	{
    
    		TranslateMessage(&msg);
    		//将消息给窗口
    		DispatchMessage(&msg);
    
    	}
    
    	return msg.wParam;
    
    }
    
    
    LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
    {
    	HDC hdc;
    	PAINTSTRUCT ps;
    	int i, j;
    	static int cxClient, cyClient;
    	POINT apt[NUM];
    
    
    	switch (message)
    	{
    	case WM_SIZE:
    		cxClient = LOWORD(lParam);
    		cyClient = HIWORD(lParam);
    
    
    		return 0;
    	case WM_PAINT:
    		hdc = BeginPaint(hwnd, &ps);
    	
    		//画出渐变的颜色
    		for(i = 0;i < 500;i++)
    		{
    			for(j = 0; j < 26;j++)
    			{
    				SetPixel(hdc,200+i,200+j,RGB(i,j*10,0));
    			}
    		}
    		Sleep(5000);
    
    		//划线
    	
    		//用点划线
    		for(i = 0; i < 500;i++)
    		{
    			for (int j = 0; j < 500; j++)
    			{
    				if (j % 50 == 0)
    				{
    					SetPixel(hdc, i, j, RGB(0, 0, 0));
    				}
    				
    			}
    		}
    		Sleep(5000);
    
    		//用函数划线
    		MoveToEx	(hdc,0,			cyClient/2,NULL);
    		LineTo		(hdc,cxClient,	cyClient/2);
    		for(int i = 0;  i< NUM;i++)
    		{
    			//把x轴等分成1000份
    			apt[i].x = i * cxClient / NUM;
    			apt[i].y = (int) (cyClient / 2 * (1-sin(TWOPI * i /NUM)));
    			//LineTo(hdc,apt[i].x,apt[i].y);
    		}
    
    		//Polyline绘制,速度快于在for循环内LineTo
    		Polyline(hdc,apt,NUM);
    		Sleep(5000);
    
    		//绘制矩形
    		Rectangle(hdc, cxClient / 8, cyClient / 8,
    			7 * cxClient / 8, 7 * cyClient / 8);
    		Sleep(5000);
    
    		//绘制对角线
    		MoveToEx(hdc, 0, 0, NULL);
    		LineTo(hdc, cxClient, cyClient);
    		MoveToEx(hdc, 0, cyClient, NULL);
    		LineTo(hdc, cxClient, 0);
    		Sleep(5000);
    
    		//绘制椭圆
    		Ellipse(hdc, cxClient / 8, cyClient / 8,
    			7 * cxClient / 8, 7 * cyClient / 8);
    		Sleep(5000);
    
    		//绘制圆角矩形
    		RoundRect(hdc, cxClient / 4, cyClient / 4,
    			3 * cxClient / 4, 3 * cyClient / 4,
    			//最后两个参数是圆角矩形的圆角形成的椭圆的长和宽
    			cxClient / 4, cyClient / 4);
    		Sleep(5000);
    
    		EndPaint(hwnd, &ps);
    		return 0;
    
    
    	case WM_DESTROY:
    		PostQuitMessage(0);
    		return 0;
    	}
    	return DefWindowProc(hwnd, message, wParam, lParam);
    }
    
    
    展开全文
  • 基于qt实现画图

    2018-10-31 14:39:38
    基于qt实现画图板,内含基本的绘画功能,例如选取画笔,填充,图像打开和保存等。
  • 类似Windows画图的简单绘图程序.rar类似Windows画图的简单绘图程序.rar
  • VC++实现画图功能

    2012-10-19 18:13:31
    使用VC开发平台,MFC框架实现一个画图程序,尽可能多的实现Windows自带的画图功能,并扩展其功能。
  • 仿windows画图

    2010-08-14 19:38:02
    仿windows画图板程序,基本实现windows画图板的功能
  • C# 画图板 源代码 实现了基本功能

    热门讨论 2008-12-29 16:39:41
    是开源代码。 这个是本人用C#写的一个画图板程序,实现了画轨迹,...可以取前景色,背景色,可以显示鼠标的坐标,可以保存当前所画的内容等等功能,总的来说,功能不是很强大,但是作为一个写画图板的参考是很不错的。
  • android实现简单画图功能

    千次阅读 2017-02-09 15:36:38
    模拟Windows画图软件,简单的画图和颜色选择 0x01 :package com.itheima.scrawl;import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.OutputStream;import ...

    0x00 :
    模拟Windows画图软件,简单的画图和颜色选择
    0x01 :

    package com.itheima.scrawl;
    
    import java.io.File;
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.io.OutputStream;
    
    import com.itheima.scrawl.R;
    
    import android.net.Uri;
    import android.os.Bundle;
    import android.os.Environment;
    import android.app.Activity;
    import android.content.Intent;
    import android.graphics.Bitmap;
    import android.graphics.Bitmap.CompressFormat;
    import android.graphics.Canvas;
    import android.graphics.Color;
    import android.graphics.Matrix;
    import android.graphics.Paint;
    import android.util.Log;
    import android.view.Menu;
    import android.view.MenuItem;
    import android.view.MotionEvent;
    import android.view.View;
    import android.view.View.OnClickListener;
    import android.view.View.OnTouchListener;
    import android.widget.ImageView;
    import android.widget.SeekBar;
    import android.widget.SeekBar.OnSeekBarChangeListener;
    
    public class MainActivity extends Activity implements OnClickListener, OnSeekBarChangeListener, OnTouchListener {
    
        private static final String logTAG = "MainActivity";
        private Canvas canvas;
        private Matrix matrix;
        private Paint paint;
        private Bitmap blankBitmap;
        private ImageView iv;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
            iv = (ImageView) findViewById(R.id.iv);
            // 1.查找原图
    
            // 2.创建拷贝
            //Log.v(logTAG, iv.getHeight() + " # " + iv.getWidth()); //需要等ImageView加载完成才能正确
            blankBitmap = Bitmap.createBitmap(320, 307, Bitmap.Config.ARGB_8888);
    
            // 3.创建画布
            canvas = new Canvas(blankBitmap);
            canvas.drawColor(Color.WHITE);
    
            // 4.
            matrix = new Matrix();
    
            // 5.
            paint = new Paint();
    
            // 6.
            canvas.drawBitmap(blankBitmap, matrix, paint);
    
            findViewById(R.id.btn_Red).setOnClickListener(this);
            findViewById(R.id.btn_Green).setOnClickListener(this);
            findViewById(R.id.btn_Blue).setOnClickListener(this);
            findViewById(R.id.btn_Purple).setOnClickListener(this);
            findViewById(R.id.btn_Yellow).setOnClickListener(this);
            ((SeekBar)findViewById(R.id.sb_PaintWidth)).setOnSeekBarChangeListener(this);
    
            iv.setOnTouchListener(this);
            paint.setStrokeWidth(5);
        }
    
        @Override
        public boolean onCreateOptionsMenu(Menu menu) {
            getMenuInflater().inflate(R.menu.main, menu);
    
            return true;
        }
    
        @Override
        public boolean onMenuItemSelected(int arg0, MenuItem arg1) {
            switch (arg1.getItemId()) {
            case R.id.menuItem_Clear:
                Log.v(logTAG, "清空图像");
                if (canvas == null || paint == null || matrix == null) {
                    Log.v(logTAG, "Clear Bitmap Error!");
                    return false;
                }
                canvas.drawColor(Color.WHITE);
                iv.setImageBitmap(blankBitmap);
                break;
            case R.id.menuItem_Save:
                Log.v(logTAG, "Save");
                OutputStream outputstream;
                try {
                    File file = new File(Environment.getExternalStorageDirectory().getAbsolutePath(),  + System.currentTimeMillis() + ".jpg");
                    outputstream = new FileOutputStream(file);
                    blankBitmap.compress(CompressFormat.JPEG, 100, outputstream);
                    outputstream.close();
                    // 4.4之后也可以使用!
                    Intent intent = new Intent();
                    intent.setAction(Intent.ACTION_MEDIA_MOUNTED);
                    intent.setData(Uri.fromFile(file));
                    sendBroadcast(intent);
                } catch (IOException e) {
                    e.printStackTrace();
                }
                break;
            default:
                Log.v(logTAG, "Menu Error!");
                break;
            }
    
    //      // 4.4之后无法使用!
    //      Intent intent = new Intent();
    //      intent.setAction(Intent.ACTION_MEDIA_MOUNTED);
    //      intent.setData(Uri.parse("file://"));
    //      sendBroadcast(intent);
    
    
    
            return super.onMenuItemSelected(arg0, arg1);
        }
    
        //颜色选择器的点击事件
        @Override
        public void onClick(View v) {
            if (paint == null)
                return;
            switch (v.getId()) {
            case R.id.btn_Red:
                paint.setColor(Color.RED);
                Log.v(logTAG, "Red!");
                break;
            case R.id.btn_Green:
                paint.setColor(Color.GREEN);
                Log.v(logTAG, "Green!");
                break;
            case R.id.btn_Blue:
                paint.setColor(Color.BLUE);
                Log.v(logTAG, "Blue!");
                break;
            case R.id.btn_Purple:
                paint.setColor(0xffff00ff);
                Log.v(logTAG, "Purpel!");
                break;
            case R.id.btn_Yellow:
                paint.setColor(Color.YELLOW);
                Log.v(logTAG, "Yellow!");
                break;
            default:
                Log.v(logTAG, "颜色选择错误!");
                break;
            }
        }
    
        //画笔粗细的点击事件
        @Override
        public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
    //      Log.v(logTAG, "onProgressChanged!");
        }
    
        @Override
        public void onStartTrackingTouch(SeekBar seekBar) {
    //      Log.v(logTAG, "onStartTrackingTouch!");
        }
    
        @Override
        public void onStopTrackingTouch(SeekBar seekBar) {
            Log.v(logTAG, "onStopTrackingTouch!");
            paint.setStrokeWidth(seekBar.getProgress());
    
        }
    
        //画布的监听
        float startx = 0;
        float starty = 0;
        float stopx = 0;
        float stopy = 0;
        @Override
        public boolean onTouch(View v, MotionEvent event) {
            if (canvas == null || paint == null || matrix == null) {
                Log.v(logTAG, "init Error!");
                return false;
            }
    
            switch (event.getAction()) {
            case MotionEvent.ACTION_DOWN:
                startx = event.getX();
                starty = event.getY();
                stopx = startx;
                stopy = starty;
                break;
            case MotionEvent.ACTION_MOVE:
                startx = stopx;
                starty = stopy;
                stopx = event.getX();
                stopy = event.getY();
                break;
            case MotionEvent.ACTION_UP:
                break;
            default:
                Log.v(logTAG, "获取焦点失败!");
                break;
            }
    
            Log.v(logTAG, startx + " # " + starty + " # " + stopx + " # " + stopy);
            canvas.drawLine(startx, starty, stopx, stopy, paint);
            iv.setImageBitmap(blankBitmap);
    
            return true;
        }
    }

    0x03 :
    参考:
    http://www.jb51.net/article/46023.htm

    http://blog.csdn.net/x605940745/article/details/18040027

    //当拖动条发生变化时调用该方法
    public void onProgressChanged(SeekBar seekBar,int progress,Boolean fromUser)
    {System.out.println(progress);}
    //当用户开始滑动滑块时调用该方法(即按下鼠调用一次)
    public void onStartTrackingTouch(SeekBar seekBar){System.out.println(“start:=>”+seekBar.getProgress());}
    //当用户结束对滑块滑动时,调用该方法(即松开鼠标)
     public void onStopTrackingTouch (SeekBar seekBar)
    {System.out.println(“stop:=>”+seekBar.getProgress());}}
    为SeekBar绑定监听器:
    seekBar.SetOnSeekBarChangeListener(new SeekBarListener());实现接口时用this代替new SeekBarListener())

    http://blog.csdn.net/lsyz0021/article/details/51214082

    //要想对菜单项设置点击事件需要复写一个方法
    @Override
    public boolean onMenuItemSelected(int featureId, MenuItem item) {
        //获取当前点击的菜单项的Id
        switch (item.getItemId()) {
        case R.menu.action_back​:
            Toast.makeText(getApplicationContext(), "后退", 0).show();
            break;
        case R.menu.action_go:
            Toast.makeText(getApplicationContext(), "前进", 0).show();
            break;
    
        case R.menu.refresh:
            Toast.makeText(getApplicationContext(), "刷新", 0).show();
            break;
    
        }
    
        return super.onMenuItemSelected(featureId, item);
    }

    http://www.cnblogs.com/salam/archive/2011/04/04/2005329.html

    展开全文
  • 这是一款基于WinForm应用程序的画图板主要实现了一下功能 1、操作:主要包括读取图片...该源码可以在windows窗体上直接画图,也可以选择一张图片进行操作,基本上实现画图的基本功能。有兴趣的朋友可以下载研究下!
  • 目录功能梳理部分代码实现绘图工具的功能实现手动调节画布大小 功能梳理 主要实现功能:画直线,矩形,橡皮,圆形,切换颜色,打开图片,保存图片,清除图片,手动调节画布大小;软件刚启动时,为一张空白画布,我们...

    功能梳理

    主要实现功能:画直线,矩形,橡皮,圆形,切换颜色,打开图片,保存图片,清除图片,手动调节画布大小;软件刚启动时,为一张空白画布,我们可以直接在画布上绘画,也可以通过菜单中的“打开”,导入一张图片,然后我们就可以在这张图片上进行绘制。
    由于代码过多,在这里只简要介绍下制作步骤,大家可以下载
      1.对整个界面进行布局.
      2.实现绘图工具的功能
      3.实现颜色拾取的功能,这里我们直接拿上次写的自定义控件来用.
      4.实现菜单功能
      5.实现手动调节画布大小的功能

    部分代码

    实现绘图工具的功能

    我们要实现将打开后的图片在修改后重新保存就必须让文件在打开后就能关闭,否则就会因为文件打开而无法覆盖原文件。就会导致编译时弹出“GDI  一般性错误”。所以根据网上其它朋友的做法就是先将打开的图片通过GDI+将图片画到另一个画布上,然后及时关闭打开的图片和用来绘制该图片的画板。
    代码:

     private void openPic_Click(object sender, EventArgs e)
            {
                OpenFileDialog ofd = new OpenFileDialog();//实例化文件打开对话框
                ofd.Filter = "JPG|*.jpg|Bmp|*.bmp|所有文件|*.*";//设置对话框打开文件的括展名
                if (ofd.ShowDialog() == DialogResult.OK)
                {
                    Bitmap bmpformfile = new Bitmap(ofd.FileName);//获取打开的文件
                    panel2.AutoScrollPosition = new Point(0,0);//将滚动条复位
                    pbImg.Size = bmpformfile.Size;//调整绘图区大小为图片大小
    
                    reSize.Location = new Point(bmpformfile.Width, bmpformfile.Height);//reSize为我用来实现手动调节画布大小用的
                    //因为我们初始时的空白画布大小有限,"打开"操作可能引起画板大小改变,所以要将画板重新传入工具类
                    dt.DrawTools_Graphics = pbImg.CreateGraphics();
    
                    Bitmap bmp = new Bitmap(pbImg.Width, pbImg.Height);
                    Graphics g = Graphics.FromImage(bmp);
                    g.FillRectangle(new SolidBrush(pbImg.BackColor), new Rectangle(0, 0, pbImg.Width, pbImg.Height));//不使用这句话,那么这个bmp的背景就是透明的
                    g.DrawImage(bmpformfile, 0, 0,bmpformfile.Width,bmpformfile.Height);//将图片画到画板上
                    g.Dispose();//释放画板所占资源
                    //不直接使用pbImg.Image = Image.FormFile(ofd.FileName)是因为这样会让图片一直处于打开状态,也就无法保存修改后的图片
                    bmpformfile.Dispose();//释放图片所占资源
                    g = pbImg.CreateGraphics();
                    g.DrawImage(bmp, 0, 0);
                    g.Dispose();
                    dt.OrginalImg = bmp;
                    bmp.Dispose();
                    sFileName = ofd.FileName;//储存打开的图片文件的详细路径,用来稍后能覆盖这个文件
                    ofd.Dispose();
    
                }
            }
    

    实现手动调节画布大小

    代码如下:
    (放置一个picturebox1(尺寸为5*5),将它固定在主画板的右下角,然后改变鼠标进入时的Cursor为箭头形状,设置鼠标按下移动时的事件)

    private bool bReSize = false;//是否改变画布大小
            private void reSize_MouseDown(object sender, MouseEventArgs e)
            {
                bReSize = true;//当鼠标按下时,说明要开始调节大小
            }
    
            private void reSize_MouseMove(object sender, MouseEventArgs e)
            {
                if (bReSize)
                {
                    reSize.Location = new Point(reSize.Location.X + e.X, reSize.Location.Y + e.Y);
    
                }
            }
    
            private void reSize_MouseUp(object sender, MouseEventArgs e)
            {
                bReSize = false;//大小改变结束
                //调节大小可能造成画板大小超过屏幕区域,所以事先要设置autoScroll为true.
                //但是滚动条的出现反而增加了我们的难度,因为滚动条上下移动并不会自动帮我们调整图片的坐标。
                //这是因为GDI绘图的坐标系不只一个,好像有三个,没有仔细了解,一个是屏幕坐标,一个是客户区坐标,还个是文档坐标。
                //滚动条的上下移动改变的是文档的坐标,但是客户区坐标不变,而location属性就属于客户区坐标,所以我们直接计算会出现错误
                //这时我们就需要知道文档坐标与客户区坐标的偏移量,这就是AutoScrollPostion可以提供的
    
                pbImg.Size = new Size(reSize.Location.X - (this.panel2.AutoScrollPosition.X), reSize.Location.Y - (this.panel2.AutoScrollPosition.Y));
                dt.DrawTools_Graphics = pbImg.CreateGraphics();//因为画板的大小被改变所以必须重新赋值
    
                //另外画布也被改变所以也要重新赋值
                Bitmap bmp = new Bitmap(pbImg.Width, pbImg.Height);
                Graphics g = Graphics.FromImage(bmp);
                g.FillRectangle(new SolidBrush(Color.White), 0, 0, pbImg.Width, pbImg.Height);
                g.DrawImage(dt.OrginalImg, 0, 0);
                g.Dispose();
                g = pbImg.CreateGraphics();
                g.DrawImage(bmp, 0, 0);
                g.Dispose();
                dt.OrginalImg = bmp;
    
                bmp.Dispose();
            }
    

    完整代码点击下载
    https://download.csdn.net/download/ssssswsrjhtdj/16595892

    展开全文
  • 用VC实现类似Windows自带的画图板的功能 可以实现画矩形、椭圆、点、线段,根据鼠标轨迹随意画图,可以选择画笔的颜色,含详细源代码
  • 类似windows画图版C#

    热门讨论 2007-12-24 22:20:43
    实现Windows应用程序,功能类似Windows的“画图”工具,其中,“类型”分组框中包含五个按钮: 1) “画笔”功能类似“画图”软件中的“铅笔”,用户可以随意的绘制图形; 2) “直线”功能类似“画图”软件...
  • 这段时间在学JAVA的swing界面开发,试着做了个画图板。实现了直线、曲线、喷枪、矩形、圆形、文字、橡皮...虽然技术有限不能做的一模一样,但感觉还是能看(手动滑稽)。下面就讲讲如何实现了。 首先不用想,肯定...

    /*文章中用到的代码只是一部分,需要源码的可通过邮箱联系我 1978702969@qq.com*/

    这段时间在学JAVA的swing界面开发,试着做了个画图板。实现了直线、曲线、喷枪、矩形、圆形、文字、橡皮等操作,感觉收获很大。

    既然要做画图板,那最好的参考当然是windows系统自带的画图啦!虽然技术有限不能做的一模一样,但感觉还是能看(手动滑稽)。下面就讲讲如何实现了。

    首先不用想,肯定是先把界面做好了(这是我做的界面,emmmmmm。。。。功能和界面都还有待完善)

    仔细看一看大概就能想到怎么实现了,首先创建一个DrawMain类继承(extends)JFrame类

    public class DrawMain extends JFrame {
    
    	public static void main(String[] args) {
    		DrawMain dm = new DrawMain();
    		dm.setLookAndFeel();
    		dm.initUI();
    	}
    
    	/**
    	 * 为主面板设置皮肤,这个是我随便找的一个,具体可以自己去研究
    	 */
    
    	public void setLookAndFeel() {
    
    		try {
    
    			UIManager.setLookAndFeel("com.sun.java.swing.plaf.nimbus.NimbusLookAndFeel");
    
    		} catch (Exception e) {
    
    			e.printStackTrace();
    
    		}
    
    	}
    
    	public void initUI() {
    		this.setTitle("画图程序");
    		this.setSize(1000, 700);
    		this.setDefaultCloseOperation(3);
    		this.setLocationRelativeTo(null);
    		this.setLayout(new BorderLayout());
    	     this.setVisible(true);
    
    }
    

      这当然只是主界面啦,那后面该怎么弄呢?上面可以有那么多个分区当然需要再放几个容器类型的组件啦。就是组件里放组件了,那么此时布局的选择很重要,首先利用主界面是BroderLayout,就在北方向上放上一个JPanel上去咯

    		JPanel NorthJPanel = new JPanel();
    		NorthJPanel.setLayout(new FlowLayout(FlowLayout.LEFT, 1, 0));
    		NorthJPanel.setBackground(new Color(240, 240, 240));//设置背景色
              //NorthJPanel.setBorder(BorderFactory.createEtchedBorder(new Color(0, 0, 0), new Color(0, 255, 0)));设置边框,可以看看有什么区别 this.add(NorthJPanel, BorderLayout.NORTH);

      运行一下,再拉拉边框,有什么发现没有?这个刚贴上去的组件大小会随着你拉边框而改变,所以我们应该再贴一个JPanel到这个JPanel里,然后再设置好大小防止改变

    		JPanel InNorthJPanel = new JPanel();
    		InNorthJPanel.setLayout(new FlowLayout(FlowLayout.LEFT, 1, 0));
    		InNorthJPanel.setPreferredSize(new Dimension(900, 150));
    		InNorthJPanel.setBackground(new Color(240, 240, 240));
    		NorthJPanel.add(InNorthJPanel);
    

      然后该怎么做呢?设置分区,自然,每个分区就是一个JPanel组件

    /*
    		 * 形状区域
    		 * 
    		 * @param ShapeJPanel 形状区域的面板,界面布局
    		 * 
    		 * @param InShapeJPanel 形状区域中放置形状选项的面板,放在ShapeJPanel中,流式布局
    		 * 
    		 * @param InShapeLabel 形状区域中标识区域的标签,放在ShapeJPanel中
    		 */
    		JPanel ShapeJPanel = null;
    		ShapeJPanel = createJPanel(InNorthJPanel);
    		ShapeJPanel.setPreferredSize(new Dimension(300, 150));
    		JPanel InShapeJPanel = new JPanel();
    		InShapeJPanel.setLayout(new FlowLayout(FlowLayout.LEFT, 5, 5));
    		InShapeJPanel.setBackground(null);// 设置背景色透明
    		InShapeJPanel.setOpaque(false);
    		InShapeJPanel.setPreferredSize(new Dimension(300, 110));
    		ShapeJPanel.add(InShapeJPanel, BorderLayout.NORTH);
    		JLabel InShapeLabel = null;
    		InShapeLabel = createJLabel("形状", ShapeJPanel);
    
    		/*
    		 * 颜色区域
    		 * 
    		 * @param ColorJPanel 颜色区域面板,界面布局
    		 * 
    		 * @param InColorJPanel 颜色区域中放置颜色选项的面板,放在ColorJPanel中,流式布局
    		 * 
    		 * @param InColorLabel 颜色区域中标识区域的标签,放在ColorJPanel中
    		 */
    		JPanel ColorJPanel = null;
    		ColorJPanel = createJPanel(InNorthJPanel);
    		JPanel IncolorJPanel = new JPanel();
    		IncolorJPanel.setPreferredSize(new Dimension(200, 110));
    		IncolorJPanel.setBackground(null);// 设置背景色透明
    		IncolorJPanel.setOpaque(false);
    		IncolorJPanel.setLayout(new FlowLayout(FlowLayout.LEFT, 5, 5));
    		ColorJPanel.add(IncolorJPanel, BorderLayout.NORTH);
    		JLabel InColorLabel = null;
    		InColorLabel = createJLabel("颜色", ColorJPanel);
    
    		/*
    		 * 粗细设置区域
    		 * 
    		 * @param StrokeJPanel 粗细设置区域面板,界面布局
    		 * 
    		 * @param InStrokeJPanel 粗细设置区域中放置粗细选项的面板,放在StrokeJPanel中,流式布局
    		 * 
    		 * @param InStrokeLabel 粗细设置区域的标签,放在StrokeJPanel中
    		 */
    		JPanel StrokeJPanel = null;
    		StrokeJPanel = createJPanel(InNorthJPanel);
    		StrokeJPanel.setPreferredSize(new Dimension(50, 150));
    		JPanel InStrokeJPanel = new JPanel();
    		InStrokeJPanel.setPreferredSize(new Dimension(50, 110));
    		InStrokeJPanel.setBackground(null);
    		InStrokeJPanel.setOpaque(false);
    		InStrokeJPanel.setLayout(new FlowLayout(FlowLayout.LEFT, 5, 5));
    		StrokeJPanel.add(InStrokeJPanel, BorderLayout.NORTH);
    		JLabel InStrokeLabel = null;
    		InStrokeLabel = createJLabel("粗细", StrokeJPanel);
    

      可能你会发现,我在里面用了createJLabel()和createJPanel(),这是我写的方法,因为在创建过程中很多代码是重复的,自己写两个方法用在里面代码看上去会舒服很多,而且也能少写很多代码。两个方法的具体实现

         private JPanel createJPanel(JPanel InNorthJPanel) {
    		JPanel jp = new JPanel();
    		jp.setBorder(BorderFactory.createEtchedBorder(new Color(0, 0, 0), new Color(0, 255, 0)));
    		jp.setPreferredSize(new Dimension(200, 150));
    		jp.setBackground(new Color(240, 240, 240));
    		InNorthJPanel.add(jp);
    		return jp;
    	}
    
    	private JLabel createJLabel(String s, JPanel jp) {
    		JLabel jl = new JLabel(s);
    		jl.setHorizontalAlignment(JLabel.CENTER);// 设置对其格式剧中
    		jl.setFont(new Font("楷体", Font.BOLD, 20));// 设置字体 样式 大小
    		jp.add(jl, BorderLayout.SOUTH);
    		return jl;
    	}
    

      这样上面的边框就做好了,接下来就是贴按钮和文本框之类的了

              /*
    		 * 放置按钮
    		 */
    		String[] typeArray = { "Line", "Oval", "Rect", "RoundRect", "fill3DRect", "fillArc", "Image", "Text", "Pencil",
    				"iso_Tri", "Polygon","喷枪", "Erase" };
    		Color[] colorArray = { Color.red, Color.black, Color.green, Color.BLUE, new Color(255, 255, 255) };
    		String[] widthArray = { "1", "3", "5" };
    		JTextField text = new JTextField();
    		text.setPreferredSize(new Dimension(100, 30));
    
    		DrawListener dl = new DrawListener(this, text, list);
    
    		for (int i = 0; i < typeArray.length; i++) {
    			JButton button = new JButton(typeArray[i]);
    			InShapeJPanel.add(button);
    			button.addActionListener(dl);
    			if(i>=12)
    			{
    				JButton button1 = new JButton(typeArray[i]);
    				InNorthJPanel.add(button);
    				button1.addActionListener(dl);
    			}
    		}
    		for (int i = 0; i < colorArray.length; i++) {
    			JButton button = new JButton();
    			button.setBackground(colorArray[i]);
    			button.setPreferredSize(new Dimension(30, 30));
    			IncolorJPanel.add(button);
    			button.addActionListener(dl);
    		}
    		for (int i = 0; i < widthArray.length; i++) {
    			JButton button = new JButton(widthArray[i]);
    			InStrokeJPanel.add(button);
    			button.addActionListener(dl);
    		}
    		InNorthJPanel.add(text);
    

      这样,我们的界面就做好了。

     

    转载于:https://www.cnblogs.com/csu-lmw/p/9285065.html

    展开全文
  • 今天做的是用python实现画图,画出你想要的图案,只要你的想象力足够丰富,以及能够合理的运用这个turtle模块,基本可以画出你想要的东西出来。 而且如果真要看turtle的画笔的效果的话,用python自带的idea来编写会...
  • MFC写的画图板(类似Windows自带的画图,功能非常强大的)

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 15,013
精华内容 6,005
关键字:

windows的画图功能不能实现