Autor Beitrag
Dezipaitor
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 220



BeitragVerfasst: Mi 31.01.07 01:41 
hi

ich habe eine eigene Fensterklasse in nonVCL erstellt und würde nun gerne ein großes Bitmap
als Hintergrund zeichnen lassen.
Es geht einfach mit TCanvas und TBitmap, jedoch flackert das Bild, wenn Fenster über das nonVCL Fenster gezogen werden.

Mir geht es nicht darum völlig ohne VCL zu programmieren. Jedoch bin ich gezwungen, kein TForm zu verwenden (wegen Threads). TBitmap und TCanvas kann ich schon verwenden.

Wie kann ich also verhindern, dass jedesmal das komplette Fenster in WM_PAINT neu gezeichnet wird.

THX
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19346
Erhaltene Danke: 1754

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Mi 31.01.07 08:38 
Ich vermute mal das Problem liegt eher daran, dass der Hintergrund mit WM_ERASEBACKGROUND gelöscht wird, oder reagierst du darauf nicht bzw. fängst das ab? Das jedenfalls merkt man vor allem als Flackern.

Warum du TForm nicht verwenden kannst, aber andere Teile der VCL verwenden kannst, ist mir zwar nicht wirklich klar, denn die gesamte VCL ist zunächst einmal nicht threadsicher. Und ich habe durchaus mit TForm und visuellen Komponenten in Verbindung mit Threads gearbeitet. Man muss lediglich aufpassen, wie man auf was zugreift (und ggf. eigene Komponenten ableiten, die den gewünschten Zugriff threadsicher erlauben).
Aber egal, darum gehts hier nicht, und wenns funktioniert ists ja auch gut so.

Aber warum nutzt du nicht wirklich für alles die Windows API? Ich meine, das würde deine Anwendung doch stark verkleinern und nebenbei vermutlich auch solche Probleme beheben. Denn wenn du non-VCL programmierst, dann musst du ja eine Nachrichtenschleife haben, die sämtliche Messages bekommt. Und da kannst du ja auf WM_PAINT und WM_ERASEBACKGROUND reagieren, wie du es für richtig hälst, in deinem Fall eben nur deinen Hintergrund zeichnen statt vorher eine z.B. weiße Hintergrundfläche zu zeichnen um den Hintergrund zu löschen.
Dezipaitor Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 220



BeitragVerfasst: Do 01.02.07 00:49 
Ich verwende standardmäßig die VCL. Jedoch verwende ich dazu noch CreateDesktop, um einen eigenen Desktop zu erstellen. Dazu brauche ich jedoch einen eigenen Thread, in dem ich dann mit der WinAPI eigene Fenster erstellen kann. Visuelle Elemente aus der VCL funktionieren darin jedoch nicht. TBitmap oder TCanvas jedoch schon. Ich kann also nicht Syncronize verwenden.

Jedoch war die WM_ERASEBKGND - Idee wohl genau die richtige Idee. THX