Microsoft Knowledge Base on Compuserve 9/18/91 "Visual Basic" anywhere in document Part 1 thru June 25, 1991 Title: How to Create a System-Modal Program/Window in Visual Basic Document Number: Q72674 Publ Date: 6-JUN-1991 Product Name: Microsoft Visual Basic Product Version: 1.00 Operating System: WINDOWS Summary: From a Visual Basic program, you can disable the ability to switch to other Windows programs by calling the Windows 3.0 API function SetSysModalWindow. This information applies to Microsoft Visual Basic programming system version 1.0 for Windows. More Information: Microsoft Windows is designed so that the user can switch between applications without terminating one program to run another program. There may be times when the program needs to take control of the entire environment and run from only one window, restricting the user from switching to any other application. An example of this is a simple security system; or a time-critical application that may need to go uninterrupted for long periods of time. Passing the handle to the window through the argument of SetSysModalWindow will limit the user to that particular window. This will not allow the user to move to any other applications with the mouse or use ALT+ESC or CTRL+ESC to bring up the Task Manager. You could even remove the system menu if you do not want the user to exit through the ALT+F4 (Close) combination. All child windows that are created by the system-modal window become system-modal windows. When the original window becomes active again, it is system-modal. To end the system-modal state, destroy the original system-modal window. Care must be taking when using the SetSysModalWindow API from within the Visual Basic programmer's environment. Pressing CTRL+BREAK to get to the [break| mode leaves your modal form with no way to exit unless you restart your system. When using the SetSysModalWindow within the environment, be sure to exit your application by destroying the window with either the ALT+F4 in the system menu, or by some other means from within your running program. To use the SetSysModalWindow API function, declare the API call in your global section: Declare Function SetSysModalWindow Lib "User" (ByVal hwnd%) As Integer At an appropriate place in your code, add the following: Success% = SetSysModalWindow(hwnd) Once this line is executed, your window will be the only window that can get focus until that window is destroyed. Reference: 1. "Programming Windows: the Microsoft Guide to Writing Applications for Windows 3," by Charles Petzold (published by Microsoft Press, 1990) 2. "Microsoft Windows 3.0 Software Development Kit: Reference Volume 1" 3. The WINSDK.HLP file shipped with Microsoft Windows 3.0 Software Development Kit. Knowledge Base Title: VB "Out of Stack Space" with LoadPicture in Form_Paint Event Document Number: Q72675 Publ Date: 6-JUN-1991 Product Name: Microsoft Visual Basic Product Version: 1.00 Operating System: WINDOWS Summary: An "Out of stack space" error can occur when you use a LoadPicture method within a Form_Paint event. This information applies to Microsoft Visual Basic programming system version 1.0 for Windows. More Information: The Visual Basic stack can be exhausted when the LoadPicture method is executed within a [control/form|_Paint event. The LoadPicture method generates a [control/form|_Paint event itself, and when performed within a _Paint event, the program will repeat the cycle until the stack is exhausted. The following code example demonstrates that the Form_Paint event is a recursive procedure when a LoadPicture method is included in the _Paint event code. After you add the code to your program, run the program and notice how many times the message "Form_Paint Count :" is displayed within the Immediate Window before you receive the "Out of stack space" error message. Sub Form_Paint () Static Count Count = Count + 1 Debug.Print "Form_Paint Count : "; Count Form1.picture = LoadPicture("c:\windows\chess.bmp") End Sub To remedy the situation, move the LoadPicture to another event handler, such as the Form_Load event. Since these bitmaps are automatically refreshed when needed, you don't have to maintain the picture within a Paint event. The Visual Basic stack is limited to 16K bytes, and cannot be changed. Knowledge Base Title: "Method Not Applicable For This Object" with SetFocus Document Number: Q72676 Publ Date: 6-JUN-1991 Product Name: Microsoft Visual Basic Product Version: 1.00 Operating System: WINDOWS Summary: Visual Basic will return "Method Not Applicable For This Object" whenever you use the SetFocus method on a control that is on a form that is not visible. This information applies to Microsoft Visual Basic programming system version 1.0 for Windows. More Information: A control needs to be visible before you can execute the SetFocus method to that control. To make a control visible, the form must be loaded and the Visible property for the control must also be True {-1}. As an example, create two forms, and on each form, create a command button. In the code segment that follows, Form2 is not loaded yet, so you must show Form2 before you can set the focus to Form2.Command1. Once Form2 has been loaded, you can set the focus to the visible control Form2.Command1. When you click the Form1.Command1 twice, you will receive the error "Method Not Applicable For This Object" because Form2.Command1's visible property was set to false during the previous call to Form_Click. '* This is the load event for Form1. Sub Form_Load () Form2.Show Form2.Command1.Visible = 0 'this is the default setting End Sub '* This is the click event for Form1.Command1 Sub Command1_Click () Form2.Command1.SetFocus Form2.Command1.Visible = 0 'hide the control End Sub Knowledge Base Title: How to Limit User Input In VB Combo/Text Box; SendMessage API Document Number: Q72677 Publ Date: 6-JUN-1991 Product Name: Microsoft Visual Basic Product Version: 1.00 Operating System: WINDOWS Summary: You can specify a limit to the amount of text that can be entered into a text and/or combo box by calling SendMessage (a Windows 3.0 API function) with the EM_LIMITTEXT constant. This information applies to Microsoft Visual Basic programming system version 1.0 for Windows. More Information: The constant EM_LIMITTEXT can be sent to the SendMessage Windows 3.0 API function to limit the length of a string entered into a combo and/or text box. Another method is to check the length of a string inside a KeyPress event for the control. If the length is over a specified amount, then the formal argument parameter KeyAscii will be set to zero. A cleaner way is to use the SendMessage API function call. After you set the Focus to the desired edit control, you must send a message to the window's message queue, which will reset the text limit for the control. The argument, EM_LIMITTEXT, as the second parameter to SendMessage will set the desired text limit based on the value specified by the third arguments. The SendMessage function requires the following parameters for setting the text limit: SendMessage (hWnd%,EM_LIMITTEXT, wParam%, lParam) wParam% Specifies the maximum number of bytes that can be entered. If the user attempts to enter more characters, the edit control beeps and does not accept the characters. If the wParam parameter is zero, no limit is imposed on the size of the text(until no more memory is available) lParam Is not used. As an example, do the following: 1. Create a form called Form1. 2. Add to Form1 a combo box called Combo1. 3. Add the following code to the general declarations section of the form: '*** Note: Each Declare statement must be on just one line: Declare Function GetFocus% Lib "user" () Declare Function SendMessage& Lib "user" (ByVal hWnd%, ByVal wMsg%, ByVal wParam%, lp As Any) Declare Function PutFocus% Lib "user" Alias "SetFocus" (ByVal hWnd%) Const WM_USER = &H400 Const EM_LIMITTEXT = WM_USER + 21 4. Add the following code to the Form_Load event procedure: Sub Form_Load () Form1.Show 'Must show form to work on it Combo1.SetFocus 'Set the focus to the list box cbhWnd% = GetFocus() 'Get the handle to the list box TextLimit% = 5 'Specify the largest string retVal = SendMessage(cbhWnd%, EM_LIMITTEXT, TextLimit%, 0) End Sub 5. Run the program and enter some text into the combo box. You will notice that you will only be able to enter a string of five characters into the combo box. Reference: 1. "Programming Windows: the Microsoft Guide to Writing Applications for Windows 3," by Charles Petzold (published by Microsoft Press, 1990) 2. "Microsoft Windows 3.0 Software Development Kit: Reference Volume 1" 3. The WINSDK.HLP file shipped with Microsoft Windows 3.0 Software Development Kit. Knowledge Base Title: VB Debug.Print in MouseMove Event Causes MouseMove Event Document Number: Q72679 Publ Date: 6-JUN-1991 Product Name: Microsoft Visual Basic Product Version: 1.00 Operating System: WINDOWS Summary: Debug.Print used within the MouseMove event procedure of a form or control causes a MouseMove event. If the mouse cursor is located within the form or control, an endless stream of output to the Immediate Window will occur. This behavior occurs for a program run in the Visual Basic development environment. An .EXE program does not utilize the Immediate Window and the Debug object so this behavior does not apply to a .EXE program. The problem does not occur if a Print method is issued to any other form or control in the program. This is not a problem with Visual Basic, but rather the nature of the Microsoft Windows operating environment. This information applies to Microsoft Visual Basic programming system version 1.00 for Windows. More Information: If Debug.Print is used within the MouseMove event procedure of a form or control, an endless stream of output is sent to the Immediate Window. This occurs whenever the mouse cursor is within the form or control. This behavior occurs because the Debug.Print statement causes the focus to change briefly to the Immediate Window. When the focus returns to the form or control, Windows generates a MouseMove event that is processed by Visual Basic. There is no way for Visual Basic to suppress MouseMove events that are generated by Windows. The easiest way to overcome this behavior is to send debug output to another form or control. To duplicate this behavior, create a picture control (Picture1) within the default form (Form1). Add the following code segment to the MouseMove event procedure of Picture1: Sub Picture1_MouseMove (Button As Integer, Shift As Integer, X As Single, Y As Single) ' You must write the above Sub statement on just one line. Static i% i% = i% + 1 Debug.Print i% End Sub If you want output to be sent only when the mouse is moved, then all Debug.Print statements within the MouseMove event procedure should be changed to Print methods to other forms or controls. Below is a description of how to modify the example above such that output is produced only when the mouse is moved. Add another form (Form2) to the project by selecting New Form from the File menu (ALT F+F). Change the Debug.Print statement in the MouseMove event procedure for Picture1 to Form2.Print. Below is a copy of the above sample modified to send output to another form. Sub Picture1_MouseMove (Button As Integer, Shift As Integer, X As Single, Y As Single) ' You must write the above Sub statement on just one line. Static i% i% = i% + 1 Form2.Print i% End Sub In the example above, all output that scrolls off the form will be lost. A more sophisticated routine will be required to keep track of all output to the form. Such a routine is beyond the scope of this article. Knowledge Base Title: Why Cooper Software Is Listed in Visual Basic's Copyright Document Number: Q72747 Publ Date: 12-JUN-1991 Product Name: Microsoft Visual Basic Product Version: 1.00 Operating System: WINDOWS Summary: The Microsoft Visual Basic copyright notice acknowledges Cooper Software in both the sign-on dialog box and in the About dialog box from the Help menu. Visual Basic uses technology from a forms engine purchased from Cooper Software. The acknowledgment in Visual Basic is part of the contract between Microsoft and Cooper Software. This information applies to Microsoft Visual Basic programming system version 1.0 for Windows. Knowledge Base Title: How to Trap a VB Form's Lost Focus with GetActiveWindow API Document Number: Q69792 Publ Date: 20-MAY-1991 Product Name: Microsoft Visual Basic Product Version: 1.00 Operating System: WINDOWS Summary: The LostFocus event in Microsoft Visual Basic is useful when transferring control within an application. However, no global routine exists to check for the entire form losing the focus. One method to use to check whether your Visual Basic application has lost the focus is the Windows API call GetActiveWindow, as explained below. This information applies to Microsoft Visual Basic programming system version 1.00 for Windows. More Information: The only way for a Visual Basic application to check for loss of focus is to trigger the LostFocus event. A form does support a LostFocus event; however, a form will only get focus if there are no controls on that form. Focus goes to the controls on a form, and when you click any other visible form or window, the control's LostFocus procedure will be called. A control's LostFocus procedure will also be called when another control on the form is activated. To perform a routine that occurs only when the form loses focus requires careful management of what generated a LostFocus event on each control (such as setting a flag if another control's Click event was called). For a simpler method to check if a whole form has lost the focus, you can call the Windows API function GetActiveWindow, located in USER.DLL in Windows 3.00. The GetActiveWindow API call returns the window handle of the active window, which is the new window that you clicked. In every LostFocus procedure for every control on the old form, you would call GetActiveWindow and compare the return value with the old form's window handle (hWnd). The following program example demonstrates this technique: Program Example --------------- This single-form example will print "Lost Focus" on the form when you click a different window (such as when you click another program running in Windows). In Visual Basic, create one command button, Command1, on a single form, Form1. From VB.EXE's Code menu, choose View Code, and enter the following code for Form1 [using (general) from the Object box, and (declarations) from the Procedure box|: Declare Function GetActiveWindow Lib "User" () As Integer From the Object box, choose Command1, and from the Procedure box, choose LostFocus, and then put the following code in the Command1_LostFocus procedure: Sub Command1_LostFocus () If GetActiveWindow() <> Form1.hWND Then 'Do form's lost-focus routines here. Print "Lost Focus" End If End Sub You can now run the program. Reference: Knowledge Base Title: How to Create Scrollable Viewports in Visual Basic Document Number: Q71068 Publ Date: 20-MAY-1991 Product Name: Microsoft Visual Basic Product Version: 1.00 Operating System: WINDOWS Summary: Scrollable viewports can be created within Visual Basic using standard Basic calls. The viewports can include bitmaps, graphics, or other controls. This information applies to Microsoft Visual Basic Programming System version 1.00 for Windows. More Information: To create a scrollable picture with clipping, you must have two picture controls. The first picture control is called the stationary parent picture control. Within the parent picture control, you need to create a movable child picture control. It is the child picture control that will be moved within the parent picture control. Moving the child picture within the parent picture control creates the clipping effect. During run time when you move the child picture, it will now be clipped by the boundaries of the parent picture. To create these two picture controls, do the following: 1. Choose the picture box control from the Toolbox window in Visual Basic. 2. Draw a picture on the form. This is the parent picture. 3. Again choose the picture box control from the Toolbox window. 4. Draw the second picture on top of and within the boundaries of the first picture control. This is the child picture. The sample application below shows how to create a scrollable bitmap within a viewport. Perform the sequence above to create a parent/child picture control. Add a horizontal scroll bar and a vertical scroll bar to the form. Make sure that the path to your bitmap is correct. Several of the properties are set during run time, which could have been set during design time as well. Moving the thumb of the two scroll bars will move the child picture within the parent picture. The handle (upper-left corner of the picture) to the child picture will be located either at (0,0) of the parent picture or to the left and/or right of the parent picture. Since the clipping region is that of the parent picture, the child picture will appear to move across the parent picture viewport. Sub Form_Load () Const PIXEL = 3 Const TRUE = -1 Const NONE = 0 ' Set design properties, included here for simplicity. Form1.ScaleMode = PIXEL Picture1.ScaleMode = PIXEL Picture2.ScaleMode = PIXEL ' AutoSize is set to TRUE so that the boundaries of ' Picture2 are expanded to the size of the actual bitmap. Picture2.AutoSize = TRUE ' Get rid of annoying borders. Picture1.BorderStyle = NONE Picture2.BorderStyle = NONE ' Load the picture that you want to display. Picture2.Picture = LoadPicture("c:\win\party.bmp") ' Initialize location of both pictures. Picture1.Move 0, 0, ScaleWidth - VScroll1.Width,_ ScaleHeight - HScroll1.Height Picture2.Move 0, 0 ' Position the horizontal scroll bar. HScroll1.Top = Picture1.Height HScroll1.Left = 0 HScroll1.Width = Picture1.Width ' Position the vertical scroll bar. VScroll1.Top = 0 VScroll1.Left = Picture1.Width VScroll1.Height = Picture1.Height ' Set the Max value for the scroll bars. HScroll1.Max = Picture2.Width - Picture1.Width VScroll1.Max = Picture2.Height - Picture1.Height ' Determine if child picture will fill up screen. ' If so, then there is no need to use scroll bars. VScroll1.Enabled = (Picture1.Height < Picture2.Height) HScroll1.Enabled = (Picture1.Width < Picture2.Width) End Sub Sub HScroll1_Change () ' Picture2.Left is set to the negative of the value because ' as you scroll the scroll bar to the right, the display ' should move to the Left, showing more of the right ' of the display, and vice-versa when scrolling to the ' left. Picture2.Left = -HScroll1.Value End Sub Sub VScroll1_Change () ' Picture2.Top is set to the negative of the value because ' as you scroll the scroll bar down, the display ' should move up, showing more of the bottom ' of the display, and vice-versa when scrolling up. Picture2.Top = -VScroll1.Value End Sub Knowledge Base Title: How to Clear a VB List Box with a Windows API Function Document Number: Q71069 Publ Date: 20-MAY-1991 Product Name: Microsoft Visual Basic Product Version: 1.00 Operating System: WINDOWS Summary: Customers commonly ask how to quickly clear the contents of a list box without clearing one item at a time. The following article shows how to instantly clear the contents of a list box by sending the list box a LB_RESETCONTENT message. This information applies to Microsoft Visual Basic Programming System version 1.00 for Windows. More Information: There is no single command within Visual Basic that will clear out the entries of a list box. However, by using the SendMessage function, you can clear out the list box with one command. The arguments to SendMessage with the LB_RESETCONTENT parameter are SendMessage(hWnd%, wMsg%, wParam%, lParam&) where: hWnd% Identifies the window that is to receive the message. wMsg% The message to be sent. (&H405) wParam% Is not used. (NULL) lParam& Is not used. (NULL) Specifying wMsg% equal to &H405 removes all strings from the list box and frees any memory allocated for those strings. To get hWnd% you must call the Windows API function GetFocus. This method will return the handle to the control that currently has focus, in this case the list box that you want to delete all items from. The code listed below demonstrates how to delete entries from a list box: 1. Create a list box called List1 on Form1. 2. Declare the following Windows API functions at the module level or in the Global section of your code as follows: Declare Function SendMessage% Lib "user" (ByVal hWnd%,_ ByVal wMsg%,_ ByVal wParam%,_ ByVal lParam&) Declare Function GetFocus% Lib "user" () Declare Function PutFocus% Lib "user" Alias "SetFocus" (ByVal hWnd%) Note: Each Declare statement must be written on one line, leaving out the underscore (_) line-continuation symbol shown above. 3. Declare the following constants in the same section: Const WM_USER = &H400 Const LB_RESETCONTENT = WM_USER + 5 4. Create a Sub within the (declarations) section of the code window with the following code: Sub ClearListBox (Ctrl As Control) hWndOld% = GetFocus() Ctrl.SetFocus x = SendMessage(GetFocus(), LB_RESETCONTENT, 0, 0) Suc% = PutFocus(hWndOld%) End Sub 5. Now, within some event procedure, call ClearListBox with the name of the list box as a parameter: Sub Form_Click () ClearListBox List1 End Sub 6. Place some entries into the list box: Sub Form_Load () For i = 1 To 10 List1.AddItem Format$(i) 'Put something into list box. Next End Sub 6. Run the program and click anywhere on Form1. This will clear out the list box. Knowledge Base Title: How to Emulate QuickBasic's SOUND Statement in Visual Basic Document Number: Q71102 Publ Date: 20-MAY-1991 Product Name: Microsoft Visual Basic Product Version: 1.00 Operating System: WINDOWS Summary: The SOUND statement found in Microsoft QuickBASIC is not implemented within Microsoft Visual Basic. You can perform sound through a Windows 3.00 API call that is equivalent to the QuickBASIC SOUND statement. This information applies to Microsoft Visual Basic Programming System version 1.00 for Windows. More Information: The QuickBASIC version of the SOUND statement can be executed by calling several Windows 3.00 API function calls. Within Windows, you must open up a VoiceQueue with the OpenSound call routine. Using the function SetVoiceSound, place all of the values corresponding to the desired frequencies and durations. Once the VoiceQueue has the desired frequencies and durations, you start the process by calling StartSound. After the sounds have been played, you must free up the VoiceQueue by calling CloseSound. If you plan on placing a large amount of information into the VoiceQueue, you may need to resize the VoiceQueue buffer by calling the SetVoiceQueueSize function. After executing the StartSound function, you cannot place any more sound into the VoiceQueue until the VoiceQueue is depleted. Placing more sound into the queue will overwrite any information that was previously in the VoiceQueue. If you are going to place sound into the VoiceQueue after a StartSound statement, you will need to call WaitSound with an argument of one. When WaitSound returns NULL, the VoiceQueue is empty and processing can continue. Below is an example of using the Windows API function calls, which will imitate the QuickBASIC SOUND statement: In the general section place the following: Declare Function OpenSound Lib "sound.drv" () As Integer Declare Function VoiceQueueSize Lib "sound.drv" (ByVal nVoice%, ByVal nBytes%) As Integer Declare Function SetVoiceSound Lib "sound.drv" (ByVal nSource%, ByVal Freq&, ByVal nDuration%) As Integer Declare Function StartSound Lib "sound.drv" () As Integer Declare Function CloseSound Lib "sound.drv" () As Integer Declare Function WaitSoundState Lib "sound.drv" (ByVal State%) As Integer Note: All Declare statements above each must be placed on one line. The SetVoiceSound takes two arguments. The first variable, Freq, is a two WORD parameter. The HIGH WORD will hold the actual frequency in hertz. The LOW WORD will hold the fractional frequency. The formula, X * 2 ^ 16, will shift the variable "X" into the HIGH WORD location. The second variable, Duration%, is the duration in clock ticks. There are 18.2 tick clicks per second on all Intel computers. The following simplistic example shows how you can place several frequencies and durations into the VoiceQueue before starting the sound by calling the StartSound function: Sub Form_Click () Suc% = OpenSound() S% = SetVoiceSound(1, 100 * 2 ^ 16, 100) ' Frequency = 100hz S% = SetVoiceSound(1, 90 * 2 ^ 16, 90) ' Frequency = 90 hz S% = SetVoiceSound(1, 80 * 2 ^ 16, 90) ' Frequency = 80 hz S% = StartSound() Succ% = CloseSound() End Sub The following is another simple example, which creates a siren sound: 1. Within the general section, place the following Sound procedure: Sub Sound (ByVal Freq as Long, ByVal Duration%) Freq = Freq * 2 ^ 16 ' Shift frequency to high byte. S% = SetVoiceSound(1, Freq, Duration%) S% = StartSound() While (WaitSoundState(1) <> 0): Wend End Sub 2. Place the code below into any event procedure. The example below uses the Form_Click event procedure. Clicking any position on the form will create a police siren. Sub Form_Click () Suc% = OpenSound() For j& = 440 To 1000 Step 5 Call Sound(j&, j& / 100) Next j& For j& = 1000 To 440 Step -5 Call Sound(j&, j& / 100) Next j& Succ% = CloseSound() End Sub Knowledge Base Title: How to Flood Fill in VB Using Windows API Function Call Document Number: Q71103 Publ Date: 20-MAY-1991 Product Name: Microsoft Visual Basic Product Version: 1.00 Operating System: WINDOWS Summary: You can fill an area on a window in Visual Basic through a Windows API function call. Depending on the type of fill to be performed, you can use ExtFloodFill to achieve the desired effect. This information applies to Microsoft Visual Basic Programming System version 1.00 for Windows. More Information: The Windows API function call ExtFloodFill fills an area of the display surface with the current brush, as shown in the example below. Code Example ------------ From VB.EXE's Code menu, choose View Code, and enter the following code (on just one line) for Form1 [using (general) from the Object box, and (declarations) from the Procedure box|: Declare Function ExtFloodFill Lib "GDI" (ByVal hdc%, ByVal i%, ByVal i%, ByVal w&, ByVal i%) As Integer To demonstrate several fill examples, create a picture box called Picture1. Set the following properties: AutoSize = TRUE ' Scale picture to size of imported picture. FillColor = &HFF00FF ' This will be the selected fill color. FillStyle = Solid ' Necessary to create a fill pattern. Picture = Chess.bmp ' This should be in your Windows directory. Create a push button in a location that will not be overlapped by Picture1. Within the Click event, create the following code: Sub Command1_Click () ' Make sure that the FillStyle is not transparent. ' crColor& specifies the color for the boundary. Const FLOODFILLBORDER = 0 ' Fill until crColor& color encountered. Const FLOODFILLSURFACE = 1 ' Fill surface until crColor& color not ' encountered. X% = 1 Y% = 1 crColor& = RGB(0, 0, 0) wFillType% = FLOODFILLSURFACE Suc% = ExtFloodFill(picture1.hDC, X%, Y%, crColor&, wFillType%) End Sub When you click on the push button, the black background will change to the FillColor. The fill area is defined by the color specified by crColor&. Filling continues outward from (X%,Y%) as long as the color is encountered. Now change the related code to represent the following: crColor& = RGB(255, 0, 0) 'Color to look for. wFillType% = FLOODFILLBORDER Suc% = ExtFloodFill(picture1.hDC, X%, Y%, crColor&, wFillType%) Executing the push button will now fill the area until crColor& is encountered. In the first example, the fill was performed while the color was encountered; in the second example, the fill was performed while the color was NOT encountered. In the last example, everything is changed except the "floating pawn". Knowledge Base Title: How to Use Windows 3.0 BitBlt Function from Visual Basic Document Number: Q71104 Publ Date: 10-JUN-1991 Product Name: Microsoft Visual Basic Product Version: 1.00 Operating System: WINDOWS Summary: The Windows GDI.DLL has a function call BitBlt, which will move the source device given by the hSrcDC parameter to the destination device given by the hDestDC parameter. This article explains in detail the arguments of the Windows BitBlt function call. This information applies to Microsoft Visual Basic Programming System version 1.00 for Windows. More Information: To use BitBlt within a Visual Basic application, you must Declare the BitBlt function in either the Global section or within the (declaration) section of your code window. Declare the Function as follows: Declare Function BitBlt Lib "gdi" (ByVal hDestDC%, ByVal X%, ByVal Y%, ByVal nWidth%, ByVal nHeight%, ByVal hSrcDC%, ByVal XSrc%, ByVal YSrc%, ByVal dwRop&) As Integer Note: The above Declare statement must be written on just one line. The following formal parameters are defined as: Formal Parameter Definition ---------------- ---------- hDestDC Specifies the device context that is to receive the bitmap. X,Y Specifies the logical x-coordinate and y-coordinate of the upper-left corner of the destination rectangle. nWidth, nHeight Specifies the width (in logical units) of the destination rectangle and the source bitmap. nHeight Specifies the height (in logical units) of the destination rectangle and the source bitmap. hSrcDC Identifies the device context from which the bitmap will be copied. It must be NULL(zero) if the dwRop& parameter specifies a raster operation that does not include a source. XSrc Specifies the logical x-coordinate and the y-coordinate of the upper-left corner of the source bitmap. dwRop Specifies the raster operation to be performed as defined below. The following Raster operations are defined using the predefined constants found in the WINDOWS.H file supplied with the Microsoft Windows version 3.00 Software Development Kit (SDK). The value within the "()" is the value to assign to the dwRop& variable. Code/Value (hex) Description ---------------- ----------- BLACKNESS (42) Turn output black. DSINVERT(550009) Inverts the destination bitmap. MERGECOPY(C000CA) Combines the pattern and the source bitmap using the Boolean AND operation. MERGEPAINT(BB0226) Combines the inverted source bitmap with the destination bitmap using the Boolean OR operator. NOTSRCCOPY(330008) Copies the inverted source bitmap to the destination. NOTSRCERASE(1100A6) Inverts the result of combining the destination and source bitmap using the Boolean OR operator. PATCOPY(F00021) Copies the pattern to the destination bitmap. PATINVERT(5A0049) Combines the destination bitmap with the pattern using the Boolean XOR operator. PATPAINT(FB0A09) Combines the inverted source bitmap with the pattern using the Boolean OR operator. Combines the result of this operation with the destination bitmap using the Boolean OR operator. SRCAND(8800C6) Combines pixels of the destination and source bitmap using the Boolean AND operator. SRCCOPY(CC0020) Copies the source bitmap to the destination bitmap. SRCERASE(4400328) Inverts the destination bitmap and combines the results with the source bitmap using the Boolean AND operator. SRCINVERT(660046) Combines pixels of the destination and source bitmap using the Boolean XOR operator. SRCPAINT(EE0086) Combines pixels of the destination and source bitmap using the Boolean OR operator. WHITENESS(FF0062) Turns all output white. Below is an example of how to copy the contents of a picture control to the contents of another picture control. Define a form with two picture controls. Display some graphics on Picture1 by loading from a picture file or pasting from the clipboard at design time. You can load a picture from a file as follows: from the Properties bar, select Picture from the Properties list box and click the arrow at the right of the Settings box, then select the desired picture file (such as a .BMP or .ICO file supplied with Microsoft Windows) from the dialog box. Add the following code to the Form_Click procedure. Run the program and click the form. The contents of the first picture will be displayed to the second picture. Sub Form_Click () ' Assign information of the destination bitmap. Note that Bitblt ' requires coordinates in pixels. Const PIXEL = 3 Picture1.ScaleMode = PIXEL Picture2.ScaleMode = PIXEL hDestDC% = Picture2.hDC X% = 0: Y% = 0 nWidth% = Picture2.ScaleWidth nHeight% = Picture2.ScaleHeight ' Assign information of the source bitmap. hSrcDC% = Picture1.hDC XSrc% = 0: YSrc% = 0 ' Assign the SRCCOPY constant to the Raster operation. dwRop& = &HCC0020 Suc% = BitBlt(hDestDC%, X%, Y%, nWidth%, nHeight%,_ hSrcDC%, XSrc%, YSrc%, dwRop&) End Sub Knowledge Base Title: How to Set Hourglass MousePointer in VB Program During Delays Document Number: Q71105 Publ Date: 20-MAY-1991 Product Name: Microsoft Visual Basic Product Version: 1.00 Operating System: MS-DOS Summary: During operations that take time, you may decide to display the hourglass mouse cursor. This will let the user know that the computer is performing an operation that may take some noticeable time, and that no user input will be immediately processed during this time. This information applies to Microsoft Visual Basic Programming System version 1.00 for Windows. More Information: The MousePointer property can be set during design time or during run time. During operations that may take some noticeable amount of time, the MousePointer should be set to the hourglass pointer. This can be performed using the Screen.MousePointer property. Before setting the mouse pointer to the hourglass, you should save the present mouse pointer so that when you are through with the hourglass cursor, you can re-initialize it to the previous pointer. Below is an example of setting the pointer to the hourglass cursor: Sub Form_Click () SavedPointer = Screen.MousePointer ' Save mouse pointer. Screen.MousePointer = 11 ' 11# = hourglass. For i = 1 To 10000: Next i ' Some lengthy operation. Screen.MousePointer = SavedPointer ' set to previous mouse pointer. End Sub Knowledge Base Title: How to Pass One-Byte Parameters from VB to DLL Routines Document Number: Q71106 Publ Date: 20-MAY-1991 Product Name: Microsoft Visual Basic Product Version: 1.00 Operating System: WINDOWS Summary: Calling some routines in dynamic link libraries (DLLs) requires BYTE parameters in the argument list. Visual Basic possesses no BYTE data type as defined in other languages such as C, which can create DLLs. To pass a BYTE value correctly to an external FUNCTION (in a DLL), which requires a BYTE data type, you must pass an integer data type for the BYTE parameter. This information applies to Microsoft Visual Basic Programming System version 1.00 for Windows. More Information: Visual BASIC has the ability to call external code in the form of dynamic link libraries (DLLs). Some of these libraries require BYTE parameters in the argument list. An example of this is located in the KEYBOARD.DRV FUNCTION as defined below: FUNCTION GetTempFileName (BYTE cDrive, LPSTR lpPrefix, WORD wUnique, LPSTR lpTempFileName) GetTempFileName is documented on page 4-217 of the "Microsoft Windows 3.0 Software Development Kit, Reference - Volume 1." In Visual BASIC, declare the FUNCTION on one line in the main module of your code: DECLARE FUNCTION GetTempFileName LIB "keyboard.drv" (BYVAL A%, BYVAL B$, BYVAL C%, BYVAL D$) Because the architecture of the 80x86 stack is segmented into word boundaries, the smallest type pushed onto the stack will be a word. Therefore, both the BYTE and the integer will be pushed onto the stack in the same manner, and require the same amount of memory. This is the reason you can use an integer data type for a BYTE data type in these types of procedure calls. Knowledge Base Title: How to Send an HBITMAP to Windows API Function Calls from VB Document Number: Q71260 Publ Date: 20-MAY-1991 Product Name: Microsoft Visual Basic Product Version: 1.00 Operating System: WINDOWS Summary: Several Windows API functions require the HBITMAP data type. Visual Basic does not have a HBITMAP data type. This article explains how to send the equivalent Visual Basic HBITMAP handle of a picture control to a Windows API function call. This information applies to Microsoft Visual Basic Programming System version 1.00 for Windows. More Information: The HBITMAP data type represents a 16-bit index to GDIs physical drawing object. Several Windows API routines need the HBITMAP data type as an argument. Sending the [picture-control|.Picture as an argument is the equivalent in Visual Basic. The code sample below demonstrates how to send HBITMAP to the Windows API function ModifyMenu. Declare Function SetMenuItemBitMaps% Lib "user" (ByVal hMenu%, ByVal nPos%, ByVal wFlag%, ByVal BitmapUnChecked%, ByVal hBitmapChecked%) Note: The above Declare statement must be written on just one line. The SetMenuItemBitMap takes five arguments. The fourth and fifth arguments are HBITMAP data types. The following code segment will associate the specified bitmap Picture1.Picture in place of the default check mark: X% = SetMenuItemBitMap(hMenu%, menuID%,0,0, Picture1.Picture) Reference: 1. "Programming Windows: the Microsoft Guide to Writing Applications for Windows 3," by Charles Petzold (published by Microsoft Press, 1990) 2. "Microsoft Windows 3.0 Software Development Kit: Reference Volume 1" 3. The WINSDK.HLP file shipped with Microsoft Windows 3.0 Software Development Kit. Knowledge Base Title: How to Create Pop-up Menus on a Visual Basic Form Document Number: Q71279 Publ Date: 20-MAY-1991 Product Name: Microsoft Visual Basic Product Version: 1.00 Operating System: WINDOWS Summary: Visual Basic can call the Windows API function TrackPopupMenu to display a specified menu at the location on the screen that the user clicks with the mouse. This information applies to Microsoft Visual Basic Programming System version 1.00 for Windows. More Information: The TrackPopupMenu function displays a "floating" pop-up menu at the specified location and tracks the selection of items on the pop-up menu. A floating pop-up menu can appear anywhere on the screen. The hMenu parameter specifies the handle of the menu to be displayed; the application obtains this handle by calling GetSubMenu to retrieve the handle of a pop-up menu associated with an existing menu item. TrackPopupMenu is defined as follows TrackPopupMenu (hMenu%,wFlags%, X%, Y%, rRes%, hwnd%, lpRes&) where: hMenu% - Identifies the pop-up menu to be displayed. wFlags% - Not used. This parameter must be set to zero. x% - Specifies the horizontal position in screen coordinates of the left side of the menu on the screen. y% - Specifies the vertical position in screen coordinates of the top of the menu on the screen. nRes% - Is reserved and must be set to zero. hWnd% - Identifies the window that owns the pop-up menu. lpRes& - Is reserved and must be set to NULL. The supporting Windows API functions needed to support the arguments to TrackPopupMenu are: 1. GetMenu(hWnd%) hWnd% - Identifies the window whose menu is to be examined. GetMenu returns a value that identifies the menu. The return value is NULL if the given window has no menu. The return value is undefined if the window is a child window. 2. GetSubMenu(hMenu%, nPos%) hMenu% - Identifies the menu. nPos% - Specifies the position in the given menu of the pop-up menu. Position values start at zero for the first menu item. GetSubMenu returns a value that identifies the given pop-up menu. The return value is NULL if no pop-up menu exists at the given position. To create a pop-up menu within Visual Basic, define a menu system with the Menu Design window. The following is an example of a menu system: Caption CntlName Indented ------- -------- -------- File M_File No New M_New Once Open M_Open Once Close M_Close Once Exit M_Exit Once Help M_Help No Within the general-declaration section of your Code window, declare the following: Declare Function TrackPopupMenu% Lib "user"(ByVal hMenu%, ByVal wFlags%, ByVal X%, ByVal Y%, ByVal r2%, ByVal hwnd%, ByVal r1&) Declare Function GetMenu% Lib "user" (ByVal hwnd%) Declare Function GetSubMenu% Lib "user" (ByVal hMenu%, ByVal nPos%) Note: Each Declare statement above must be located on just one line. Place the following code in the form's MouseUp event procedure: Sub Form1_MouseUp (Button As Integer, Shift As Integer, X As Single, Y As Single) ' The above Sub statement must be concatenated onto one line. Const PIXEL = 3 Const TWIP = 1 ScaleMode = PIXEL InPixels = ScaleWidth ScaleMode = TWIP IX = (X + Left) \ (ScaleWidth \ InPixels) IY = (Y + (Top + (Height - ScaleHeight - (Width - ScaleWidth)))) \ (ScaleWidth \ InPixels) ' The above IY = ... statement must be concatenated onto one line. hMenu% = GetMenu(hwnd) hSubMenu% = GetSubMenu(hMenu%, Button - 1) R = TrackPopupMenu(hSubMenu%, 0, IX, IY, 0, hwnd, 0) End Sub When you run the program, clicking anywhere on Form1 will display the first menu on your menu bar at that location. Reference: 1. "Programming Windows: the Microsoft Guide to Writing Applications for Windows 3," by Charles Petzold (published by Microsoft Press, 1990) 2. "Microsoft Windows 3.0 Software Development Kit: Reference Volume 1" 3. The WINSDK.HLP file shipped with Microsoft Windows 3.0 Software Development Kit. Knowledge Base Title: How to Create a Flashing Title Bar on a Visual Basic Form Document Number: Q71280 Publ Date: 20-MAY-1991 Product Name: Microsoft Visual Basic Product Version: 1.00 Operating System: WINDOWS Summary: When calling a Windows API function call, you can create a flashing window title bar on the present form or any other form for which you know the handle. This information applies to Microsoft Visual Basic Programming System version 1.00 for Windows. More Information: Visual Basic has the ability to flash the title bar on any other form if you can get the handle to that form. The function FlashWindow flashes the specified window once. Flashing a window means changing the appearance of its caption bar, as if the window were changing from inactive to active status, or vice versa. (An inactive caption bar changes to an active caption bar; an active caption bar changes to an inactive caption bar.) Typically, a window is flashed to inform the user that the window requires attention when that window does not currently have the input focus. The function FlashWindow is defined as FlashWindow(hWnd%, bInvert%) where: hWnd% - Identifies the window to be flashed. The window can be either open or iconic. bInvert% - Specifies whether the window is to be flashed or returned to its original state. The window is flashed from one state to the other if the bInvert parameter is nonzero. If the bInvert parameter is zero, the window is returned to its original state (either active or inactive). FlashWindow returns a value that specifies the window's state before the call to the FlashWindow function. It is nonzero if the window was active before the call; otherwise, it is zero. The following section describes how to flash a form while that form does not have the focus: 1. Create two forms called Form1 and Form2. 2. On Form1, create a timer control and set the Interval Property to 1000. Also set the Enabled Property to FALSE. 3. Within the general-declarations section of Form1, declare the FlashWindow function as follows: Declare Function FlashWindow% Lib "user" (ByVal hWnd%, ByVal bInvert%) 4. Define the following constants directly after the declarations section: Const TRUE = -1 Const FALSE = 0 5. In the Form_Load event procedure, add the following code: Sub Form_Load () Form2.Show End Sub 6. In the Sub_Time1_Timer () procedure of Form1, add the following code: Sub Timer1_Timer () Succ% = FlashWindow(Form1.hWnd, 1) End Sub 7. In the GetFocus event procedure of Form1, create the following code: Sub Form_GotFocus () Timer1.Enabled = 0 End Sub 8. In the Click event for Form2, add the following code: Sub Form_Click () Form1.Timer1.Enabled = -1 End Sub 9. Run the program. Form1 will be in the foreground with Form2 in the background. Click anywhere on Form2; Form1's Caption Bar will flash until you click on Form1. Reference: 1. "Programming Windows: the Microsoft Guide to Writing Applications for Windows 3," by Charles Petzold (published by Microsoft Press, 1990) 2. "Microsoft Windows 3.0 Software Development Kit: Reference Volume 1" 3. The WINSDK.HLP file shipped with Microsoft Windows 3.0 Software Development Kit. Knowledge Base Title: How to Implement Bitmaps Within Visual Basic Menus Document Number: Q71281 Publ Date: 20-MAY-1991 Product Name: Microsoft Visual Basic Product Version: 1.00 Operating System: WINDOWS Summary: There is no command within Visual Basic that will add bitmaps to the menu system. There are several Windows API functions that you can call that will place bitmaps within the menu system. You may also change the default check mark displayed. This information applies to Microsoft Visual Basic Programming System version 1.00 for Windows. More Information: There are several Windows API functions that you can call that will display bitmaps instead of text in the menu system. Below is a list of the required Windows API functions: 1. GetMenu% (hwnd%) hwnd% - Identifies the window whose menu is to be examined. Returns: Handle to the menu. 2. GetSubMenu% (hMenu%, nPos%) hMenu% - Identifies the menu. nPos% - Specifies the position (zero-based) in the given menu of the pop-up menu. Returns: Handle to the given pop-up menu. 3. GetMenuItemID% (hMenu%, nPos%) hMenu% - Identifies the handle to the pop-up menu that contains the item whose ID is being retrieved. nPos - Specifies the position(zero-based) of the menu whose ID is being retrieved. Returns: The item ID for the specified item in the pop-up menu. 4. ModifyMenu% (hMenu%, nPos%, wFlags%, wIDNewItem%, lpNewItem&) hMenu% - Identifies the handle to the pop-up menu that contains the item whose ID is being retrieved. nPos% - Specifies the menu item to be changed. The interpretation of the nPos parameter depends on the wFlags parameter. wFlags% - BF_BITMAP = &H4 wIDNewItem% - Specifies the command ID of the modified menu item. lpNewItem& - 32-bit handle to the bitmap. Returns: TRUE if successful, FALSE if unsuccessful. 5. SetMenuItemBitmaps% (hMenu%, nPos%, wFlags%,hBitmapUnchecked%, hBitmapChecked%) hMenu% - Identifies menu to be changed. nPos% - Command ID of the menu item wFlags% - &H0 hBitmapUnchecked% - Handle to "unchecked" bitmap. hBitmapChecked%) - Handle to the "check" bitmap. Returns: TRUE if successful, FALSE if unsuccessful. There are two different ways to implement bitmaps within Visual Basic. The first method is using static bitmaps. The other method is using dynamic bitmaps. Static bitmaps are bitmaps that are placed within the menu using static bitmaps. Dynamic bitmaps are bitmaps that are changed during execution of your program. You may change dynamic bitmap attributes such as color, size, and text. The sample code below describes how to perform both types of menus. Define a menu system using the Menu Design window. Create a menu system such as the following: Caption CtlName Indented Index ------- ------- -------- ----- BitMenu TopMenu No Sub Menu0 SubMenu Once 0 Sub Menu1 SubMenu Once 1 Sub Menu2 SubMenu Once 2 Create a Picture Control Array with 3 bitmaps. This can be accomplished by creating 3 picture controls with the same CtlName using the Properties list box. Caption CtlName Index FontSize ------- ------- ----- -------- Picture0 Picture1 0 Set different Picture1 Picture1 1 font sizes for Picture2 Picture1 2 each of the pictures Both types of bitmap implementations will need to have the following declarations in the declaration or global section of your code: Declare Function GetMenu% Lib "user" (ByVal hwnd%) Declare Function GetSubMenu% Lib "user" (ByVal hMenu%, ByVal nPos%) Declare Function GetMenuItemID% Lib "user" (ByVal hMenu%, ByVal, nPos%) Declare Function ModifyMenu% Lib "user" (ByVal hMenu%, ByVal nPosition%, ByVal wFlags%, ByVal wIDNewItem%, ByVal lpNewItem&) Declare Function SetMenuItemBitmaps% Lib "user" (ByVal hMenu%, ByVal nPosition%, ByVal wFlags%, ByVal hBitmapUnchecked%, ByVal BitmapChecked%) ' NOTE: Each Declare statement above must be on just one line. Const MF_BITMAP = &H4 Const CLR_MENUBAR = &H80000004 ' Defined for dynamic bitmaps only. Const TRUE = -1, FALSE = 0 Const Number_of_Menu_Selections = 3 The following Sub will also need to be defined to handle the actual redefinition of the "check" bitmap: Sub SubMenu_Click (Index As Integer) ' Uncheck presently checked item, check new item, store index Static LastSelection% SubMenu(LastSelection%).Checked = FALSE SubMenu(Index).Checked = TRUE LastSelection% = Index End Sub The following examples show the two ways to implement the Dynamic and Static menu bitmaps. Static Bitmap Menus ------------------- Add the code listed below to the appropriate Sub: Sub Form_Load () ' Get the handle to the top level Menu hMenu% = GetMenu(hwnd) ' Get the handle to the SubMenu of top level Menu hSubMenu% = GetSubMenu(hMenu%, 0) For I% = 0 To Number_of_Menu_Selections - 1 ' get the handle to the specific item in SubMenu menuID% = GetMenuItemID(hSubMenu%, I%) ' Place the bitmap into the I'th submenu location X% = ModifyMenu(hMenu%, menuID%, MF_BITMAP, menuID%, CLng(picture1(I%).Picture)) ' Assign bitmap for the check mark to the I'th submenu X% = SetMenuItemBitmaps(hMenu%, menuID%, 0, 0, CLng(picture2.Picture)) Next I% End Sub Dynamic Bitmap Menus -------------------- This code sample will change the actual menu bitmaps size, font size, color, and caption. Run the application and select the BitMenu and view the selections. Then click on the form and revisit the BitMenu. Sub Form_Click () For i% = 0 To Number_of_Menu_Selections '* Place some text into the menu. SubMenu(i%).Caption = Picture1(i%).FontName + Str$(Picture1(i%).FontSize) + " Pnt" '* 1. Must be AutoRedraw for Image(). '* 2. Set Backcolor of Picture control to that of the '* current system Menu Bar color, so Dynamic bitmaps '* will appear as normal menu items when menu bar '* color is changed via the control panel '* 3. See the bitmaps on screen, this could all be done at design '* time. Picture1(i%).AutoRedraw = TRUE Picture1(i%).BackColor = CLR_MENUBAR Picture1(i%).Visible = FALSE '* Set the width and height of the Picture controls '* based on their corresponding Menu items caption, '* and the Picture controls Font and FontSize. '* DoEvents() is necessary to make new dimension '* values to take affect prior to exiting this Sub. Picture1(i%).Width = Picture1(i%).TextWidth(SubMenu(i%).Caption) Picture1(i%).Height =Picture1(i%).TextHeight(SubMenu(i%).Caption) Picture1(i%).Print SubMenu(i%).Caption '* - Set picture controls backgroup picture (Bitmap) to its Image. Picture1(i%).Picture = Picture1(i%).Image X% = DoEvents() Next i% '* Get handle to forms menu. hMenu% = GetMenu(Form1.hwnd) '* Get handle to the specific menu in top level menu. hSubMenu% = GetSubMenu(hMenu%, 0) For i% = 0 To Number_of_Menu_Selections '* Get ID of sub menu menuID% = GetMenuItemID(hSubMenu%, i%) '* Replace menu text w/bitmap from corresponding picture control X% = ModifyMenu(hMenu%, menuID%, MF_BITMAP, menuID%, CLng(Picture1(i%).Picture)) '* Replace bitmap for menu check mark with custom check bitmap X% = SetMenuItemBitmaps(hMenu%, menuID%, 0, 0, CLng(picture2.Picture)) Next i% End Sub Knowledge Base Title: How to Create Rubber-Band Lines/Boxes in Visual Basic Document Number: Q71488 Publ Date: 20-MAY-1991 Product Name: Microsoft Visual Basic Product Version: 1.00 Operating System: WINDOWS Summary: Creating rubber bands within Visual Basic can be done using the DrawMode property. Rubber bands are lines that stretch as you move the mouse cursor from a specified point to a new location. This can be very useful in graphics programs and when defining sections of the screen for clipping routines. This information applies to Microsoft Visual Basic Programming System version 1.00 for Windows. More Information: The theory of drawing a rubber-band box is as follows: 1. Draw a line from the initial point to the location of the mouse cursor using: [form|.DrawMode = 6. {INVERT} 2. Move the mouse cursor. 3. Save the DrawMode. 4. Set the [form|.DrawMode to 6. {INVERT} 5. Draw the same line that was drawn in step 1. This will restore the image underneath the line. 6. Set the [form|.DrawMode back to the initial DrawMode saved in step 3. 7. Repeat the cycle again. DrawMode equal to INVERT allows the line to be created using the inverse of the background color. This allows the line to be always displayed on all colors. The sample below will demonstrate the rubber-band line and the rubber-band box. Clicking on the command buttons will allow the user to select between rubber-band line or a rubber-band box. The user will also be able to select a solid line or a dashed line. Create and set the following controls and properties: CtlName Caption Picture ------- ------- ------- Form1 Form1 c:\windows\chess.bmp Command1 RubberBand Command2 RubberBox Command3 Dotted Command4 Solid In the general section of your code, define the following constants: Const INVERSE = 6 '*Characteristic of DrawMode property(XOR). Const SOLID = 0 '*Characteristic of DrawStyle property. Const DOT = 2 '*Characteristic of DrawStyle property. Const TRUE = -1 Const FALSE = 0 Dim DrawBox As Integer '*Boolean-whether drawing Box or Line Dim OldX, OldY, StartX, StartY As Single '* Mouse locations In the appropriate procedures, add the following code: Sub Form_MouseDown (Button As Integer, Shift As Integer, X As Single, Y As Single) '* Store the initial start of the line to draw. StartX = X StartY = Y '* Make the last location equal the starting location OldX = StartX OldY = StartY End Sub Sub Form_MouseMove (Button As Integer, Shift As Integer, X As Single, Y As Single) '* If the button is depressed then... If Button Then '* Erase the previous line. Call DrawLine(StartX, StartY, OldX, OldY) '* Draw the new line. Call DrawLine(StartX, StartY, X, Y) '* Save the coordinates for the next call. OldX = X OldY = Y End If End Sub Sub DrawLine (X1, Y1, X2, Y2 As Single) '* Save the current mode so that you can reset it on '* exit from this sub routine. Not needed in the sample '* but would need it if you are not sure what the '* DrawMode was on entry to this procedure. SavedMode% = DrawMode '* Set to XOR DrawMode = INVERSE '*Draw a box or line If DrawBox Then Line (X1, Y1)-(X2, Y2), , B Else Line (X1, Y1)-(X2, Y2) End If '* Reset the DrawMode DrawMode = SavedMode% End Sub Sub Form_MouseUp (Button As Integer, Shift As Integer, X As Single, Y As Single) '* Stop drawing lines/boxes. StartEvent = FALSE End Sub Sub Command2_Click () '* Boolean value to determine whether to draw a line or box. DrawBox = TRUE End Sub Sub Command1_Click () '* Boolean value to determine whether to draw a line or box. DrawBox = FALSE End Sub Sub Command3_Click () '* Create a dotted line Form1.DrawStyle = DOT End Sub Sub Command4_Click () '* Create a solid line. Form1.DrawStyle = SOLID End Sub Knowledge Base Title: Visual Basic Support Service Letter, BL0356; Phone Policies Document Number: Q72264 Publ Date: 30-MAY-1991 Product Name: Microsoft Visual Basic Product Version: 1.00 Operating System: WINDOWS Summary: Below is the letter that Microsoft sends in response to customers who want to know what Microsoft support services are available for Visual Basic. This form letter is sent out from Microsoft Product Support Services (PSS) as the following application note: BL0356 "Visual Basic Support Service Letter" This information applies to Microsoft Visual Basic version 1.00 programming system for Windows. More Information: Note: Page 1 of 2 is shown below for this reply letter. Page 2 of 2, the "Product Assistance Checklist," is shown in a separate article found by querying using the following words: product and assistance and checklist BL0356 "Visual Basic Support Service Letter" --------------------------------------------- Dear Visual Basic Customer: Thank you for contacting us regarding Microsoft Visual Basic Programming System for Windows. Although we are unable to respond to technical questions by letter (unless solicited by Microsoft), we will forward your questions to our development team. This procedure provides developers with customer feedback, which will make Microsoft's products even better. For fast answers to your technical questions, you may contact Microsoft directly using the following support services: 1. Microsoft Visual Basic startup service: (206) 646-5105 8 AM to 5 PM Pacific Time, Monday - Friday (except holidays) Microsoft is committed to getting you "up and running" with Visual Basic. On this phone line, a technician will assist you with setup and installation questions, and provide information on system requirements, product functionality, and navigating the Visual Basic environment. Product suggestions and problem reports are also welcome on this line. This service is free (but normal long- distance charges are billed by your phone company). 2. Microsoft OnCall(TM) for Visual Basic: (900) 896-9876 or (206) 646-5106 Extended hours: 6 AM to 6 PM Pacific Time, Monday - Friday (except holidays) For "how-to" programming assistance, priority support is available through this fee-based service. At OnCall for Visual Basic, technicians will answer questions about writing and debugging code, fine-tuning programs, error trapping and handling, creating custom controls, and calling the Windows API from Visual Basic. The rate for OnCall service is $2 per minute at (900) 896-9876 (billed by your phone company). If you are blocked from dialing our 900 phone number, please call (206) 646-5106, where we charge a credit card fee of $20 per call. Only Master Card, VISA, and American Express credit cards are accepted. 3. Microsoft AutoAnswer for Visual Basic: (206) 646-5107 Available 24 hours a day, 7 days a week The AutoAnswer automated voice system provides prerecorded answers to the most commonly asked questions about Visual Basic. AutoAnswer also provides a voice mail system that allows you to leave a message with comments on Visual Basic or on Microsoft Product Support Services. The AutoAnswer service is free (but normal long-distance charges are billed by your phone company). The AutoAnswer system is updated periodically. 4. CompuServe Information Service: VBasic Forum, and the Microsoft Knowledge Base User feedback and Microsoft technical support are available on the Microsoft Forum on CompuServe Information Service (CIS), an independent electronic information service that provides a medium for public discussion of Microsoft products. CompuServe also provides access to the Microsoft Knowledge Base, which contains descriptions of known problems and answers to commonly asked questions. For additional information about CompuServe, please call (800) 848-8990. 5. For more information on other comprehensive fee-based technical support options available from Microsoft, call (800) 443-4672. Thank you for using Microsoft Visual Basic, Blain Barton Basic Languages Team Manager Microsoft Product Support Services BL0356, 5/20/91 Knowledge Base Title: Declare Currency Type to Be Double When Returning from DLL Document Number: Q72274 Publ Date: 30-MAY-1991 Product Name: Microsoft Visual Basic Product Version: 1.00 Operating System: WINDOWS Summary: When using Visual Basic, if you want to pass a parameter to a DLL routine, or receive a function return value of type Currency from a DLL routine written in Microsoft C, the parameter or function returned should be declared as a "double" in the C routine. Note that C does not support the Basic Currency data type, and although specifying the parameter as type "double" in C will allow it to be passed correctly, you will have to write your own C routines to manipulate the data in the Currency variable. For information on the internal format of the Currency data type, query using the following words: Basic and Currency and internal and format This information applies to the Microsoft Visual Basic programming system version 1.00 for Windows. More Information: When creating a DLL function that either receives or returns a Currency data type, it may be useful to include the following declaration: typedef double currency; Based on this typedef, a sample DLL routine to return a currency value might be declared as follows: currency FAR pascal foo(...); Knowledge Base Title: PR Microsoft Announces Visual Basic at Windows World '91 Document Number: Q72312 Publ Date: 22-MAY-1991 Product Name: Microsoft News Releases Product Version: Operating System: Microsoft Announces Visual Basic at Windows World '91 General-Purpose, High-Productivity Programming System for Microsoft Windows ATLANTA -- May 20, 1991 -- Microsoft today announced Microsoft(R) Visual Basic(TM) programming system at the Windows World '91 industry trade show. Visual Basic is a graphical application development system for Microsoft Windows(TM) graphical environment version 3.0 that combines visual design tools with a powerful, general-purpose programming language and Windows .EXE compiler. It provides a simple solution to the complex task of creating real Windows-based software applications. "We set out to create the fastest, easiest way to program for the Windows environment," said Bill Gates, Microsoft founder and CEO. "My goal from the start was to make developing Windows applications as easy and natural as possible. We also wanted this tool to appeal to a broad spectrum of people interested in programming for Windows -- from professional corporate programmers and consultants solving business problems to independent software vendors and casual programmers." Visual Basic programming system combines a rich, event-driven programming model with the world's most widely used programming language in a tightly integrated package. General development for the Windows environment is faster than ever. The Visual Basic programming system provides visual user-interface design capabilities with powerful general-purpose programming tools, making it easy for any programmer to create compiled Windows .EXE files that can be freely distributed without run-time fees or royalties of any kind. "This is the most important software product of the year, if not the decade," said Steve Gibson, president of Gibson Research Inc. "It's the ultimate intellectual tool. Thanks to Visual Basic, both casual and professional programmers can produce compelling and beautiful results. Now it's easy to put together real Windows version 3.0 applications." "We needed to create an application that incorporated Microsoft Word for Windows and Microsoft Excel," said Craig Ellis, senior programmer analyst, Reuters Information Systems. "Visual Basic was the tool to do this. It filled our needs, allowed us to develop a fast and effective application and cut our development time by more than half. It's a fantastic product that allowed us to incorporate a family of Microsoft products into one application." The Visual Basic programming system can be used to develop any Windows-based application, including corporate business systems, tools and utilities, front ends to data (mainframe, server and local) or commercial Windows software products. It is also useful for integrating multiple Windows-based applications and for automating software testing through dynamic data exchange (DDE). Visual Basic programming system provides visual design tools for creating the user interface components -- windows and dialogs -- of an application. A full set of Windows interface components (including command buttons, text fields, list boxes, pictures, drop-down menus and file system controls) are created visually, without writing any code. The forms engine for building the interface incorporates technology acquired from Cooper Software. A powerful, structured programming language is then used to add functionality to these interface components, responding to events that are automatically trapped by the system. The Visual Basic language is a derivative of the Microsoft QuickBasic(TM) modern programming system, modified for the graphical environment and the event-driven programming language. It uses a threaded p-code incremental compiler and source-level debugging tools, including an interactive immediate window, in a tightly integrated system. Extensibility ------------- Support is provided for DDE, the mechanism for exchanging data with other Windows-based applications. The Visual Basic system also supports dynamic link libraries (DLLs), which allow the user to establish links with other Windows systems facilities and call the Windows API or routines written in other languages and compiled into DLLs. The control set itself can be extended by developers using C and the Windows SDK and the Microsoft Visual Basic Control Development Kit, available separately. This extensibility will provide the ability to fully integrate new user interface components into the graphical design and code development environment. Examples could include multimedia, pen controls and data access. Printed documentation and online Help provide step-by-step instructions for writing programs. The online Help system provides context-sensitive reference information and sample code that can be copied and pasted into a Visual Basic program. An icon library of approximately 400 designs and an icon editor written in Visual Basic language are also included. "The built-in help is excellent," said Lee Perryman, deputy director of Associated Press Broadcast Services in Washington, D.C. "The debugging features are superb, and the controls are rich and feature-packed. Because there is almost no learning curve for users familiar with the Basic language, Visual Basic makes Windows programming a snap." Visual Basic programming system for Windows will be available in June 1991 for a suggested retail price* of $199. German and French versions are expected to ship in August, with other foreign language versions to follow. The Visual Basic programming system runs in either the standard or enhanced mode of Microsoft Windows graphical environment version 3.0 or higher. The system requirements include a personal computer using 80286 processor or higher; hard disk; mouse; CGA, EGA, VGA, 8514, Hercules(R) or compatible display; MS-DOS(R) operating system version 3.1 or later and one or more megabyte of memory. Microsoft Corporation (NASDAQ "MSFT") develops, markets and supports a wide range of software for business and professional use, including operating systems, network products, languages and applications as well as books, CD-ROM products and hardware for the microcomputer marketplace. *Prices listed are U.S. suggested retail prices. ### Microsoft, the Microsoft logo and MS-DOS are registered trademarks and Microsoft QuickBasic, Visual Basic and Windows are trademarks of Microsoft Corporation. Hercules is a registered trademark of Hercules Computer Technology. For pricing and availability outside the U.S., please contact your local subsidiary. Knowledge Base Title: PR MS Announces Visual Basic Control Development Kit Document Number: Q72313 Publ Date: 22-MAY-1991 Product Name: Microsoft News Releases Product Version: Operating System: Control Development Kit Lets Developers Extend Microsoft Visual Basic with New Controls Redmond, Wash. -- May 20, 1991 -- Microsoft today announced the Microsoft(R) Visual Basic(TM) Control Development Kit, a kit that allows software developers to extend the capabilities of the Visual Basic programming system by developing custom controls for the Visual Basic Toolbox. Visual Basic is a general-purpose programming system hosted within the Microsoft Windows(TM) graphical environment that lets programmers quickly develop new applications for that environment. Custom controls created with the Control Development Kit can provide new visual interface elements, trap events and add functionality -- just like the built-in controls that come with the product. Once the custom controls are loaded into a project, they are available for use along with the standard controls. Standard Toolbox controls include such items as command buttons, option buttons, text boxes, check boxes, scroll bars, timers and file system controls. Possible custom controls that third parties could develop with the Control Development Kit include controls for data access, multimedia environments, and Microsoft Windows for Pen Computing. For example, they might develop custom SQL Server controls that trap messages from the server; animation, video and sound controls for multimedia PCs; and controls for handwriting input and recognition for the Windows for Pen environment. Custom controls are written in C; developers using the Control Development Kit must also be familiar with the Windows application programming interface (API). "Visual Basic will make Windows programming much more accessible, allowing millions of programmers to create their own Windows programs," said Tom Button, product marketing manager for the Microsoft applications programmability group. "Now, with the Control Development Kit, third-party software developers can participate in and help define this new opportunity. Visual Basic programmers will also benefit from the development of custom controls, since these controls will provide more options for application development." Beta sites for the Control Development Kit are also enthusiastic about the product. "I think Visual Basic is going to be a very successful product -- and a key factor in its success is the fact that it's so incredibly extensible," said Daniel Appleman, president of Desaware, a software company based in San Jose, California. "With the standard product, you get a set of built-in controls that are very useful; with the Control Development Kit, you get the ability to add virtually any control you want. And, once they've been added, the custom controls are just as easy to use as the built-in ones." The Visual Basic Control Development Kit includes 5.25- and 3.5-inch disks, plus documentation. It requires the Visual Basic programming system, the Microsoft Windows Software Development Kit (version 3.0 or later) and the Microsoft C compiler (version 6.0 or later). The kit will be available from Microsoft in June for $49.95* plus shipping, handling and applicable sales tax. Microsoft Corporation (NASDAQ "MSFT") develops, markets and supports a wide range of software for business and professional use, including operating systems, network products, languages and applications as well as books, CD-ROM products and hardware for the microcomputer marketplace. *Prices listed are U.S. suggested retail prices. ### Microsoft and the Microsoft logo are registered trademarks and Visual Basic and Windows are trademarks of Microsoft Corporation. For pricing and availability outside the U.S., please contact your local subsidiary. Knowledge Base Title: PR Windows-Based Visual Basic SDK for SQL Server Announced Document Number: Q72315 Publ Date: 22-MAY-1991 Product Name: Microsoft News Releases Product Version: Operating System: Microsoft Announces Windows-Based Visual Basic Software Development Kit for SQL Server ATLANTA -- May 20, 1991 -- Microsoft Corporation today announced Visual Basic(TM) Library and Software Development Kit (SDK) for Microsoft(R) SQL Server. Visual Basic programmers can quickly develop rich Microsoft Windows(TM) graphical environment-based client-server applications for Microsoft SQL Server, the company's intelligent database server for PC networks. Developers wanting to take advantage of the Microsoft Windows graphical environment and Microsoft SQL Server can now use the Visual Basic SDK to build line-of-business or decision support applications that require a robust multiuser database server. Developers can also use Visual Basic Library for SQL Server with the Database Gateway(TM) from Micro Decisionware, Boulder, Colo., to build graphical applications that tap DB2(TM) and other IBM(R) mainframe data sources. "Visual Basic programming system is an exciting tool for building rich Windows-based client-server applications on SQL Server," said Dwayne Walker, group business manager, server applications group at Microsoft. "For some time now, our customers have been asking for such a tool to develop prototypes and custom applications around SQL Server." Visual Basic Library for SQL Server is built on the standard SQL Server application programming interface (API) called DB-Library(TM). To date, Microsoft has provided language support for C, Basic, and COBOL. Visual Basic Library for SQL Server adds another language to the list of those that can be used to develop applications for SQL Server. Visual Basic Library for SQL Server will be available as a Software Development Kit by June 30, 1991. The product will contain the programming libraries, a preliminary documentation set and a copy of Visual Basic programming system. It will be available directly from Microsoft for $495*. The Visual Basic system is a graphical application development system for Microsoft Windows graphical environment version 3.0 that combines visual design tools with a powerful, general-purpose programming language and Windows .EXE compiler. It provides a simple solution to the complex task of creating real Windows-based software applications. Microsoft SQL Server is an intelligent client-server relational database management system (RDBMS) for PC networks. Providing capabilities previously the exclusive domain of mainframe and minicomputer systems, Microsoft SQL Server brings high-end performance, security, and data integrity to local area networks, allowing data to be shared safely among many applications and users. Microsoft SQL Server is supported by popular networks such as Microsoft LAN Manager, Novell(R) NetWare(R) and IBM LAN Server. Microsoft Corporation (NASDAQ "MSFT") develops, markets, and supports a wide range of microcomputer software for business and professional use, including operating systems, languages and applications, as well as books, hardware and CD-ROM products for the microcomputer marketplace. *Prices listed are U.S. suggested retail prices. ### Microsoft and the Microsoft logo are registered trademarks and Visual Basic and Windows are trademarks of Microsoft Corporation. Database Gateway is a trademark of Micro Decisionware. DB-Library is a trademark of Sybase, Inc. IBM is a registered trademark and DB2 is a trademark of International Business Machines Corporation. Novell and NetWare are registered trademarks of Novell, Inc. For pricing and availability outside the U.S., please contact your local subsidiary. Knowledge Base Title: PR Microsoft Visual Basic Document Number: Q72316 Publ Date: 22-MAY-1991 Product Name: Microsoft News Releases Product Version: Operating System: Microsoft Visual Basic May 1991 Introduction ------------ The Microsoft(R) Windows(TM) graphical environment offers many benefits to end users -- ease of use, user interface consistency, interapplication integration -- but poses new challenges for programmers. Writing Windows applications poses a challenge to programmers because the available development tools lack the very combination of functionality and ease of use that the applications themselves feature. Tools for Developing Graphical Applications ------------------------------------------- Microsoft Windows applications make doing powerful things easy. The Microsoft Visual Basic(TM) programming system creates applications that tap into such Windows functionality as rich forms and controls, pull-down menus, graphics and animation, dynamic data exchange (DDE) and multi-tasking. These are difficult for Windows programmers using traditional tools to develop, but very easy to achieve in the Microsoft Visual Basic programming system. In general, software development tools have resided at either end of a spectrum, and each extreme forced developers to make tradeoffs. High-level tools allow faster development, which is paid for in reduced flexibility and control and greater runtime overhead. Low-level tools provide better control and less overhead, but require more programming skill. Thus, choosing a tool often involves making an undesirable compromise. Microsoft Visual Basic: Real Windows Applications Really Fast ------------------------------------------------------------- Microsoft Visual Basic programming system is a general-purpose graphical application development system for the Microsoft Windows environment that bridges the extremes of the tool spectrum described above. The Visual Basic system addresses the need for a Windows programming solution that is both serious and easy to use. It is specifically designed to accelerate Windows version 3.0 development by harnessing the power of the graphical environment to make mainstream programmers more productive. Visual Basic helps programmers create real Windows applications real fast. Extremely easy to use, it is the ultimate productivity tool. Visual Basic Key Features ------------------------- The following is a description of the key features of the Microsoft Visual Basic programming system. Visual Design Tools for the User Interface ------------------------------------------ The Visual Basic system offers rich design tools that enable the visual components of an application to be designed with drawing tools. No code is required to create graphical user interfaces. Programs are designed, created and run within the target Windows environment. With Visual Basic programming system, windows and dialog boxes are designed visually by selecting a tool from the Toolbox of controls and then placing and sizing them on a form. All the Windows controls are included in the Toolbox: command buttons, option buttons, check boxes, simple and drop-down list boxes and combo boxes, text fields, labels (static text), pictures (that can display icons, bitmaps, Windows metafiles and programmatic graphics), Frame (to visually and functionally group controls), Timer (that responds to the system clock), scroll bars, and file system controls (drives, directory and file list boxes). These controls have the appearance and behavior of Windows controls such as three-dimensional command buttons that push in and out, scroll bars that scroll, and edit fields that accept text input and support cutting and pasting without writing any code. Visual design tools are also used to set the attributes of a form's appearance and behavior, from within the Visual Basic environment. The Property Bar provides a list of available properties for each type of control. A color palette offers a visual way to assign color properties. Menus, complete with access keys and accelerators, are created in outlining fashion in a menu design window. A project or application can include many forms. A Structured, Powerful Programming Language ------------------------------------------- The Visual Basic language is a powerful, structured, general-purpose programming language. It is a derivative of the Microsoft QuickBasic(TM) modern programming system. Visual Basic language offers all the modern programming structures such as Subs and Functions, Block If...Then...Else..., Select Case, Do While/Until, For/Next and error trapping with an easy-to-learn syntax. An Event-Driven Programming Model --------------------------------- The Visual Basic system introduces a high-level, event-driven programming model that is especially suited for programming in a graphical environment. Events such as mouse clicks and key presses are automatically detected and processed by the system. The Visual Basic programmer doesn't need to deal with event trapping or Windows message dispatching and can simply tell the Visual Basic application how to respond to a specific recognized event on a particular form or control. The Visual Basic system's visual design tools, combined with its event-driven nature, free the programmer to think of how the application should look and behave, instead of having to concentrate on lower-level system events or coding the user interface. A Fast, Responsive Coding and Debugging Environment --------------------------------------------------- The Microsoft Visual Basic programming system's combination of an intuitive front-end building tool with an easy-to-learn programming language creates a highly productive development environment. Further productivity is realized by the system's threaded p-code incremental compiler, a technology first introduced in Microsoft QuickBasic programming system version 4.0 in 1987. Each line of code is automatically parsed and incrementally compiled as soon as it is typed in. Syntax errors are trapped immediately, alerting the programmer to any syntax problem. The incremental compilation allows a very fast transition from Design mode to Run mode. Break mode is also available when the program encounters a runtime error or a breakpoint in the code. The programmer can then single-step or procedure-step through the application. The programmer also can set the next statement to be executed anywhere within a procedure. An Immediate window lets the programmer interact with the application while it is temporarily suspended in the running state. The programmer can check or even change the value of a variable, or enter any valid line of code, which is directly executed without affecting the source code. The programmer can then copy code entered in the Immediate window to the Code window, to be included in the program's source code. This revolutionary technology, first introduced in Microsoft QuickBasic system version 4.0, is the threaded p-code incremental compiler. For additional productivity, help is readily available in both online and printed form. A detailed computer-based tutorial gets the user up and running fast, and manuals (Programmer's Guide and Language Reference) provide further training and reference materials. Context- sensitive online Help provides readily available reference information on the programming language and environment. Code examples from Help can be copied and pasted to an application's source listing. The Ability to Create Real Windows .EXE Files When a program is designed, coded, debugged and fully functional, the programmer simply chooses Make EXE File from the File menu to create an .EXE file that can be freely distributed, without any royalties or runtime fees. .EXE files can have all the features generally associated with Microsoft Windows programs, such as multiple windows, pull-down menus, standard controls (command buttons, text fields, option buttons), graphics and icons, drag-and-drop and DDE. Interoperability and Extensibility ---------------------------------- Microsoft Visual Basic programming system gives programmers access to DDE and dynamic link libraries (DLLs) for interoperability and extensibility with other applications. Interapplication communication and integration is available via DDE. Visual Basic applications can be DDE clients, servers or both. The environment offers high-level DDE (paste-link) as well as programmable DDE in the language. Visual Basic environment includes a rich set of DDE events (LinkOpen, LinkClose, LinkExecute, LinkError), properties (LinkMode, LinkTopic, LinkItem, LinkTimeout), and methods (LinkExecute, LinkPoke, LinkRequest, LinkSend). Visual Basic programmers can access external routines in DLLs, including directly calling the Windows API (applications programming interface). This is accomplished with a very straightforward syntax. A one-line Function or Sub Declaration is all that is required to use an external DLL routine as though it were built into the Visual Basic system's language. Users can gain powerful additional functionality by extending the Microsoft Visual Basic development environment with custom controls. Microsoft has separately announced the Visual Basic Control Development Kit, which allows Windows developers to create extensions to the Visual Basic system. Custom controls can have predefined properties and events and some built-in functionality, just like the standard controls in the Visual Basic Toolbox. A Visual Basic programmer can load a custom control into a project, then assign properties and write code for it just as though it were a built-in control. Custom controls, like the standard ones, can trap events and call the appropriate event procedures written in Visual Basic language. This mechanism allows the Visual Basic environment to be extended in many different ways, providing custom user-interface components and specialized functionality such as multimedia, data access or communications capabilities. Visual Basic For High Productivity ---------------------------------- Visual Basic programming system is designed to make Windows application developers more productive regardless of skill level or application complexity. Its tightly integrated graphical development environment helps move applications from concept to executable code in the shortest possible time. The Visual Basic User --------------------- Users of the Microsoft Visual Basic system have the common task of creating Windows applications, although they come to it with different backgrounds and skills. They are professional programmers working with small ISVs, VARs and system integrators; part-time programmers, including engineers, scientists, analysts and educators; corporate development staff and MIS professionals; and general PC "power users" who want to create their own Windows applications. Visual Basic system doesn't require programming experience, but it is helpful if the user is familiar with general programming concepts. Anyone who has written a macro or batch file, or has programmed in any high-level language, can be productive very quickly with Microsoft Visual Basic. Using the Visual Basic system, programmers can carry out a variety of tasks, including writing standalone GUI applications; integrating applications; developing application front ends, utilities or tools, and graphical display-oriented programs; and prototyping. Summary ------- As Microsoft Windows grows in popularity, development environments are naturally evolving toward graphical hosts, allowing programmers to realize the productivity benefits of the graphical user interface. Microsoft Visual Basic programming system is a low-cost (under $200 U.S. suggested retail price) Microsoft Windows-hosted and targeted development tool that uses an event-driven programming model. It offers high-level visual design tools to help programmers develop interfaces. A graphical tool for graphical systems, the Visual Basic programming system provides a simple solution to the otherwise complex task of creating and integrating real Windows applications. It is the only general-purpose, high-productivity programming system for the Microsoft Windows environment. ### Microsoft and the Microsoft logo are registered trademarks and Visual Basic, Windows and Microsoft QuickBasic are trademarks of Microsoft Corporation. For pricing and availability outside the U.S., please contact your local subsidiary. Knowledge Base Title: PR Microsoft Announces Update of FORTRAN Compiler Document Number: Q72560 Publ Date: 30-MAY-1991 Product Name: Microsoft News Releases Product Version: Operating System: Microsoft Announces Update of FORTRAN Compiler That Taps the Power of Microsoft Windows REDMOND, Wash. -- May 28, 1991 -- Microsoft today announced the Microsoft(R) FORTRAN professional development system version 5.1, bringing the power of the Microsoft Windows(TM) graphical environment to FORTRAN developers. This new version introduces the QuickWin library, which allows programmers to port DOS* applications to the Windows environment without modifying their code. It also supports the development of Windows DLLs (dynamic link libraries) for inclusion in mixed-language applications. New QuickWin Library Turns DOS Programs into Windows Programs ------------------------------------------------------------- By providing access to Windows, the QuickWin library allows FORTRAN applications to take advantage of extended and virtual memory -- over 16 MB on 80386 computers. This is done simply by recompiling DOS applications in Microsoft FORTRAN and linking them to the Microsoft QuickWin library. Most 16-bit applications can be moved to the Windows environment without changes to the source code. Microsoft plans to incorporate the QuickWin library in other language products as well. "FORTRAN programs usually require a lot of memory for program and data," said Fred Gray, general manager of the languages business unit at Microsoft. "Now programmers can create bigger applications and also take advantage of the power of the Windows environment." The QuickWin library provides a fast way to port character-based FORTRAN applications to the Windows graphical environment, taking advantage of the advanced features Windows computing offers. For example, programmers can add custom-sized child windows, window titles and message boxes to their QuickWin applications. QuickWin applications can access all memory available under the Windows environment. "The QuickWin library allows us to expand easily the data matrices used by our fault tree analysis applications without concern for running out of memory," said Bill Debus, manager of software engineering for a major aerospace company. New Links Facilitate Mixed-Language Programming in Windows Applications ----------------------------------- Programmers can now link FORTRAN object code and dynamic-link libraries to Windows applications. Existing FORTRAN code can be used when developing full-featured Windows applications, such as those written in Microsoft C or with the Microsoft Visual Basic(TM) programming system. DLLs can also be used as repositories for FORTRAN algorithms that are shared by multiple Windows applications. "Being able to reuse our established FORTRAN libraries as Windows DLLs allows us to speed up migration of our Simusolve modeling software from host machines to the Windows environment," said Gary Agin, software developer at the Dow Chemical Company. Windows Provides Access to Analysis Tools ----------------------------------------- The ability to develop Windows-based FORTRAN applications will be welcomed by Microsoft FORTRAN users, over 50 percent of whom have the Microsoft Windows environment. The Microsoft Windows environment allows FORTRAN programmers to exchange data easily with popular analysis tools that run in the Windows environment, such as Microsoft Excel. FORTRAN output can be cut-and-pasted into Microsoft Excel or other Windows charting software for custom graphic display. VAX, IBM Syntax Compatibility ----------------------------- Microsoft's optimizing FORTRAN compiler supports ANSI 77 and numerous IBM(R), VAX(R) and ANSI 8x extensions. Support for IBM and VAX extensions is particularly significant for the vast majority of applications ported to PCs, approximately half of which are from IBM mainframes and half from the VAX environment. These extensions, along with the QuickWin technology, may enable the migration of traditional FORTRAN code in minicomputer and mainframe environments to the Windows graphical environment. An Integrated Toolset Speeds Application Development ---------------------------------------------------- As with all other Microsoft professional development systems, FORTRAN professional development system version 5.1 includes a complete set of integrated tools and utilities for developing programs. This set includes the Microsoft CodeView(R) debugger, Advisor online help, the Source Browser and the complete Microsoft Programmer's WorkBench. The CodeView debugger has been improved to take advantage of extended memory for debugging large DOS applications, as well as for supporting Windows and OS/2(R) programs. Pricing and Availability ------------------------ Microsoft FORTRAN professional development system version 5.1 will be available in June 1991 for a suggested retail price of $450. Licensees of previous versions of Microsoft FORTRAN can receive an update for $150 until June 1, 1992. Microsoft Corporation (NASDAQ "MSFT") develops, markets and supports a wide range of software for business and professional use, including operating systems, network products, languages and applications as well as books, CD-ROM products and hardware for the microcomputer marketplace *As used herein, "DOS" refers to the MS-DOSR and PC-DOS operating systems. ### Microsoft, the Microsoft logo, CodeView and MS-DOS are registered trademarks and Visual Basic and Windows are trademarks of Microsoft Corporation. OS/2 is a registered trademark licensed to Microsoft Corporation. Simusolve is a registered trademark of Dow Chemical Company. IBM is a registered trademark of International Business Machines Corporation. VAX is a registered trademark of Digital Equipment Corporation. For pricing and availability outside the U.S., please contact your local subsidiary. Knowledge Base Title: PR MS Visual Basic for Windows Wins Overall "Best of Show" Document Number: Q72561 Publ Date: 30-MAY-1991 Product Name: Microsoft News Releases Product Version: Operating System: Microsoft Visual Basic for Windows Wins Overall "Best of Show" at COMDEX/Spring and Windows World REDMOND, Wash., -- May 29, 1991 -- "Microsoft Visual Basic represents the "best of the bests" in a field of hundreds of new introductions at COMDEX and WINDOWS WORLD," said Fred Langa, editor in chief of BYTE magazine. Show organizers -- The Interface Group and BYTE magazine editors -- selected the Visual Basic(TM) programming system as the most exciting new product which will have the most industry impact. The Visual Basic system also received the "Best of Spring" award for the Best Windows(TM) Utility. The Visual Basic programming system is a graphical application development system for Microsoft(R) Windows graphical environment version 3.0, and combines visual design tools with a powerful, general-purpose programming language and Windows .EXE compiler. The Visual Basic system was introduced May 21, 1991, at a press conference attended by more than 600 corporate customers, developers and journalists. Microsoft founder and CEO Bill Gates forecasts that many more thousands of Windows applications will be written in the Visual Basic language. Forty-five independent software developers announced and demonstrated more than 60 products ranging from custom controls to add-on DLLs for data access and multimedia applications. Charles Stevens, general manager of the Microsoft data access business unit, said "Our goal was to make creating real Windows applications incredibly easy and fast. This award represents an affirmation of our strategy of combining a rich set of visual design tools with a powerful, event-driven programming language to achieve just that. "We also appreciate the feedback from our customers, independent software vendors and beta sites that helped us build the product they wanted and which continue to guide our future directions." Visual Basic programming system for Windows will be available in June 1991 for a U.S. suggested retail price of $199. German and French versions are scheduled to ship in August, with other language versions to follow. Microsoft Corporation (NASDAQ "MSFT") develops, markets and supports a wide range of software for business and professional use, including operating systems, network products, languages and applications as well as books, CD-ROM products and hardware for the microcomputer marketplace. ### Microsoft and the Microsoft logo are registered trademarks and Visual Basic and Windows are trademarks of Microsoft Corporation. For pricing and availability outside the U.S., please contact your local subsidiary. Knowledge Base Title: How to Create Flashing/Rotating Rubber-Band Box in VB Document Number: Q71489 Publ Date: 17-JUN-1991 Product Name: Microsoft Visual Basic Product Version: 1.00 Operating System: WINDOWS Summary: Several programs, such as Excel, create a flashing border (which appears to rotate) when selecting items of the windows when using the Edit Copy selection of the menu system. You can create a flashing, rotating border with the DrawMode and DrawStyle properties of a Visual Basic form. This information applies to Microsoft Visual Basic Programming System version 1.00 for Windows. More Information: By drawing a dashed line on the form and then within a timer event creating a solid line on the dashed line with DrawMode set to INVERSE, you can create a special effect of a flashing border that appears to rotate. You can draw a rotating rubber-band box as follows: 1. Draw a line using: DrawStyle = 2 {Dot} 2. Save the [form|.DrawMode and the [form|.DrawStyle. 3. Set the [form|.DrawMode = 6 {Inverse}. 4. Set [form|.DrawStyle = 0 {Solid}. 5. Draw the same line as in step 1. 6. Reset the properties saved in step 2. 7. Delay some time interval. 8. Repeat starting at step 2. The following code demonstrates the rotating (flashing) border. Pressing the mouse button and then dragging the cursor some distance will create a dotted line. Releasing the button will display a rotating rubber-band box. In VB.EXE, create a form called Form1. On Form1, create a timer control with the name Timer1 and with an interval of 100. Duplicate the following code within the general declaration section of your code window: Const INVERSE = 6 'Characteristic of DrawStyle property(Inverse). Const SOLID = 0 'Characteristic of DrawMode property. Const DOT = 2 'Characteristic of DrawMode property. Const TRUE = -1 Const FALSE = 0 Dim OldX, OldY, StartX, StartY As Single Add the following code in the appropriate event procedures for Form1: Sub Form_Load () '* Must draw a dotted line to create effect. Load a bitmap. Not required but shows full extent of line drawing. DrawStyle = DOT End Sub Sub Timer1_Timer () SavedDrawStyle% = DrawStyle '* Solid is need to create the inverse of the dashed line. DrawStyle = SOLID '* Invert the dashed line. Call DrawLine(StartX, StartY, OldX, OldY) '* Restore the DrawStyle back to what it was previously. DrawStyle = SavedDrawStyle% End Sub Sub Form_MouseDown (Button As Integer, Shift As Integer, X As Single, Y As Single) ' The above Sub statement must be on just one line. '* Don't add effect as you draw box. Timer1.Enabled = FALSE '* Save the start locations. StartX = X StartY = Y '* Set the last coord. to start locations. OldX = StartX OldY = StartY End Sub Sub Form_MouseMove (Button As Integer, Shift As Integer, X As Single, Y As Single) ' (The above Sub statement must be on just one line.) '* If button is depress then... If Button Then '* Restore previous lines background. Call DrawLine(StartX, StartY, OldX, OldY) '* Draw new line. Call DrawLine(StartX, StartY, X, Y) '* Save coordinates for next call. OldX = X : OldY = Y End If End Sub Sub DrawLine (X1, Y1, X2, Y2 As Single) '* Save the current mode so that you can reset it on '* exit from this sub routine. Not needed in the sample '* but would need it if you are not sure what the '* DrawMode was on entry to this procedure. SavedMode% = DrawMode '* Set to XOR DrawMode = INVERSE '*Draw a box Line (X1, Y1)-(X2, Y2), , B '* Reset the DrawMode DrawMode = SavedMode% End Sub Sub Form_MouseUp (Button As Integer, Shift As Integer, X As Single, Y As Single) ' (The above Sub statement must be on just one line.) StartEvent = FALSE Timer1.Enabled = TRUE End Sub Knowledge Base Title: VB Can Determine When a Shelled Process Has Terminated Document Number: Q72880 Publ Date: 17-JUN-1991 Product Name: Microsoft Visual Basic Product Version: 1.00 Operating System: WINDOWS Summary: The Shell function initiates a process and returns back to the Visual Basic program. The process will continue indefinitely until you decide to stop it. Terminating the Visual Basic program will not cause the shelled process to terminate. However, you may not want this behavior if you want the Visual Basic program to wait until the shelled process has finished before continuing. This article describes a method by which a Visual Basic program will wait until a shelled process has terminated. This information applies to Microsoft Visual Basic programming system version 1.0 for Windows. More Information: By using the Windows API functions GetActiveWindow and IsWindow, your program can monitor the status of a shelled process. The API function GetActiveWindow should be called immediately after the Shell function to get the window handle of the shelled process. This will work correctly only if you invoke the Shell function using a window style with focus, that is, window style 1, 2, or 3. By continually calling the API function IsWindow from within a While loop, you can cause the Visual Basic program to wait until the shelled process has terminated. The Windows API function IsWindow simply checks to make sure that the window associated with the handle found with GetActiveWindow is still a valid window. The Visual Basic program below uses the Shell function to execute Windows's Calculator accessory. The program is an example of how to use the Windows API functions GetActiveWindow and IsWindow to wait until a shelled process has terminated before resuming execution. Code Example ------------ 'The Declare statements for Windows API functions need to be included 'in the Declarations section of the form or in the Global module. 'Assume that the following Declare statements are in the Declarations 'section of the default form (Form1). Declare Function GetActiveWindow% Lib "User" () Declare Function IsWindow% Lib "User" (ByVal hWnd%) 'Below is the code contained within the Form_Load event procedure of 'the default form (Form1): Sub Form_Load () x% = Shell("calc.exe", 1) ' Must Shell using a Window Style ' with focus, Window style 1, 2, or 3. ' You must immediately invoke GetActiveWindow%() for this ' technique to work: ShellWindowHWnd% = GetActiveWindow%() 'Get the window handle ' of the shelled process. While IsWindow%(ShellWindowHWnd%) 'Wait until the shelled ' process has been terminated. x% = DoEvents() 'Process other Windows events. Wend End End Sub Knowledge Base Title: How to Set Tab Stops Within a List Box in Visual Basic Document Number: Q71067 Publ Date: 18-JUN-1991 Product Name: Microsoft Visual Basic Product Version: 1.00 Operating System: WINDOWS Summary: Visual Basic does not have any intrinsic function for creating multi-column list boxes. To create multi-column list boxes, you must call several Windows API function calls to set tab stops within the list box. The tab stops create the multi-column effect. This information applies to Microsoft Visual Basic Programming System version 1.00 for Windows. More Information: Multi-column list boxes can be created by calling several Windows API function calls. These functions are GetFocus, SendMessage, and SetFocus. The function GetFocus requires no parameters. This function will return an integer value that represents the handle to the control. Use GetFocus to get the handle to the control that currently has focus upon entry to the event-handler procedure. After you store the handle to the control that currently has focus, set the focus to the desired list box. After you set the focus to the list box, you must send a message to the window's message queue that will reset the tab stops of the list box. Using the argument LB_SETTABSTOPS as the second parameter to SendMessage will set the desired tab stops for the multi-column list box based on other arguments to the function. The SendMessage function requires the following parameters for setting the tab stops SendMessage (hWnd%,LB_SETTABSTOPS, wParam%, lparam) where: wParam% Is an integer that specifies the number of tab stops in the list box. lParam Is a long pointer to the first member of an array of integers containing the tab stop position in dialog units. (A dialog unit is a horizontal or vertical distance. One horizontal dialog unit is equal to 1/4 of the current dialog base-width unit. The dialog base units are computed based on the height and the width of the current system font. The GetDialogBaseUnits function returns the current dialog base units in pixels.) The tab stops must be sorted in increasing order; back tabs are not allowed. After setting the tab stops with the SendMessage function, calling PutFocus with the saved handle will return the focus back to the control that had focus before the procedure call. PutFocus is the Alias for the Windows API SetFocus function. The Windows API SetFocus needs to be redefined using the "Alias" keyword because SetFocus is a reserved word within Visual Basic. To create multi-column list boxes within Visual Basic, create a list box named Listbox1 on Form1. Declare the following Windows API functions at the module level or in the Global section of your code as follows: Declare Function GetFocus Lib "user" () As Integer Declare Function SendMessage Lib "user" (ByVal hwnd As Integer, ByVal wMsg As Integer, ByVal wp As Integer, lp As Any) As Long Declare Function PutFocus Lib "user" Alias "SetFocus" (ByVal hWnd%) As Integer Note: All Declare statements must each be written out on one line. Also declare the following constants: Const WM_USER = &H400 Const LB_SETTABSTOPS = WM_USER + 19 Include the following code within a SUB procedure: Sub Form_Click () Static tabs(3) As Integer hOldWnd% = GetFocus() 'Remember who had the focus. list1.SetFocus 'Set the focus to the list box. lbhWnd% = GetFocus() 'Get the handle to the list box. 'Set up the array of defined tab stops. tabs(1) = 10 tabs(2) = 50 tabs(3) = 90 'Send a message to the message queue. retVal& = SendMessage(lbhWnd%, LB_SETTABSTOPS, 3, tabs(1)) 'Restore the handle to whoever had it. R% = PutFocus(hOldWnd%) 'Place some elements into the list box. list1.AddItem "Name" + Chr$(9) + "Rank" + Chr$(9) + "Serial#" list1.AddItem "J. Doe" + Chr$(9) + "O-3" + Chr$(9) + "1234" list1.AddItem "J. Blow" + Chr$(9) + "E-1" + Chr$(9) + "5678" list1.AddItem "F. Smith" + Chr$(9) + "O-6" + Chr$(9) + "0192" End Sub Knowledge Base Title: PR QBasic Interpreter Included with Each Copy of MS-DOS 5 Document Number: Q73245 Publ Date: 20-JUN-1991 Product Name: Microsoft News Releases Product Version: Operating System: Modern Structured Programming Language, QBasic Interpreter Included with Each Copy of MS-DOS 5 NEW YORK CITY -- June 11, 1991 -- Microsoft Corporation today announced that Microsoft(R) MS-DOS(R) QBasic(TM) Interpreter, a powerful, modern Basic interpreter, replaces GW-BASIC(R) interpreter in the MS-DOS 5 operating system. The new MS-DOS QBasic Interpreter, an interpreter-only subset of the award-winning Microsoft QuickBasic(TM) compiler version 4.5, loads and runs most GW-BASIC programs without modification while permitting far more powerful and structured applications to be created. QBasic Interpreter is completely upward-compatible with Microsoft QuickBasic compiler version 4.5. Basic, the world's most popular programming language, has been included in the MS-DOS operating system since it first began shipping in 1981. In MS-DOS 5, QBasic Interpreter replaces the 10-year-old GW- BASIC interpreter. "While our retail Basic products have grown and matured over the last 10 years, we've been looking for an opportunity to provide the same modern syntax in the version that ships with MS-DOS, that we have in our retail tools," said Mike Maples, vice president of applications at Microsoft. "GW-BASIC and BASICA have been the first look at programming for many computer users. We're excited that beginning programmers, students and others interested in doing some casual programming will now have a fully structured, modern programming language to use -- MS-DOS QBasic Interpreter." "More than 6 million PC users in the U.S. alone have used Basic in the past year," said Charles Stevens, general manager of the Microsoft data access business unit. "Our research shows that more people, both professional programmers and average computer users, know Basic than any other programming language. Microsoft now offers a complete line of compatible Basic development tools for DOS*, from MS-DOS QBasic Interpreter to Microsoft QuickBasic compiler to Microsoft Basic professional development system. These are specifically tailored to different customer segments, from the casual programmer and student to the professional developer." A Powerful Programming Tool --------------------------- MS-DOS QBasic Interpreter, like other Microsoft Basic products, uses the modern Basic language. Old commands and features such as GOTO, GOSUB and line numbers are unnecessary (but are supported for backward compatibility). MS-DOS QBasic Interpreter also supports true procedures and functions with local variables, full parameter passing, modern control-flow structures (including SELECT CASE, DO/WHILE LOOP/UNTIL) nested block IFs, user-defined data types structures, recursion, random, binary and sequential file I/O, and global error handling. To make learning the language easier, detailed online help is included along with code examples that can be copied into a user's program. A standard, easy-to-use interface using menus and dialog boxes supports both the mouse and the keyboard and functions much like the user interface in Microsoft Word version 5.5 or Microsoft Works. Other features include break points to speed debugging and Search & Replace for making large-scale changes. Because Basic is an international favorite, the MS-DOS QBasic Interpreter will be localized into several languages worldwide, including Russian, French, German, Italian, Swedish, Dutch, Finnish, Portuguese and Korean. Product support is available from Microsoft OnCall(TM) for Basic** at (900) 896-9999. Programs written in QBasic language typically run six times faster than those written in GW-BASIC or BASICA, and have more than twice the capacity, 160 K versus 64 K. (Microsoft QuickBasic compiler and Basic professional development system offer increased performance over MS- DOS QBasic Interpreter with capacities of 640 K and 16 MB, respectively.) Available Books --------------- More than a half-dozen books on MS-DOS QBasic Interpreter are currently available or will be soon. Available now are Running QBasic from Microsoft Press and QBasic Made Easy from Osborne/McGraw-Hill. Scheduled for a July release are Using QBasic from Que Corporation, Power QBasic and Teach Yourself QBasic from MIS Books. Howard W. Sams & Company's First Book of QBasic and The Waite Group's QBasic Primer Plus will be available in the fall. Basic Products Available Today ------------------------------ In addition to the new MS-DOS QBasic Interpreter, Microsoft offers several Basic products to meet the needs of different users: o Microsoft Visual Basic(TM) programming system for the Microsoft Windows(TM) graphical environment: announced on May 20 and now shipping in quantities. Visual Basic system is the fast and easy way to write applications for the Microsoft Windows graphical environment version 3.0. It combines visual design tools with a powerful, event- driven programming language and Windows executable program compiler to enable any programmer to write full-featured Windows applications quickly. o Microsoft QuickBasic compiler version 4.5: the world's most popular DOS-based Basic compiler/interpreter package is a superset of MS-DOS QBasic Interpreter and adds the power to develop and compile stand-alone executable programs that can be distributed freely. These compiled .EXEs execute significantly faster than interpreted programs and can access all the memory available under 640 K. Microsoft QuickBasic compiler version 4.5 also has several additional debugging tools such as a full range of watch variable features, multiple modules and mixed-language programming support. Single-user and 10- pack versions are available at a discount to students and schools for teaching modern, structured programming. o Microsoft Basic professional development system version 7.1: This system is designed to offer the commercial application developer the most powerful toolset available for creating finished DOS software products fast. Basic version 7.1 includes the most powerful optimizing Basic compiler available and generates the smallest and fastest compiled .EXEs possible. It includes advanced memory management features which make it possible to develop and compile Basic programs as large as 16 MB using overlays, expanded memory, and far strings. It also includes integrated data access in the form of Microsoft Professional ISAM (indexed sequential access method) for data- intensive business applications, the user interface toolbox for creating professional user interfaces, and numerous other professional language features and tools. Microsoft Corporation (NASDAQ "MSFT") develops, markets and supports a wide range of software for business and professional use, including operating systems, network products, languages and applications as well as books, hardware and CD-ROM products for the microcomputer marketplace. *"DOS" as used herein refers to the MS-DOS and PC-DOS operating environments. **$2.00 per call. ### Microsoft, the Microsoft logo, GW-BASIC and MS-DOS are registered trademarks and Microsoft QuickBasic, OnCall, QBasic, Visual Basic and Windows are trademarks of Microsoft Corporation. For pricing and availability outside the U.S., please contact your local subsidiary. Knowledge Base Title: Huge Array Support in DLL for Visual Basic for Windows Document Number: Q72585 Publ Date: 24-JUN-1991 Product Name: Microsoft Visual Basic Product Version: 1.00 Operating System: WINDOWS Summary: A dynamic-link library (DLL) is available that contains functions for managing arrays larger than 64K from Microsoft Visual Basic version 1.0 for Windows. This DLL also provides the ability to create arrays with more than 32,767 (32K) elements per dimension, and to redimension arrays while preserving the data inside of the arrays. This file can be found in the Software/Data Library by searching for the filename BV0442, the Q number of this article, or S13082. BV0442 was archived using the PKware file-compression utility. When you decompress BV0442, you will obtain the following files: HUGEARR.DLL, HUGEARR.BAS, HUGEARR.C, HUGEARR.DEF, HUGEARR.H, HUGEARR.TXT, MAKEFILE These files are also available on disk in the application note "Huge Array Support in DLL for Visual Basic for Windows" (BV0442) by calling Microsoft Product Support Services. This information applies to Microsoft Visual Basic programming system version 1.0 for Microsoft Windows, and to Microsoft Windows 3.0 Software Development Kit (SDK). HUGEARR.DLL is provided only as an example, which you are free to modify, and Microsoft makes no performance or support claims for HUGEARR.DLL or its associated files. More Information: To use the functions in HUGEARR.DLL, copy the declarations contained in HUGEARR.BAS into your global module in Visual Basic and copy HUGEARR.DLL to your Windows directory. The functions can then be used like any other Windows DLL function. HUGEARR.DLL allocates memory using the Windows API function GlobalAlloc. This means that the largest array that can be allocated is 1 MB in standard mode, and 64 MB in 386 enhanced mode for Windows. The following routines are contained in HUGEARR.DLL. For a complete description of the parameters and/or return values of these routines, see Visual Basic's Declare statement for the routine in question in the file HUGEARR.BAS. For additional notes on using these functions, see the HUGEARR.TXT reference file. 1. HugeDim: Dimensions an array and returns a handle to that array. 2. HugeErase: Erases an array that was previously dimensioned using HugeDim. 3. HugeRedim: Redimensions an array created with HugeDim to a different size. 4. GetHugeEl, SetHugeEl: Gets or sets the contents of the specified array element in a given huge array. 5. HugeInt, HugeLong, HugeSingle, HugeDouble, HugeCurrency: Functions that return a value from a specific element in a huge array of the type corresponding to the function name (Integer, Long, Single, Double, or Currency data type.) 6. HugeUbound: Returns the upper bound of a given huge array. 7. NumHugeArrays: Returns the number of free huge array handles available. References: HUGEARR.DLL is written in Microsoft C, and the C source code is provided in HUGEARR.C and HUGEARR.H. Advanced programmers can optionally modify and rebuild HUGEARR.DLL by using the Microsoft C Compiler version 6.0 or 6.0a and DLL libraries from the Microsoft Windows 3.0 Software Development Kit (SDK), and by running NMAKE.EXE with the enclosed MAKEFILE. The MAKEFILE tells LINK.EXE to use the enclosed linker definition file, HUGEARR.DEF. Knowledge Base Title: Wrong Default Path After Drive Error, VB Open/Add File Dialog Document Number: Q72878 Publ Date: 25-JUN-1991 Product Name: Microsoft Visual Basic Product Version: 1.00 Operating System: WINDOWS Summary: When you choose the Open Project or Add File option from the File menu in the VB.EXE environment, and you get an error accessing a disk drive, Visual Basic incorrectly stays logged onto the failed drive path (even though the previous path is displayed), unless you explicitly change the drive. (This behavior differs from the Open command from the File menu in standard Windows applications, such as Microsoft Word for Windows and Microsoft Excel for Windows.) Microsoft has confirmed this to be a problem in Microsoft Visual Basic programming system version 1.0 for Windows. Microsoft is researching this problem and will post new information here as it becomes available. To work around this problem, just change to a valid drive by typing a path preceded by a valid drive letter, or by selecting a valid drive letter with the mouse. More Information: To duplicate this problem, follow these steps: 1. Start Visual Basic (such as from the C:\VB\ subdirectory for the following example). 2. From the File menu, choose Open Project or Add File. (The Open Project or Add File dialog box lets you search for and select the file you want.) 3. Make sure drive A is empty and open. 4. Select [-a-| from the dialog box. A message box will correctly appear with the error message "Path Not Found:'' ". (What appears to be one double quotation mark is really two single quotation marks with nothing between them.) 5. Choose the OK button. Note that the current path, such as C:\VB (displayed above the Directories box), is correctly shown to be the same as before drive A was selected. The Files and Directories boxes also correctly show the same files as before drive A was selected. (So far, this behavior is the same as for the files dialog box in standard Windows applications.) 6. Erase the information in the File Name field, and type the following: *.* 7. Choose the OK button. 8. The problem is that Visual Basic now incorrectly gives you the "Path Not Found:'' " error message, which demonstrates that the actual current drive fails to match the displayed path (C:\VB), and Visual Basic is incorrectly attempting to access drive A again. This behavior differs from standard Windows applications, such as Microsoft Word for Windows and Excel for Windows, which don't give an error at this point, and instead correctly show all (*.*) files in the path (C:\VB) displayed in the dialog box. To work around this problem, just change to a valid drive by typing a path preceded by a valid drive letter, such as C:\VB\*.*, or by selecting a valid drive letter, such as [-c-| with the mouse. Knowledge Base Title: Settings Box Is Hidden When Properties Bar at Bottom of Screen Document Number: Q72881 Publ Date: 25-JUN-1991 Product Name: Microsoft Visual Basic Product Version: 1.00 Operating System: WINDOWS Summary: When the Properties bar is positioned at the bottom of the screen and an enumerated property, such as FontName, is selected from the Settings box, the FontName list is still displayed beneath the Properties bar, instead of above the Properties bar, making the FontName list essentially invisible. Because of this behavior, Microsoft recommends leaving the Properties bar at the top of the screen. Note: The Properties bar's entry field is not a combo box, and does not react as a combo box. This information applies to Microsoft Visual Basic programming system version 1.0 for Windows. More Information: When you open a combo box and the space below is insufficient to display the drop-down list, the list will be displayed above the combo box window. This is exactly how the combo box "Properties list box" displays when the Properties bar is moved to the bottom of the screen. Although the Settings box resembles a combo box, the Settings box is actually an edit box and a push button. This window is not a combo box because the push button can take on several functions. In some cases the Settings box is disabled, and in some cases it invokes a pop-up dialog box (for example, when you select the Picture property of the Picture control). In other cases, such as for the FontName property, the Settings box displays a Windows list box just under the Properties bar. The location of the list box is determined by Visual Basic and will always be displayed below the Properties bar. Microsoft recommends leaving the Properties bar at the top of the screen. Reference: Please refer to pages 38-39 of the "Microsoft Visual Basic: Programmer's Guide" for version 1.0 for definitions of Properties bar, Properties list box, and Settings box. Knowledge Base Title: Why VB Sub Might Stay in Proc: List Even After Code Deleted Document Number: Q73270 Publ Date: 25-JUN-1991 Product Name: Microsoft Visual Basic Product Version: 1.00 Operating System: WINDOWS Summary: In a Visual Basic code window, if you want to delete the code for a Sub...End Sub procedure (or Function...End Function procedure), you must also delete the two or more blank lines (if any) following that procedure, or else that procedure will still exist (in a blank code window and in the Proc: box). Microsoft has confirmed this to be a problem in Microsoft Visual Basic version 1.0 programming system for Windows. We are researching this problem and will post new information here as it becomes available. To work around this problem, make sure to delete all blank lines in the code window for the procedure that you want to delete. More Information: Steps to Reproduce Problem -------------------------- 1. Start Visual Basic (or select New Project from Visual Basic's File menu if you are already in Visual Basic). 2. Double-click Form1, or press F7, to display the form's Code window. 3. Choose (general) from the Object: box, and enter the statement Sub Sub1 in the (general) (declarations) code window, and press the ENTER key. This causes Visual Basic to display the following Sub procedure: Sub Sub1() End Sub 4. Press CTRL+END, or click to the blank line after the End Sub statement. 5. Press the ENTER key to add a few blank lines after the End Sub statement. 6. Using the mouse, select (highlight) from the Sub Sub1() statement to the End Sub statement (but to duplicate the problem, don't highlight the blank lines after the End Sub statement). From the Edit menu, choose Delete, or press the DEL key, to delete the selected text. 7. Now the Proc: box still indicates that Sub1 exists as a procedure, even though you just tried to delete it. This problem is caused by the blank lines that were added after the End Sub statement. To work around the problem, highlight and delete the blank lines in the Sub1 code window, and the Sub1 procedure will be properly deleted. Additional reference words: 1.00 Knowledge Base Title: Can't Get Help Within Any VB Dialog Box After an Error Document Number: Q73119 Publ Date: 25-JUN-1991 Product Name: Microsoft Visual Basic Product Version: 1.00 Operating System: MS-DOS Summary: If you are in any Visual Basic dialog box and an error occurs, after you dismiss the error message, pressing F1 to get help for the dialog box will result in getting help on the previous error message, not help on the dialog box. Microsoft has confirmed this problem in Microsoft Visual Basic programming system version 1.0 for Windows. We are researching this problem and will post new information here as it becomes available. More Information: The following steps reproduce the error: 1. From the File menu, choose Save Project. 2. Enter an invalid filename for saving the project. 3. An error message will pop up telling you that the filename is incorrect. 4. Press ENTER or double-click the OK button to dismiss the error message. 5. Press the F1 key to get help on the Save Project dialog box. 6. The help message for the error will pop up, instead of help for the dialog box. This behavior is incorrect. The above steps should give you help for the Save Project dialog box. To work around the problem and get correct help on this dialog box, dismiss the incorrect error message by double-clicking the control button, and click CANCEL to get rid of the Save Project dialog box. Now, choose Save Project from the File menu and press F1; the correct help should display. To get help on the error message, press F1 while the error message is displayed. Knowledge Base Title: "Method Not Applicable..." with IsHidden Method in VB Document Number: Q73154 Publ Date: 25-JUN-1991 Product Name: Microsoft Visual Basic Product Version: 1.00 Operating System: WINDOWS Summary: "IsHidden" was a method implemented in prerelease versions of Visual Basic, but IsHidden was removed in the released version (because it was no longer needed). However, using IsHidden as the name for a variable, Sub, Function, or object can still give the following error at run time: Method not applicable with this Object To work around this problem, avoid using the name IsHidden. This information applies to Microsoft Visual Basic programming system version 1.0 for Windows. More Information: The following example demonstrates the problem: 1. Within any event procedure, try the following: Sub Form_Click() print ishidden End Sub 2. This gives a syntax error asking you to add a "(" to the method, so continue by adding "()": Sub Form_Click() print ishidden() End Sub 3. This results in the following format after pressing ENTER after ishidden(): Sub Form_Click() Print IsHidden() Sub End This is the format for a predefined method called IsHidden(). After following the steps above, you will receive a run-time error "Method not applicable with this Object." This error results because this particular method was not completely unimplemented from the beta version. Microsoft will consider completely removing this behavior of the IsHidden name in a future version of Visual Basic. Knowledge Base Title: Make EXE with 40-Byte Title Displays Only 39 in Task List Document Number: Q73155 Publ Date: 25-JUN-1991 Product Name: Microsoft Visual Basic Product Version: 1.00 Operating System: WINDOWS Summary: This information applies to Microsoft Visual Basic programming system version 1.0 for Windows. The following steps demonstrate a problem with Microsoft Windows 3.0; the problem is not caused by Microsoft Visual Basic version 1.0: 1. Start Visual Basic. 2. From Visual Basic's File Menu, choose the Make EXE File command. 3. A Make EXE File dialog box will display. Enter a 40-character filename in the File Name box. 4. Double-click the OK command button to exit the dialog box. 5. Minimize Visual Basic, go to the Windows Program Manager menu, and choose File. 6. From the File menu, choose the Run option; the Run dialog box will display. 7. Now enter that 40-character .EXE filename or path to the .EXE filename in the Command Line box, and double-click OK when done. 8. The .EXE file will run correctly, but if you press CTRL+ESC to bring up the Task List box, you will see that your .EXE filename has been truncated to 39 characters (it no longer is 40 characters). Microsoft has confirmed this problem in the Microsoft Windows version 3.0 operating system (buglist3.00). We are researching this problem and will post new information here as it becomes available. Additional reference words: 3.00 Knowledge Base Title: Removing Disk During VB Setup Terminates SETUP, Missing Files Document Number: Q73157 Publ Date: 25-JUN-1991 Product Name: Microsoft Visual Basic Product Version: 1.00 Operating System: WINDOWS Summary: While running SETUP.EXE for Visual Basic, you may fail to copy all files (or experience other problems) if you try to remove the disk while the SETUP.EXE program is in progress. Microsoft has confirmed this problem in Microsoft Visual Basic programming system version 1.0 for Windows. We are researching this problem and will post new information here as it becomes available. To work around this problem, wait until SETUP indicates that 100 percent of the files are copied before removing the Visual Basic floppy disk. More Information: Below is an example of one specific problem: When running SETUP.EXE on Disk 1 of Visual Basic (using 1.2 MB 5.25- inch disks), you can choose the option to install Visual Basic only. SETUP's bar graph will start by displaying 4 percent done, and while the large file C:\VB\VB.EXE is being copied, the disk drive light may go off and you might assume that Visual Basic is finished running SETUP. At this point you might (mistakenly) remove Disk 1. Then a message tells you that SETUP is complete, and you can exit SETUP. You have now installed VB.EXE, but you did not install some of the other important files, such as VBRUN100.DLL, which is needed to run your compiled applications under Windows version 3.0. If you want to install Visual Basic by selecting Visual Basic only, then you need to let Disk 1 complete its processing by waiting until the bar displays 100 percent. If you let Disk 1 run to completion, then the installed directory C:\VB should correctly contain the following files: VB.EXE VB.HLP VBRUN100.DLL README.TXT PACKING.LST SETUP.EXE DECOMP.DLL CONSTANT.TXT Additional reference words: 1.00 3.00