⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 gpstracerappwmce5.aspx.htm

📁 This is a simple GPS tracer developed for Window Mobile 2005/2003 on Compact Framework 2.0 SDK. So f
💻 HTM
📖 第 1 页 / 共 5 页
字号:
<pre lang="cs">        <span class="code-keyword">public</span> Form1()
        {
            InitializeComponent();
            m_graphics = <span class="code-keyword">this</span>.CreateGraphics();
            m_mapper = <span class="code-keyword">new</span> Mapper(m_graphics, <span class="code-digit">0</span>, <span class="code-digit">30</span>, <span class="code-digit">240</span>, <span class="code-digit">300</span>);
            m_rTh = <span class="code-keyword">new</span> reader(m_port);
            m_rTh.dataReceived += <span class="code-keyword">new</span> reader.DataReceivedEventHandler(parse);
        }
</pre>

<p>The event registered method is called on the <code>DataReceived</code> event. With <code>m_isDemoMode==True</code>, the application will generate a randoom coordinate. </p>

<pre lang="cs">        <span class="code-keyword">public</span> <span class="code-keyword">void</span> parse(<span class="code-SDKkeyword">String</span> readed)
        {
            <span class="code-keyword">if</span> (!m_isDemoMode)
            {
                m_mapper.parseAndDraw(readed);
            }
            <span class="code-keyword">else</span>
            {
                Random r = <span class="code-keyword">new</span> Random();
                <span class="code-SDKkeyword">String</span> rSecond1 = (<span class="code-keyword">int</span>)(r.NextDouble() * <span class="code-digit">10</span> - <span class="code-digit">1</span>) + <span class="code-string">"</span><span class="code-string">"</span> + 
                                  (<span class="code-keyword">int</span>)(r.NextDouble() * <span class="code-digit">10</span> - <span class="code-digit">1</span>) + <span class="code-string">"</span><span class="code-string">"</span> + 
                                  (<span class="code-keyword">int</span>)(r.NextDouble() * <span class="code-digit">10</span> - <span class="code-digit">1</span>) + <span class="code-string">"</span><span class="code-string">"</span> + 
                                  (<span class="code-keyword">int</span>)(r.NextDouble() * <span class="code-digit">10</span> - <span class="code-digit">1</span>);
                <span class="code-SDKkeyword">String</span> rSecond2 = (<span class="code-keyword">int</span>)(r.NextDouble() * <span class="code-digit">10</span> - <span class="code-digit">1</span>) + <span class="code-string">"</span><span class="code-string">"</span> + 
                                  (<span class="code-keyword">int</span>)(r.NextDouble() * <span class="code-digit">10</span> - <span class="code-digit">1</span>) + <span class="code-string">"</span><span class="code-string">"</span> + 
                                  (<span class="code-keyword">int</span>)(r.NextDouble() * <span class="code-digit">10</span> - <span class="code-digit">1</span>) + <span class="code-string">"</span><span class="code-string">"</span> + 
                                  (<span class="code-keyword">int</span>)(r.NextDouble() * <span class="code-digit">10</span> - <span class="code-digit">1</span>);
                <span class="code-SDKkeyword">String</span> rPrime1 = (<span class="code-keyword">int</span>)(r.NextDouble() * <span class="code-digit">1</span> - <span class="code-digit">1</span>) + <span class="code-string">"</span><span class="code-string">"</span>;
                <span class="code-SDKkeyword">String</span> rPrime2 = (<span class="code-keyword">int</span>)(r.NextDouble() * <span class="code-digit">1</span> - <span class="code-digit">1</span>) + <span class="code-string">"</span><span class="code-string">"</span>;

                m_mapper.drawLatLong(<span class="code-string">"</span><span class="code-string">434"</span> + rPrime1 + <span class="code-string">"</span><span class="code-string">."</span> + rSecond1, 
                                     <span class="code-string">"</span><span class="code-string">0111"</span> + rPrime2 + <span class="code-string">"</span><span class="code-string">."</span> + rSecond2);
            }
        }</pre>

<p>This is the method that starts and stops the <code>Readed</code> thread. </p>

<pre lang="cs">        <span class="code-keyword">private</span> <span class="code-keyword">void</span> menuItemRunStop_Click(<span class="code-keyword">object</span> sender, EventArgs e)
        {
            <span class="code-keyword">if</span> (m_isRunning)
            {
                m_rTh.stop();
            }
            <span class="code-keyword">else</span>
            {
                m_rTh.start();
            }
            menuItemRunStop.Checked = !menuItemRunStop.Checked;
            m_isRunning = !m_isRunning;
        }</pre>

<p>This is the region that solves problem of panning the map on your touchscreen device. You can enable <code>m_mapper.clearAndDraw()</code> and it will clear the screen before it redraws the moved map. </p>

<div class="SmallText" id="premain3" style="width: 100%;"><img preid="3" src="GpsTracerAppWMCE5.aspx_files/minus.gif" id="preimg3" height="9" width="9"><span preid="3" style="margin-bottom: 0pt;" id="precollapse3"> Collapse</span></div><pre style="margin-top: 0pt;" id="pre3" lang="cs">        <span class="code-preprocessor">#region</span> Panning

        <span class="code-keyword">private</span> Point touch;
        <span class="code-keyword">private</span> <span class="code-keyword">void</span> Form1_MouseMove(<span class="code-keyword">object</span> sender, MouseEventArgs e)
        {
            <span class="code-keyword">if</span> (m_mapper != <span class="code-keyword">null</span>)
            {
                m_mapper.moveCenter(touch.X - e.X, touch.Y - e.Y);
                m_mapper.draw();<span class="code-comment">//</span><span class="code-comment">m_mapper.clearAndDraw();
</span>
            }
            touch.X = e.X;
            touch.Y = e.Y;
        }

        <span class="code-keyword">private</span> <span class="code-keyword">void</span> Form1_MouseDown(<span class="code-keyword">object</span> sender, MouseEventArgs e)
        {
            touch.X = e.X;
            touch.Y = e.Y;
        }


        <span class="code-keyword">private</span> <span class="code-keyword">void</span> Form1_MouseUp(<span class="code-keyword">object</span> sender, MouseEventArgs e)
        {
            Form1_MouseMove(sender, e);
            m_mapper.clearAndDraw();
        }

        <span class="code-preprocessor">#endregion</span></pre>

<h3>Reader</h3>

<p>Event exposed to <code>Form</code> on data received: </p>

<pre lang="cs">        <span class="code-keyword">public</span> <span class="code-keyword">delegate</span> <span class="code-keyword">void</span> DataReceivedEventHandler(<span class="code-keyword">string</span> data);
        <span class="code-keyword">public</span> <span class="code-keyword">event</span> DataReceivedEventHandler dataReceived;
</pre>

<p>The thread method that reads on serial port: </p>

<pre lang="cs">        <span class="code-keyword">private</span> <span class="code-keyword">void</span> methodTh()
        {
            m_serialPort1.Open();
            <span class="code-keyword">byte</span>[] buffer= <span class="code-keyword">new</span> <span class="code-keyword">byte</span>[<span class="code-digit">100</span>];
            <span class="code-keyword">while</span> (m_run)
            {
                Thread.Sleep(<span class="code-digit">500</span>);
                m_readed = m_serialPort1.ReadLine();
                <span class="code-keyword">if</span> (m_readed.Length &gt; <span class="code-digit">0</span>)
                {
                    dataReceived(m_readed);
                }
            }
        }</pre>

<p>These methods allow the <code>Form</code> to start and stop the reader thread: </p>

<pre lang="cs">        <span class="code-keyword">public</span> <span class="code-keyword">void</span> start()
        {
            <span class="code-keyword">if</span> (m_th == <span class="code-keyword">null</span>)
            {
                m_th = <span class="code-keyword">new</span> Thread(methodTh);
            }
            m_run = <span class="code-keyword">true</span>;
            m_th.Start();
        }

        <span class="code-keyword">public</span> <span class="code-keyword">void</span> stop()
        {
            m_run = <span class="code-keyword">false</span>;
            Thread.Sleep(<span class="code-digit">500</span>);
            m_serialPort1.Close();
            <span class="code-keyword">if</span> (m_th != <span class="code-keyword">null</span>)
            {
                m_th.Abort();
                m_th = <span class="code-keyword">null</span>;
            }
        }</pre>

<h3>Mapper</h3>

<p>Now follow me through the <code>Mapper</code> section. This is a simple method that parses the data read from the <code>Reader</code>. It's called by the <code>Form</code> on a <code>DataReceivedEvent</code>.</p>

<div class="SmallText" id="premain7" style="width: 100%;"><img preid="7" src="GpsTracerAppWMCE5.aspx_files/minus.gif" id="preimg7" height="9" width="9"><span preid="7" style="margin-bottom: 0pt;" id="precollapse7"> Collapse</span></div><pre style="margin-top: 0pt;" id="pre7" lang="cs">        <span class="code-keyword">public</span> <span class="code-keyword">void</span> parseAndDraw(<span class="code-keyword">string</span> s)
        {
            <span class="code-keyword">string</span>[] Words = s.Split(<span class="code-string">'</span><span class="code-string">,'</span>);

            m_g.FillRectangle(m_bgBrush, <span class="code-keyword">new</span> Rectangle(m_clip.X, 
                                         m_clip.Y + <span class="code-digit">5</span>, m_clip.Width, <span class="code-digit">15</span>));
            m_g.DrawString(s, m_font,m_fontBrush, <span class="code-keyword">new</span> RectangleF(m_clip.X ,
                           m_clip.Y + <span class="code-digit">5</span>, m_clip.Width, <span class="code-digit">15</span>));

            <span class="code-keyword">switch</span> (Words[<span class="code-digit">0</span>])
            {
                <span class="code-keyword">case</span> <span class="code-string">"</span><span class="code-string">$GPRMC"</span>:
                <span class="code-comment">//</span><span class="code-comment"> $GPRMC,170111,A,4338.5810,N,07015.1010,W,000.0,
</span>
                <span class="code-comment">//</span><span class="code-comment">        360.0,060199,017.5,W*73
</span>
                    <span class="code-comment">//</span><span class="code-comment"> RMC - Recommended minimum specific GPS/Transit data
</span>

                    <span class="code-keyword">if</span> (Words[<span class="code-digit">3</span>].Length &gt; <span class="code-digit">0</span> &amp;&amp; Words[<span class="code-digit">5</span>].Length &gt; <span class="code-digit">0</span>)
                    {
                        drawLatLong(Words[<span class="code-digit">3</span>], Words[<span class="code-digit">5</span>]);
                    }
                    <span class="code-keyword">break</span>;
                <span class="code-keyword">case</span> <span class="code-string">"</span><span class="code-string">$GPGSV"</span>:
                <span class="code-comment">//</span><span class="code-comment"> $GPGSV,2,1,08,03,17,171,42,06,21,047,44,14,
</span>
                <span class="code-comment">//</span><span class="code-comment">        28,251,45,16,25,292,44*71
</span>
                    <span class="code-comment">//</span><span class="code-comment"> GSV - Satellites in view
</span>
                    <span class="code-keyword">break</span>;
                <span class="code-keyword">case</span> <span class="code-string">"</span><span class="code-string">$GPGSA"</span>:
                <span class="code-comment">//</span><span class="code-comment"> $GPGGA,170111,4338.581,N,07015.101,W,1,
</span>
                          <span class="code-digit">00</span>,<span class="code-digit">2</span>.<span class="code-digit">0</span>,<span class="code-digit">1</span>.<span class="code-digit">1</span>,M,-31.<span class="code-digit">8</span>,M,,*71
                    <span class="code-comment">//</span><span class="code-comment">GSA - GPS dilution of precision and active satellites
</span>
                    <span class="code-keyword">break</span>;
                <span class="code-keyword">default</span>:
                    <span class="code-keyword">break</span>;
            }
        }</pre>

<p>The <code>drawLatLong()</code> method allows conversion of the latitude and longitude data. In the example, <code>latitude:<span class="code-digit">43</span> <span class="code-digit">38</span>.<span class="code-digit">5810</span></code> will be converted to <code><span class="code-digit">162710</span></code> using the formula <code><span class="code-digit">43</span>*360+34*60+5810</code>. At the end of parsing and conversion, it will add the data to the <code><span class="code-keyword">private</span> List<span class="code-keyword">&lt;</span>POINT<span class="code-keyword">&gt;</span> m_points;</code> and later it will call the method <code>draw()</code>.
This method will draw all of the lines that were not drawn before.
Obviously, on pan or application start this method will draw all
points. </p>

<div class="SmallText" id="premain8" style="width: 100%;"><img preid="8" src="GpsTracerAppWMCE5.aspx_files/minus.gif" id="preimg8" height="9" width="9"><span preid="8" style="margin-bottom: 0pt;" id="precollapse8"> Collapse</span></div><pre style="margin-top: 0pt;" id="pre8" lang="cs"><span class="code-keyword">public</span> <span class="code-keyword">void</span> drawLatLong(<span class="code-keyword">string</span> latitude, <span class="code-keyword">string</span> longitude)
{

    Point aPoint = <span class="code-keyword">new</span> Point();

    aPoint.X = 
      (Convert.ToInt32(latitude.Substring(latitude.Length - <span class="code-digit">4</span>, <span class="code-digit">4</span>)));
    aPoint.Y = 
      (Convert.ToInt32(longitude.Substring(longitude.Length - <span class="code-digit">4</span>, <span class="code-digit">4</span>)));

    aPoint.X += 
      (Convert.ToInt32(latitude.Substring(latitude.Length - <span class="code-digit">7</span>, <span class="code-digit">2</span>))) * <span class="code-digit">60</span>;
    aPoint.Y += 
      (Convert.ToInt32(longitude.Substring(longitude.Length - <span class="code-digit">7</span>, <span class="code-digit">2</span>))) * <span class="code-digit">60</span>;

    aPoint.X += 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -