Article ID: 223370
Article Last Modified on 6/14/2006
APPLIES TO
- Microsoft Java Virtual Machine
- Microsoft Visual J++ 6.0 Standard Edition
This article was previously published under Q223370
SYMPTOMS
When using Windows Foundation Classes (WFC) controls on a Web page, while it is possible to add OnEnter and OnLeave event handlers (delegates), the events do not actually fire, and the handler methods do not get called.
STATUS
Microsoft has confirmed that this is a problem in versions of Microsoft Visual J++.
This bug was corrected in Visual Studio 6.0 Service Pack 3. For more information about Visual Studio service packs, please see the following articles in the Microsoft Knowledge Base:
MORE INFORMATION
Steps to Reproduce Behavior
- Compile and run the following code.
- In Internet Explorer, move the mouse over each button, and tab between the two buttons. You will notice that nothing happens when tabbing between the buttons (these would be the Enter and Leave events). You will also notice that the dynamic (lower) button is not in the tab order with the other elements; it is skipped.
- Now, click on the dynamic (lower) button. This will bring up a WFC Form with two more buttons wired to the same event handlers.
- Tab between the controls (buttons) in the form, and move the mouse over each button.
- You will notice that the enter and leave events are now firing and being handled by the delegates assigned to them. These are the same delegates that did nothing when in the context of the Web page.
- You will also see that the MouseEnter and MouseLeave events are handled in both cases.
- To run this test from outside the Visual J++ IDE, you need to place Class1.class in a signed CAB file called WFCUICodeBehind.cab.
NOTE: When accessing a WFC Control on a Web page from the Java code behind the HTML, you will not be able to get to it through normal means as a DhElement. DhDocument.getAllElements() or DhDocument.findElement() do not work and cause a ClassCastException to be thrown. This is because the IHTMLElement COM interface is not exposed for WFC controls used this way. This interface is required when accessing typical HTML page elements in a traditional code-behind scenario.
The way to access a WFC control (represented by an OBJECT tag and clsid:java: ... in HTML) is through the DOM or Document Object Model. You do this by obtaining the IHTMLDocument2 interface for the DhDocument object and using methods exposed by that interface to retrieve the IDispatch interface for the WFC Control object. Typecast the dispatch interface to the Java WFC Control class (Button in this case) to use it as a WFC Java object.
HTML Code
<HTML> <BODY> <P> <OBJECT classid=java:com.ms.wfc.html.DhModule height=0 width=0 ... VIEWASTEXT> <PARAM NAME="CABBASE" VALUE="WFCUICodeBehind.CAB"> <PARAM NAME="__CODECLASS" VALUE="Class1"> </OBJECT> <OBJECT classid=java:com.ms.wfc.ui.Button height=50 id=Button1 name=wfcButton style="HEIGHT: 50px; LEFT: 0px; TOP: 0px; WIDTH: 250px" width=219 VIEWASTEXT> <PARAM NAME="data" VALUE="UEsBAAAEc2l6ZQsAE2NvbS5tcy53ZmMudWkuUG9pbnQIAAAA+gAAADIAAAAACHRhYkluZGV4BQAAAAAABHRleHQJABhXRkMgQnV0dG9uIERyYWcgYW5kIERyb3AAAA=="> </OBJECT> <!-- Insert HTML here --> </P> </BODY> </HTML>
Java Code
import com.ms.wfc.html.*; import com.ms.wfc.core.*; import com.ms.wfc.ui.*; import com.ms.wfc.html.om.*; import com.ms.com.*; import com.ms.wfc.app.*; public class Class1 extends DhDocument { Button wfcButtonDragDrop; Button wfcButtonDynamic; EventHandler enter = new EventHandler(onEnter); EventHandler leave = new EventHandler(onLeave); EventHandler mEnter = new EventHandler(onMEnter); EventHandler mLeave = new EventHandler(onMLeave); public Class1() { initForm(); wfcButtonDynamic = new Button(); wfcButtonDynamic.setSize(250, 50); wfcButtonDynamic.setText("WFC Button Dynamic"); wfcButtonDynamic.addOnEnter(enter); wfcButtonDynamic.addOnLeave(leave); wfcButtonDynamic.addOnMouseEnter(mEnter); wfcButtonDynamic.addOnMouseLeave(mLeave); wfcButtonDynamic.addOnClick(new EventHandler(onClick)); DhComponentWrapper bwrap = new DhComponentWrapper(wfcButtonDynamic); bwrap.setSize(250, 50); add(bwrap); } public void dispose() { super.dispose(); } private void initForm() { } protected void onDocumentLoad(Object sender, Event e) { //DhElement tmp = this.findElement("wfcButton"); //ClassCastException because IHTMLElement is not //exposed for WFC Controls IHTMLDocument2 doc = (IHTMLDocument2)getPeer(); IHTMLElementCollection all = doc.getAll(); wfcButtonDragDrop = (Button)all.item(new Variant("wfcButton"), new Variant(0)); wfcButtonDragDrop.addOnEnter(enter); wfcButtonDragDrop.addOnLeave(leave); wfcButtonDragDrop.addOnMouseEnter(mEnter); wfcButtonDragDrop.addOnMouseLeave(mLeave); } private void onEnter(Object source, Event e) { ((Button)source).setText("Enter"); } private void onLeave(Object source, Event e) { ((Button)source).setText("Leave"); } private void onMEnter(Object source, Event ev) { ((Button)source).setText("Mouse Enter"); } private void onMLeave(Object source, Event ev) { ((Button)source).setText("Mouse Leave"); } private void onClick(Object source, Event ev) { Button b1 = new Button(); b1.setDock(ControlDock.TOP); b1.addOnEnter(enter); b1.addOnLeave(leave); b1.addOnMouseEnter(mEnter); b1.addOnMouseLeave(mLeave); Button b2 = new Button(); b2.addOnEnter(enter); b2.addOnLeave(leave); b2.addOnMouseEnter(mEnter); b2.addOnMouseLeave(mLeave); b2.setDock(ControlDock.BOTTOM); Form f = new Form(); f.setBackColor(Color.WHITE); f.setSize(400, 400); f.add(b1); f.add(b2); Application.run(f); } }
REFERENCES
For more information on the IHTMLDocument2 interface, see the MSDN Online Web Workshop, or search the MSDN index for "IHTMLDocument2."
For support information about Visual J++ and the SDK for Java, visit the following Microsoft Web site:
Keywords: kbbug kbfix kbide kbuidesign kbjava kbctrlcreate kbvj600fix kbwfc kbvs600sp3fix KB223370