Exemple: Sur une Form (Form1) vous posez une ListBox (ListBox1)
avec sa propriété Style à : lbOwnerDrawFixed.
Vous y rajoutez quelques Items.
Puis le code suivant sur l'événement OnDrawItem
de la ListBox :
void __fastcall TForm1::ListBox1DrawItem(TWinControl *Control,
int Index, TRect &Rect, TOwnerDrawState State)
{
TCanvas *pCanvas = ((TListBox *)Control)->Canvas;
if ((Index%2)==0) pCanvas->Brush->Color = clYellow;
// met 1 ligne sur 2 en jaune
if(State.Contains(odSelected)) //ligne selectionnée
{
pCanvas->Brush->Color = clRed;
pCanvas->FillRect(Rect);
pCanvas->Font->Color = clYellow;
}
else pCanvas->FillRect(Rect); //Les autres lignes
//écriture les Items.
pCanvas->TextOut(Rect.Left+5,Rect.Top+2,
((TListBox *)Control)->Items->Strings[Index]);
}
Avec l'utilisation de ((TListBox *)Control) au lieu de
ListBox1 cette méthode est valable pour n'importe quel ListBox.
On peut obtenir ces informations à l'aide des variables :
Win32MajorVersion, Win32MinorVersion, Win32BuildNumber, Win32Platform, Win32CSDVersion.
Exemple sur une Form (Form1) vous posez un Memo (Memo1) et un bouton
(Button1) et sur l'événement OnClick de Button1 :
void __fastcall TForm1::Button1Click(TObject *Sender)
{
Memo1->Lines->Add("Version : " + String(Win32MajorVersion) +
"." + String(Win32MinorVersion));
Memo1->Lines->Add("Construction : " + String(LOWORD(Win32BuildNumber)));
Memo1->Lines->Add("Plateforme : " + String(Win32Platform));
Memo1->Lines->Add("Info suppl. : " + String(Win32CSDVersion));
}
Plateforme :
0 -> Win32s on Windows 3.1.
1 -> Win32 on Windows 95.
2 -> Win32 on Windows NT.
Même chose mais avec l'API Windows :
void __fastcall TForm1::Button1Click(TObject *Sender)
{
OSVERSIONINFO OsVer;
OsVer.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
GetVersionEx(&OsVer);
Memo1->Lines->Add("Version : " + String(OsVer.dwMajorVersion) +
"." + String(OsVer.dwMinorVersion));
Memo1->Lines->Add("Construction : " + String(LOWORD(OsVer.dwBuildNumber)));
Memo1->Lines->Add("Plateforme : " + String(OsVer.dwPlatformId));
Memo1->Lines->Add("Info suppl. : " + String(OsVer.szCSDVersion));
}
A ce jour, je n'ai trouvé qu'une solution pour charger un curseur animé
à partir d'une ressource. C'est de sauvegarder la ressource dans
un fichier temporaire puis de charger le curseur animé depuis
le fichier temporaire.
Exemple :
Créer un fichier ressource "fichier.rc" à ajouter au projet:
MCursor RCDATA cursor.ani
Dans "Unit.cpp" :
const TCursor crMyCursor = 401;
//.............
//Sur l'événement OnCreate de la Form :
void __fastcall TForm1::FormCreate(TObject *Sender)
{
TResourceStream *MRes = new TResourceStream((int)HInstance,"MCursor",RT_RCDATA);
char TempFileName[MAX_PATH];
char TempDir[MAX_PATH];
GetTempPath(MAX_PATH, TempDir);
GetTempFileName(TempDir, "~", 0, TempFileName);
//Création du nom de fichier temporaire
MRes->SaveToFile(TempFileName);
Screen->Cursors[crMyCursor] = LoadCursorFromFile(TempFileName);
Cursor = crMyCursor;
DeleteFile(TempFileName);
delete MRes;
}
Une solution plus simple, mais qui ne fonctionne que sous
Windows XP, 2000 et NT.
(Je n'ai pas testé sous 2000 et NT)
Créer un fichier ressource à ajouter au projet : "Ress.rc"
#include "ress.h"
MCursor ANICURSOR cursor.ani
Un fichier entête ressource : "Ress.h"
#define ANICURSOR 21
#define MCursor 210
Fichier principal : "Unit1.cpp"
#include "ress.h"
//..........
const TCursor crAniCur = 401;
//..........
//Sur l'événement OnCreate de la Form :
void __fastcall TForm1::FormCreate(TObject *Sender)
{
Screen->Cursors[crAniCur]=LoadCursor(HInstance,MAKEINTRESOURCE(MCursor));
Cursor=crAniCur;
}
Sur l'événement OnCreate de la Form (Form1) pour le Bouton (Button1) :
void __fastcall TForm1::FormCreate(TObject *Sender)
{
SetWindowLong(Button1->Handle,GWL_STYLE,
GetWindowLong(Button1->Handle,GWL_STYLE) | BS_MULTILINE);
}
Le texte s'affiche sur plusieurs lignes automatiquement à l'exécution.
On peut forcer le passage à la ligne avec le caractère '\n', mais il faut
affecter le texte du bouton à l'exécution.
Button1->Caption = "Ligne1\nLigne2";
Sur une Form (Form1) vous posez une StatusBar (StatusBar1) et une ProgressBar
(ProgressBar1)
Sur l' événement OnCreate de Form1 :
void __fastcall TForm1::FormCreate(TObject *Sender)
{
StatusBar1->ControlStyle = StatusBar1->ControlStyle << csAcceptsControls ;
ProgressBar1->Left = 0;
ProgressBar1->Top = 2;
ProgressBar1->Parent = StatusBar1;
}
#include <ShellApi.h>
//................
ShellExecute ( Handle,"open","http://www.developpez.com",NULL,NULL,SW_NORMAL);
Le même principe peut être utilisé pour envoyer un mail:
#include <ShellApi.h>
//................
ShellExecute(Handle,"open","mailto:toto@developpez.com",NULL,NULL,SW_NORMAL);
Ou tout simplement pour ouvrir un fichier associé à une application
(ici fichier texte):
#include <ShellApi.h>
//................
ShellExecute(Handle,"open","C:\\Dossier\\Fichier.txt",NULL,NULL,SW_NORMAL);
(N'importe quel document peut être ouvert de cette façon s'il est associé
à une application.)
Le code ci-dessous vous permet d'afficher un AnsiString avec un certain angle.
cela ne fonctionne qu'avec des polices True Type.
Canvas->Font->Size = 20;
Canvas->Font->Name = "Arial";
LOGFONT lgfont;
GetObject(Canvas->Font->Handle, sizeof(LOGFONT), &lgfont);
lgfont.lfEscapement = 450; //Angle *10
lgfont.lfOrientation = 450; //Angle *10
lgfont.lfOutPrecision = OUT_TT_ONLY_PRECIS;
Canvas->Font->Handle = CreateFontIndirect(&lgfont);
SetGraphicsMode(Canvas->Handle, GM_ADVANCED);
Canvas->Brush->Style = bsClear; //transparent
AnsiString text = "C++ Builder";
Canvas->TextOut(50,210, text);
Créer un nouveau projet avec une Form (Form1) avec
sa propriété KeyPreview à true et un Label (Label1)
Sur l'événement OnKeyDown de Form1 :
void __fastcall TForm1::FormKeyDown(TObject *Sender, WORD &Key,
TShiftState Shift)
{
char ch[3];
wsprintf(ch,"%X",Key);
Label1->Caption = "0x" + String(ch);
}
A l'appuie d'une touche son code s'affiche sur Label1.
- Dans le dossier de sauvegarde mettre les fichiers sources du composant.
"fichier.pas" (source), "fichier.dcr" (icone qui le représentera sur la palette).
parfois "fichier.res" ...
- Sur le menu faire : "Composant" puis "Installer un composant".
- Sur la boîte de dialogue choisir l'onglet "Dans paquet existant" ou "Dans nouveau paquet".
- Puis faire "parcourir" sur "Nom de fichier unité" choisir "Type" : Unité Pascal (*.PAS) et
sélectionner votre fichier (fichier.pas) et faire "Ouvrir".
- Le fichier d'icône "fichier.dcr" est automatiquement chargé.
- Sur le champ "Nom du paquet" saisir le nom du nouveau paquet ou sélectionner un paquet
existant. Puis faire Ok.
- Faire "Ok" sur les boîtes de messages construction et compilation du paquet.
- Faire "Installer" sur la fenêtre du paquet si ça ne s'est pas fait automatiquement.
- Sauvegarder le paquet: Menu "Enregistrer".
(Dans le même paquet on peut mettre plusieurs composant.)
Cette icône est mise dans un fichier ressource spécial qui a comme
extension ".DCR" ce fichier doit être dans le même dossier que les
fichiers sources du composant avant compilation.
Particularités de ce fichier:
- Le nom du fichier doit être le même que le nom du fichier source
du composant. (si "Compo.cpp" alors "Compo.dcr")
- L'icône doit être dans un Bitmap de taille 24 x 24
- Le nom de ce Bitmap doit être le même que celui de la classe
du composant en majuscules (si "TCompo" alors "TCOMPO")
Exemple:
Sur une form (Form1) mettre un Bouton (Button1) et 2 label (Label1 et Label2)
Dans l'évènement OnClick de Button1 :
#include <winsock2.h>
//.................
void __fastcall TForm1::Button1Click(TObject *Sender)
{
WORD wVersionRequested;
WSADATA wsaData;
char name[255];
AnsiString ip;
PHOSTENT hostinfo;
wVersionRequested = MAKEWORD( 2, 0 );
if ( WSAStartup( wVersionRequested, &wsaData ) == 0 )
{
if( gethostname ( name, sizeof(name)) == 0)
{
Label1->Caption = name; //nom de l'ordinateur
if((hostinfo = gethostbyname(name)) != NULL)
{
ip = inet_ntoa (*(in_addr *)*hostinfo->h_addr_list);
Label2->Caption = ip; //adresse IP
}
}
WSACleanup( );
}
}
Sur l'événement OnCreate de la Form (Form1) pour Edit1 :
void __fastcall TForm1::FormCreate(TObject *Sender)
{
SetWindowLong(Edit1->Handle,GWL_STYLE,
GetWindowLong(Edit1->Handle,GWL_STYLE)
| ES_NUMBER );
}
2eme Solution:
Saisir que des chiffres et au plus une virgule dans un TEdit
Sur l'événement OnKeyPress du TEdit (Edit1):
void __fastcall TForm1::Edit1KeyPress(TObject *Sender, char &Key)
{
if ((Key < '0' || Key >'9') && Key != 8 && (Key != DecimalSeparator ||
((TEdit *)Sender)->Text.Pos(DecimalSeparator)!=0))
Key = NULL;
}
En utilisant "((TEdit *)Sender)" au lieu de "Edit1" dans la méthode. Elle
devient valable pour n'importe quel TEdit.
Voici une solution pour accéder simplement aux différents bits d'un char.
Pour cela nous utiliserons une union entre une structure de bits et un char.
Exemple:
union TSChar
{
char chr;
struct
{
unsigned char Bit0 : 1;
unsigned char Bit1 : 1;
unsigned char Bit2 : 1;
unsigned char Bit3 : 1;
unsigned char Bit4 : 1;
unsigned char Bit5 : 1;
unsigned char Bit6 : 1;
unsigned char Bit7 : 1;
};
};
//................
TSChar SChar;
SChar.chr='a';
//affectation du caractère 'a' dans l'union
Label1->Caption = SChar.Bit3;
// affichage du 4eme bit dans un label
SChar.Bit5 = 0;
//mise à 0 du 6ème bit (Cela met SChar.chr en majuscule 'A' )
Le séparateur décimal est défini dans les paramètres régionaux de Windows.
("Panneau de configuration", "Paramètre régionaux")
On peut connaître le séparateur décimal avec la variable DecimalSeparator
exemple pour l'afficher dans un label : Label1->Caption = DecimalSeparator;
On peut aussi le changer en lui affectant une autre valeur ex:
DecimalSeparator = ',';
Voir aide de C++ Builder : "variables de format"
Exemple sur une Form (Form1) poser un bouton (Button1) et plusieurs TEdit. Nous allons
affecter la valeur "Ok" à la propriété Text de tous les TEdits
se trouvant sur la Form.
Sur l'événement OnClick de Button1 :
void __fastcall TForm1::Button1Click(TObject *Sender)
{
for ( int x=0 ; x<ControlCount ; x++)
if ((AnsiString)Controls[x]->ClassName() == "TEdit" )
((TEdit*)Controls[x])->Text = "Ok";
}
|