|
Das deutsche QBasic- und FreeBASIC-Forum Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
|
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
Lutz Ifer Grillmeister
Anmeldungsdatum: 23.09.2005 Beiträge: 555
|
Verfasst am: 04.12.2005, 22:53 Titel: Zeichnen mit der WinApi / GUI |
|
|
Servus!
Ich habe >>hier<< mal ein Stückchen Code gepostet.
Rein prinzipiell möchte ich ein Windowsfenster erzeugen, und auf dem Teil rummalen, hier als Beispiel der Farbverlauf.
Allerdings ist mir aufgefallen, das das "erste" Zeichnen des Fensters ziemlich lange dauert (bei 320*240 Pixel noch nicht so, aber bei deutlich größeren Fenstern ist der Bildaufbau deutlich sichtbar), und wenn ich ein anderes Fenster über dieses Fenster ziehe, braucht das ewig, bis der Farbverlauf wieder hergestellt ist.
In einem FB-screen bzw. screenres würde ich ganz einfach mit screen(un)lock oder direktem Schreiben in den Ram per screenptr arbeiten, allerdings habe ich keine Ahnung, wie ich das hier mache. Kennt sich da Jemand aus, und kann mir sagen, wie man das "richtig" macht?
Gruß
Lutz Ifer |
|
Nach oben |
|
|
Lutz Ifer Grillmeister
Anmeldungsdatum: 23.09.2005 Beiträge: 555
|
Verfasst am: 11.12.2005, 18:57 Titel: |
|
|
Servus.
Sorry für den Doppelpost, aber ich wollte das Topic nochmal nach Oben ziehen.
Ich hab jetzt die komplette msdn durchsucht, habe aber nichts gefunden. Kann mir wirklich Niemand sagen, was die richtige Art und Weise wäre, im Fensterbereich enes Windowsfensters rumzuzeichnen?
Lutz Ifer |
|
Nach oben |
|
|
Dominik
Anmeldungsdatum: 22.12.2004 Beiträge: 172
|
Verfasst am: 08.01.2006, 18:56 Titel: |
|
|
Hallo,
ich würde dir ja gerne helfen, kann aber die windows.bi in meinem FreeBasic-Pfad nicht finden und daher dein Programm nicht ausführen.
Kannst du mir sagen, wo ich sie herbekomme?
Viele Grüße
Dominik |
|
Nach oben |
|
|
ytwinky
Anmeldungsdatum: 28.05.2005 Beiträge: 2624 Wohnort: Machteburch
|
Verfasst am: 08.01.2006, 19:56 Titel: |
|
|
Hi Dominik,
..wenn du Zeit gehabt hättest, hättest du sicher die Suchen-Funktion benutzt:
http://forum.qbasic.at/viewtopic.php?t=1829&highlight=windows
So habe ich dir die Arbeit abgenommen
Gruß
ytwinky _________________
v1ctor hat Folgendes geschrieben: | Yeah, i like INPUT$(n) as much as PRINT USING.. | ..also ungefähr so, wie ich GOTO.. |
|
Nach oben |
|
|
volta
Anmeldungsdatum: 04.05.2005 Beiträge: 1875 Wohnort: D59192
|
Verfasst am: 10.01.2006, 16:20 Titel: Re: Zeichnen mit der WinApi / GUI |
|
|
hi Lutz Ifer ,
ob dieser Link
http://cvs.sourceforge.net/viewcvs.py/fbc/FreeBASIC/examples/Windows/gui/hello_region.bas?rev=1.1
eine Lösung für dein ursprüngliches Problem 'Windows Zeichenfläche' ist kann ich nicht genau sagen (dafür kenn ich mich damit auch nicht gut genug aus) aber es ist ein sehr schönes Demo.
Eine gezeichnete Fläche wird als nicht rechteckiges Fenster auf den Desktop gegeben.
Gruß
Volta _________________ Warnung an Choleriker:
Dieser Beitrag kann Spuren von Ironie & Sarkasmus enthalten.
Zu Risiken & Nebenwirkungen fragen Sie Ihren Therapeuten oder Psychiater. |
|
Nach oben |
|
|
Lutz Ifer Grillmeister
Anmeldungsdatum: 23.09.2005 Beiträge: 555
|
Verfasst am: 10.01.2006, 17:37 Titel: |
|
|
Servus Volta!
"ob dieser Link (...) eine Lösung für dein ursprüngliches Problem 'Windows Zeichenfläche' ist kann ich nicht genau sagen (dafür kenn ich mich damit auch nicht gut genug aus) aber es ist ein sehr schönes Demo."
Japp. Nicht wirklich das was ich meinte, aber durchaus interessant.
Gruß
Lutz Ifer |
|
Nach oben |
|
|
Dominik
Anmeldungsdatum: 22.12.2004 Beiträge: 172
|
Verfasst am: 12.01.2006, 00:34 Titel: |
|
|
Hallo!
Puh, nun hab ich endlich die windows.bi thx @ ytwinky für das Abnehmen dieser Arbeit... Ich bin, warum auch immer, nicht auf die Idee gekommen mal die Suche zu benutzen. Mit dieser Minutenabrechnung kämpft man ja auch immer mit der Zeit..
Nun zu deinem Problem, Lutz Ifer:
Ich würde sagen, dass es ziemlich sicher an der Schleife mit SetPixel liegt, wo Windows einfach nicht schnell genug die API-Befehle abarbeiten kann. (Sind ja auch viele tausend Aufrufe, sodass es nicht möglich ist große Flächen immer sofort da zu haben.)
Deshalb würde ich vorschlagen, dass du das, wenn möglich über Bitmaps erledigst. Das geht einfach, sehr schnell zu laden und ist normal überall leicht einsetzbar, wenn nicht gerade der Anwender der Programmes irgendetwas im Fenster zeichnen kann.
Wären Bitmaps denn keine Möglichkeit für dich?
Gruß
Dominik |
|
Nach oben |
|
|
Lutz Ifer Grillmeister
Anmeldungsdatum: 23.09.2005 Beiträge: 555
|
Verfasst am: 12.01.2006, 13:56 Titel: |
|
|
Servus Dominik.
Hm, ich weiß nicht, ob ich meine Frage wirklich so dämlich gestellt habe, dass das die Antwort gerechtfertigt, aber was solls.
Dass das Problem wohl letzten Endes an den SetPixeln liegt, ist wirklich extrem scharfsinnig von dir, und danke für den Hinweis, dass große Flächen erst einzeln gemalt werden müssen, hätte ich das nicht schon im ersten Post als mein Problem definiert, wäre ich da sicherlich nie draufgekommen.
Und vielen Dank für den Tipp mit den Bitmaps, aber da ich schon im ersten Posting schreibe, dass ich umfangreicher im Fenster rummalen möchte, ist das - mit Verlaub - blödsinn. Ich müsste Klein- und Kleinstbitmaps benutzen, und entweder riesige DATA-Blöcke verwenden oder alle Bitmaps dem Programm beilegen.
Kurz: war wohl nix, hm?
Lutz Ifer |
|
Nach oben |
|
|
Dominik
Anmeldungsdatum: 22.12.2004 Beiträge: 172
|
Verfasst am: 12.01.2006, 15:24 Titel: |
|
|
Hi,
es tut mir leid, aber mir ist nicht ganz klar, was du malen willst.
Schwarz/Weiß oder Farbe? Muster, bei denen du wirklich jedes Pixel setzten musst oder geometrische Formen oder sowas wie im Beispielcode? Kann der Benutzer etwas an den Zeichnungen ändern?
Was wird es denn für ein Programm?
Gib doch mal ein paar mehr Informationen, dann passiert so ein Missverständnis nicht nochmal.
Gruß
Dominik |
|
Nach oben |
|
|
Lutz Ifer Grillmeister
Anmeldungsdatum: 23.09.2005 Beiträge: 555
|
Verfasst am: 12.01.2006, 18:01 Titel: |
|
|
Servus.
Mein Problem ist wirklich wie ich bereits geschrieben habe "das Prinzip". Mir ist klar, wie ich eine Bitmap lade, ich kann auch tolle Polygone, Kreise, Ellipsen, Was-weiß-ich-nicht's oder einzelne Pixel ins Fenster malen - aber sobald da mehr als ein paar Objekte rumfliegen, wird die Chose tierisch langsam.
Eben weil, wie Du richtig festgestellt hast, alles bei WM_PAINT-Nachrichten neu gezeichnet wird. Und das is ja auch das, was ich vom Ansatz her so seltsam finde, dass nicht wie z.B. in QB und FB "on demand" gemalt wird, sondern immer, wenn ein Fenster überlappt, minimiert, maximiert, oder sonstwas gemacht wird. Dass der grafische Fensterinhalt net einfach in irgendeinen Windows-internen Puffer geschrieben wird, sondern mich mit neuzeichnen belästigt.
Ich hatte auch schon mal dran gedacht, eine Bitmap von Fenstergröße zu laden, auf der Bitmap zu malen und die dann immer bei WM_PAINTs anzeigen zu lassen, weil das scheinbar schneller ist - allerdings bin ich zu doof, auf die Bitmap im Ram zu malen, wenn ich nur deren handler hab.
Hoffentlich is das verständlicher... mir gehts halt eben "ums Prinzip"...
Gruß
Lutz Ifer |
|
Nach oben |
|
|
Dominik
Anmeldungsdatum: 22.12.2004 Beiträge: 172
|
Verfasst am: 14.01.2006, 21:25 Titel: |
|
|
Hallo,
ich hab mir das jetzt nochmal durch den Kopf gehen lassen.
Mein Problem ist, dass ich nicht weiß, was du damit machen willst.
Es kommt auf die Art an, wie du das verwenden willst.
Denn ich weiß nicht ob mein Beispiel, was ich dir schreiben würde, zu deiner Art der Anwendung passt und bevor ich alles umsonst mache lasse ich es lieber.
Lutz Ifer hat Folgendes geschrieben: | und wenn ich ein anderes Fenster über dieses Fenster ziehe, braucht das ewig, bis der Farbverlauf wieder hergestellt ist.
|
Genau dazu hab ich nämlich etwas rausgefunden, aber beim ersten Zeichnen des Farbverlaufs hapert es noch, denn das bekommt der Benutzer auf Grund der Schleife eben mit.
Nur ginge es z.B. um ein Zeichenprogramm, wäre das kein Thema, da der Benutzer ja mit einem einheitlichen Hintergrund anfängt, bei einem Spiel schon.
Verrat mir doch endlich, was für eine Art Programm es wird.
Ich suche einfach ein Schlagwort, sonst kann ich dir nicht helfen. |
|
Nach oben |
|
|
Lutz Ifer Grillmeister
Anmeldungsdatum: 23.09.2005 Beiträge: 555
|
Verfasst am: 15.01.2006, 17:43 Titel: |
|
|
Hallo Dominik.
So langsam komm ich mir verarscht vor. Sorry, vielleicht steh ich auch nur tierisch aufm Schlauch, und formulier wirklich so unbandig missverständlich, ich glaub nähmlich, ich werd langsam wahnsinnig.
Dominik hat Folgendes geschrieben: | Mein Problem ist, dass ich nicht weiß, was du damit machen willst. |
Lutz Ifer hat Folgendes geschrieben: | Mein Problem ist wirklich wie ich bereits geschrieben habe "das Prinzip" |
Dominik hat Folgendes geschrieben: | Es kommt auf die Art an, wie du das verwenden willst. | Wage ich stark zu bezweifeln - nochmal: sobald ich auf dem Fenster rumzeichne, wird der Bildaufbau peinlich langsam, und das Bild baut sich jedes mal komplett neu auf, wenn ich ein anderes Fenster über dieses Fenster ziehe, oder minimiere / maximiere oder sonstwas mache. Und ich will wissen, wie ich das umgehe. Ich will den Fensterinhalt "statisch" haben, so wie zum Beispiel eben in FB - da passiert garnix, wenn ich ein Fenster über das FB-Fenster ziehe.
Dominik hat Folgendes geschrieben: | Verrat mir doch endlich, was für eine Art Programm es wird. | Ich sagte bereits: Ich rede vom Prinzip. Vom "wie macht man das richtig", vom "Wie realisiere ich damit ALLE Typen von Programmen?"...
Dominik hat Folgendes geschrieben: | Ich suche einfach ein Schlagwort, sonst kann ich dir nicht helfen. | Auf die Gefahr hin, mal wieder tierisch überheblich und impertinent zu wirken: Hilf mir nicht.
Lutz Ifer |
|
Nach oben |
|
|
Dominik
Anmeldungsdatum: 22.12.2004 Beiträge: 172
|
Verfasst am: 15.01.2006, 18:34 Titel: |
|
|
Lutz Ifer hat Folgendes geschrieben: |
So langsam komm ich mir verarscht vor.
|
Nein, um Gottes Willen, das habe ich nicht vor.
Also, hier ist ein Programm, das bei einem Linksklick einen Farbverlauf zeichnet, der zumindest bei mir, nicht kaputt geht, wenn man ein anderes Fenster darüber zieht:
Code: |
DefInt A-Z
Option Explicit
Option Private
#define WIN_INCLUDEALL
#include once "windows.bi"
Dim Shared szAppName As String
'Im Programm verwendete Fenster
Dim Shared hWnd As HWND
'
Declare Sub GetLargestDisplayMode(ByRef cxBitmap As Integer, ByRef cyBitmap As Integer)
Declare Function WinMain(Byval hInstance As HINSTANCE, _
Byval hPrevInstance As HINSTANCE, _
szCmdLine As PSTR, _
Byval iCmdShow As Integer)
End WinMain(GetModuleHandle(null), null, Command$, SW_NORMAL)
DefInt A-Z
Function WndProc ( Byval hWnd As HWND, _
Byval message As UINT, _
Byval wParam As WPARAM, _
Byval lParam As LPARAM ) As LRESULT
Static cxBitmap As Integer
Static cyBitmap As Integer
Static cxClient As Integer
Static cyClient As Integer
Dim hdc As HDC
Dim ps As PAINTSTRUCT
Dim A As Integer
Dim B As Integer
Static hdcMem As HDC
Static hBitmap As HBITMAP
WndProc = 0
Select Case(message)
Case WM_CREATE
GetLargestDisplayMode(cxBitmap, cyBitmap)
hdc = GetDC(hWnd)
hBitmap = CreateCompatibleBitmap(hdc, 800, 800)
hdcMem = CreateCompatibleDC(hdc)
ReleaseDC(hWnd, hdc)
SelectObject(hdcMem, hBitmap)
PatBlt(hdcMem, 0, 0, 800, 800, WHITENESS)
Case WM_SIZE
cxClient = LoWord(lParam)
cyClient = HiWord(lParam)
Case WM_PAINT
hdc = BeginPaint(hWnd, @ps)
BitBlt(hdc, 0, 0, cxClient, cyClient, hdcMem, 0, 0, SRCCOPY)
EndPaint(hWnd, @ps)
Case WM_DESTROY
DeleteDC(hdcMem)
DeleteObject(hBitmap)
PostQuitMessage(0)
Exit Function
Case WM_LBUTTONDOWN
hdc = GetDC(hWnd)
For A = 0 To 800
For B = 1 To 800
SetPixel(hdc, A, B, Rgb(A * (255 / 800), B * (255 / 800), A * (255 / 800)))
SetPixel(hdcMem, A, B, Rgb(A * (255 / 800), B * (255 / 800), A * (255 / 800)))
Next B
Next A
ReleaseDC(hWnd, hdc)
End Select
WndProc = DefWindowProc(hWnd, message, wParam, lParam)
End Function
DefInt A-Z
Function WinMain(Byval hInstance As HINSTANCE, _
Byval hPrevInstance As HINSTANCE, _
szCmdLine As PSTR, _
Byval iCmdShow As Integer)
Dim wMsg As MSG
Dim wcls As WNDCLASS
szAppName = "Farbverlauf"
WinMain = 0
With wcls
.style = CS_HREDRAW or CS_VREDRAW
.lpfnWndProc = @WndProc
.cbClsExtra = 0
.cbWndExtra = 0
.hInstance = hInstance
.hIcon = LoadIcon(null, Byval IDI_APPLICATION)
.hCursor = LoadCursor(null, Byval IDC_ARROW)
.hbrBackground = GetStockObject(Byval COLOR_BACKGROUND)
.lpszMenuName = null
.lpszClassName = Strptr(szAppName)
End With
If (RegisterClass(@wcls) = False) Then
MessageBox null, "Dieses Programm benötigt Windows NT!", szAppName, MB_ICONERROR
Exit Function
End If
hWnd = CreateWindowEx(0, _
szAppName, _
szAppName + " Copyright 2006 by Dominik Schäffner", _
WS_OVERLAPPED + WS_SYSMENU + WS_MINIMIZEBOX, _
CW_USEDEFAULT, _
CW_USEDEFAULT, _
800, _
800, _
null, _
null, _
hInstance, _
null)
ShowWindow(hWnd, iCmdShow)
UpdateWindow(hWnd)
While(GetMessage(@wMsg, Null, 0, 0 ) <> False)
TranslateMessage(@wMsg)
DispatchMessage(@wMsg)
Wend
WinMain = wMsg.wParam
End Function
Sub GetLargestDisplayMode(ByRef cxBitmap, ByRef cyBitmap)
Dim DevMode As DEVMODE
Dim iModeNum As Integer = 0
cxBitmap = 0
cyBitmap = 0
DevMode.dmSize = SizeOf(DEVMODE)
While EnumDisplaySettings(NULL, iModeNum, @DevMode)
iModeNum += 1
cxBitmap = max(cxBitmap, DevMode.dmPelsWidth)
cyBitmap = max(cyBitmap, DevMode.dmPelsHeight)
Wend
End Sub
|
Lutz Ifer hat Folgendes geschrieben: |
Hilf mir nicht
|
Ich bin hartnäckig. |
|
Nach oben |
|
|
Michael712 aka anfänger, programmierer
Anmeldungsdatum: 26.03.2005 Beiträge: 1593
|
Verfasst am: 28.02.2006, 14:59 Titel: |
|
|
Hallo, THread is zwar was alt, mir is aber ne kleine Verbesserung aufgefallen:
Code: |
Case WM_LBUTTONDOWN
hdc = GetDC(hWnd)
For A = 0 To 800
For B = 1 To 800
SetPixel(hdcMem, A, B, Rgb(A * (255 / 800), B * (255 / 800), A * (255 / 800)))
Next B
Next A
BitBlt(hdc, 0, 0, cxClient, cyClient, hdcmem, 0, 0, SRCCOPY)
ReleaseDC(hWnd, hdc)
|
Dadurch baut sich der Farbverlauf im Hintergrund auf, sodass man das nicht sieht.
Michael _________________
Code: | #include "signatur.bi" |
|
|
Nach oben |
|
|
|
|
Du kannst keine Beiträge in dieses Forum schreiben. Du kannst auf Beiträge in diesem Forum nicht antworten. Du kannst deine Beiträge in diesem Forum nicht bearbeiten. Du kannst deine Beiträge in diesem Forum nicht löschen. Du kannst an Umfragen in diesem Forum nicht mitmachen.
|
|