Einzelnen Beitrag anzeigen

taaktaak

Registriert seit: 25. Okt 2007
Ort: Radbruch
1.990 Beiträge
 
Delphi 7 Professional
 
#1

HtmlHelp-API - HH_Get_Win_Type

  Alt 12. Jan 2008, 16:39
Moin, Moin,
bin gerade dabei meine Hilfen von .HLP auf .CHM umzustellen. Units, die auch Delphi7 einen Zugriff auf die HtmlHelp-API ermöglichen, gibt es ja im Internet in vielen Varianten. Für mich ist es besonders wichtig, in MultiMonitorsystemen das Hilfefenster durch das Programm positionieren zu können. Da habe ich für Delphi nix finden können und bin dann bei MSDN gelandet (und bereue es erneut, praktisch keine Kenntnisse in C oder VB zu besitzen).

Anyway, habe jetzt folgende Prozedur zusammengebastelt, die es tatsächlich schafft das unmittelbar danach aufzurufende Hilfefenster an eine beliebige Position und eine beliebige Caption zu setzen:

Delphi-Quellcode:
procedure TForm1.buSetWinPosClick(Sender:TObject); // call SetWinPos separately
var WT : HH_WinType; // before HelpCall,
begin // otherwise HelpWindow will have
  fillchar(WT,SizeOf(WT),0); // default position and -size

  with WT do begin
    cbStruct :=SizeOf(WT);
    pszType :=PChar('MainWindow'); // name of window type MUST be given!!!
    fsValidMembers:=HHWin_Param_Rect; // we will change rectangle of helpwindow

    pszCaption :=PChar('blabla'); // new caption
    rcWindowPos.Top :=0; // new
    rcWindowPos.Left :=1051; // position
    rcWindowPos.Right :=1551; // and
    rcWindowPos.Bottom:=600; // size
    end;

  HtmlHelp(0,PChar(Application.HelpFile),HH_Set_Win_Type,DWord(@WT));
end;
Nun gibt es auch die Konstante HH_Get_Win_Type, mit der man - davon gehe ich mal aus - z.B. die Position und Größe des gerade offenen Hilfefensters ermitteln kann. Wenn ich die Werte setzen kann, dann sollte es doch einfach sein diese auch zu lesen. Habe ich zumindest gedacht. Folgende Prozedur sollte das tun:

Delphi-Quellcode:
 
procedure TForm1.buGetWinPosClick(Sender:TObject); // doesn't work ???
var WT : HH_WinType;
    Hnd : HWND;
begin
  fillchar(WT,SizeOf(WT),0);

  with WT do begin
    cbStruct :=SizeOf(WT);
    pszType :=PChar('MainWindow'); // needed ?
    fsValidMembers:=HHWin_Param_Rect; // needed ?
    end;

  Hnd:=HtmlHelp(0,PChar(Application.HelpFile{+'>MainWindow'}),HH_Get_Win_Type,DWord(@WT));

  if Hnd>=0 then
    with WT.rcWindowPos do begin
     laLeft. Caption:='Left='  +IntToStr(Left); // always 0
     laTop. Caption:='Top='   +IntToStr(Top); // always 0
     laRight. Caption:='Right=' +IntToStr(Right); // always 0
     laBottom.Caption:='Bottom='+IntToStr(Bottom); // always 0
     end;
end;
Tja, das tut das Mist-Stück aber nicht. Egal was ich bisher versucht habe, ich bekomme immer die Initialisierungswerte (0) zurück. Kann mir da einer auf die Sprünge helfen?

Gruß Ralph

PS : Ich gehe mal davon aus, dass diejenigen, die hier helfen können/wollen die InterfaceUnit nicht benötigen (falls doch, werde ich sie als Attachment natürlich nachliefern)
Ralph
  Mit Zitat antworten Zitat