`
剑&箫
  • 浏览: 54559 次
  • 性别: Icon_minigender_1
  • 来自: 长沙
社区版块
存档分类
最新评论

WindowsPhone开发之简单画图板的实现

阅读更多

这两天在摸索WindowsPhone应用程序的开发,实现了一个简单的画图板应用程序和一个简单的手机端与电脑端的通信应用程序。今晚先总结一下自己实现的画图板,画图板能够实现基本的画直线,矩形,三角形和圆形,废话少说,先上图,下面是实现的画图板的截图:



 

首先是在Visual Studio2010中新建一个WindowsPhone应用程序项目,按照以前Java实现画图板的思路,首先是在界面上显示几个按钮和一个面板。在WindowsPhone中组件的添加和android中是差不多,都是以类似于XML标签的形式添加的,然后可以设置各个标签的属性值。在我的程序中是添加四个按钮和一个面板,具体的代码(MainPage.xaml文件)如下:

<phone:PhoneApplicationPage 
    x:Class="Drawer.MainPage"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:phone="clr-namespace:Microsoft.Phone.Controls;assembly=Microsoft.Phone"
    xmlns:shell="clr-namespace:Microsoft.Phone.Shell;assembly=Microsoft.Phone"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    mc:Ignorable="d" d:DesignWidth="480" d:DesignHeight="768"
    FontFamily="{StaticResource PhoneFontFamilyNormal}"
    FontSize="{StaticResource PhoneFontSizeNormal}"
    Foreground="{StaticResource PhoneForegroundBrush}"
    SupportedOrientations="Portrait" Orientation="Portrait"
    shell:SystemTray.IsVisible="True">

    <!--LayoutRoot 是包含所有页面内容的根网格-->
    <Grid x:Name="LayoutRoot" Background="Transparent">
        <Grid.RowDefinitions>
            <RowDefinition Height="Auto"/>
            <RowDefinition Height="Auto" />
            <RowDefinition Height="*"/>
        </Grid.RowDefinitions>

        <!--TitlePanel 包含应用程序的名称和页标题-->
        <StackPanel x:Name="TitlePanel" Grid.Row="0" Margin="12,17,0,28">
            <TextBlock x:Name="ApplicationTitle" Text="我的画图板" Style="{StaticResource PhoneTextNormalStyle}"/>
            <TextBlock x:Name="PageTitle" Text="画图" Margin="9,-7,0,0" Style="{StaticResource PhoneTextTitle1Style}"/>
        </StackPanel>

        <!--ContentPanel - 在此处放置其他内容-->
        <Grid x:Name="ContentPanel" Grid.Row="1" Margin="12,0,12,0">
            <Grid.ColumnDefinitions>
                <ColumnDefinition Width="120"/>
                <ColumnDefinition Width="100"/>
                <ColumnDefinition Width="100"/>
                <ColumnDefinition Width="*"/>
            </Grid.ColumnDefinitions>
            <Button Name="save" HorizontalAlignment="Stretch" Content="长方形" 
                    Height="80" Background="Blue"  FontFamily="Arial" FontSize="20" 
                    Margin="-6,1,1,1" />
            <Button Grid.Column="1" Name="reck" Content="直线" FontFamily="Arial" FontSize="20"
                    Height="80" Background="Blue" Margin="0,1" HorizontalAlignment="Right" Width="100" />
            <Button Grid.Column="2" Name="line" HorizontalAlignment="Stretch" Content="圆形" 
                    Height="81" Background="Blue"  FontFamily="Arial" FontSize="20" 
                    Margin="1,1,5,0" />
            <Button Grid.Column="3" Name="rect" HorizontalAlignment="Stretch" Content="三角形" 
                    Height="80" Background="Blue"  FontFamily="Arial" FontSize="20" 
                    Margin="1,1,1,1" />
        </Grid>
        <Grid Grid.Row="2">
            <Canvas Name="canvas" Background="White">
                
            </Canvas>
        </Grid>
        
    </Grid>
</phone:PhoneApplicationPage>

 

需要注意的一点是<Grid.RowDefinitions></Grid.RowDefinitions>标签之间添加一行<RowDefinition Height="Auto" />,意思就是在原有界面上在划分出一行,因为原先刚创建工程时,界面上默认的只划分两行,同样可以以同样的方式添加更多的行。在一行中要定义列的话,是在<Grid.ColumnDefinitions></Grid.ColumnDefinitions>这一对标签之间添加,用<ColumnDefinition/>标签。

 

然后是要给各个组件添加监听器,添加监听器有两种方式,一种是以标签属性的方式添加的,就像写JS中的事件处理一样。另外一种是在MainPage.g.i.cs文件的public void InitializeComponent() 方法中添加,我的程序中是用到这一种方式的,添加的方式如下所示:

//给各个按钮添加点击事件监听器,监听器的方法:onButtonClick()
            this.save.Click += new RoutedEventHandler(this.onButtonClick);
            this.reck.Click += new RoutedEventHandler(this.onButtonClick);
            this.line.Click += new RoutedEventHandler(this.onButtonClick);
            this.rect.Click += new RoutedEventHandler(this.onButtonClick);
            //给Canvas添加鼠标左键按下和松开事件监听器,方法分别为:mouseLeftEnter()和mouseLeftUp()
            this.canvas.MouseLeftButtonDown += new MouseButtonEventHandler(this.mouseLeftEnter);
            this.canvas.MouseLeftButtonUp += new MouseButtonEventHandler(this.mouseLeftUp);

 以第二种方式添加监听器的时候,我发现了一个奇怪的现象:在添加保存之后关闭工程再重新打开,发现MainPage.g.i.cs文件中添加的代码不见,但是还是能够响应事件的发生,但是在不知道修改什么东西情况下,再运行程序,就不能够响应事件的发生了。可以能如MainPage.g.i.cs文件开头的注释所说:“对此文件的更改可能会导致不正确的行为,并且如果重新生成代码,这些更改将会丢失。”为了稳妥方便些,建议还是以第一种方式添加监听器。

 

如上面加监听器所示的代码,在MainPage.xaml.cs文件中定义的方法如下:

//画图起始点的坐标
        private double x1, x2, y1, y2;
        //形状的类型
        private String shapetype = "reck";
        
        // 构造函数
        public MainPage()
        {
            InitializeComponent();
        }

        //按下鼠标左键
        public void mouseLeftEnter(object sender, MouseButtonEventArgs e)
        {
            Point p = e.GetPosition(this.canvas);
            x1 = p.X;
            y1 = p.Y;
            //System.Windows.MessageBox.Show("x1:"+x1+"<>"+"y1:"+y1, "友情提示", MessageBoxButton.OK);
        }

        //松开鼠标左键得到坐标
        public void mouseLeftUp(object sender, MouseButtonEventArgs e) 
        {
            Point p = e.GetPosition(this.canvas);
            x2 = p.X;
            y2 = p.Y;

            if (shapetype.Equals("reck"))
            {
                //画直线
                Line line = new Line();

                line.Stroke = new SolidColorBrush(Colors.Blue);
                line.StrokeThickness = 5;
                line.X1 = x1;
                line.Y1 = y1;
                line.X2 = x2;
                line.Y2 = y2;

                this.canvas.Children.Add(line);
            }
            else if (shapetype.Equals("save"))
            {
                //画长方形
                Line line1 = new Line();
                Line line2 = new Line();
                Line line3 = new Line();
                Line line4 = new Line();
                line1.Stroke = new SolidColorBrush(Colors.Blue);
                line1.StrokeThickness = 5;
                line2.Stroke = new SolidColorBrush(Colors.Blue);
                line2.StrokeThickness = 5;
                line3.Stroke = new SolidColorBrush(Colors.Blue);
                line3.StrokeThickness = 5;
                line4.Stroke = new SolidColorBrush(Colors.Blue);
                line4.StrokeThickness = 5;

                line1.X1 = Math.Min(x1, x2);
                line1.Y1 = Math.Min(y1, y2);
                line1.X2 = Math.Max(x1, x2);
                line1.Y2 = Math.Min(y1, y2);

                line2.X1 = Math.Min(x1, x2);
                line2.Y1 = Math.Min(y1, y2);
                line2.X2 = Math.Min(x1, x2);
                line2.Y2 = Math.Max(y1, y2);

                line3.X1 = Math.Min(x1, x2);
                line3.Y1 = Math.Max(y1, y2);
                line3.X2 = Math.Max(x1, x2);
                line3.Y2 = Math.Max(y1, y2);

                line4.X1 = Math.Max(x1, x2);
                line4.Y1 = Math.Min(y1, y2);
                line4.X2 = Math.Max(x1, x2);
                line4.Y2 = Math.Max(y1, y2);

                this.canvas.Children.Add(line1);
                this.canvas.Children.Add(line2);
                this.canvas.Children.Add(line3);
                this.canvas.Children.Add(line4);
            }
            else if (shapetype.Equals("line"))
            {
                //画圆形
                Ellipse ellipse = new Ellipse();
                ellipse.Stroke = new SolidColorBrush(Colors.Blue);
                ellipse.StrokeThickness = 5;
                ellipse.Height = x1;
                ellipse.Width = y1;
                this.canvas.Children.Add(ellipse);
            }
            else if (shapetype.Equals("rect"))
            {
                //画三角形
                Line line1 = new Line();
                Line line2 = new Line();
                Line line3 = new Line();
                line1.Stroke = new SolidColorBrush(Colors.Blue);
                line1.StrokeThickness = 5;
                line2.Stroke = new SolidColorBrush(Colors.Blue);
                line2.StrokeThickness = 5;
                line3.Stroke = new SolidColorBrush(Colors.Blue);
                line3.StrokeThickness = 5;

                line1.X1 = Math.Min(x1, x2);
                line1.Y1 = Math.Max(y1, y2);
                line1.X2 = Math.Max(x1, x2);
                line1.Y2 = Math.Max(y1, y2);

                line2.X1 = Math.Max(x1, x2);
                line2.Y1 = Math.Max(y1, y2);
                line2.X2 = (x1 + x2) / 2;
                line2.Y2 = Math.Min(y1, y2);

                line3.X1 = Math.Min(x1, x2);
                line3.Y1 = Math.Max(y1, y2);
                line3.X2 = (x1 + x2) / 2;
                line3.Y2 = Math.Min(y1, y2);

                this.canvas.Children.Add(line1);
                this.canvas.Children.Add(line2);
                this.canvas.Children.Add(line3);
            }
            else
            {
                System.Windows.MessageBox.Show("其他形状还没实现", "友情提示", MessageBoxButton.OK);
            }

           //System.Windows.MessageBox.Show("x2:" + x2 + "<>" + "y2:" + y2, "友情提示", MessageBoxButton.OK);
        }
        
        //监听save按钮
        public void onButtonClick(object sender, RoutedEventArgs e)
        {
            shapetype = ((Button)sender).Name;
            System.Windows.MessageBox.Show(shapetype, "友情提示", MessageBoxButton.OK);
        }

 

在定义监听的方法时,需要注意的是方法名可以任意取,但是方法的参数要根据各种不同的监听情况传入。画各种形状时,不像Java中直接取得Graphic对象,然后画各种形状,也不像C#中可以通过createGraphic方法取得Graphic。在WindowsPhone中没有Graphic的对象,画各种二维图形很不方便,它是通过创建Line对象(直线)或者Ellipse对象(椭圆)等等,然后设置各种形状的值,最后把各种形状对象当做Canvas的子节点一样通过Canvas的Children对象的Add()方法添加到Canvas对象中,这样子画各种形状很没有灵活性。所以在我的程序中无法弄一个颜色选择器让用户选择颜色,只能在代码里面设置图形的颜色,线条的粗细,画的矩形是通过同时创建四个Line对象实现的,三角形也一样通过创建三个Line对象实现。而椭圆没有达到自己想要的效果,每次画出的椭圆都是和左边,上边的边相切的。在我查资料中发现有些人通过一个与平台无关的类库(PS:一下子记不起来了)取得Graphic2D对象就可以很方便的画出各种形状来。好了,现总结到这里吧。

 

  • 大小: 79.6 KB
1
1
分享到:
评论

相关推荐

    java 画图板 windows画图板简单实现

    在Java编程语言中,实现一个简单的Windows画图板是一个经典的练习,它可以帮助初学者更好地理解图形用户界面(GUI)的设计以及事件处理机制。这个项目通常会涉及到Java的Swing库,这是一个用于创建桌面应用程序的GUI...

    JavaFx开发Windows画图板工具

    本项目“JavaFx开发Windows画图板工具”旨在模仿Windows操作系统内置的画图应用,为用户提供一个简单的绘图环境。 首先,JavaFX的Scene类是构建应用界面的基础,它包含了所有可视组件和交互行为。在这个画图板工具...

    windows phone 开发书籍及资料

    Windows Phone开发是一个面向微软移动平台的技术,主要针对运行Windows Phone操作系统的智能手机。在这个领域,开发者可以利用Microsoft的工具和框架创建原生应用,为用户提供丰富的交互体验。以下是一些关于Windows...

    .Net全套视频教程之WindowsPhone开发-video

    【.Net全套视频教程之WindowsPhone开发-video】是一套针对Windows Phone平台的开发教程,旨在帮助开发者掌握在.Net框架下构建Windows Phone应用的技能。该教程涵盖了从基础到进阶的多个方面,包括使用XAML进行界面...

    MFC 简易画图板

    在本文中,我们将深入探讨如何使用Microsoft Foundation Class (MFC) 库来创建一个简易的画图板应用程序。MFC 是微软为Windows平台提供的一种C++类库,它简化了Windows API的使用,使得开发Windows应用程序更加高效...

    windows phone开发实例源码

    本资源“windows phone开发实例源码”提供了一套完整的Windows Phone应用程序开发实例,帮助初学者和经验丰富的开发者深入理解平台的工作原理,并提升开发技能。 首先,Windows Phone平台基于微软的.NET Framework...

    C# 高仿 Windows 画图板

    在本文中,我们将深入探讨如何使用C#编程语言高仿Windows自带的画图板应用程序,实现各种绘图功能。这个项目旨在提供一个类似的用户界面和功能集,包括打开和保存图片、文字绘制、多种形状绘制、画刷和画笔操作、...

    windows10画图板

    windows11的画图板存在bug,什么图层问题,输入文字之后会变模糊,每次输入文字的时候都需要重置字体和字体大小等等的问题,在这里给大家一个旧版本的画图板,就是windows10的画图板,windows10的画图板还是相对好用,在...

    画图板(C#实现

    总的来说,这个C#实现的画图板项目涵盖了计算机图形学的基础知识、事件驱动编程、用户界面设计以及文件操作等多个IT领域的关键概念,对于学习C#编程和Windows应用开发的初学者来说,是一个很好的实践项目。...

    简单画图板的设计

    "简单画图板的设计"是一个关于创建一个基本图形编辑器的话题,主要涉及到计算机图形学、用户界面设计以及可能的编程实现。在这个项目中,我们可能会遇到以下关键知识点: 1. **计算机图形学基础**:画图板应用的...

    windows画图板程序源码

    《Windows画图板程序源码解析与探讨》 在计算机编程领域,Windows画图板程序是一种常见的学习和实践窗口应用程序设计的案例。本篇文章将深入剖析"windows画图板程序源码",揭示其背后的原理和技术,以帮助读者更好...

    Windows Phone7开发教程汇总

    开发Windows Phone 7应用程序主要使用的是Visual Studio集成开发环境(IDE),配合C#编程语言和Silverlight技术。Silverlight是一种用于构建富媒体和交互式用户体验的框架,对于WP7应用开发来说,它提供了丰富的图形...

    windows phone开发手册(精选)

    《Windows Phone开发手册》是针对微软移动平台开发者的重要参考资料,尤其对那些想要深入理解并实践Windows Phone应用开发的程序员来说,这份资料具有很高的价值。Windows Phone操作系统,作为微软在移动领域的尝试...

    windows用QT实现画图工具

    在windows平台下用QT实现的画图工具 可移植 在windows平台下用QT实现的画图工具 可移植 在windows平台下用QT实现的画图工具 可移植 在windows平台下用QT实现的画图工具 可移植 在windows平台下用QT实现的画图工具 可...

    windows phone开发源代码18-24

    数据绑定是Windows Phone 8开发中的重要概念,它将UI元素与后台数据源连接起来,实现动态更新。通过数据绑定,UI可以自动反映数据源的变化,简化了应用的开发。 6. **事件处理**: 用户与应用的交互通常由事件...

    VC++实现简单的画图板程序

    在本项目中,"VC++实现简单的画图板程序"是一个基础级别的计算机图形学应用,主要目的是让初学者了解如何使用Microsoft Visual C++ (VC++) 编程环境来创建一个功能丰富的图形用户界面(GUI)应用程序。这个程序允许...

    virtual c++6.o mfc简易画图板

    本项目“virtual c++6.0 mfc简易画图板”正是基于VC++ 6.0的MFC库,实现了类似Windows自带画图板的功能,让用户能够进行简单的图形绘制,如直线、圆、矩形和椭圆,并且可以调整线条的颜色和类型。 一、MFC库介绍 ...

    WindowsPhone开发简单示例

    在这个特定的"WindowsPhone开发简单示例"中,我们看到开发工作主要基于C#语言,利用的是Windows Phone SDK 7.1版本。 C#是一种面向对象的编程语言,由微软公司推出,特别适合用于.NET框架下的应用程序开发。对于...

    深入浅出Windows Phone 8.1应用开发(Runtime框架)_源代码

    《深入浅出Windows Phone 8.1应用开发(Runtime框架)_源代码》这本书的源代码包含多个章节的内容,涉及了Windows Phone 8.1应用程序开发的关键技术。以下将逐一解析这些章节涉及的知识点。 1. **第7章** - 通常在这...

    Windows Phone游戏开发实战

    内容提要: 本书对WindowsPhoneXNA游戏开发的流程进行了详细的讲解,对其核心内容和开发技巧进行了深入的说明。...本书还针对WindowsPhone8的新特性以及如何将WindowsPhone7游戏向WindowsPhone8上迁移做了详细的说明。

Global site tag (gtag.js) - Google Analytics