|
Pour cela il suffit d'envoyer la commande 415 à la barre des taches.
PostMessage(FindWindow("Shell_TrayWnd", NULL), WM_COMMAND, 415, 0);
D'autre commandes sont possible :
- 403 Les fenêtres en cascade.
- 404 Les fenêtres en mosaique horizontale.
- 405 Les fenêtres en mosaique verticale.
- 416 Annule la dernière action parmis les précedentes.
- 413 Appelle la fenêtre de propriété de la barre des taches.
- 408 Appelle la fenêtre de propriété date heure.
- 401 Appelle La fenêtre Executer.
Dans cet exemple nous allons passer la couleur du fond du bureau en rouge à
l'aide de la fonction SetSysColors().
int elem = COLOR_DESKTOP;
COLORREF color = RGB(255,0,0);
SetSysColors(1,&elem,&color);
Cette fonction doit recevoir en paramétres le nombre d'éléments à changer,
puis l'adresse du tableau éléments, puis l'adresse du tableau de COLORREF
qui contient les couleurs.
Donc si plusieurs éléments notre exemple devient:
int elem[2];
COLORREF color[2];
elem[0] = COLOR_DESKTOP;
elem[1] = COLOR_ACTIVECAPTION;
color[0] = RGB(255,0,0);
color[1] = RGB(0,0,255);
SetSysColors(2,elem,color);
Liste des identificateurs d'élément:
COLOR_3DDKSHADOW, COLOR_3DFACE, COLOR_BTNFACE, COLOR_3DHILIGHT, COLOR_3DLIGHT,
COLOR_3DSHADOW, COLOR_ACTIVEBORDER, COLOR_ACTIVECAPTION,COLOR_APPWORKSPACE,
COLOR_BACKGROUND, COLOR_DESKTOP, COLOR_BTNTEXT, COLOR_CAPTIONTEXT, COLOR_GRAYTEXT
COLOR_HIGHLIGHT, COLOR_HIGHLIGHTTEXT, COLOR_INACTIVEBORDER, COLOR_INACTIVECAPTION,
COLOR_INACTIVECAPTIONTEXT, COLOR_INFOBK, COLOR_INFOTEXT, COLOR_MENU,
COLOR_MENUTEXT, COLOR_SCROLLBAR, COLOR_WINDOW, COLOR_WINDOWFRAME, COLOR_WINDOWTEXT.
Pour cela il suffit de rajouter le style CS_NOCLOSE à la classe de fenêtre
de la Form.
Unit1.h
void __fastcall CreateParams(TCreateParams& Params);
Unit1.cpp
void __fastcall TForm1::CreateParams(TCreateParams& Params)
{
TForm::CreateParams(Params);
Params.WindowClass.style |= CS_NOCLOSE;
}
Pour cela il suffit de donner le style WS_EX_TOOLWINDOW à la fenêtre Application.
(Sous BCB la fenêtre Application est toujours invisible)
Dans le WinMain fichier: Project1.cpp
WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int)
{
try
{
SetWindowLong(Application->Handle, GWL_EXSTYLE, WS_EX_TOOLWINDOW);
Application->Initialize();
//.........
Inscription dans le registre du lancement automatique de votre application
au démarrage de l'ordinateur.
Dans Unit1.h
#include <Registry.hpp>
Dans Unit1.cpp
TRegistry *Reg = new TRegistry();
Reg->RootKey = HKEY_LOCAL_MACHINE;
Reg->OpenKey("Software\\Microsoft\\Windows\\CurrentVersion\\Run", false);
Reg->WriteString("Nom du Programme", "C:\\Dossier\\Project1.exe");
delete Reg;
Désactiver les touches Win, Ctrl-Echap , Alt-Tab et Ctrl-Alt-Suppr pendant
l'éxécution de votre programme. (Ce code ne fonctionne que sous les plateformes
Windows 95.)
Sur les événements OnCreate et OnClose de Form1 :
void __fastcall TForm1::FormCreate(TObject *Sender)
{
int val;
SystemParametersInfo( SPI_SCREENSAVERRUNNING, 1, &val, 0);
}
void __fastcall TForm1::FormClose(TObject *Sender, TCloseAction &Action)
{
int val;
SystemParametersInfo( SPI_SCREENSAVERRUNNING, 0, &val, 0);
}
On va tout simplement simuler l'appuit sur la touche <Impr écran>
à l'aide de la fonction keybd_event
keybd_event(VK_SNAPSHOT,1,0,0);
Par la même méthode on peut faire une copie de la Form dans le presse papier:
keybd_event(VK_SNAPSHOT,0,0,0);
Sur une Form (Form1) poser une ComboBox (ComboBox1) avec sa propriété
Style à csDropDownList.
Sur l'événement OnCreate de Form1 affecter la liste des fontes à la
propriété Items de ComboBox1 et sélectionner la fonte "Arial" :
void __fastcall TForm1::FormCreate(TObject *Sender)
{
ComboBox1->Items = Screen->Fonts;
ComboBox1->ItemIndex = ComboBox1->Items->IndexOf("Arial");
}
Exemple pour Form2 sur son l'événement OnCreate, lui donner le style étendu
WS_EX_APPWINDOW.
void __fastcall TForm2::FormCreate(TObject *Sender)
{
SetWindowLong(Handle,GWL_EXSTYLE,GetWindowLong(Handle,GWL_EXSTYLE) |
WS_EX_APPWINDOW);
}
Pour l'exemple sur une fiche Form1, poser un bouton Button1 et 3
labels Label1, Label2 et Label3. Puis sur l'événement OnClick de Button1
inserer le code ci-dessous.
C'est la fonction de l'API Windows GetVolumeInformation qui va nous
fournir ces informations.
Le numéro de série du volume est retourné dans une variable de type
DWORD dont on passe l'adresse au 4eme paramètre de la fonction.
Dans l'exemple il est affiché sur Label1 en hexadécimal.
Cette fonction peut renvoyer aussi le système de fichier du volume,
affiché par Label2 dans l'exemple et aussi le nom du volume
sur Label3 dans l'exemple. Il suffit de lui fournir l'adresse et la taille
des buffers ou elle doit écrire ces informations.
void __fastcall TForm1::Button1Click(TObject *Sender)
{
DWORD NumSerie;
char NomVol[12];
char SysFile[16];
GetVolumeInformation("C:/", NomVol, 12, &NumSerie, NULL , NULL, SysFile, 16);
Label1->Caption = IntToHex((int)NumSerie, 8);
Label2->Caption = SysFile;
Label3->Caption = NomVol;
}
Fonction retournant la liste des disques dans une liste de chaines (TStrings).
Pour obtenir cette liste nous utiliserons la fonction GetLogicalDriveStrings
de l'API Windows. Cette fonction retourne cette liste dans un buffer (DriveSt dans
l'exemple), où chaque chaine est separée par un \0 et la fin de liste par un double
\0.
void DiskList(TStrings* Liste)
{
int ch = 0;
char DriveSt[127];
GetLogicalDriveStrings(126, DriveSt);
while ( DriveSt[ch] != 0 )
{
Liste->Add(&DriveSt[ch]);
ch += strlen(&DriveSt[ch])+1;
}
}
Exemple d'utilisation de cette fonction pour initialiser un TMemo
avec cette liste :
DiskList(Memo1->Lines);
Pour l'exemple nous metterons le code sur l'événement OnClick d'un Button
(Button1), le résultat sur un Label (Label1) et l'information sera
obtenu avec la fonction GetFileSize. (Elle retourne -1 si le fichier
n'existe pas.)
void __fastcall TForm1::Button1Click(TObject *Sender)
{
HANDLE hFile;
hFile = CreateFile("fichier.ext", 0, 0, NULL, OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL, NULL);
int dwSize = GetFileSize (hFile, NULL);
CloseHandle(hFile);
Label1->Caption = dwSize;
}
Dans cet exemple on va utiliser une image que l'on va
inclure dans les ressources de l'application. C'est-à-dire qu'elle
sera intégrée au fichier executable de l'application une fois celui-ci crée.
Pour cela il faudra tout d'abord mettre le fichier de l'image (image.bmp)
dans le dossier de compilation.
Puis créer un fichier script de ressource qui devra être ajouté au projet
de l'application.
Image.rc pour l'exemple :
IMAGE BITMAP image.bmp
Dans ce script le nom de la ressource sera IMAGE, elle est de type BITMAP
est se trouve dans le fichier image.bmp
Nous allons voir maintenant comment exploiter cette ressource :
Dans l'exemple nous allons récuperer l'image dans un TBitmap à l'aide
de sa méthode LoadFromResourceName puis la dessiner sur la fiche
(Form1), cela sur l'événement OnPaint de la fiche :
void __fastcall TForm1::FormPaint(TObject *Sender)
{
Graphics::TBitmap *Image = new Graphics::TBitmap();
Image->LoadFromResourceName((int)HInstance, "IMAGE");
Canvas->Draw(0, 0,Image);
delete Image;
}
Les économiseurs d'écrans sont des fichiers exécutables spéciaux.
Pour les lancer, on les appelle avec le paramètre '/p' et pour obtenir leur
boîte de dialogue de configuration on les appelle le paramètre '/c'.
On peut aussi les lancer avec comme 2ème paramètre un Handle de fenêtre après le
paramètre '/p', indiquant la fenêtre où il devra s'afficher.
Dans notre exemple nous fournirons donc le Handle d'un TPanel (Panel1) afin
d'afficher l'économiseur d'écran à l'intérieur de ce TPanel.
HANDLE hProcess;
DWORD Code;
//........
// Lancement de l'économiseur :
AnsiString st = "economiseur.scr /p" + IntToStr((int)Panel1->Handle) ;
STARTUPINFO StUpInfo;
PROCESS_INFORMATION ProcessInfo;
StUpInfo.cb = sizeof(StUpInfo);
StUpInfo.lpReserved = NULL;
StUpInfo.lpDesktop = NULL;
StUpInfo.lpTitle = NULL;
StUpInfo.dwFlags = 0;
StUpInfo.cbReserved2 = 0;
StUpInfo.lpReserved2 = NULL;
CreateProcess(NULL, st.c_str(), NULL, NULL, false, DETACHED_PROCESS,
NULL, NULL, &StUpInfo, &ProcessInfo);
hProcess = ProcessInfo.hProcess;
GetExitCodeProcess(hProcess,&Code);
//........
//Arrêt de l'économiseur :
TerminateProcess(hProcess,Code);
L'économiseur est lancé avec la fonction CreateProcess afin de pouvoir
récupérer le Handle de son process dans la structure PROCESS_INFORMATION
afin de pouvoir l'arrêter ultérieurement à l'aide de la fonction
TerminateProcess.
Cet arrêt est nécessaire avant la destruction de la fenêtre parente.
Il faut passer la propriété ShowMainForm de l'objet Application à false
avant d'appeler sa méthode Run. Il faut bien sûr laisser la propriété Visible
de cette fiche à false.
WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int)
{
try
{
Application->Initialize();
Application->ShowMainForm = false;
Application->CreateForm(__classid(TForm1), &Form1);
Application->Run();
}
//...
|