home *** CD-ROM | disk | FTP | other *** search
/ Eagles Nest BBS 6 / Eagles_Nest_Mac_Collection_Disc_6.TOAST / Windows / VisBasAPIex / VBAPIGUIDE.image / TEXTMSGS.FRM < prev    next >
Text File  |  1994-01-19  |  7KB  |  255 lines

  1. VERSION 2.00
  2. Begin Form TextMsgs 
  3.    Caption         =   "Text Control Messages Demo"
  4.    Height          =   4710
  5.    Left            =   1035
  6.    LinkMode        =   1  'Source
  7.    LinkTopic       =   "Form1"
  8.    ScaleHeight     =   4020
  9.    ScaleWidth      =   7365
  10.    Top             =   1140
  11.    Width           =   7485
  12.    Begin VScrollBar VScroll1 
  13.       Height          =   1935
  14.       LargeChange     =   5
  15.       Left            =   3360
  16.       Max             =   1
  17.       TabIndex        =   4
  18.       Top             =   1500
  19.       Width           =   315
  20.    End
  21.    Begin TextBox Text1 
  22.       Height          =   3015
  23.       Left            =   120
  24.       MultiLine       =   -1  'True
  25.       TabIndex        =   0
  26.       Text            =   "Text control example"
  27.       Top             =   600
  28.       Width           =   3015
  29.    End
  30.    Begin Label LabelShowLine 
  31.       BorderStyle     =   1  'Fixed Single
  32.       Height          =   315
  33.       Left            =   3780
  34.       TabIndex        =   3
  35.       Top             =   2340
  36.       Width           =   3495
  37.    End
  38.    Begin Label LabelLinenum 
  39.       Height          =   315
  40.       Left            =   3780
  41.       TabIndex        =   5
  42.       Top             =   1980
  43.       Width           =   1455
  44.    End
  45.    Begin Label LabelResult 
  46.       BorderStyle     =   1  'Fixed Single
  47.       Height          =   255
  48.       Left            =   4380
  49.       TabIndex        =   2
  50.       Top             =   600
  51.       Width           =   2835
  52.    End
  53.    Begin Label Label1 
  54.       Alignment       =   1  'Right Justify
  55.       Caption         =   "Result:"
  56.       Height          =   255
  57.       Left            =   3420
  58.       TabIndex        =   1
  59.       Top             =   600
  60.       Width           =   915
  61.    End
  62.    Begin Menu MenuSetup 
  63.       Caption         =   "Setup"
  64.       Begin Menu MenuFillText 
  65.          Caption         =   "FillText"
  66.       End
  67.    End
  68.    Begin Menu MenuTests 
  69.       Caption         =   "Tests"
  70.       Begin Menu MenuLineCount 
  71.          Caption         =   "LineCount"
  72.       End
  73.       Begin Menu MenuFirstVisible 
  74.          Caption         =   "FirstVisible"
  75.       End
  76.       Begin Menu MenuSelected 
  77.          Caption         =   "Selected"
  78.       End
  79.       Begin Menu MenuLinesVisible 
  80.          Caption         =   "LinesVisible"
  81.       End
  82.    End
  83. End
  84.  
  85. Sub Form_Load ()
  86.     ' Initialize the display line command
  87.     UpdateDisplayLine
  88. End Sub
  89.  
  90. '
  91. ' Determines the number of lines actually visible in the
  92. ' text control.
  93. '
  94. '
  95. Function GetVisibleLines% ()
  96.     Dim rc As Rect
  97.     Dim hdc%
  98.     Dim lfont%, oldfont%
  99.     Dim tm As TEXTMETRIC
  100.     Dim di%
  101.  
  102.     ' Get the formatting rectangle - this describes the
  103.     ' rectangle in the control in which text is placed.
  104.     lc% = SendMessage(Text1.hWnd, EM_GETRECT, 0, rc)
  105.  
  106.     ' Get a handle to the logical font used by the control.
  107.     ' The VB font properties are accurately reflected by
  108.     ' this logical font.
  109.     lfont% = SendMessageBynum(Text1.hWnd, WM_GETFONT, 0, 0&)
  110.     
  111.     ' Get a device context to the text control.
  112.     hdc% = GetDC(Text1.hWnd)
  113.  
  114.     ' Select in the logical font to obtain the exact font
  115.     ' metrics.
  116.     If lfont% <> 0 Then oldfont% = SelectObject(hdc%, lfont%)
  117.  
  118.     di% = GetTextMetrics(hdc%, tm)
  119.     ' Select out the logical font
  120.     If lfont% <> 0 Then lfont% = SelectObject(hdc%, oldfont%)
  121.  
  122.     ' The lines depends on the formatting rectangle and font height
  123.     GetVisibleLines% = (rc.bottom - rc.top) / tm.tmHeight
  124.  
  125.     ' Release the device context when done.
  126.     di% = ReleaseDC(Text1.hWnd, hdc%)
  127. End Function
  128.  
  129. ' Fill the text control with 20 lines of text
  130. '
  131. Sub MenuFillText_Click ()
  132.     Dim x%
  133.     Dim t$
  134.     For x% = 0 To 19
  135.         t$ = t$ + "This is line" + Str$(x%) + Chr$(13) + Chr$(10)
  136.     Next x%
  137.     Text1.Text = t$
  138.  
  139. End Sub
  140.  
  141. '
  142. ' Determine the number of the first line visible in the text control
  143. '
  144. Sub MenuFirstVisible_Click ()
  145.     Dim lc%
  146.     lc% = SendMessageBynum(Text1.hWnd, EM_GETFIRSTVISIBLELINE, 0, 0&)
  147.     LabelResult.Caption = "Line" + Str$(lc%) + " at top"
  148.  
  149. End Sub
  150.  
  151. '
  152. ' Determine the number of lines of text in the text control
  153. '
  154. Sub MenuLineCount_Click ()
  155.     Dim lc%
  156.     lc% = SendMessageBynum(Text1.hWnd, EM_GETLINECOUNT, 0, 0&)
  157.     LabelResult.Caption = Str$(lc%) + " lines"
  158. End Sub
  159.  
  160. '
  161. ' Determine the number of visibile lines in the text control.
  162. '
  163. Sub MenuLinesVisible_Click ()
  164.     LabelResult.Caption = Str$(GetVisibleLines()) + " lines visible"
  165. End Sub
  166.  
  167. '
  168. ' Determine the start and end position of the current selection
  169. '
  170. Sub MenuSelected_Click ()
  171.     Dim ls&
  172.     ls& = SendMessageBynum&(Text1.hWnd, EM_GETSEL, 0, 0&)
  173.  
  174.     LabelResult.Caption = "Chars" + Str$(CInt(ls& And &HFFFF&)) + " to" + Str$(CInt(ls& / &H10000))
  175.  
  176.  
  177. End Sub
  178.  
  179. '
  180. ' Update the display line information on change
  181. '
  182. Sub Text1_Change ()
  183.     ' Make sure the vertical scroll range matches the number
  184.     ' of lines in the text control
  185.     lc% = SendMessageBynum(Text1.hWnd, EM_GETLINECOUNT, 0, 0&)
  186.     VScroll1.Max = lc% - 1
  187.     UpdateDisplayLine
  188.  
  189. End Sub
  190.  
  191. ' This function updates the line displayed based on the
  192. ' current position of the scroll bar.
  193. '
  194. Sub UpdateDisplayLine ()
  195.     Dim linetoshow%, linelength%
  196.     Dim linebuf$
  197.     Dim lc%
  198.     Dim linechar%
  199.     
  200.     linetoshow% = VScroll1.Value
  201.     ' Show the number of the line being displayed
  202.     LabelLinenum.Caption = "Line" + Str$(linetoshow%)
  203.     
  204.     ' Find out the character offset to the first character
  205.     ' in the specified line
  206.     linechar% = SendMessageBynum(Text1.hWnd, EM_LINEINDEX, linetoshow%, 0&)
  207.     
  208.     ' The character offset is used to determine the length of the line
  209.     ' containing that character.
  210.     lc% = SendMessageBynum(Text1.hWnd, EM_LINELENGTH, linechar%, 0&) + 1
  211.     
  212.     ' Now allocate a string long enough to hold the result
  213.     linebuf$ = String$(lc% + 2, 0)
  214.     Mid$(linebuf$, 1, 1) = Chr$(lc% And &HFF)
  215.     Mid$(linebuf$, 2, 1) = Chr$(lc% \ &H100)
  216.  
  217.     ' Now get the line
  218.     lc% = SendMessageByString(Text1.hWnd, EM_GETLINE, linetoshow%, linebuf$)
  219.     LabelShowLine.Caption = Left$(linebuf$, lc%)
  220.  
  221. End Sub
  222.  
  223. ' Whenever the scroll bar changes, display the requested
  224. ' line in the LabelShowLine label box
  225. '
  226. Sub VScroll1_Change ()
  227.     Dim lc%
  228.     Dim dl&
  229.     Dim firstvisible%, lastvisible%
  230.  
  231.     ' Make sure value is in range
  232.     lc% = SendMessageBynum(Text1.hWnd, EM_GETLINECOUNT, 0, 0&)
  233.     If VScroll1.Value > lc% - 1 Then
  234.         VScroll1.Value = lc% - 1
  235.         Exit Sub
  236.     End If
  237.     UpdateDisplayLine ' Update the display
  238.  
  239.     
  240.     ' Get the number of the first and last visible line
  241.     firstvisible% = SendMessageBynum(Text1.hWnd, EM_GETFIRSTVISIBLELINE, 0, 0&)
  242.     lastvisible% = GetVisibleLines%() + firstvisible% - 1
  243.     
  244.     ' Scroll it into view if necessary
  245.     If (VScroll1.Value < firstvisible%) Then
  246.         dl& = SendMessageBynum(Text1.hWnd, EM_LINESCROLL, 0, CLng(VScroll1.Value - firstvisible%))
  247.     End If
  248.     If (VScroll1.Value > lastvisible%) Then
  249.         dl& = SendMessageBynum(Text1.hWnd, EM_LINESCROLL, 0, CLng(VScroll1.Value - lastvisible%))
  250.     End If
  251.  
  252.  
  253. End Sub
  254.  
  255.