HOWTO: Manual Mode OLE Drag and Drop Mouse Pointer Changes
ID: Q186919
|
The information in this article applies to:
-
Microsoft Visual FoxPro for Windows, version 6.0
SUMMARY
This article provides the steps for implementing OLE Drag and Drop in
manual mode to drag the caption of a command button to a text box. The
article also features the Data Object methods ClearData, SetData and the
changing of mouse cursors. This article is a more extensive version of the
Microsoft Knowledge Base article Q185654, "HOWTO: Starting OLE Drag & Drop
In Manual Mode". The steps and the information in this article are the same
as those in Q185654. However, there are many enhancements in this article.
If you are new to OLE Drag and Drop, we recommend that you start with
Q185654.
This article does not cover the background for OLE Drag and Drop. For more
information on OLE Drag and Drop, please see Chapter 31: Interoperability
and the Internet in the Microsoft Visual FoxPro "Programmer's Guide,"
version 6.0.
MORE INFORMATION
The steps below illustrate how to implement OLE Drag and Drop in manual
mode to drag the caption of a Command button to a Text box. In the steps
where you add code to the various events and methods, the LPARAMETERS lines
shown are already there by default. Do not add the lines a second time.
- Create a new form and save the form. Be sure the default directory is
set to the folder where the form is saved.
- Add two command buttons and a text box.
- Select the command button with the caption of "Command2" and change the
caption to "Reset Controls".
- Place the following code in the Click event of Command2:
Thisform.Text1.Value=SPACE(10)
Thisform.Command1.Caption="Text To Drag"
- Copy the following files from the Visual Studio\Common\Graphics folders
specified to the folder where the form is saved:
\Icons\Misc\Eye.ico
\Cursors\H_move.cur
\Cursors\H_we.cur
- Set the following properties of Command1:
Caption="Text To Drag"
OLEDragPicture="eye.ico"
- Add the following code to the Click event of Command1:
WAIT WINDOW "Hello"
- Add the following code to the MouseDown event of Command1:
LPARAMETERS nButton, nShift, nXCoord, nYCoord
IF nButton=2
*This.OLEDrag(.F.)
This.OLEDrag(.T.)
ENDIF
This code checks to see if the right mouse button is down. If the right
mouse button is down, the code calls the OLEDrag method. You can call
the OLEDrag method with either true or false. The difference is shown
later in this article.
- Add the following code to the OLEDrag method of Command1:
LPARAMETERS lDetectDrag
IF lDetectDrag
This.ForeColor=RGB(0,255,64)
ELSE
This.ForeColor=RGB(255,0,255)
ENDIF
The code above changes the color of the caption text of the command
button. It is included here as a visual confirmation that the method is
firing.
- Add the following code to the OLEStartDrag event of Command1:
LPARAMETERS oDataObject, nEffect
nEffect=3
oDataObject.ClearData
oDataObject.SetData("Hello",1)
In this event code, you clear the data in the Data Object, which in this
case means that you clear the caption of the command button is from the
Data Object. Next, it sets the caption to the word "Hello." for
illustration purposes only. If you need to drop the actual command
button caption into the text box, you would not use this code. The
nEffect parameter is set to 3, which is the sum of 1 (for copy) and 2
(for move). The nEffect parameter is an output parameter that you pass
to the OLEDragOver event of the drop target. By default, it would be 7
(copy+move+link). Since this specific code example does not support
linking, nEffect is set to 3.
When using OLE Drag and Drop in automatic mode, the OLEStartDrag event
is the first event to fire. In manual mode, the MouseDown and OLEDrag
methods have to run first to start OLEStartDrag.
- Add the following code to the OLEGiveFeedback event of Command1:
LPARAMETERS nEffect, eMouseCursor
DO CASE
CASE nEffect=1
eMouseCursor="H_we.cur"
CASE nEffect=2
eMouseCursor="H_move.cur"
ENDCASE
The code in this method checks the nEffect parameter. Visual FoxPro
automatically sets the nEffect parameter to either 1 or 2, depending on
whether or not the control key is depressed. The mouse cursor is then
set appropriately. Note that the use of these cursors are for
illustration purposes only.
- Add the following code to the OLECompleteDrag event of Command1:
LPARAMETERS nEffect
DO CASE
CASE nEffect=2
This.Caption="You Moved Me"
CASE nEffect=1
This.Caption="You Copied Me"
CASE nEffect=0
This.Caption="You Didn't Drop Me"
ENDCASE
This.ResetToDefault("ForeColor")
Thisform.Text1.BackColor=RGB(200,224,216)
This code checks to see if you should copy or move the text from the
command button. The OLEDragDrop event of the drop target (the text box)
sets the nEffect parameter and then passes it to the OLECompleteDrag of
the drag source (the command button). The programmer then needs to take
appropriate action in the OLECompleteDrag.
- Set the OLEDropMode property of the text box to 1 - Enabled.
- Add the following code to the OLEDragOver event of the text box:
LPARAMETERS oDataObject, nEffect, nButton, nShift, ;
nXCoord, nYCoord, nState
DO CASE
CASE nState=0
This.BackColor=RGB(10,255,10)
IF oDataObject.GetFormat(1) && CF_TEXT
This.OLEDropHasData=1
This.OLEDropEffects=3 && Copy and Move
ELSE
This.OLEDropHasData=0
This.OLEDropEffects=0
ENDIF
CASE nState=1
CASE nState=2
ENDCASE
This code fires when you drag data over the text box. This sets the
nState parameter to zero. The event checks the Data Object to see if
there is text data in the object. If so, it sets the OLEDropHasData and
OLEDropEffects properties. The other cases for nState without any code
are for illustration purposes only.
- Add the following code to the OLEDragDrop event of the text box:
LPARAMETERS oDataObject, nEffect, nButton, nShift, nXCoord, nYCoord
LOCAL nOperation
IF nShift=2 && Control is down
nOperation=1 && DropEffect_Copy
ELSE
nOperation=2 && DropEffect_Move
ENDIF
DO CASE
CASE oDataObject.GetFormat(1) && CF_TEXT
This.Value=oDataObject.GetData(1)
NODEFAULT
ENDCASE
nEffect=nOperation
This code fires when you drop data onto the text box. The first check
that takes place is for the nShift parameter. If the Control key is
down, the nEffect parameter sets to 1 for copy, otherwise it is 2 for
move. The nEffect parameter is an output parameter so it passes to the
OLECompleteDrag event of the drag source, Command1. After the check of
the nShift parameter, a check for the Data Object for text data with the
oDataObject.GetFormat(1) code occurs. If the check finds text, the Value
property of the text box changes to text data. The inclusion of the
NODEFAULT keyword here has two purposes. First, if it is not, a shortcut
menu appears when you drop the data. Based on the settings in the code
above, the menu has options for Copy Here, Move Here and Cancel. This
menu essentially does nothing as there has been no allowances made for
it in the OLECompleteDrag event of the drag source. Second, if you do
not include NODEFAULT, and select either Copy Here or Move Here from the
shortcut menu, the text you are dropping into the text box, appears
twice. "Hello Hello" is what displays. This is because you set the Value
property to "Hello" in the code and then the default drop behavior of
the text box adds the second "Hello" to the Value property.
- Save and run the form. Right-click the "Text To Drag" command button
and drag and drop into the text box. Use the Reset Controls command
button to reset. Try holding down the Control key while right dragging.
The key program code in the example created above for starting OLE Drag
and Drop in manual mode is the code shown in step 8 for the MouseDown
event of the drag source. Also note that the OLEDragMode property of the
"Text To Drag" command button is set to 0 - Manual.
As stated in step 8, you can call the OLEDrag method with either True
(.T.) or False (.F.). If you call OLEDrag with False, the OLEStartDrag
event fires immediately. If you call OLEDrag with True, there is a
slight delay before the OLEStartDrag event fires. Follow these steps to
see the difference.
- Starting with the OLEDrag method being True, which is how it should be
set after step 16 above, right-click the "Text To Drag" command button.
There should be a slight delay before the eye icon appears. Try this a
few times. It should not be necessary to reset the controls.
- Modify the form. Open the MouseDown event of the "Text To Drag" command
button. Remark out the This.OLEDrag(.T.) and unremark the
This.OLEDrag(.F.) lines of code. Save and run the form.
- Right-click the "Text To Drag" command button. Notice that the eye icon
appears immediately. If you move the mouse, the No Drop mouse pointer
also appears.
Try some of the changes to the example form from the list below. They
illustrate some of the features of OLE Drag and Drop. Please see the Help
file documentation for further explanations of the options in the OLE Drag
and Drop events.
- As discussed in step 15 above, remark out the NODEFAULT keyword in the
OLEDragDrop event of the text box. Run the form and drag the "Text To
Drag" command button over the text box. Experiment.
- Try not clearing and setting the data in the OLEStartDrag event of the
"Text To Drag" command button. See step 10 above. Also, try not setting
nEffect in the OLEStartDrag event.
- Try setting the OLEDropEffects for the text box to 1 or 2. See step 14
above for the code. Try this in conjunction with removing the NODEFAULT
keyword from the OLEDragDrop event of the text box. Try setting
OLEDropEffects to 4 and 7. OLEDropEffect of 4 is Link. Seven is Copy,
Move or Link.
REFERENCES
Visual FoxPro Books Online: Programmer's Guide; Chapter 31 -
Interoperability and the Internet; OLE Drag and Drop topic.
For additional information, please see the following articles in the
Microsoft Knowledge Base:
Q185654 HOWTO: Starting OLE Drag and Drop In Manual Mode
Q184386 HOWTO: Using OLE Drag & Drop to Move Controls on a Form
Q185497 HOWTO: Using GridHitTest() with OLE Drag and Drop
Additional query words:
kbvfp600
Keywords :
Version : WINDOWS:6.0
Platform : WINDOWS
Issue type : kbhowto
|