Paules-PC-Forum.de Anzeige:

Microsoft Windows Intune: PC-Verwaltung und -Sicherheit in der Cloud: Updateverwaltung, Anti-Virus und vieles mehr!


Zurück   Paules-PC-Forum.de > Programmierung > XProfan

XProfan Alles rund um die Programmiersprache XProfan.

EM-Tippspiel

Paule bei Facebook


Paule bei Twitter


Letzte Forenthemen
Gehe zum ersten neuen Beitrag Algorithmen Teil IV...
Aufrufe: 3361, Antworten: 129
Gehe zum ersten neuen Beitrag Hamachi deinstallieren
Aufrufe: 58, Antworten: 5
Gehe zum ersten neuen Beitrag Bundesliga-Tippspiel Saision...
Aufrufe: 7670, Antworten: 187
Gehe zum ersten neuen Beitrag PPF - Spiel "Wörter weiter...
Aufrufe: 26970, Antworten: 4223
Gehe zum ersten neuen Beitrag PPF - Shoppingwahn
Aufrufe: 50963, Antworten: 1397
Gehe zum ersten neuen Beitrag Pc lahmt plötzlich
Aufrufe: 186, Antworten: 6
Gehe zum ersten neuen Beitrag PC fährt nicht mehr hoch.
Aufrufe: 0, Antworten: 0
Gehe zum ersten neuen Beitrag Von Live CD Windowspfad...
Aufrufe: 329, Antworten: 19
Gehe zum ersten neuen Beitrag Captur 2.2 (Snow Leo)
Aufrufe: 28, Antworten: 0
Gehe zum ersten neuen Beitrag Captur 2.3 (Lion)
Aufrufe: 34, Antworten: 0
Zeige:





Antwort
 
LinkBack Themen-Optionen Ansicht
Alt 23.04.2011, 17:27   #1 (Direktlink)
Weiß worum´s geht
 
Registriert seit: 03.01.2010
Ort: Saarland
Beiträge: 103
Beitrag Gummiband

Ich suche schon länger die Möglichkeit eine Linie,ein Rechteck mit der
Maus flimmerfrei auf den Bildschirm zu zeichnen.

Ich habe eine Lösung gefunden, deren Umsetzung in Profan mir nicht gelingt.(Text zwischen den beiden Smilies)

Zitat:
" ( wg. Guttenberg )

Echtzeit-Ausgabe beim Erstellen und Editieren von Zeichenobjekten

Wenn man zum Beispiel mit der Maus in einem Zeichenprogramm ein geometrisches Objekt (z.B. ein Polygon) auf der Zeichenfläche in Echtzeit von Position A nach Position B verschieben möchte, dann wäre es sinnlos, für jede der Zwischenpositionen, an denen sich die Maus gerade befindet, alles neu zu zeichnen, den Puffer zu füllen und anschließend auszugeben. Hier bedient man sich eines Kniffes. Mit Hilfe des ROP (Raster Operator) kann man mit XOR (exklusives OR) folgendermaßen vorgehen.
Man zeichnet das zu verschiebende Objekt zunächst mit XOR an der alten Stelle noch einmal direkt auf dem Ausgabegerät. Dadurch „verschwindet“ dieses Objekt auf der Ausgabefläche wie von Geisterhand. Nun zeichnet man das Objekt direkt und ohne XOR an die neue Position, so dass es dort wieder sichtbar wird. Das wiederholt man bei jeder einzelnen Mausbewegung erneut, so dass innerhalb einer Sekunde durchaus 10-50 Positionsveränderungen dargestellt werden können. Das träge Auge nimmt dies als ruckelfreien und fließenden Vorgang ohne Flimmern wahr. Erst am Schluss wird der Puffer komplett neu gefüllt und ausgegeben. Diese Methode des nicht beständigen, direkten Zeichnens auf ein Device nennt man auch „floating drawing“.
"
Bei Microsoft findet man folgendes:

For a color device, GDI uses RGB values to represent the colors of the pen and the destination. An RGB color value is a long integer that contains a red, a green, and a blue color field, each specifying the intensity of the specified color. Intensities range from 0 through 255. The values are packed in the three low-order bytes of the long integer. The color of a pen is always a solid color, but the color of the destination may be a mixture of any two or three colors. If an application attempts to draw with a white pen on a blue destination by using the available binary raster operations, the following results occur.
Raster operation Result
R2_BLACK Visible black line
R2_COPYPEN Visible white line
R2_MASKNOTPEN Visible black line
R2_MASKPEN Invisible blue line
R2_MASKPENNOT Visible red/green line
R2_MERGENOTPEN Invisible blue line
R2_MERGEPEN Visible white line
R2_MERGEPENNOT Visible white line
R2_NOP Invisible blue line
R2_NOT Visible red/green line
R2_NOTCOPYPEN Visible black line
R2_NOTMASKPEN Visible red/green line
R2_NOTMERGEPEN Visible black line
R2_NOTXORPEN Invisible blue line
R2_WHITE Visible white line
R2_XORPEN Visible red/green line


Kann mir jemand ein Beispiel machen, indem diese GDI32 Funktionen
(Rasteroperationen XOR) benutzt werden.
Ralph Theobald ist offline   Mit Zitat antworten
Werbung

Windows 7 Tipps und Tricks in Bildern

Alt 23.04.2011, 20:19   #2 (Direktlink)
Stammuser
 
Benutzerbild von Andreas Miethe
 
Registriert seit: 08.02.2009
Ort: Bielefeld
Alter: 53
Beiträge: 428
Standard

Hallo Ralph,

hier ein kleines Beispiel, das funktioniert nur wenn Du von links/oben nach recht/unten das Rechteck mit der Maus aufziehst. Du musst Dir also die Koordinaten für andere Bewegungen anpassen.

Code:
$H Windows.ph

cls
Struct RECT = left&,top&,right&,bottom&
Declare Ende&,startx&,starty&
Var R# = New(RECT)

Whilenot Ende&
  WaitInput
  startx&=%mousex
  starty&=%mousey
  while %mousepressed
    ~SetROP2(%hdc,~R2_NOTXORPEN)
    IfNot ~IsRectEmpty(r#)
      Rectangle R#.Left&,R#.Top& - R#.right&,R#.bottom&
    endif
    ~SetRect(R#,startx&,starty&,%mousex,%mousey)
    Rectangle R#.Left&,R#.Top& - R#.right&,R#.bottom&
  Endwhile
  ~SetROP2(%hdc,~R2_COPYPEN)
EndWhile
__________________
Gruss
Andreas

______________________
http://www.ampsoft.eu

Profan 3.3 - XProfanX2
Windows 95,98,ME,2000,XP
Vista - Windows 7 32 / 64 Bit

ASUS X93S - Intel Core I7 - NVIDIA GForce GT540M - 8GB Arbeitsspeicher
Andreas Miethe ist offline   Mit Zitat antworten
Alt 23.04.2011, 20:53   #3 (Direktlink)
Super-Moderator
 
Benutzerbild von Frabbing
 
Registriert seit: 05.02.2009
Ort: Westliches NRW
Alter: 44
Beiträge: 5.094
Standard

Hab da auch noch was rumliegen:

Code:
Def SystemParametersInfo(4) !"user32","SystemParametersInfoA"
Def DrawFocusRect(2) !"user32","DrawFocusRect"
Def GetCursorPos(1) !"user32","GetCursorPos"
Def ScreenToClient(2) !"user32","ScreenToClient"

Declare x&,y&,rect#,z&
Dim rect#,16

Cls
DrawPic "Background.bmp", 0, 0 - x&, y&; 0

SystemParametersInfo($2011,0,4,0)    '4 = Strichbreite (ab XP)
SystemParametersInfo($200F,0,4,0)    '4 = Strichhöhe (ab XP)

UserMessages $200
While 1
  WaitInput
  Case %key=2:Break
  If IsKey(1)
    DrawFocusRect(%hdc,rect#)
    GetCursorPos(rect#)
    ScreenToClient(%hwnd,rect#)
    Long rect#,8=Long(rect#,0),Long(rect#,4)
    Long rect#,0=x&,y&
    If Long(rect#,0)>Long(rect#,8)
      z&=Long(rect#,8)
      Long rect#,8=Long(rect#,0)
      Long rect#,0=z&
    EndIf
    If Long(rect#,4)>Long(rect#,12)
      z&=Long(rect#,12)
      Long rect#,12=Long(rect#,4)
      Long rect#,4=z&
    EndIf
      Long rect#,0=Long(rect#,0)+2
      Long rect#,4=Long(rect#,4)+2
      DrawFocusRect(%hdc,rect#)
    Else
    GetCursorPos(rect#)
    ScreenToClient(%hwnd,rect#)
    x&=Long(rect#,0)
    y&=Long(rect#,4)
    Long rect#,0=0,0,0,0
  EndIf
Endwhile
Funktioniert in alle Richtungen und flimmerfrei. Bildname mal anpassen.
__________________
Gruß, Frank


Webpage http://frabbing.bplaced.net
mit Freeware - Tools, Spiele und Grafiken.

Geändert von Frabbing (23.04.2011 um 20:59 Uhr)
Frabbing ist gerade online   Mit Zitat antworten
Alt 23.04.2011, 22:53   #4 (Direktlink)
Weiß worum´s geht
 
Registriert seit: 03.01.2010
Ort: Saarland
Beiträge: 103
Standard

Danke Frank

Beispiel 1 sieht schon mal gut aus.
Das Testprogramm in C++ kriegt das nicht hin.
Ralph Theobald ist offline   Mit Zitat antworten
Alt 23.04.2011, 22:57   #5 (Direktlink)
Weiß worum´s geht
 
Registriert seit: 03.01.2010
Ort: Saarland
Beiträge: 103
Standard

Das zweite Beispiel ist spitze.
Ralph Theobald ist offline   Mit Zitat antworten
Werbung

Windows 7 Tipps und Tricks in Bildern

Alt 24.04.2011, 07:34   #6 (Direktlink)
Stammuser
 
Benutzerbild von Andreas Miethe
 
Registriert seit: 08.02.2009
Ort: Bielefeld
Alter: 53
Beiträge: 428
Standard

Zitat:
Zitat von Ralph Theobald Beitrag anzeigen
Das zweite Beispiel ist spitze.
Stimmt, nicht schlecht mit FocusRect().

Mit SetROP2() ist allerdings flexibler(Rechtecke, Kreise, Linien usw.), auch wenn es ein Relikt aus Zeiten von Win3.1 ist, funktioniert das doppelte Invertieren sehr gut.

Code:
$H Windows.ph
$H Messages.ph

cls $ff0000

'Pfad anpassen
Loadbmp "Creek.jpg",0,0;0

Struct RECT = left&,top&,right&,bottom&
Declare Ende&,startx&,starty&
Declare Oldx&,Oldy&
Var R# = New(RECT)

Usermessages ~WM_LBUTTONDOWN,~WM_MOUSEMOVE,~WM_LBUTTONUP

Whilenot Ende&
  WaitInput
  If %UMessage = ~WM_LBUTTONDOWN
    Usebrush 0,0
    Usepen 1,2,0
    startx&=Loword(&ULParam)
    starty&=HiWord(&ULParam)
    ~SetRect(R#,0,0,0,0)
  ElseIf (%UMessage = ~WM_MOUSEMOVE) and (&UWParam = ~MK_LBUTTON)
    ~SetROP2(%hdc,~R2_NOTXORPEN)
    ~SetROP2(%hdc2,~R2_NOTXORPEN)
    
    IfNot ~IsRectEmpty(r#)
      Ellipse R#.Left&,R#.Top& - R#.right&,R#.bottom&
    endif
    
    'Richtung ermitteln
    '##################
    if (startx& < LOWORD(&ulParam)) AND (starty& > HIWORD(&ulParam))
      ~SetRect(R#,startx&,HIWORD(&ulParam),LOWORD(&ulParam),starty&)
    elseif (startx& > LOWORD(&ulParam)) and (starty& > HIWORD(&ulParam))
      ~SetRect(R#,LOWORD(&ulParam),HIWORD(&ulParam),startx&,starty&)
    elseif (startx& > LOWORD(&ulParam)) AND (starty& < HIWORD(&ulParam))
      ~SetRect(R#,LOWORD(&ulParam),starty&,startx&,HIWORD(&ulParam))
    else
      ~SetRect(R#,startx&,starty&, LOWORD(&ulParam),HIWORD(&ulParam))
    endif
    '##################
    
    Ellipse R#.Left&,R#.Top& - R#.right&,R#.bottom&

  elseif %UMessage = ~WM_LBUTTONUP
    ~SetROP2(%hdc,~R2_COPYPEN)
    ~SetROP2(%hdc2,~R2_COPYPEN)
    Usepen 0,1,$FFFFFF
    Usebrush 1,$FF
    Ellipse R#.Left&,R#.Top& - R#.right&,R#.bottom&
  Endif
EndWhile
__________________
Gruss
Andreas

______________________
http://www.ampsoft.eu

Profan 3.3 - XProfanX2
Windows 95,98,ME,2000,XP
Vista - Windows 7 32 / 64 Bit

ASUS X93S - Intel Core I7 - NVIDIA GForce GT540M - 8GB Arbeitsspeicher
Andreas Miethe ist offline   Mit Zitat antworten
Alt 24.04.2011, 08:49   #7 (Direktlink)
Weiß worum´s geht
 
Registriert seit: 03.01.2010
Ort: Saarland
Beiträge: 103
Standard

Hallo Andreas,

Code:
$H Windows.ph

cls
Struct RECT = left&,top&,right&,bottom&
Declare Ende&,startx&,starty&
Var R# = New(RECT)

Whilenot Ende&
  WaitInput
  startx&=%mousex
  starty&=%mousey
  while %mousepressed
    ~SetROP2(%hdc,~R2_NOTXORPEN)
   ' IfNot ~IsRectEmpty(r#)
      Rectangle R#.Left&,R#.Top& - R#.right&,R#.bottom&
   ' EndIf
 
    ~SetRect(R#,startx&,starty&,%mousex,%mousey)
    Rectangle R#.Left&,R#.Top& - R#.right&,R#.bottom&
  Endwhile
  ~SetROP2(%hdc,~R2_NOTXORPEN)
EndWhile


So funktioniert dein Beispiel in alle Richtungen.
Ralph Theobald ist offline   Mit Zitat antworten
Alt 24.04.2011, 08:53   #8 (Direktlink)
Weiß worum´s geht
 
Registriert seit: 03.01.2010
Ort: Saarland
Beiträge: 103
Standard

Wie kann man im letzten Beispiel von Andreas die Füllung
halbtransparent machen
Ralph Theobald ist offline   Mit Zitat antworten
Alt 24.04.2011, 08:55   #9 (Direktlink)
Weiß worum´s geht
 
Registriert seit: 03.01.2010
Ort: Saarland
Beiträge: 103
Standard

Bevor ich es vergesse,

Allen ein Frohes Osterfest !
Ralph Theobald ist offline   Mit Zitat antworten
Alt 24.04.2011, 10:20   #10 (Direktlink)
Super-Moderator
 
Benutzerbild von Frabbing
 
Registriert seit: 05.02.2009
Ort: Westliches NRW
Alter: 44
Beiträge: 5.094
Standard

Zitat:
Stimmt, nicht schlecht mit FocusRect().

Mit SetROP2() ist allerdings flexibler(Rechtecke, Kreise, Linien usw.), auch wenn es ein Relikt aus Zeiten von Win3.1 ist, funktioniert das doppelte Invertieren sehr gut.
SetROP2 nutze ich selber auch gerne. Jetzt war aber nach Rechteck gefragt, da bieten sich die Focuslinien an. Vor allem, weil die Dicke auch frei wählbar ist.
__________________
Gruß, Frank


Webpage http://frabbing.bplaced.net
mit Freeware - Tools, Spiele und Grafiken.
Frabbing ist gerade online   Mit Zitat antworten
Werbung

Windows 7 Tipps und Tricks in Bildern

Alt 24.04.2011, 11:26   #11 (Direktlink)
Super-Moderator
 
Benutzerbild von Frabbing
 
Registriert seit: 05.02.2009
Ort: Westliches NRW
Alter: 44
Beiträge: 5.094
Standard

Zitat:
Zitat von Ralph Theobald Beitrag anzeigen
Hallo Andreas,

Code:
$H Windows.ph

cls
Struct RECT = left&,top&,right&,bottom&
Declare Ende&,startx&,starty&
Var R# = New(RECT)

Whilenot Ende&
  WaitInput
  startx&=%mousex
  starty&=%mousey
  while %mousepressed
    ~SetROP2(%hdc,~R2_NOTXORPEN)
   ' IfNot ~IsRectEmpty(r#)
      Rectangle R#.Left&,R#.Top& - R#.right&,R#.bottom&
   ' EndIf
 
    ~SetRect(R#,startx&,starty&,%mousex,%mousey)
    Rectangle R#.Left&,R#.Top& - R#.right&,R#.bottom&
  Endwhile
  ~SetROP2(%hdc,~R2_NOTXORPEN)
EndWhile
So funktioniert dein Beispiel in alle Richtungen.
Das flackert bei mir leider sehr extrem. Ist auch ungünstig, das Zeichnen in einer Schleife laufen zu lassen, die ständig aktualisiert. In der Zeit wird auch keine Message mehr verarbeitet.
__________________
Gruß, Frank


Webpage http://frabbing.bplaced.net
mit Freeware - Tools, Spiele und Grafiken.
Frabbing ist gerade online   Mit Zitat antworten
Alt 24.04.2011, 11:53   #12 (Direktlink)
Weiß worum´s geht
 
Registriert seit: 03.01.2010
Ort: Saarland
Beiträge: 103
Standard

Ich habe unter Codeproject folgendes gefunden:

DrawTools - CodeProject


Zu dieser Anwendung gehört eine DLL, vllt kann man die unter Xprofan
nutzen.

Dort gibt es noch einige interessante Demos: Painter,GDI+Generator.
Ralph Theobald ist offline   Mit Zitat antworten
Alt 24.04.2011, 12:21   #13 (Direktlink)
Weiß worum´s geht
 
Registriert seit: 03.01.2010
Ort: Saarland
Beiträge: 103
Standard

Was ist eigentlich aus deinem Oframe.dll - Projekt geworden Frank

Gibt es diese Dll auch ohne Nagscreen ?
Ralph Theobald ist offline   Mit Zitat antworten
Alt 24.04.2011, 14:30   #14 (Direktlink)
Super-Moderator
 
Benutzerbild von Frabbing
 
Registriert seit: 05.02.2009
Ort: Westliches NRW
Alter: 44
Beiträge: 5.094
Standard

Die OFrame ist eigentlich fertig so. Du findest die neuste Version auf Jac's Webpage: bloody random - Frank Abbings Software
Auf meiner Webpage versuche ich, mich auf wenige, ausgesuchte Software zu konzentrieren.
__________________
Gruß, Frank


Webpage http://frabbing.bplaced.net
mit Freeware - Tools, Spiele und Grafiken.
Frabbing ist gerade online   Mit Zitat antworten
Alt 24.04.2011, 19:44   #15 (Direktlink)
Stammuser
 
Benutzerbild von Andreas Miethe
 
Registriert seit: 08.02.2009
Ort: Bielefeld
Alter: 53
Beiträge: 428
Standard

Noch ein Gummiband, gefällt mir fast am besten, da sichtbarer.

Code:
$H Windows.ph
$H Messages.ph

cls
'Pfad anpassen
Loadbmp "Creek.jpg",0,0;0

Struct RECT = left&,top&,right&,bottom&
Declare Ende&,startx&,starty&
Var R# = New(RECT)

Usermessages ~WM_LBUTTONDOWN,~WM_MOUSEMOVE,~WM_LBUTTONUP
Randomize

Whilenot Ende&
  WaitInput
  If %UMessage = ~WM_LBUTTONDOWN
    Usebrush 0,0
    Usepen 0,2,$0000FF
    startx&=Loword(&ULParam)
    starty&=HiWord(&ULParam)
    ~SetRect(R#,0,0,0,0)
  ElseIf (%UMessage = ~WM_MOUSEMOVE) and (&UWParam = ~MK_LBUTTON)
    
    IfNot ~IsRectEmpty(r#)
      ~BitBlt(%hdc,R#.Left&-1,R#.Top&-1,R#.right&+1,R#.bottom&+1,%hdc2,R#.Left&-1,R#.Top&-1,~SRCCOPY)
    endif
    
    'Richtung ermitteln
    '##################
    if (startx& < LOWORD(&ulParam)) AND (starty& > HIWORD(&ulParam))
      ~SetRect(R#,startx&,HIWORD(&ulParam),LOWORD(&ulParam),starty&)
    elseif (startx& > LOWORD(&ulParam)) and (starty& > HIWORD(&ulParam))
      ~SetRect(R#,LOWORD(&ulParam),HIWORD(&ulParam),startx&,starty&)
    elseif (startx& > LOWORD(&ulParam)) AND (starty& < HIWORD(&ulParam))
      ~SetRect(R#,LOWORD(&ulParam),starty&,startx&,HIWORD(&ulParam))
    else
      ~SetRect(R#,startx&,starty&, LOWORD(&ulParam),HIWORD(&ulParam))
    endif
    
    '##################
    ' Malen nur mit API, nie mit Xprofan
    ' sonst wird %hdc2 überschrieben
    '##################
    'Linie
    ~MovetoEx(%hdc,startx&,starty&,0)
    ~LineTo(%hdc, LOWORD(&ulParam),HIWORD(&ulParam))
    'Ellipse
    ~Ellipse(%hdc,R#.Left&,R#.Top&,R#.right&,R#.bottom&)
    'Rechteck
    ~Rectangle(%hdc,R#.Left&,R#.Top&,R#.right&,R#.bottom&)
    
  elseif %UMessage = ~WM_LBUTTONUP
    'Usepen 0,2,$00FFFF
    'Usebrush 1,RND($FFFFFF)
    '###################
    'HDC2 überschreiben
    '###################
    Rectangle R#.Left&,R#.Top& - R#.right&,R#.bottom&
    Ellipse R#.Left&,R#.Top& - R#.right&,R#.bottom&
    MoveTo startx&,starty&
    LineTo LOWORD(&ulParam),HIWORD(&ulParam)
  Endif
EndWhile
__________________
Gruss
Andreas

______________________
http://www.ampsoft.eu

Profan 3.3 - XProfanX2
Windows 95,98,ME,2000,XP
Vista - Windows 7 32 / 64 Bit

ASUS X93S - Intel Core I7 - NVIDIA GForce GT540M - 8GB Arbeitsspeicher
Andreas Miethe ist offline   Mit Zitat antworten
Werbung

Windows 7 Tipps und Tricks in Bildern

Antwort

  Paules-PC-Forum.de > Programmierung > XProfan

Lesezeichen

Themen-Optionen
Ansicht

Forumregeln
Es ist Ihnen erlaubt, neue Themen zu verfassen.
Es ist Ihnen erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are an




Alle Zeitangaben in WEZ +2. Es ist jetzt 12:44 Uhr.


Powered by vBulletin® Version 3.8.7 (Deutsch)
Copyright ©2000 - 2012, vBulletin Solutions, Inc.
Powered by vBCMS® 2.7.0 ©2002 - 2012 vbdesigns.de
(c) Paules-PC-Forum.de

::: Impressum :::

Search Engine Optimization by vBSEO 3.3.2