wbrcomponentpeer.java
来自「java调用ie浏览器demo源码,可以用在windows或者linux」· Java 代码 · 共 588 行 · 第 1/2 页
JAVA
588 行
public long sendMouseEvent(MouseEvent e) {
long ret = 0;
int wm = 0;
final int modifiers = e.getModifiers();
int wParam =
(( 0 != (modifiers & MouseEvent.CTRL_MASK) ) ? 0x0008/*MK_CONTROL*/ : 0)
| (( 0 != (modifiers & MouseEvent.SHIFT_MASK) ) ? 0x0004/*MK_SHIFT*/ : 0)
| (( 0 != (modifiers & MouseEvent.BUTTON1_DOWN_MASK) ) ? 0x0001/*MK_LBUTTON*/ : 0)
| (( 0 != (modifiers & MouseEvent.BUTTON3_DOWN_MASK) ) ? 0x0002/*MK_RBUTTON*/ : 0)
| (( 0 != (modifiers & MouseEvent.BUTTON2_DOWN_MASK) ) ? 0x0010/*MK_MBUTTON*/ : 0);
int lParam = e.getX() + (e.getY() << 16 );
if( MouseEvent.MOUSE_PRESSED==e.getID() ){
switch(e.getButton()){
case MouseEvent.BUTTON1:
wm = 0x0202; //WM_LBUTTONUP
break;
case MouseEvent.BUTTON3:
wm = 0x0205; //WM_RBUTTONUP
break;
case MouseEvent.BUTTON2:
wm = 0x0208; //WM_MBUTTONUP
break;
}
nativeSendMouseEvent(WND_PARENT, wm, wParam, lParam);
}
nativeSetTransparent(false);
//System.out.println("MouseEvent m:" + e.getModifiers() + " " + e);
switch(e.getID()){
case MouseEvent.MOUSE_PRESSED:
switch(e.getButton()){
case MouseEvent.BUTTON1:
wm = 0x0201; //WM_LBUTTONDOWN
wParam |= 0x0001/*MK_LBUTTON*/;
break;
case MouseEvent.BUTTON3:
wm = 0x0204; //WM_RBUTTONDOWN
wParam |= 0x0002/*MK_RBUTTON*/;
break;
case MouseEvent.BUTTON2:
wm = 0x0207; //WM_MBUTTONDOWN
wParam |= 0x0010/*MK_MBUTTON*/;
break;
}
break;
case MouseEvent.MOUSE_RELEASED:
switch(e.getButton()){
case MouseEvent.BUTTON1:
wm = 0x0202; //WM_LBUTTONUP
break;
case MouseEvent.BUTTON3:
wm = 0x0205; //WM_RBUTTONUP
break;
case MouseEvent.BUTTON2:
wm = 0x0208; //WM_MBUTTONUP
break;
}
break;
case MouseEvent.MOUSE_MOVED:
case MouseEvent.MOUSE_DRAGGED:
wm = 0x0200; //WM_MOUSEMOVE
break;
case MouseEvent.MOUSE_ENTERED:
wm = 0x02A1; //WM_MOUSEHOVER
break;
case MouseEvent.MOUSE_EXITED:
if( hasFocus() ){
//System.out.println("MouseEvent skipped");
} else {
wm = 0x02A3; //WM_MOUSELEAVE
}
break;
}
if(0!=wm && !hasFocus()){
int iHitTest = (int)nativeSendMouseEvent(
WND_IE,
0x0084,//WM_NCHITTEST
0, e.getXOnScreen() + (e.getYOnScreen() << 16 ));
if( MouseEvent.MOUSE_PRESSED==e.getID() )
focusGain(false);
/*
if( MouseEvent.MOUSE_PRESSED==e.getID() ){
//System.out.println("##focusGain!");
long res = nativeSendMouseEvent(
WND_IE,
0x0021,//WM_MOUSEACTIVATE
(int)((WComponentPeer)target.getTopLevelAncestor().getPeer()).getHWnd(),
iHitTest //HTCLIENT
+ (wm << 16 ));
if(1==res || 2==res){
focusGain(false);
}
if(4==res || 2==res){
//discad message
return ret;
}
}*/
nativeSendMouseEvent(
WND_IE,
0x0020,//WM_SETCURSOR
0,
iHitTest + (wm << 16 ));
ret = nativeSendMouseEvent(
WND_IE,
wm,
wParam,
lParam);
}
if( !hasFocus() ){
nativeSetTransparent(true);
}
return ret;
}
native public void setEnabled(boolean enabled);
native public void setVisible(boolean aFlag);
// public boolean requestFocusInWindow() {
// return true; //To change body of implemented methods use File | Settings | File Templates.
// }
/**
* Synchronous callback for notifications from native code.
* @param iId the event identifier - <code>BrComponentEvent.DISPID_XXXX</code> const
* @param stName the event name of (optional)
* @param stValue the event paramenter(s) (optional)
* @return the application respont
*/
private String postEvent(
int iId,
String stName,
String stValue)
{
switch(iId){
case BrComponentEvent.DISPID_REFRESH:
refreshHard();
break;
case BrComponentEvent.DISPID_DOCUMENTCOMPLETE:
if(isEditable()!=editable){
//System.out.println("setEditable(" + editable + ");");
enableEditing(editable);
} else if(editable) {
//System.out.println("refreshHard");
refreshHard();
}
documentReady = true;
break;
case BrComponentEvent.DISPID_ONFOCUCHANGE:
isFocusOwner = Boolean.parseBoolean(stValue);
break;
case BrComponentEvent.DISPID_ONFOCUSMOVE:
focusMove(Boolean.parseBoolean(stValue));
break;
case BrComponentEvent.DISPID_PROGRESSCHANGE:
break;
}
return target.processBrComponentEvent(
new BrComponentEvent(target, iId, stName, stValue));
}
public Image getImage(int x, int y, int width, int height){
BrComponent ie = (BrComponent)target;
if(
x < 0 ||
y < 0 ||
(x+width)>(ie.getX()+ie.getWidth()) ||
(y+height)>(ie.getY()+ie.getHeight()) )
{
return null;
}
int[] imageData = ImageData(x, y, width, height);
if(null==imageData || 0==imageData.length) {
return null;
}
int len = imageData.length - 2;
int rwidth = imageData[len];
int rheight = imageData[len + 1];
DataBufferInt buffer = new DataBufferInt(imageData, len);
WritableRaster raster = Raster.createPackedRaster(buffer, rwidth,
rheight, rwidth,
bandmasks, null);
return new BufferedImage(directColorModel, raster, false, null);
}
public void paintClientArea(Graphics g, int iPaintHint)
{
if( target.isVisible() ){
//System.err.println("paintClientArea");
Rectangle updateRect = g.getClipBounds();
if(null==updateRect){
updateRect = target.getBounds();
}
if( null!=updateRect ){
if(updateRect.x < 0){
updateRect.width += updateRect.x;
updateRect.x = 0;
}
if(updateRect.y < 0){
updateRect.height += updateRect.y;
updateRect.y = 0;
}
if( 0<updateRect.width
&& 0<updateRect.height)
{
//if(BrComponent.PAINT_NATIVE!=iPaintHint )
{
//System.err.println("getImage");
Image updateImage = getImage(
updateRect.x,
updateRect.y,
updateRect.width,
updateRect.height);
if( null!=updateImage ){
//System.err.println("getImage is");
g.drawImage(
updateImage,
updateRect.x,
updateRect.y,
null
);
}
}
}
}
}
}
public long getNativeHandle() {
return data;
}
protected int notifyCounter = 0;
protected boolean showOnZero = true;
public void onAddNotify() {
if(0 == notifyCounter){
if( !BrComponent.DESIGN_MODE ) {
if( NativeLoadMgr.loadLibrary("jdicWeb") ) {
//init IDs for native callbacks on the first load
initIDs();
}
for( Container c = target.getParent(); null != c; c = c.getParent() )
{
ComponentPeer cp = c.getPeer();
if( (cp instanceof WComponentPeer) ){
parentHW = c;
data = create( ((WComponentPeer)cp).getHWnd(), target.paintAlgorithm);
acceptTargetURL();
setEditable(target.isEditable());
break;
}
}
} else if( !target.isMandatoryDispose() ){
setVisible(showOnZero);
}
}
++notifyCounter;
}
public void onRemoveNotify() {
--notifyCounter;
if( 0==notifyCounter ){
showOnZero = target.isVisible();
if( !target.isMandatoryDispose() ) {
if(showOnZero){
setVisible(false);
}
} else if( 0!=data ) {
destroy();
data = 0;
}
}
}
public boolean isNativeReady() {
return 0!=data;
}
public boolean isSelfPaint()
{
return false;
}
public JComponent getCentralPanel() {
return target;
}
BrComponent target;
long data = 0;
}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?