Developpez.com - C
X

Choisissez d'abord la catégorieensuite la rubrique :



Trucs et astuces pour C++ Builder

Par CGi

Page 1 Page 2 Page 3 Page 4 Page 5



Réduire toutes les fenêtres du bureau :

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.





Changer les couleurs System :

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.





Griser le bouton fermeture et interdire le <Alt F4> :

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;
}




Cacher l'application de la barre des tâches :

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();
    //.........




Lancement de votre application au démarrage de l'ordinateur :

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 Windows (Win 95) :

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);
}




Mettre une copie d'écran dans le presse papier:

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);




Liste des fontes du système dans une Combobox :

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");
}




Avoir un bouton sur la barre des tâches pour les fiches secondaires :

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);
}




Obtenir le numéro de série d'un dique :

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;
}




Liste des disques dans une TStrings :

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);  




Obtenir la taille d'un fichier :

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;
}   




Mettre une image dans les ressources d'une application :

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;
}




Mettre l'économiseur d'écran dans un TPanel :

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.





Cacher la fenêtre principal au lancement de l'application :

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();
        } 
         //...




Précédant Index Suivant





C/C++
  Les pointeurs du C/C++.   Les listes chaînées.             Liste simple.             Liste triée.             Liste double.   Les arbres.   Les tas.   Le C orienté objets ?

  1 - La fenêtre principale.   2 - Contrôles et messages.   3 - Les commandes.   4 - Dialogue std.   5 - Contexte de périph.   6 - Dessiner.   7 - Les ressources.   8 - Dialogue perso.   9 - Dialogue comm.   10 - Les accélérateurs.

Assembleur
  Assembleur sous Visual C++.

C++ BUILDER
  Trucs et astuces.   Composant.   TRichEdit.   TDrawGrid.   Application MDI.   TThread.   wxWidgets.   Style Win XP.

  Première application.   Construire un menu.   Dessiner.   Sisers, Timers...   Dialogues standards.   Dialogues perso.

DotNet
  Composant C# Builder.   Contrôle WinForm.   Application MDI.

Java
  Applet java.





Copyright 2002-2016 CGi - Tous droits réservés CGi. Toutes reproduction, utilisation ou diffusion de ce document par quelque moyen que ce soit autre que pour un usage personnel doit faire l'objet d'une autorisation écrite de la part de l'auteur, propriétaire des droits intellectuels.
Les codes sources de ce document sont fournis en l'état. L'utilisateur les utilise à ses risques et périls, sans garantie d'aucune sorte de la part de l'auteur. L'auteur n'est responsable d'aucun dommage subi par l'utilisateur pouvant résulter de l'utilisation ou de la distribution des codes sources de ce document.
De la même façon, l'auteur n'est en aucun cas responsable d'une quelconque perte de revenus ou de profits, ou de données, ou de tous dommages directs ou indirects, susceptibles de survenir du fait de l'utilisation des codes sources de ce document, quand bien même l'auteur aurait été averti de la possibilité de tels dommages. L'utilisation des codes sources de ce document vaut acceptation par l'utilisateur des termes de la licence ci-dessus.

Contacter le responsable de la rubrique C