Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht Das deutsche QBasic- und FreeBASIC-Forum
Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
 
FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen  RegistrierenRegistrieren
ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin
Zur Begleitseite des Forums / Chat / Impressum
Aktueller Forenpartner:

Zeichnen mit der WinApi / GUI

 
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Windows-spezifische Fragen
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
Lutz Ifer
Grillmeister


Anmeldungsdatum: 23.09.2005
Beiträge: 555

BeitragVerfasst am: 04.12.2005, 21:53    Titel: Zeichnen mit der WinApi / GUI Antworten mit Zitat

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 böse Ifer
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Lutz Ifer
Grillmeister


Anmeldungsdatum: 23.09.2005
Beiträge: 555

BeitragVerfasst am: 11.12.2005, 17:57    Titel: Antworten mit Zitat

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 böse Ifer
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Dominik



Anmeldungsdatum: 22.12.2004
Beiträge: 172

BeitragVerfasst am: 08.01.2006, 17:56    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
ytwinky



Anmeldungsdatum: 28.05.2005
Beiträge: 2624
Wohnort: Machteburch

BeitragVerfasst am: 08.01.2006, 18:56    Titel: Antworten mit Zitat

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 vor lachen auf dem Boden rollen
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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
volta



Anmeldungsdatum: 04.05.2005
Beiträge: 1874
Wohnort: D59192

BeitragVerfasst am: 10.01.2006, 15:20    Titel: Re: Zeichnen mit der WinApi / GUI Antworten mit Zitat

hi Lutz böse 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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Lutz Ifer
Grillmeister


Anmeldungsdatum: 23.09.2005
Beiträge: 555

BeitragVerfasst am: 10.01.2006, 16:37    Titel: Antworten mit Zitat

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 grinsen Ifer
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Dominik



Anmeldungsdatum: 22.12.2004
Beiträge: 172

BeitragVerfasst am: 11.01.2006, 23:34    Titel: Antworten mit Zitat

Hallo!

Puh, nun hab ich endlich die windows.bi lächeln thx @ ytwinky für das Abnehmen dieser Arbeit... Ich bin, warum auch immer, nicht auf die Idee gekommen mal die Suche zu benutzen. Kopf schütteln Mit dieser Minutenabrechnung kämpft man ja auch immer mit der Zeit.. zwinkern

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
Benutzer-Profile anzeigen Private Nachricht senden
Lutz Ifer
Grillmeister


Anmeldungsdatum: 23.09.2005
Beiträge: 555

BeitragVerfasst am: 12.01.2006, 12:56    Titel: Antworten mit Zitat

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 böse Ifer
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Dominik



Anmeldungsdatum: 22.12.2004
Beiträge: 172

BeitragVerfasst am: 12.01.2006, 14:24    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
Lutz Ifer
Grillmeister


Anmeldungsdatum: 23.09.2005
Beiträge: 555

BeitragVerfasst am: 12.01.2006, 17:01    Titel: Antworten mit Zitat

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"... zwinkern

Gruß
Lutz böse Ifer
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Dominik



Anmeldungsdatum: 22.12.2004
Beiträge: 172

BeitragVerfasst am: 14.01.2006, 20:25    Titel: Antworten mit Zitat

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. lächeln
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Lutz Ifer
Grillmeister


Anmeldungsdatum: 23.09.2005
Beiträge: 555

BeitragVerfasst am: 15.01.2006, 16:43    Titel: Antworten mit Zitat

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. grinsen

Lutz böse Ifer
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Dominik



Anmeldungsdatum: 22.12.2004
Beiträge: 172

BeitragVerfasst am: 15.01.2006, 17:34    Titel: Antworten mit Zitat

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. grinsen
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Michael712
aka anfänger, programmierer


Anmeldungsdatum: 26.03.2005
Beiträge: 1593

BeitragVerfasst am: 28.02.2006, 13:59    Titel: Antworten mit Zitat

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. zwinkern

Michael
_________________
Code:
#include "signatur.bi"
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Windows-spezifische Fragen Alle Zeiten sind GMT + 1 Stunde
Seite 1 von 1

 
Gehe zu:  
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.

 Impressum :: Datenschutz