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

Zurück