Help-Button in der Titelleiste

Ich befürchte das ist nicht so ohne weiteres möglich... Ich muss mal gucken ob ich das in JNI hinkrieg (der Screenshot ist aus C++).. Ich sag dann noch mal Bescheid... (Wenn du JNI und C++ kannst, kannst du das auch selber versuchen)
 
Also ich hab das jetzt mal mit JNI gelöst:

HelpButton.java
Code:
import java.awt.Window;
import java.awt.Rectangle;
import javax.swing.JDialog;

/**
 * <p>Überschrift: </p>
 *
 * <p>Beschreibung: </p>
 *
 * <p>Copyright: Copyright (c) 2005</p>
 *
 * <p>Organisation: None</p>
 *
 * @author Tobias Viehweger
 * @version 1.0
 */

public class HelpButton
{
  static
  {
	System.loadLibrary( "HelpButton" );
  }

  public HelpButton()
  {
	JDialog dlg = new JDialog();
	setDialogHasHelpButton( dlg );
	dlg.setSize(500,500);
	dlg.setVisible(true);
  }

  public void setDialogHasHelpButton( Window w )
  {
	boolean wasVisible = w.isVisible();
	Rectangle bounds = w.getBounds();

	//Sicherstellen, dass kein Fehler in der nativen Dll erzeugt wird
	w.setBounds( 0, 0, 0, 0 );
	w.setVisible( true );

	setHelpButton( w );
	//Sicherstellen, dass das Fenster korrekt angezeigt wird
	w.setVisible( false );

	if ( bounds != null )
	  w.setBounds( bounds );
	else
	  w.setBounds( 0, 0, 10, 10 );

	w.setVisible( wasVisible );
  }

  public static void main( String[] args ) {
	new HelpButton();
  }

  public native void setHelpButton( Window w );
}

HelpButton.h:
Code:
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class HelpButton */

#ifndef _Included_HelpButton
#define _Included_HelpButton
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:	 HelpButton
 * Method:	setHelpButton
 * Signature: (Ljava/awt/Window;)V
 */
JNIEXPORT void JNICALL Java_HelpButton_setHelpButton
  (JNIEnv *, jobject, jobject);

#ifdef __cplusplus
}
#endif
#endif

HelpButton.cpp
Code:
// HelpButton.cpp : Definiert den Einsprungpunkt für die DLL-Anwendung.
//
#include "HelpButton.h"
#include "jawt_md.H"

HWND getHWnd (jobject window, JNIEnv * env)
{
	JAWT awt;
	JAWT_DrawingSurface* ds;
	JAWT_DrawingSurfaceInfo* dsi;
	JAWT_Win32DrawingSurfaceInfo* dsi_win;

	//Initalisieren
	awt.version = JAWT_VERSION_1_3;
	JAWT_GetAWT(env, &awt);
	ds = awt.GetDrawingSurface(env, window);
	ds->Lock(ds);
	dsi = ds->GetDrawingSurfaceInfo(ds);
	dsi_win = (JAWT_Win32DrawingSurfaceInfo*)dsi->platformInfo;
 
	//Handle speichern
	HWND tmp = dsi_win->hwnd;

	//Aufraeumen
	ds->FreeDrawingSurfaceInfo(dsi);
	ds->Unlock(ds);
	awt.FreeDrawingSurface(ds);

	return tmp;
}

JNIEXPORT void JNICALL Java_HelpButton_setHelpButton
  (JNIEnv *env, jobject clazz, jobject window)
{
	HWND hWnd = getHWnd(window, env);
	SetWindowLong(hWnd, GWL_EXSTYLE, GetWindowLong ((HWND)hWnd, GWL_EXSTYLE )|WS_EX_CONTEXTHELP);
	SetWindowPos(hWnd, HWND_NOTOPMOST, 0,0,0,0,SWP_NOMOVE | SWP_NOSIZE | SWP_NOZORDER | SWP_FRAMECHANGED);
}

Das Problem hierbei ist aber, dass zwar ein ?-Button angezeigt wird, aber man nicht auf das Ereignis reagieren kann..
Ich weiß auch nicht, wie man dass jetzt mit C++ lösen würde... Vermutlich per C++ irgendwie das WndProc auf ne C++-
Methode umbiegen, aber da muss ich nochmal nachgucken... Vllt. weiß ja jemand anders hier noch was...

Hab die Quellcodes und die gelinkte dll mal als zip angehängt.
 

Anhänge

Neue Beiträge

Zurück