C/C++ FAQ

[BCB]Zegar na aktywnym oknie

Krecik

Poniższy kod wyświetla zegarek na pasku tytułu aktywnego okna...
Jest w nim kilka błędów:
a) Czyszczenie tła pod znakami polega na powtórzeniu Windowsowego gradientu (tzn. nie będzie działało z blindsem, Xp Loona itp...)
b) Parametry (położenie) zegarka walnąłem 'na oko' na podstawie moich ustawień systemowych

Ale w końcu chodzi tylko o przykład:), najlepiej wrzucić to do jakiegoś TTimer`a :

TCanvas *Cnv;  //Canvas
Cnv = new TCanvas;
HWND hwnd = GetForegroundWindow(); //uchwyt do aktywnego okna
Cnv->Handle = GetWindowDC(hwnd);  //przekazanie regionu do Canvy
Cnv->Brush->Style = bsClear; //przezroczyste brush Canvy, by nie było tła pod napisem
TRect Rect = Cnv->ClipRect;  //pobranie wielkości okna
      Rect.Right = Rect.Right - Rect.Left;
      Rect.Bottom = Rect.Bottom - Rect.Top;
      Rect.Left = 0;
      Rect.Top = Rect.Left;
Cnv->Font->Color = 0xFFFFFF;     //ustawienie koloru czcionki
//tu wczytujemy datę / godzinę - co na sie podoba:)
TDateTime Teraz = TDateTime::CurrentTime();
String text = Teraz.FormatString("hh:nn:ss");
int width = Cnv->TextWidth(text); //szerokość wypisywanego textu
 
//Bardzo dziwny kod :) czyszczący pole pod napisem na podstawie tego co jest wyżej na pasku :):
for(int i=Rect.Right-width-65; i<Rect.Right-65; i++)
        {
        TColor Clr = Cnv->Pixels[i][5];
        Cnv->Pen->Color = Clr;
        Cnv->MoveTo(i,5);
        Cnv->LineTo(i,5+Cnv->TextHeight(text));
        }
 
Cnv->TextOutA(Rect.Right-width-65,6,text);//parametry walnąłem na oko i na różnych systemach mogą być różne, ale w końcu chodzi tylko o przykład:)
ReleaseDC(hwnd, Cnv->Handle); //'wypuszcza' Region (nie wiem jak to nazwać po 'fachowemu' :)
ReleaseDC(hwnd, Handle);
delete Cnv; //i zwalniamy pamięć

PS> Trochę 'namotane' to dlatego, że pisane w kawałku wolnej chwili... Efekt najlepiej wychodzi na pasku zadań :)

FAQ

0 komentarzy