PNG-To-Face & FaceView für Windows-XP
und die Nutzung mit "40tude Dialog"

PNGtoFace - Screenshot - FaceView - Dialog-Skript - Download


Achtung: Für die Nutzung unter WIN98 (und früher) werden die gdiplus.dll (bei WIN-XP dabei)
und verschiedene VB-Runtimes benötigt!


Der Newsreader "40tude Dialog" kann in der aktuellen Version keine "Face:" darstellen oder erzeugen. Diese Seite richtet sich an alle, die dennoch nicht auf diese "nette Spielerei" verzichten möchten. Um den Face-Header mit "40tude-Dialog" nutzen zu können werden die beiden Programme "PNGtoFace" und "FaceView" benötigt. PNGtoFace erzeugt den Code für den Face-Header und FaceView ermöglicht die Integration in "40tude-Dialog" zum Darstellen von Face-Headern.



PNGtoFace

PNGtoFace ist ein kleines Tool um aus beliebigen PNG-Bildern den Base64-Code zu erzeugen, der für die Integration von Color-Faces per Skript in "40tude Dialog" benötigt wird. Die Bilder müssen hierzu allerdings schon in dem erforderlichen Format (48x48 Pixel) und einer maximalen Größe von 725 bytes (4 Bit Farbtiefe empfohlen) vorliegen.
Zur Konvertierung der Bilder möchte ich an dieser Stelle IrfanView (mit PlugIn PNGOUT) empfehlen.

Mit PNGtoView ist es außerdem möglich, beliebigen Face-Code (z.B. aus Newsartikeln)zu konvertieren und als entsprechendes Bild anzuzeigen. Dieser wird dazu über die Zwischenablage in PNGtoFace eingefügt (Text aus Zwischenablage) und direkt umgewandelt.


Screenshot

  Mit gedrückter Maustaste verschieben





FaceView

Mit FaceView ist es möglich Face-Code direkt als Bild anzuzeigen. Dazu wird beim Programmaufruf entweder die Zwischenablage auf Face-Code geprüft oder dieser wie z.B. im nachfolgendem Skript per FileExecute als Parameter übergeben.
Um die Wirkungsweise zu testen, kann zunachst ein Face-Code aus PNGtoFace in die Zwischenablage kopiert werden. Wenn jetzt FaceView gestartet wird, wandelt dies den Face-Code in ein Bild um und zeigt dieses am oberen Bildschirmrand an. Durch eine Klick auf dieses Bild kann es mit gedrückter Maustaste nach belieben verschoben werden. Nach einer festgelegten Zeit (Standard: 30 Sekunden) wird das Bild wieder ausgeblendet, falls nicht zwischenzeitlich ein neuer Aufruf mit gültigem Face-Code erfolgt ist. Die Zeit kann in der FaceView.ini im Programm-Pfad von FaceView geändert werden. Wenn die "CutTime=0" ist, wird der Timer nicht aktiviert und FacView bleibt solange aktiv, bis es durch den Aufruf mit Parameter "exit", zum Beispiel:

FileExecute(0,'D:\VB-Projekte\FaceView\FaceView.exe','open','exit','',4,0);

... oder per Rechtsklick beendet wird.



Dialog-Skript

Mit dem folgenden Skript-Beispiel für "40tude Dialog" wird bei jedem Klick auf einen Artikel der Body geladen (falls noch nicht vorhanden), der Face-Header ausgelesen und soweit vorhanden das entsprechende Color-Face angezeigt. Die kurze Pause (Delay(800), ggf. anpassen) ist notwendig damit zunächst Zeit zum laden des Body bleibt, bevor der Header ausgewertet wird. Es handelt sich bei dem Skript um ein Meldungs-Skript:

Control = ARTICLELV
Meldung = WM_LBUTTONUP

program ARTICLELV_WM_LBUTTONUP;

// Version 1.08 - 26.02.2006

uses
  Forms, StdCtrls;

const
//  ----------------------------------------------------
//  Configuration settings
//  ----------------------------------------------------

   win98 = 0; // für Nutzer von WIN-XP "win98 = 0", Windows 98 "win98 = 1"
   PfadToFaceView = 'D:\VB-Projekte\FaceView'; // Vollständiger Pfad von FaceView.exe
      
//  ----------------------------------------------------
//  End of configuration settings
//  ---------------------------------------------------- 
  
   {Tag to detect a given Header}
   FaceHeader = 'Face: ';
  
function GetTickCount : cardinal; external 'GetTickCount@kernel32.dll stdcall';
function OpenClipboard(hWndNewOwner: THandle): Boolean; external 'OpenClipboard@user32.dll stdcall';
function CloseClipboard: Boolean; external 'CloseClipboard@user32.dll stdcall';
function EmptyClipboard: Boolean; external 'EmptyClipboard@user32.dll stdcall';

procedure Delay(const Milliseconds: Word);
var
  FirstTickCount: LongWord;
begin
  FirstTickCount := GetTickCount;
  lockdisplay;
  while ((GetTickCount - FirstTickCount) < Milliseconds) do
    begin
      Application.ProcessMessages;
      Sleep(0);
    end;
  unlockdisplay;
end;

var
  FaceCode : string;
  TempClip : string;
  HeadersAreHidden : Boolean;
  tmpForm   : TForm;
  tmpMemo   : TMemo;

function GetClipboardAsString: String;
var
  M: TMemo; F: TForm;
begin
  F:=TForm.Create(nil);
  M:=TMemo.Create(F);
  M.Parent:=F;
  M.PasteFromClipboard;
  Result:=M.Text;
  M.Free;
  F.Free;
end;

function GetMessageBody: String;
begin
  ADo('ArticlePane');
  ADo('SelectAll');
  Ado('Copy');
  Result:=GetClipboardAsString;
end;

function GetHeaderInfo(HeaderTag, Body: String): String;
var 
 TempBody : String;
 
 begin
   if Pos(#13#10#13#10, Body)>0 then
     TempBody:=Copy(Body, 1, Pos(#13#10#13#10, Body)+1);
   if Pos(#13#10+HeaderTag, TempBody)=0 then
     Result:=''
   else
     begin
       Delete(Body, 1, Pos(#13#10+HeaderTag, Body)+Length(HeaderTag)+1);
       Result:=Copy(Body, 1, Pos(#13#10, Body)-1);
     end;
 end;

 function AreHeadersHidden(Body: String): boolean;
 begin
   if Pos(#13#10#13#10, Body)>0 then
     Body:=Copy(Body, 1, Pos(#13#10#13#10, Body)+1);
   Result:= (Pos('Newsgroups: ', Body)=0) and (Pos('From: ', Body)=0);
 end;

function GetFaceCode: String;
var
  Body: String;
begin
  Body:=GetMessageBody;
  HeadersAreHidden:=AreHeadersHidden(Body);
  {headers must be displayed to get FaceCode}
  if HeadersAreHidden then
    ADo('ShowHeaders');
  Body:=GetMessageBody;
  if HeadersAreHidden then
    Ado('ShowHeaders');   

  Result:=GetHeaderInfo(FaceHeader, Body);

end;

procedure OnWMessage (var Msg : TMessage; var handled : boolean);
begin
  tmpForm := tForm.Create(nil);
  try
  tmpForm.Visible := False;
  tmpMemo := tmemo.Create(tmpForm);
  tmpMemo.Parent := tmpForm;
  tmpMemo.Visible := False;
  tmpMemo.Clear;
  tmpMemo.pasteFromClipboard;
  tmpMemo.SelectAll;
  TempClip := tmpMemo.text;
  lockdisplay;
  ADo('GetSelectedMessageBodies');
  Delay(800)
  unlockdisplay;

  FaceCode := GetFaceCode;

  finally

  if Length(FaceCode) < 200 then FaceCode := 'exit';
  if (win98 = 1) and (FaceCode <> 'exit') then begin
     FileExecute(0,PfadToFaceView + '\FaceView.exe', 'open','exit','',4,0);
     Delay(200)
     tmpMemo.Clear;
     tmpMemo.text := trim(FaceCode)
     tmpMemo.SelectAll;
     tmpMemo.CopyToClipboard;
//     WriteLn('Face: ' + trim(tmpMemo.text));
     FileExecute(0,PfadToFaceView + '\FaceView.exe', 'open','','',4,100);
     end
  else begin 
//     WriteLn('Face: ' + FaceCode);
     FileExecute(0,PfadToFaceView + '\FaceView.exe', 'open',FaceCode,'',4,10);
     end;

  if TempClip <> '' then begin
     tmpMemo.Clear;
     tmpMemo.text := TempClip
     tmpMemo.SelectAll;
//     WriteLn('Temp: ' + trim(tmpMemo.text));
     tmpMemo.CopyToClipboard;
  end
  else begin
     OpenClipboard(0);
     EmptyClipboard;
     CloseClipboard;
  end;
  tmpForm.free;
  ADo('HeaderlistPane');
  handled := false;

  end;

//  WriteLn('Face: ' + FaceCode);                                      
//   beep;

end;

Begin
end.


Download

Die Software befindet sich in einem frühen Beta-Stadium. Nachdem ich sie aber an drei verschiedenen PC ohne Probleme in Kombination mit dem Skript nutzen konnte, möchte ich sie hiermit zum Testen freigeben:

  • PNGtoFace vom 29.07.2005
    pngtoface.exe (56 KB) - Version 1.0.0.20 Beta

  • FaceView vom 26.07.2005
    faceview.exe (48 KB) - Version 1.0.0.94 Beta

Beide Programme sind Freeware und können beliebig weitergegeben werden.
Achtung: Dieses Programme sind "beta" und beinhalten von daher keinerlei Garantie auf einwandfreie Funktion. Insbesondere übernimmt der Autor keine Verantwortung für ggf. im Zusammenhang mit dieser Software entstehende Schäden oder Fehlfunktionen.

Achtung: Für die Nutzung unter WIN98 (und früher) werden die gdiplus.dll (bei WIN-XP dabei)
und verschiedene VB-Runtimes benötigt!


Verbesserungsvorschläge, Kritiken und Anregungen bitte hier übermitteln!

Meine Homepage mit zahlreichen Desktopbildern findet Ihr hier.


This document maintained by.
Copyright © 2005-2016 Maik Prinz - Kontakt/Impressum