博文

用VB 实现GPS 信息处理2(2005-09-29 20:19:00)

摘要:2. 2. 4  ShowData 过程

该过程具体实现GPS 信息在文本框区显示、采集的功能,它通过添加数据到txt Term 控件的Text 属性,过滤控制字符,如空格、回车、换行, 并且写数据到一个打开的记录文件。空格符从它的左侧删除,在Text 属性, 或

者从传递字符串中;换行符将被修改为回车; txt Term 控件的Text 属性的尺寸也被监视,使它不能超过MAX2TERMSIZE 的要求。其实现过程如下:

Private Static Sub ShowData ( Term As Control , Data As String)

On Error GoTo Handler

Const MAXTERMSIZE = 16000

Dim TermSize As Long , i

’以下为显示GPS 信息时用的变量

Dim InString As String

Dim Utils As New CParseUtils

Dim tempStr As String

Dim n As Integer

Dim cnt As Integer

’确定现存的文本不会太大

TermSize = Len ( Term. Text )

If TermSize > MAXTERMSIZE Then

 Term. Text = Mid $( Term. Text , 4097)

 TermSize = Len ( Term. Text )

End If

’指到txt Term 的数据的结尾处

Term. SelStart = TermSize

’过滤/ 处理空格符

Do

 i = InStr (Data , Chr $(8) )

 If i Then

   If i = 1 Then

    Term. SelStart = TermSize - 1

    Term. SelLength = 1

阅读全文(2580) | 评论:0

用VB 实现GPS 信息处理1(2005-09-29 20:18:00)

摘要:用VB 实现GPS 信息处理
0  引 言

目前,GPS 已在许多行业和领域得到广泛应用,但就如何将GPS 有关信息读入计算机以便进一步处理和应用,仍是大家普遍关心的问题。虽然目前GPS 接收仪的种类、功能各有差异,而且使用的通讯协议也比较多,但许多GPS 生产商都遵循NMEA0183 协议,并且这些GPS 都提供串行通讯接口。笔者试图从分析GPS 通讯NMEA0183 协议入手,以计算机实时读取、显示、存储、回放GPS信息为例,探讨用VB 实现GPS 信息处理的一些方法。

1  GPS 通讯的NMEA 协议

GPS 的通讯协议比较多,其中NMEA (National Ma2rine Electronics Association) , 0183 协议为GPS 接收机和其他航海电子产品的导航数据输出格式,是目前普遍使用且为大多数生产商遵循的协议之一,以下为其基本通讯参数及报文格式。

1. 1  GPS 串行通讯参数

波特率= 4800 ;无奇偶校验;数据位= 8 ;停止位= 1

1. 2  NMEA 0183 报文格式

NMEA 0183 协议报文的语句串(ASCII 字符) 格式全部信息可如下表示[1] :

$AAXXX,ddd. . . ddd , 3 hh < CR > < LF >

具体内容为:

$ 串头,表示串开始

AA  识别符

XXX 语句名

ddd &#8943;ddd  数据字段,字母或数字

,   逗号

3  星号,串尾

hh  $与3 之间所有字符代码的校验和

< CR >  回车控制符

< LF >  换行控制符

1. 3  报文示例说明

在具体的GPS 应用中,不需要用到NMEA 的全部信息,而是根据具体的工作,从中选取所需的信息,忽略其他信息。在文献[ 1 ]中,给出了用NMEA0813 的$GPGGA语句的数据格式及示例,文中以GPS 推荐的最短数据$GPRMC 语句为例,具体讨论协议串中各数据段内容......

阅读全文(2273) | 评论:0

VB使用WinSock设计网络五子棋(2005-09-29 14:17:00)

摘要: VB使用WinSock设计网络五子棋

   Visual Basic 6.0中文企业版为Windows环境下的网络开发提供了强大的工具,Winsock控件就是其中之一。利用 WinSock 控件可以与远程计算机建立连接,Winsock包含有用户数据文报协议 (UDP)和传输控制协议 (TCP)。可用这两种协议来建立客户与服务器应用程序来进行通数据交换。WinSock 控件解决了以往应用VB编程时网络中应用程序之间无法实现点对点通信的难题。用户仅通过设置属性并借助事件处理就能够轻而易举地连接到一个远程的计算机上,而且只用两个方法就可以实现数据交换其中Senddata方法用于发送数据;Getdata方法用来取数据。 

   一、Winsock的编程基础 

  1.TCP协议:TCP(Transfer Control Protocol)是传输控制协议的简称,是基于连接的协议,在数据传输之前必须先建立连接。通过TCP协议建立的是客户/服务器通信方式。 

    2.UDP协议: UDP(User Data Protocol)是用户数据文报协议的简称,两台计算机之间的传输类似于传递邮件;两者之间没有明确的连接,可作为服务器,也可作为客户机。 

使用UDP协议建立对等通信和通过TCP建立客户/服务器通信的方法略有不同,它不需要建立客户和服务器,而是建立对等通信。 

    3. Winsock属性: 

    LocalPort:返回或者设置所用到的本端口;如果指定的是端口 0,就使用一个随机端口。 

    Protocol:返回或设置Winsock所用的协议是TCP或UDP。 

阅读全文(4235) | 评论:0

气死看星星这一类软件(2005-09-29 12:59:00)

摘要:抱歉,据我再次测试,这个程序在某些时候会出问题。
所谓的某些时候就是指:我在一个普通文本框中迅速地按键,然后突然用鼠标点击经过这个程序处理过的文本框时,让它获得了焦点,这时,变量中就会记录下获得焦点之后的输入,但是,文本框中没有显示。
我想,可能是文本框获得焦点后就可以获取KeyPress和KeyDown事件,但是在一段时间内它不会对输入作出响应。
于是,我修改程序,害我增加了两个辅助变量。

修正版如下:

Dim Pws As String, Keya As Integer, Keyl As Integer

Private Sub TexPW_Change()
Select Case Keya
Case 8, 46
    If Keyl = 0 Then
        Pws = Left(Pws, TexPW.SelStart) & Mid(Pws, TexPW.SelStart + 2)
    Else
        Pws = Left(Pws, TexPW.SelStart) & Mid(Pws, TexPW.SelStart + Keyl + 1)
    End If
Case Else
    Pws = Left(Pws, TexPW.SelStart - 1) & Chr(Keya) & Mid(Pws, TexPW.SelStart + Keyl)
End Select
End Sub

Private Sub TexPW_KeyDown(KeyCode As Integer, Shift As Integer)
Keya = KeyCode: Keyl = TexPW.SelLength
End Sub

Private Sub T......

阅读全文(2670) | 评论:0

异步输入(2005-09-27 13:41:00)

摘要: 可以使用OPEN语句用随机方式打开文本文件,用GET语句将每个字符读入一个BYTE变量,逐个判断BYTE变量的ASCII码值是否为特殊字符,是则连续读入几个字符。
参考程序:
    Dim strFileName As String
    Dim iFileNum As Integer
    Dim strData As Byte
    
    cmDlg.Filter = "文文本文件(*。TXT)|*.txt|所有文件(*.*)|*.*"
    cmDlg.ShowOpen
    strFileName = cmDlg.FileName
    If Len(strFileName) > 0 Then
        iFileNum = FreeFile
        Open strFileName For Random As #iFileNum Len = 1
        Do While Not EOF(iFileNum)
            Get #iFileNum, , strData
            Debug.Print Chr(strData)
      &n......

阅读全文(2635) | 评论:0

SendMessage函数应用(四)(2005-09-27 13:29:00)

摘要: SendMessage函数应用(四)







这一期是SendMessage函数巧应用的最后一期了。在这一期中,我将向大家介绍关于Ric
hTextBox(简称RTF)控件的消息和ListView控件的消息控制各一。


在Windows消息中,以EM_开头的消息是专门控制TextBox类控件和RTF类控件的。下面介
绍的是如何利用EM_消息实现向RichTextBox中粘贴文本和位图.在EM_消息中,有一个EM_PA
STESPECIAL消息可以从剪贴板中获取文本或者位图类数据并拷贝到RTF上。消息调用范例如?br />拢?


Private Type repastespecial
dwAspect As Long
dwParam As Long
End Type


Const WM_USER = &H400
Const EM_PASTESPECIAL = WM_USER + 64
Const CF_BITMAP = 2
Const CF_TEXT = 1
Const DVASPECT_CONTENT = 1
Const DVASPECT_ICON = 4


Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" _
(ByVal hwnd As Long, _
ByVal wMsg As Long, _
ByVal wParam As Long, _
lParam As Any) As Long


Private Sub Command1_Click()
Dim re As repastespecial

re.dwAspect = DVASPECT_CONTENT
If Clipboard.GetFormat(vbCFText) Then '剪贴板中为文本信息
Call SendMessage(RichTextBox1.h......

阅读全文(1663) | 评论:0

SendMessage函数应用(三)(2005-09-27 13:28:00)

摘要: SendMessage函数应用(三)







在这一期的SendMessage函数应用中,我将向大家介绍如何利用消息函数来扩展树型列?br /> ?TreeView)控件的功能。相信对于树型列表控件大家十分的熟悉,典型的应用就是Windows
资源管理器中的目录列表。而在VB中,树型列表控件包含在Microsoft Windows Common Control 6.0(页可能是5.0,视你的VB或者系统版本而定)中。在Windows API中,有一系列的以TVM_ 开头的消息值,这些消息就是扩展树型列表控件所特定的消息值,下面向大家介绍其中的一
些应用


1、设置树型列表控件的背景颜色
首先做如下的定义:
Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" _
(ByVal hwnd As Long, _
ByVal wMsg As Long, _
ByVal wParam As Long, _
ByVal lParam As Long) As Long

Const TV_FIRST = &H1100
Const TVM_SETBKCOLOR = TV_FIRST + 29
然后再做如下调用:
Call SendMessage(TreeView1.hwnd, TVM_SETBKCOLOR, 0, RGB(255, 0, 0))
上面的SendMessage调用将TreeView1的背景颜色设置为红色。
大家可能注意到了。在上面的Sendmessage函数定义中,我们将lParam定义为 ByVal lParam As Long,而不是象前面的那些范例那样定义为Any或者String类型,关于这个问题,我会在最?br />蟮囊徽轮凶鼋樯堋?


2、设置树型列表控件标题行高度
利用TVM_SETITEMHEIGHT消息可以设定控件的标题行的高度,该消息的定义及调用方法如下?br />?br>定义:
Cons......

阅读全文(2258) | 评论:0

SendMessage函数应用(二)(2005-09-27 13:27:00)

摘要:






在上一篇文章中我向大家介绍了关于ListBox类控件消息的应用,在这一章我将向大家?br />樯苋绾卫孟⒉倏豑extBox类控件。


1、获得光标所在的行和列
一般的比较完善的文本编辑器一般都有在状态栏中显示当前光标所在行和列的功能。利
用SendMessage向TextBox控件发送编辑控件类型消息。也可以实现这样的功能。下面首先来
看程序,然后再分析。
首先在VB中建立一个新工程,并在Form1中加入一个TextBox控件和两个Label控件。将T
extBox控件的MultiLine属性设置为True。然后在Form1的代码窗口中加入如下代码:


Option Explicit


Private Declare Function SendMessage Lib "user32" Alias "SendMessageW" _
(ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, _
lParam As Any) As Long

Private Declare Function SendMessageByRef Lib "user32" Alias "SendMessageA" _
(ByVal hwnd As Long, ByVal wMsg As Long, wParam As Long, _
lParam As Long) As Long

Const EM_LINEFROMCHAR = &HC9
Const EM_LINEINDEX = &HBB
Const EM_GETLINE = &HC4
Const EM_GETSEL = &HB0


Dim iLineX, iLineY As Long


Sub GetCurPos(txtA As TextBox)
Dim l, l1, l2 As Long
Dim astr As S......

阅读全文(3316) | 评论:0

SendMessage函数应用(一)(2005-09-27 13:26:00)

摘要:
SendMessage函数应用(一)




在Windows编程中,向文本框控件、列表控件、按钮控件等是我们最常接触的控件了。?br />窃赩B中这些控件有时无法实现我们的需要。在这时,我们只要简单的利用Windows API函数就可以扩充这些控件的功能了。
顾名思义,SendMessage函数就是向窗口(这里的窗口指的是向按钮、列表框、编辑框?br />染哂衕Wnd属性的控件)发送消息的函数,该函数的定义如下:
Declare Function SendMessage Lib "user32" Alias "SendMessageA" _
(ByVal hwnd As Long, _
ByVal wMsg As Long, _
ByVal wParam As Long, _
lParam As Any) As Long

其中hwnd指定接受消息的窗口,参数wMsg指定消息值,参数wParam lParam分别定义传递到窗口的附加参数。而在Windows系统的很多消息中,有一些不仅仅是?br /> 峁┮桓龃翱谙⒛敲醇虻ァK强梢钥刂拼翱诘亩骱褪粜浴O旅嫖医执蜗蛳虼蠹医樯躍
endMessage函数在扩充基本控件功能方面的应用。


一、列表(ListBox)控件
在Windows中,有一系列的以LB_开头的列表消息,这里介绍的就是利用LB消息控制的ListBo
x的应用
1、使列表中光标移动到不同的列表项上有不同的提示(ToolTip)
在列表框控件中有一个ToolTipText属性,该属性决定了当光标在列表框上移动时出现的提?br />疚淖帧5侨绾问沟? 当光标在不同的列表项上移动时的提示文字也不同呢?问题的关键是要知道在光标移动时光
标所在的列表项的索引,使 用SendMessage函数发送LB_ITEMFROMPOINT消息就可以获得。下面是程序范例:


Option Explicit


Const LB_ITEMFROMPOINT = &H1A9


Privat......

阅读全文(2775) | 评论:0

如何在VB.NET中创建Windows应用程序之二(2005-09-27 13:21:00)

摘要: 如何在VB.NET中创建Windows应用程序之二 作者:苦丁 发文时间:2005.07.27 缺少控件数组

对于VB6开发者来说,在VB.NET中感觉很不方便的一点是缺少了控件数组。有什么办法来实现与控件数组相同的效果呢?从上文的.net中的事件处理机制我们知道,在.net中允许多个对象的事件使用同一个事件处理程序,那么结合一个标准数组就不难实现控件数组的效果了。

下面是一个简单的例子。

1.创建一个新的VB.NET Windows 应用程序。

2.在窗体上放置五个radio button,并在窗体上增加一个label。

3.双击一个radio button,会转到它的CheckedChanged事件处理程序,修改 Handles子句以包含其他四个的CheckedChanged事件。

Private Sub RadioButton1_CheckedChanged( _ ByVal sender As System.Object, _ ByVal e As System.EventArgs) _ Handles RadioButton1.CheckedChanged, _ RadioButton2.CheckedChanged, _ RadioButton3.CheckedChanged, _ RadioButton4.CheckedChanged, _ RadioButton5.CheckedChanged End Sub

4.创建一个radio buttons的数组作为一个私有成员变量:Dim radioButtons(4) As RadioButton

5.创建一个整形私有变量:Dim selectedOption As Integer = 0

6.在窗体构造器代码中增加代码以把这些radio button填充到数组中

Public Sub New() MyBase.New() 'This call is required......

阅读全文(2203) | 评论:0