Merci beaucoup
Voici, je pense, l'essentiel :
Code : Tout sélectionner
//============================================================================
// MODELE DE PLUGIN POUR PHOTOFILTRE ECRIT AVEC BORLAND C++ 5.02 (option C node)
//
// ENTETE POUR BC5 => A REVOIR POUR AUTRE COMPILATEUR
#define DLLEXPORT __declspec(dllexport) // BC5 Fonctions Exportees
#define STRICT
#define WIN32
#pragma warning(disable:4505)
#pragma hdrstop
// IMPORTANT => Calling Convention = StdCall
// Type de projet Dll 32 Bits standard (Platform:Win32 Target:GUI)
// Link = "Static Mode" sinon le compilateur ne linkera pas le runtime C
//============================================================================
// INCLUSION HEADERS
#include <windows.h>
#include <windowsx.h>
#include "Ressources.h"
#include "democ.h"
// PROTOTYPES
BOOL WINAPI DllEntryPoint(HINSTANCE hinstDll,DWORD dwReason,LPVOID plvReserved);
extern struct PluginHeader* DLLEXPORT RegisterPluginHeader(void);
extern struct PluginStruct* DLLEXPORT RegisterPluginStruct(void);
extern int DLLEXPORT RegisterCompatibility(void);
extern int DLLEXPORT Execute(void);
extern HBITMAP DLLEXPORT RegisterPluginGlyph(void);
BOOL DialogProc(HWND hWin,UINT uMsg,WPARAM wParam,LPARAM lParam);
void Affiche(void);
// VARIABLES GLOBALES
HINSTANCE hInstance;
struct PluginHeader PHeader;
struct PluginStruct PStruct;
struct SIMAGE Img;
// SPECIFIQUE PLUGIN
HWND hDlg; // Handle DialogBox
INT Couche; // Masque de couche
INT RetValue; // Retour de la boucle de message
INT IsInit; // Autorise/interdit l'affichage
HWND HROUGE; // Handle ChekBox Rouge
HWND HVERT; // Handle ChekBox Vert
HWND HBLEU; // Handle ChekBox Bleu
// DESCRIPTEURS PLUGIN
char HeaderCaption[] = {"Demo Filtre (C)"};
char HeaderVersion[] = {"Version 1.0"};
char HeaderAuthor[] = {"P@F"};
char HeaderCommentaire[] = {"Conserve ou efface les couches R-V-B.\xA\xD"
"Plugin de test écrit en C.\xA\xD"
"Nécessite PhotoFiltre 5.6 minimum."};
int HeaderPluginType = PT_FILTER;
int HeaderPluginFlag = MF_RGB_COLORS + MF_NEED_IMAGE;
//=========================================================================
// POINT D'ENTREE DU PLUGIN
//=========================================================================
#pragma argsused // Pour eviter le warning: Parameter '' is never used
BOOL WINAPI DllEntryPoint(HINSTANCE hinstDll,DWORD dwReason,LPVOID plvReserved)
{
if (dwReason == DLL_PROCESS_ATTACH) // Raison d'appel
{
hInstance = hinstDll; // Recupere l'instance dll du plugin
// Les structures a zero
ZeroMemory(&PStruct,sizeof(struct PluginStruct)); // Les structures a zero
ZeroMemory(&PHeader,sizeof(struct PluginHeader));
ZeroMemory(&Img,sizeof(struct SIMAGE));
// Intialisation de la structure d'entete du plugin
strcpy(PHeader.Caption,HeaderCaption);
strcpy(PHeader.Version,HeaderVersion);
strcpy(PHeader.Author,HeaderAuthor);
strcpy(PHeader.Commentaire,HeaderCommentaire);
PHeader.PluginType=HeaderPluginType;
PHeader.Flags=HeaderPluginFlag;
return(1); // C'est tout bon !
}
else
return(0); // Les autres raisons d'appel => Niet !
}
//=========================================================================
// FONCTION D'EXECUTION DU PLUGIN
//=========================================================================
extern int DLLEXPORT Execute(void)
{
//==== TEST DE LA VERSION PHOTOFILTRE ET DE LA COMPATIBILITE
// Si RegisterCompatibility retourne 1 ou la version ne gere pas
// la compatibilité niveau 2 => les fonctions niveau 2 sont initialisées a zéro
if (PStruct.TPrepareDialogue == 0)
{
MessageBox(NULL,
"Ce plugin est incompatible avec cette version de PhotoFiltre.\xD\xA"
"Il Nécessite la version 5.6 minimum.\xD\xA"
"Vous pouver la télécharger sur le site officiel:\xD\xA"
"http://www.photofiltre.com/","Ancienne version de PhotoFiltre",
MB_OK | MB_ICONINFORMATION);
return(0); // Une petite MsgBox pour etre poli !
};
//==== DEBUT DU FILTRE (Pour le curseur "sablier" => mettre 1 au lieu de dFALSE
(*PStruct.TBeginFilter)(HeaderCaption,dFALSE); // Signaler le debut a PhotoFiltre
// Lancer Visuel avec hParent = NUL => on laisse PhotoFiltre gerer le mode Modal
DialogBox(hInstance, MAKEINTRESOURCE(IDD_MAIN),NULL,DialogProc); // Lancer Visuel
//==== FIN DU FILTRE
(*PStruct.TEndFilter)(); // Signaler la fin a PhotoFiltre
//==== LIBERE L'IMAGE
if ( Img.piBitmap != NULL) // Un petit test pour eviter toute mauvaise surprise
(*PStruct.TFreeDBmp)(&Img);
return(RetValue); // Valeur retournée par le Visuel (1=Modif, 0=NoModif)
}
//=========================================================================
// DialogProc => Visuel
// Boucle de message de la boite de dialogue
//=========================================================================
#pragma argsused // Pour eviter le warning: Parameter '' is never used
BOOL CALLBACK DialogProc(HWND hWin,UINT uMsg,WPARAM wParam,LPARAM lParam)
{
switch(uMsg)
{
case WM_INITDIALOG:
//== Init VARIABLES ============================
hDlg = hWin; // Handle de la boite de dialogues
IsInit = 0; // Interdire l'affichage pour le momment
Couche = 0; // Masque de couche
RetValue = 0; // Image non modifiée
Img.piBitmap = NULL; // Pour etre sur de l'allocation future...
//== Init DIALOGBOX ============================
SendMessage(hWin,WM_SETICON,ICON_BIG,(LPARAM)LoadIcon(hInstance,(LPSTR)500));
//== Init CHECKBOX ============================
HROUGE = GetDlgItem(hWin,IDC_ROUGE); // Rouge
HVERT = GetDlgItem(hWin,IDC_VERT); // Vert
HBLEU = GetDlgItem(hWin,IDC_BLEU); // Bleu
SendMessage(HROUGE,BM_SETCHECK,BST_CHECKED,0);
SendMessage(HVERT,BM_SETCHECK,BST_CHECKED,0);
SendMessage(HBLEU,BM_SETCHECK,BST_CHECKED,0);
//== Demande Dialogue Modal a PhotoFiltre ============================
(*PStruct.TPrepareDialogue)(hDlg,DM_MODAL,dFALSE,dFALSE);
//== Creation de l'image a la bonne taille ============================
// Les Rectangles Delphi sont relatifs a l'origine
// Si il n'y a pas de selection, le rectangle decrit l'image entiere
Img.piWidth = PStruct.SelRect.right - PStruct.SelRect.left;
Img.piHeight = PStruct.SelRect.bottom - PStruct.SelRect.top;
(*PStruct.TCreateDBmp)(&Img);
if ( Img.piBitmap == NULL)
{(*PStruct.TEndFilter)();return(0);}
IsInit=1; // Permetre l'affichage
return(TRUE);
//== Fin de WM_INITDIALOG ============================
//== WM_COMMAND ======================
case WM_COMMAND:
switch(wParam)
//switch(LOWORD(wParam))
{
//== BOUTON ANNULER ======================
case IDC_CANCEL:
EndDialog(hWin,FALSE);break;
//== BOUTON OK ======================
case IDC_OK:
RetValue=1;
EndDialog(hWin,TRUE);break;
//== CHECKBOX Rouge ======================
case IDC_ROUGE:
if (SendMessage(HROUGE,BM_GETCHECK,0,0) == BST_UNCHECKED)
Couche |= 1 ;
else
Couche &= 0xFFFFFFFE;
Affiche();
break;
//== CHECKBOX Vert ======================
case IDC_VERT:
if (SendMessage(HVERT,BM_GETCHECK,0,0) == BST_UNCHECKED)
Couche |= 2;
else
Couche &= 0xFFFFFFFD;
Affiche();
break;
//== CHECKBOX Bleu ======================
case IDC_BLEU:
if (SendMessage(HBLEU,BM_GETCHECK,0,0) == BST_UNCHECKED)
Couche |= 4;
else
Couche &= 0xFFFFFFFB;
Affiche();
break;
//== DEFAULT COMMAND PROCESS MESSAGE ======================
default:
return(FALSE); // On traite pas le message
//== FIN DE WM_COMMAND ======================
} break; //==================================
//== WM_CLOSE ======================
case WM_CLOSE:
EndDialog(hWin,TRUE);
//== DEFAUT GLOBAL PROCESS MESSAGE ======================
default:
return(FALSE); // On traite pas le message
//*******************************************************************
}//== FIN DE LA BOUCLE DE MESSAGE ======================
return(TRUE); // On envois au traitement les autres messages
}
//=========================================================================
// FONCTION D'AFFICHAGE (Pour info)
//=========================================================================
void Affiche(void)
{
UINT CptX,CptY,Tx;
UCHAR *Ptr;
if (!IsInit)
return;
//==== RESTAURATION DE L'IMAGE ET RECUPERATION DANS LE BUFFER D'IMAGE
TRestoreUndoBitmap(&PStruct);
(*PStruct.TGetSelBitmap)(Img.piBitmap);
//==== MODIFICATION DU BUFFER D'IMAGE
(*PStruct.TGetScanLineDBmp)(&Img,0);
Ptr = Img.piBuffer;
Tx = Img.piWidth * 3 ;
for (CptY=0; CptY < Img.piHeight ; CptY ++)
{
for (CptX=0; CptX < Tx ; CptX +=3)
{
if ((Couche & 4))
Ptr[CptX]=0; // Bleu
if ((Couche & 2))
Ptr[CptX+1]=0; // Vert
if ((Couche & 1))
Ptr[CptX+2]=0; // Rouge
};
Ptr -= (Img.piScanlineSize);
};
//==== ACTUALISATION DE L'IMAGE
(*PStruct.TSetSelBitmap)(Img.piBitmap,SF_AUTO);
}
//=========================================================================
// FONCTIONS EXPORTEES
//=========================================================================
extern struct PluginHeader* DLLEXPORT RegisterPluginHeader(void)
{return(&PHeader);}
//-------------------------------------------------------------------------
extern struct PluginStruct* DLLEXPORT RegisterPluginStruct(void)
{return(&PStruct);}
//-------------------------------------------------------------------------
extern int DLLEXPORT RegisterCompatibility(void)
{return(NON_DELPHI);}
//-------------------------------------------------------------------------
extern HBITMAP DLLEXPORT RegisterPluginGlyph(void)
{return(LoadBitmap(hInstance,(LPTSTR)600));}
// OU => {return(LoadBitmap(hInstance,MAKEINTRESOURCE(600)));}
Voilà, ça c'est le fichier principal. Ensuite, viennent les deux headers...
Code : Tout sélectionner
//;********************************************************************
//; CONSTANTES PhotoFiltre
//;********************************************************************
#define RGBColorCount = 256 * 256 * 256 ; 16 millions de couleurs
#define MaxLongStr 256
#define MaxShortStr 64
// Compatibilité Delphi/Non Delphi
#define DELPHI 1
#define NON_DELPHI 2
// type du plugin
#define PT_FILTER 0
#define PT_IMAGE 1
#define PT_FILE_IMPORT 2
#define PT_FILE_EXPORT 3
#define PT_TOOL 4
// mode de dialogue
#define DM_MODAL 0
#define DM_PREVIEW 1
#define DM_COLOR_PICKER 2
// flags de sélection
#define SF_AUTO 0
#define SF_NONE 1
// flags pour la création d'image
#define IF_CREATE 0
#define IF_FILE 1
// flags pour l'activation du menu
#define MF_RGB_COLORS 0x00000001
#define MF_INDEXED_COLORS 0x00000002
#define MF_TRANSPARENT 0x00000004
#define MF_NOT_TRANSPARENT 0x00000008
#define MF_SELECTED 0x00000010
#define MF_NOT_SELECTED 0x00000020
#define MF_NEED_IMAGE 0x00000040
#define MF_NEED_MORE_THAN_ONE_IMAGE 0x00000080
// test sur l'extension du fichier en cours
#define MF_IMAGE_JPEG 0x00010000
#define MF_IMAGE_GIF 0x00020000
#define MF_IMAGE_PNG 0x00040000
#define MF_IMAGE_BMP 0x00080000
#define MF_IMAGE_TIFF 0x00100000
#define MF_IMAGE_PFS 0x00200000
// === CONSTANTES FALSE/TRUE POUR DELPHI
#define dFALSE 0
#define NIL NULL
//;********************************************************************
//; DESCRIPTION DE LA STRUCTURE D'IMAGE
//;********************************************************************
typedef UINT DBITMAP; // Objet Delphi TBitmap
typedef UINT DFORM; // Objet Delphi TForm
struct SIMAGE
{
UINT piSize; // Taille de la structure en Octets
UINT piWidth; // Taille X Utile en Pixels
UINT piHeight; // Taille Y Utile en Pixels
UINT piWidthSize; // Taille X Utile en Octets
UINT piScanlineSize; // Taille D'une ScanLine complete en Octets
UINT piByteCount; // NB D'octets par Pixels
UINT piDataSize; // Taille Totale du Buffer en Octets
UCHAR* piBuffer; // Adresse Buffer
DBITMAP piBitmap; // Pointeur Delphi TBitmap
HBITMAP piHandle; // Pointeur HBitmap
};
//;********************************************************************
//; DESCRIPTION DES STRUCTURES PHOTOFILTRE
//;********************************************************************
//;=== STRUCTURE D'ENTETE DU PLUGIN
struct PluginHeader
{
char Caption[MaxShortStr+1];
char Version[MaxShortStr+1];
UINT PluginType;
char Author[MaxShortStr+1];
char Commentaire[MaxShortStr+1];
char Reserved[MaxShortStr+1];
UINT Flags;
};
//;=== STRUCTURE D'EXECUTION DU PLUGIN
struct PluginStruct
{
// Compatibilité Niveau 1
HWND MainHandle;
INT ImageExists;
INT Selected;
RECT SelRect;
RECT ImgRect;
INT XP_ThemesEnabled;
INT (*TBeginFilter)(char* Message,int Sablier);
INT (*TEndFilter)(void);
INT (*TGetBitmap)(DBITMAP DelphiBitmap);
INT (*TSetBitmap)(DBITMAP DelphiBitmap);
INT (*TGetSelBitmap)(DBITMAP DelphiBitmap);
INT (*TSetSelBitmap)(DBITMAP DelphiBitmap,UINT SelectOption);
INT (*TGetTransparentColor)();
INT (*TSetTransparentColor)(UINT Couleur);
INT (*TGetColorCount)();
INT (*TSetColorCount)(INT ColorCount);
INT (*TNewImage)(DBITMAP DelphiBitmap,char* FileName,INT ImageOption,INT ColorCount,UINT TransColor);
INT (*TShowForm)(DFORM TForm,INT DialogOption,INT MainFormCenter,INT CloseWaiting);
INT (*TSetAlphaBlend)(INT AlphaRange);
INT (*TDrawSelBorder)(INT Width,UINT Couleur,INT Antialias);
INT (*TGetSelMask)(DBITMAP DelphiBitmap);
void (*TResetSaveMenu)();
INT (*TGetImgFileName)(char *PlPath,INT Taille);
INT (*TGetExePath)(char *PlPath,INT Taille);
INT (*TGetOpenPath)(char *PlPath,INT Taille);
INT (*TGetSavePath)(char *PlPath,INT Taille);
INT (*TGetPluginPath)(char *PlPath,INT Taille);
INT (*TGetIniFile)(char *PlPath,INT Taille);
INT (*TSetImgFileName)(char *PlPath);
INT (*TGetBitmapByName)(DBITMAP DelphiBitmap,char* FileName);
INT (*TGetThumb)(DBITMAP DelphiBitmap,UINT BkColor,
INT BorderSize,INT ShadowSize,UINT ShadowBkColor,RECT* R);
INT (*TGetThumbByName)(DBITMAP DelphiBitmap,char* FileName,UINT BkColor,
INT BorderSize,INT ShadowSize,UINT ShadowBkColor,RECT* R);
INT (*TEnumImages)(char* FileName,INT Width,INT Height,INT NbColor,UINT TransColor);
// Compatibilité Niveau 2
INT (*TPrepareDialogue)(HWND HandleF,INT DialogOption,INT MainFormCenter,INT CloseWaiting);
INT (*TCreateDBmp)(struct SIMAGE *BitmapIn);
INT (*TFreeDBmp)(struct SIMAGE *BitmapIn);
HDC (*TReleaseHandleDBmp)(struct SIMAGE *BitmapIn);
INT (*TGetScanLineDBmp)(struct SIMAGE *BitmapIn,UINT Row);
INT (*Reserve1)(void);
INT (*Reserve2)(void);
INT (*Reserve3)(void);
INT (*Reserve4)(void);
INT (*Reserve5)(void);
};
//=========================================================================
// FONCTIONS AUXILIAIRES
//=========================================================================
void TRestoreUndoBitmap(struct PluginStruct* Pls);
void TRestoreUndoBitmap(struct PluginStruct* Pls)
{(*Pls->TSetBitmap)(NULL);}
Celui qui suit, aucun problème je suppose...
Code : Tout sélectionner
#define IDD_MAIN 1
#define IDI_BITMAP 600
#define IDI_ICON1 500
#define IDC_STATICFRAME1 103
#define IDC_CANCEL 102
#define IDC_OK 101
#define IDC_BLEU 107
#define IDC_VERT 106
#define IDC_ROUGE 105
#define IDC_CHECKBOX1 105
#define IDC_CHECKBOX2 106
#define IDC_CHECKBOX3 107
et le fichier ressources...
Code : Tout sélectionner
#include "Ressources.h"
//=====================================================
IDD_MAIN DIALOGEX 0, 0, 107, 78
EXSTYLE WS_EX_TOPMOST | WS_EX_APPWINDOW
STYLE DS_SYSMODAL | DS_3DLOOK | DS_CENTER | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
CAPTION "Demo Filtre (C)"
FONT 8, "MS Sans Serif"
{
CONTROL "&Annuler", IDC_CANCEL, "button", BS_PUSHBUTTON | BS_CENTER | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 4, 60, 46, 14
CONTROL "&Ok", IDC_OK, "button", BS_PUSHBUTTON | BS_CENTER | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 58, 60, 46, 14
CONTROL "Afficher La Couche &Verte", IDC_VERT, "button", BS_AUTOCHECKBOX | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 4, 24, 92, 9
CONTROL "Afficher La Couche &Rouge", IDC_ROUGE, "button", BS_AUTOCHECKBOX | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 4, 8, 96, 9
CONTROL "Afficher La Couche &Bleue", IDC_BLEU, "button", BS_AUTOCHECKBOX | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 4, 40, 96, 9
CONTROL "Frame1", IDC_STATICFRAME1, "static", SS_ETCHEDFRAME | WS_CHILD | WS_VISIBLE, 4, 56, 100, 1
}
//=================================================
//== ICONES
500 ICON MOVEABLE PURE LOADONCALL DISCARDABLE "Democ.ico"
//=================================================
//== BITMAP
600 BITMAP MOVEABLE PURE LOADONCALL DISCARDABLE "Democ.bmp"
Je vais commencer par convertir ce que je sais convertir.
Déjà, la partie qui me gène est celle qui fait référence au type "RECT" qui est un simple rectangle, mais qui ne semble pas défini dans les sources.
Que pourrais-je faire ?