OSD (On-Screen Display)

ggelet!

Igaz nem linux alatt kell OSD, hanem Windows alatt, de remelem azert nem feszitenek keresztre :}} Szoval arrol lenne szo, hogy irtam egy kis tavvezerlo programot szamitogephez (Serial portra kotott infra szenzortol jovo jelet ertelmezi, es hajtja vegre a megfelelo parancsot). Ennek egyik resze a hang allithatosaga. Mikor le/fel huzogatom a hangot, szeretnem a kepernyon is megjeleniteni, hogy eppen milyen szinten all. Ezt OSD szeru modon szeretnem, azaz minden alkalmazas folott jelenjen meg olyan formaban, hogy "Volume xx%". Eloszor probaltam ugy, hogy megjelenitek egy form-ot keret nelkul transzparens hatterrel, es erre tettem a szoveget. Ennel bezavar ha mas olways on top alkalmazas is van, meg a taskbar ikonnal is kellett muveszkedni. Lenyeg hogy nem az igazi ez a megoldas. Aztan arra gondoltam, hogy jo lenne valami Windows fuggvenyt hasznalni, amivel tudok direktbe a kepernyore irni. Csak nem igazan ertek ilyen szintu grafikahoz (Igazabol a fejlesztoi kornyezetben torteno drag and drop utan megall a tudomanyom :})
Probaltam olyat, hogy csinalok Canvas-t, transparens hatterrel, es arra teszem a szoveget, de torolni csak az InvalidateRect(0, nil, False) parancsal sikeredett, ami az egesz kepernyot frissiti, igy hang allitasakor (ugy 30 ms-onkent jon uj parancsal) pillog egyet a kepernyo.

Tehat ami kellene: Kiirni a kepernyore minden ablak fole csak egy szoveget, hogy "Volume 56%", aztan ha tovabb nyomom a gombot, akkor ezt atirni "Volume 57%"-ra.
Ha tudna valaki ebben segiteni azt nagyon szepen megkoszonnem. Esetleg egy Silva Black-et is kaphat :}}

PS: Delphi-ben irtam a progit, bar Windows fuggveny hasznalatkor tulajdonkeppen lenyegtelen.

Elore is koszonom szepen a segitseget

Hozzászólások

Tudok event-et generalni. A KMPlayer-t ugy kezelem, hogy szimulalom a billentyuzetet, nem allok neki uzeneteket kuldozogetni az ablaknak. De szeretnem programon belul megoldani az OSD-t. Veletlenul nincs meg a forrasa a proginak? :} Amugy egyenlore a kovetkezo megoldas mellett dontottem:

Szoveg kiirasa:
with TCanvas.Create do
try
Handle :=GetDc(0);
SetBkmode(Handle, Transparent);
Font.Name := 'Tahoma';
Font.Size := 40;
Font.Style := [fsBold];
Font.Color := clBlack;
TextOut((Screen.Width - TextWidth(Msg)) div 2 - 2, Screen.Height - TextHeight(Msg) - 22, Msg);
Font.Color := clLime;
TextOut((Screen.Width - TextWidth(Msg)) div 2, Screen.Height - TextHeight(Msg) - 20, Msg);
finally
Free;
end;

Szoveg torlese:
OSD := CreateWindowEx(WS_EX_TRANSPARENT + WS_EX_TOPMOST + WS_EX_APPWINDOW, 'static', '',WS_POPUP, (Screen.Width - 400) div 2, Screen.Height - 100, 400, 100,Application.Handle, 0, 0, nil);
ShowWindow(OSD, SW_SHOW);
ShowWindow(OSD, SW_HIDE);
Destroywindow(OSD);

Meg ki kell probaljam, hogy ugy mukodik-e elesben ahogy en szeretnem. Elvileg igy nem frissiti a teljes kepernyot torleskor, csak azt a negyzetet ahol megjelenik a szoveg.
Hetfon meg tudom mondani, hogy hogyan mukodik :}