Schrift in einem beliebigen Winkel ausgeben

// Das Beispiel funktioniert nur mit Truetype-Schriftarten!
void __fastcall TForm1::Button1Click(TObject *Sender)
{
    AnsiString Ausgabetext = "C++ Builder Schrift-Demo";
    int SchriftWinkel = 45;
    int BuchstabenWinkel = 45;
    LOGFONT lgfont;

    Canvas->Font->Size = 20; // Schriftgröße
    Canvas->Font->Name = "Times Roman"; //Schriftname

    GetObject(Canvas->Font->Handle, sizeof(LOGFONT), &lgfont);
    lgfont.lfEscapement = SchriftWinkel*10; //Winkel * 10
    lgfont.lfOrientation = BuchstabenWinkel*10; //Winkel * 10
    lgfont.lfOutPrecision = OUT_TT_ONLY_PRECIS;

    Canvas->Font->Handle = CreateFontIndirect(&lgfont);
    SetGraphicsMode(Canvas->Handle, GM_ADVANCED);
    Canvas->Brush->Style = bsClear; //transparent malen

    Canvas->TextOut(50,210, Ausgabetext);
}

Ein Farb-Bitmap in ein Graustufen-Bitmap umwandeln

void __fastcall TMainForm::TestBtnClick(TObject *Sender)
{
    PRGBTriple srcRow;
    int iHeight = Image->Picture->Bitmap->Height;
    int iWidth = Image->Picture->Bitmap->Width;
    int r, g, b, gray;

    // überprüfen, ob ein 24Bit Bild vorliegt
    if (Image->Picture->Bitmap->PixelFormat == pf24bit)
    {
        try
        {
            // Bild in y-Richtung durchlaufen
            for (int ySrc = 0; ySrc<iHeight; ySrc++)
            {
                // Scanline holen
                srcRow = (PRGBTriple)Image->Picture->Bitmap->ScanLine[ySrc];

                // Scanline durchlaufen (x-Richtung)
                for (int xSrc = 0; xSrc < iWidth; xSrc++)
                {
                    // r,g,b auslesen und mit einem genormten Faktor in die entsprechende Helligkeit umrechen
                    r = 0.299 * srcRow&#91;xSrc&#93;.rgbtRed;
                    g = 0.587 * srcRow&#91;xSrc&#93;.rgbtGreen;
                    b = 0.114 * srcRow&#91;xSrc&#93;.rgbtBlue;

                    gray = r + g + b; // Grauwert ausrechnen

                    // Grauwerte setzen
                    srcRow&#91;xSrc&#93;.rgbtRed = gray;
                    srcRow&#91;xSrc&#93;.rgbtGreen = gray;
                    srcRow&#91;xSrc&#93;.rgbtBlue = gray;
                }
            }
        }
        catch ( Exception &amp;E )
        {
            MessageDlg(E.Message, mtError, TMsgDlgButtons() << mbOK, 0);
        }
    }
    else MessageDlg(&quot;Das Bild muss ein Bitmap mit 24Bit Farbtiefe sein!&quot;, mtError, TMsgDlgButtons() << mbOK, 0);

    Image->Repaint();
}

Cursor der Anwendung ändern

  1. Möglichkeit: Cursor aus einer Resource laden
    • mit dem Bildeditor eine neue Resourcendatei (*.res) erstellen
    • in unbekannt1.res -> rechtsklicken auf ‘Inhalte’ und ‘Neu’ -> ‘Cursor’ auswählen
    • doppelklichen auf Cursor1 und den eigenen Cursor zeichnen
    • Cursor1 ist der Name des Cursors im Programm der bei LoadCursor() angegeben werden muss
    • *.res Datei ins Projekt einbinden
    • Programmcode:
    const TCursor crEigenerCursor = 1; // StandartPfeil
    
    //---------------------------------------------------------------------------
    void __fastcall TForm1::FormCreate(TObject *Sender)
    {
        // Cursor laden und anzeigen
        Screen->Cursors[crEigenerCursor] = LoadCursor(HInstance, &quot;Cursor1&quot;);
        Screen->Cursor = crEigenerCursor;
    }
    
  2. Möglichkeit: Cursor direkt aus einer Datei (*.cur) laden
  3. const TCursor crEigenerCursor = 1;
    
    void __fastcall TForm1::Button1Click(TObject *Sender)
    {
        AnsiString PfadzumCursor = &quot;c:PfadCursordatei.cur&quot;;
    
        Screen->Cursors[crEigenerCursor] = LoadImage(HInstance, PfadzumCursor.c_str(), IMAGE_CURSOR, 0, 0, LR_LOADFROMFILE);
        Screen->Cursor = crEigenerCursor;
    }
    

Ein Fenster transparent malen

// Aufruf in der OnPaint-Methode: z.b. maketransparent(Handle, 20);
void maketransparent(HWND AHandle, int ABlending)
{
    SetWindowLong(AHandle, GWL_EXSTYLE,GetWindowLong(AHandle, GWL_EXSTYLE) | WS_EX_LAYERED);
    SetLayeredWindowAttributes(AHandle, 0,(255*ABlending)/100, LWA_ALPHA);

    BLENDFUNCTION blend;
    blend.BlendOp = AC_SRC_OVER;
    blend.BlendFlags = 0;
    blend.AlphaFormat = 0;
    blend.SourceConstantAlpha = AC_SRC_ALPHA ;
    UpdateLayeredWindow(AHandle, NULL, NULL, NULL, NULL, NULL,NULL, &blend, ULW_ALPHA);
}

Ein Bitmap in einen Statusbar malen

void __fastcall TForm1::StatusBar1DrawPanel(TStatusBar *StatusBar, TStatusPanel *Panel, const TRect &Rect)
{
    if (Panel->Index == 0) //Change this line if you want another panel
    {
        Graphics::TBitmap *tmpBitmap=new Graphics::TBitmap();
        tmpBitmap->LoadFromFile("bac.bmp");
        StatusBar->Canvas->Draw(Rect.Left,Rect.Top,tmpBitmap);
        delete tmpBitmap;
    }
}

Auf der Titelleiste (Caption) eines Fensters zeichnen

  • in OnPaint und OnResize der Form implementieren
  • der Beispielcode zeichnet auf der rechten Seite der Titelleiste den String “My Text”.
TCanvas * FCanvas = new TCanvas();
if(FCanvas)
{
    Caption = &quot;&quot; ; // Caption löschen
    FCanvas->Handle = GetWindowDC(Handle);
    SetBkMode(FCanvas->Handle, TRANSPARENT);
    SetTextAlign(FCanvas->Handle, TA_RIGHT); //TA_LEFT, TA_CENTER
    SetTextColor(FCanvas->Handle, clWhite); // Farbe
    FCanvas->TextOut(Width-FCanvas->TextWidth(&quot;My Text&quot;)-5, 6, &quot;My Text&quot;);
    delete FCanvas;
}

Transparentes Bitmap malen

  • *.h
private:

void __fastcall TForm1::DrawTransparentBitmap(TCanvas *Canvas, Graphics::TBitmap *Bitmap,TColor TransparentColor, int X, int Y);
  • *.cpp
void __fastcall TForm1::DrawTransparentBitmap(TCanvas *Canvas, Graphics::TBitmap *Bitmap, TColor TransparentColor, int X, int Y)
{
    // Auf Canvas wird das Bild gemalt
    // Bitmap ist das Bild
    // TransparentColor = Hintergrundfarbe
    // X und Y = Koordinaten auf dem Canvas

    TImageList *ImageList = new TImageList(this);
    ImageList->Width = Bitmap->Width;
    ImageList->Height = Bitmap->Height;
    ImageList->AddMasked(Bitmap, TransparentColor);
    ImageList->Draw(Canvas, X, Y, 0);
    delete ImageList;
}

GradientPattern auf ein Panel malen

void __fastcall TForm1::Button1Click(TObject *Sender)
{
    float Step;
    TRect BandRect;                                   //Panel hat kein Canvas 
    TControlCanvas *PanelCanvas = new TControlCanvas; 
    PanelCanvas->Control=Panel1;
    Step=(float)Panel1->ClientHeight / 256;           //256 Farbbänder

    for(int i=0;i<256;i++)
    {
        BandRect.Left = 0;
        BandRect.Top = (int)(i*Step);
        BandRect.Right = Panel1->ClientWidth + 1;
        BandRect.Bottom = (int)((i+1)*Step);          // horizontale Bänder
        PanelCanvas->Brush->Color = RGB(0, 0, 255-i); // blauer Gradient
        PanelCanvas->FillRect(BandRect);
    }

    delete PanelCanvas;
}