AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

[GDI] Offscreen Bitmap - solved

Ein Thema von SnuffMaster23 · begonnen am 1. Aug 2008 · letzter Beitrag vom 2. Aug 2008
Antwort Antwort
Seite 1 von 2  1 2      
Benutzerbild von SnuffMaster23
SnuffMaster23

Registriert seit: 13. Feb 2006
Ort: Kempten
253 Beiträge
 
#1

[GDI] Offscreen Bitmap - solved

  Alt 1. Aug 2008, 18:41
Hoi
ich brauch mal wieder Hilfe.
Erstmal mein bisheriger Code:
Code:
  HBITMAP hBMP;
  HDC    hDC;
  RECT   Rect;
  int    *pixels = new int[512*512];

  hDC = CreateCompatibleDC(GetDC(NULL)); // GetDC(NULL) sollte einen DC zum Bildschirm zurückgeben, also in FARBE (bei mir jedenfalls)
  hBMP = CreateCompatibleBitmap(hDC, 512, 512);

  SelectObject(hDC, hBMP);

  Rect = (RECT){1, 1, 100, 100};
  SetDCBrushColor(hDC, 0x00000000);
  HBRUSH hBrush = CreateSolidBrush(0x000000FF);
  FillRect(hDC, &TextRect, hBrush);
  DeleteObject(hBrush);

  // zum angucken auf den Schirm blitten
  BitBlt(GetDC(NULL), 0, 0, 512, 512, hDC, 0, 0, SRCCOPY);

  DeleteObject(hBMP);
  DeleteDC(hDC);
  delete [] pixels;
Wie krieg ich jetzt nen DC/ein Bitmap mit ner bestimmten Farbtiefe (24, besser 32 Bit)? Der hier scheint jedenfalls monochrom zu sein, das rote Rechteck ist aus Schwarz und Weiß gerastert .
Und wie komm ich hinterher an die Pixeldaten? Bei CreateBitmap kann man ja nen Pointer angeben (pixels), den vermiss ich hier auch.

Wenns nur ein Rechteck zu zeichnen wär würd ichs ja selber machen, aber ich brauch GDI weil ich eigentlich Text zeichnen will.+

(Edith hats gelöst)
"Conspiracy is the poor man's mapping of the world" - Fredric Jameson
  Mit Zitat antworten Zitat
Medium

Registriert seit: 23. Jan 2008
3.686 Beiträge
 
Delphi 2007 Enterprise
 
#2

Re: [GDI] Offscreen Bitmap

  Alt 1. Aug 2008, 19:17
Was an TCanvas.TextOut() gefällt dir denn nicht?

Edit: Ach, C++! Wenns Borland C++ ist, gibts da aber ja auch die VCL und somit TCanvas 8)
"When one person suffers from a delusion, it is called insanity. When a million people suffer from a delusion, it is called religion." (Richard Dawkins)
  Mit Zitat antworten Zitat
Benutzerbild von SnuffMaster23
SnuffMaster23

Registriert seit: 13. Feb 2006
Ort: Kempten
253 Beiträge
 
#3

Re: [GDI] Offscreen Bitmap

  Alt 1. Aug 2008, 20:12
Mit dem [GDI] im Titel wollte ich eigentlich andeuten dass ich GDI benutzen will und keine VCL und kein TCanvas

Das Problem ist auch garnicht der Text sondern wie oben steht einen bunten offscreen DC zu kriegen und hinterher an die Pixel zu kommen.
"Conspiracy is the poor man's mapping of the world" - Fredric Jameson
  Mit Zitat antworten Zitat
Medium

Registriert seit: 23. Jan 2008
3.686 Beiträge
 
Delphi 2007 Enterprise
 
#4

Re: [GDI] Offscreen Bitmap

  Alt 1. Aug 2008, 20:50
Zitat von SnuffMaster23:
Wenns nur ein Rechteck zu zeichnen wär würd ichs ja selber machen, aber ich brauch GDI weil ich eigentlich Text zeichnen will.
Der Satz klingt erstmal wie: "Nagut, ich nehm gezwingenermaßen direkt die GDI direkt damit ich Text zeichnen kann", weniger wie: "Ich will bewusst auf die VCL verzichten, darum gehts"

Zu dem Problem: Ich hab bisher sehr wenig mit der GDI direkt gemacht, aber hilft es evtl. den Brush mit SelectObject in den DC zu selektieren?

Ich weiss jetzt nicht, was GetDC(0) liefert, aber laut msdn kannst du CreateCompatibleDC direkt mit NULL aufrufen um einen Screen-DC zu erhalten. Vielleicht tuts das ja
"When one person suffers from a delusion, it is called insanity. When a million people suffer from a delusion, it is called religion." (Richard Dawkins)
  Mit Zitat antworten Zitat
Benutzerbild von SnuffMaster23
SnuffMaster23

Registriert seit: 13. Feb 2006
Ort: Kempten
253 Beiträge
 
#5

Re: [GDI] Offscreen Bitmap

  Alt 1. Aug 2008, 21:04
Zitat von Medium:
Zitat von SnuffMaster23:
Wenns nur ein Rechteck zu zeichnen wär würd ichs ja selber machen, aber ich brauch GDI weil ich eigentlich Text zeichnen will.
Der Satz klingt erstmal wie: "Nagut, ich nehm gezwingenermaßen direkt die GDI direkt damit ich Text zeichnen kann", weniger wie: "Ich will bewusst auf die VCL verzichten, darum gehts"
Das sollte eigentlich klingen wie "Ein Rechteck kann ich mit zwei Schleifen selber ins Pixelarray zeichnen, Text nicht"
Es geht auch nicht darum auf die VCL zu verzichten, ich hab einfach garkeine. Gibt ja nicht nur Borland C++.


Zitat von Medium:
Zu dem Problem: Ich hab bisher sehr wenig mit der GDI direkt gemacht, aber hilft es evtl. den Brush mit SelectObject in den DC zu selektieren?
Wenn ich auf einen Screen-DC zeichne isses rot. Außerdem nimmt FillRect ja extra einen Brush als Parameter, vom aktuell im DC selektierten steht auch nirgends was.


Zitat von Medium:
Ich weiss jetzt nicht, was GetDC(0) liefert, aber laut msdn kannst du CreateCompatibleDC direkt mit NULL aufrufen um einen Screen-DC zu erhalten. Vielleicht tuts das ja
GetDC(NULL) liefert, wie im Kommentar steht einen Screen-DC, das hab ich nur zur Sicherheit da hingeschrieben. Davor hatte ich direkt NULL drin, macht aber keinen Unterschied.
"Conspiracy is the poor man's mapping of the world" - Fredric Jameson
  Mit Zitat antworten Zitat
Medium

Registriert seit: 23. Jan 2008
3.686 Beiträge
 
Delphi 2007 Enterprise
 
#6

Re: [GDI] Offscreen Bitmap

  Alt 1. Aug 2008, 21:13
MSDN-Library durchsuchenCreateCompatibleDC
Zitat:
A memory DC exists only in memory. When the memory DC is created, its display surface is exactly one monochrome pixel wide and one monochrome pixel high. Before an application can use a memory DC for drawing operations, it must select a bitmap of the correct width and height into the DC. To select a bitmap into a DC, use the CreateCompatibleBitmap function, specifying the height, width, and color organization required.
Das klingt exakt nach deinem Problem. Zudem:
Zitat von msdn zu CreateCompatibleBitmap():
The color format of the bitmap created by the CreateCompatibleBitmap function matches the color format of the device identified by the hdc parameter. This bitmap can be selected into any memory device context that is compatible with the original device.
D.h. irgendwie scheint dein DC vermurkst zu sein. Probier doch einfach mal mir zur Liebe nochmal statt "hDC = CreateCompatibleDC(GetDC(NULL));" "hDC = CreateCompatibleDC(NULL);", weil das wäre zumindest laut msdn der dokumentierte richtige Weg.
"When one person suffers from a delusion, it is called insanity. When a million people suffer from a delusion, it is called religion." (Richard Dawkins)
  Mit Zitat antworten Zitat
Benutzerbild von SnuffMaster23
SnuffMaster23

Registriert seit: 13. Feb 2006
Ort: Kempten
253 Beiträge
 
#7

Re: [GDI] Offscreen Bitmap

  Alt 1. Aug 2008, 21:38
Das klingt nach einem Teufelskreis, der DC ist monochrom und nimmt Farbinfos vom Bitmap, das Bitmap wird aber mit den Farben vom DC erzeugt. Und es gibt keine Mäglichkeit das zu ändern, jedenfalls hab ich noch keine gefunden

SetDIBits hab ich schon ausprobiert, allerdings ohne Erfolg. Damit hätte ich halt auf einmal die Farben gesetzt und mein Pixelarray eingeschleust.

So schauts aus, sowohl mit NULL als auch mit GetDC(NULL) bei CreateCompatibleDC
http://www.abload.de/img/guckctj.jpg
"Conspiracy is the poor man's mapping of the world" - Fredric Jameson
  Mit Zitat antworten Zitat
Medium

Registriert seit: 23. Jan 2008
3.686 Beiträge
 
Delphi 2007 Enterprise
 
#8

Re: [GDI] Offscreen Bitmap

  Alt 2. Aug 2008, 00:04
Also eines kann ich dir zumindest jetzt schon sagen: Es liegt nicht an einem Problem mit deinem Rechner. Ich hab deinen Code mal (mangels C++ Compiler) nach Delphi übersetzt, und bekomme das selbe Resultat. Immerhin schon mal etwas


Edit:
Folgendes klappt:
DC := GetDC(0);
oder
DC := CreateDC(PChar('DISPLAY'), nil, nil, nil);

Beides gibt einen DC zurück, auf den sich farbig zeichnen lässt. Sobald man aber CreateCompatibleDC() über einen derjenigen ausführt, ist der resultierende wieder monochrom. Daher sollte an und für sich auf jeden Fall die 2. Variante benutzbar sein.

Ich habe mir das auch grad nur zusammengedokort da ich "zu Fuß" über GDI bislang auch nur eher sporadisch unterwegs war, aber hey! Zumindest war das Rechteck rot
"When one person suffers from a delusion, it is called insanity. When a million people suffer from a delusion, it is called religion." (Richard Dawkins)
  Mit Zitat antworten Zitat
helgew

Registriert seit: 30. Jul 2008
125 Beiträge
 
#9

Re: [GDI] Offscreen Bitmap

  Alt 2. Aug 2008, 01:40
Willst du nicht erst einmal ein Bitmap erzeugen?
http://msdn.microsoft.com/en-us/library/ms532305.aspx

Danach kannst du dann von DC zu DC blitten, wie du lustig bist
  Mit Zitat antworten Zitat
Medium

Registriert seit: 23. Jan 2008
3.686 Beiträge
 
Delphi 2007 Enterprise
 
#10

Re: [GDI] Offscreen Bitmap

  Alt 2. Aug 2008, 01:49
Hat er
Zitat von SnuffMaster23:
Code:
  hBMP = CreateCompatibleBitmap(hDC, 512, 512);
"When one person suffers from a delusion, it is called insanity. When a million people suffer from a delusion, it is called religion." (Richard Dawkins)
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine 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 aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 13:23 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz