| |
|
|
Uwe ''Pascal'' Niemeier | Ich bins schon wieder
Bin auf dieses Problem gestoßen: Wenn ich bei StartPaint das Handle eines DeviceContext angebe, der keinem Dialogelement zugeordnet ist, bekomme ich bei Einsatz der meisten Gafikbefehle die Meldung Dieser Befehl setzt ein Fenster vorraus. Die entsprechenden API-Gegenstücke lassen sich dagegen problemlos verwenden. Die gleiche Meldung gibts ja auch, wenn man in die SpeicherBitmap zeichnen will und keine angelegt hat ; sitzt da irgendwo ne entsprechende Sicherheitsüberprüfung im Weg? Denn wenn ich erst ein Control brauche, macht der Einsatz des DCs doch eigentlich keinen Sinn, weil ich dann gleich das Control-Handle einsetzen kann. KompilierenMarkierenSeparierenwindow 10,10-500,500
$H Windows.ph
------------------Geht
var dlg&=create(dialog,%hwnd,Test,100,100,300,300)
var DC1&=~GetDC(dlg&)
startpaint DC1&
textcolor 1,255
drawtext 40,0,Hallo
endpaint
------------------Geht nicht
var DC2&=~CreateCompatibleDC(%hdc)
startpaint DC2&
textcolor 1,255
drawtext 40,0,Hallo
endpaint
waitkey
Bin darauf gekommen beim Versuch, meine OwnerDrawMenü-Demo nach XProfan11 umzuschreiben. Da wird der DC, auf den gezeichnet werden soll, innerhalb des SubClassings von Windows bereitgestellt. Workaround gibts schon, aber ein direktes StartPaint DC& hätte da einiges vereinfacht.
PS: Nennt mich Hiob
SeeYou Pascal |
|
|
| |
|
|
|
Matthias Arlt | Hallo Pascal,
Komisch, bei mir funktioniert eigentlich beides nicht so recht zufriedenstellend. Ich verwende daher folgenden, bisher immer zuverlässigen Workarround. Und verwende den DC dabei eigentlich nur fürs Neuzeichnen... KompilierenMarkierenSeparierenhdc&=~GetDC(dlg&)
hdc2&=~CreateCompatibleDC(hdc&)
b&=~CreateCompatibleBitmap(hdc&,width(dlg&),height(dlg&))
~SelectObject(hdc2&,b&)
startpaint dlg&
...
endpaint
~BitBlt(hdc2&,0,0,width(dlg&),height(dlg&),hdc&,0,0,$CC0020)
~DeleteObject(b&)
setautopaint 1
while...
if %wmPaint
setautopaint 2 ansonsten permanentes neuzeichnen...
~BitBlt(hdc&,0,0,width(1&),height(1&),hdc2&,0,0,$CC0020)
~RedrawWindow(dlg&,0,0,$400+$1+$80+$100+$2)
setautopaint 1
endif
wend
~DeleteDC(hdc2&)
~DeleteDC(hdc&)
|
|
|
| WinXP SP2, Win7 - XProfan 10/11/FreeProfan32 - Xpia | 14.02.2009 ▲ |
|
|
|
|
RGH | Uwe Pascal Niemeier
Ich bins schon wieder Die gleiche Meldung gibts ja auch, wenn man in die SpeicherBitmap zeichnen will und keine angelegt hat ; sitzt da irgendwo ne entsprechende Sicherheitsüberprüfung im Weg?
Ja, die Fehlermeldung taucht immer dann auf, wenn der DC, auf dem was gezeichnet werden soll, den Wert 0 hat. In diesem speziellen Dall schläft STARTPAINT wohl fehl. (Auch nach STARTPAINT hat die Systemvariable %HDC den Werte des aktuellen DC. In diesem Fall ist er tatsächlich 0.) Der Grund ist wohl, dass STARTPAINT den Parameter aus mir nicht erkennbaren Gründen hier nicht als einen DC erkennt, sondern für ein Fensterhandle hält.
Gruß Roland |
|
|
| Intel Duo E8400 3,0 GHz / 4 GB RAM / 1000 GB HDD - ATI Radeon HD 4770 512 MB - Windows 7 Home Premium 32Bit - XProfan X4 | 14.02.2009 ▲ |
|
|
|
|
Uwe ''Pascal'' Niemeier | Hi Roland!
Ich hoffe doch, daß du das bei Gelegenheit änderst? Wie gesagt, sonst würde die Möglichkeit den DC vorzugeben ja keinen Sinn machen. Handles als Parameter gabs ja schon lange.
SeeYou Pascal |
|
|
| |
|
|
|
| Morgen! Hat das Ganze auch etwas damit zu tun, dass die hPicss nicht wirklich grosse Ausmasse haben dürfen? |
|
|
| |
|
|
|
RGH | Uwe Pascal Niemeier
Hi Roland!
Ich hoffe doch, daß du das bei Gelegenheit änderst? Wie gesagt, sonst würde die Möglichkeit den DC vorzugeben ja keinen Sinn machen. Handles als Parameter gabs ja schon lange.
SeeYou Pascal
Tja, wenn ich wüsste was ich da ändern kann. In den allermeisten Fällen funktioniert es ja und ein Devicekontext wird als solcher erkannt (das heißt: die API GetObjType() erkennt auf OBJ_DC). Ich werde mir das aber noch mal anschauen und gucken, was GetObjType() in diesem speziellen Fall meldet ... Hintergrund: Da StartPaint ja auch Fensterhandles, Bitmaps, etc. übergeben werden können, muss ich ja erst einmal ermitteln, was da übergeben wurde. Dafür nutze ich GetObjType().
Gruß Roland |
|
|
| Intel Duo E8400 3,0 GHz / 4 GB RAM / 1000 GB HDD - ATI Radeon HD 4770 512 MB - Windows 7 Home Premium 32Bit - XProfan X4 | 15.02.2009 ▲ |
|
|
|
|
RGH | ... und schon was gefunden:
Es gibt auch den Typ OBJ_MEMDC und der wird hier erzeugt. Den hatte ich wohl beim Aufbohren von STARTPAINT nicht im Fokus (wohl die API-Dokumentation nicht weit genug runter gescrollt). Es wird in der nächsten Version nachgerüstet!
Gruß Roland |
|
|
| Intel Duo E8400 3,0 GHz / 4 GB RAM / 1000 GB HDD - ATI Radeon HD 4770 512 MB - Windows 7 Home Premium 32Bit - XProfan X4 | 15.02.2009 ▲ |
|
|
|
|
Jörg Sellmeyer | bei mir funktioniert es nicht! |
|
|
| Windows XP SP2 XProfan X4... und hier mal was ganz anderes als Profan ... | 04.11.2011 ▲ |
|
|
|
|
RGH | Was funktioniert bei Dir nicht? Bei mir kommt die von Pascal angemeckerte Fehlermeldung nicht mehr!
Gruß Roland |
|
|
| XProfan X2Intel Duo E8400 3,0 GHz / 4 GB RAM / 1000 GB HDD - ATI Radeon HD 4770 512 MB - Windows 7 Home Premium 32Bit - XProfan X4 | 08.11.2011 ▲ |
|
|
|
|
Jörg Sellmeyer | Sorry - ich weiß es auch gar nicht mehr Jetzt funktioniert's. Vielleicht hatte ich nur den Code falsch verstanden |
|
|
| Windows XP SP2 XProfan X4... und hier mal was ganz anderes als Profan ... | 09.11.2011 ▲ |
|
|
|