Deutsch
Bugs und vermeintliche

Startpaint DC&

 

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.
KompilierenMarkierenSeparieren
window 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
 
14.02.2009  
 




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...
KompilierenMarkierenSeparieren
hdc&=~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
 
15.02.2009  
 



Morgen! Hat das Ganze auch etwas damit zu tun, dass die hPicss nicht wirklich grosse Ausmasse haben dürfen?
 
15.02.2009  
 




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 X2
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
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  
 



Antworten


Thementitel, max. 100 Zeichen.
 

Systemprofile:

Kein Systemprofil angelegt. [anlegen]

XProfan:

 Beitrag  Schrift  Smilies  ▼ 

Bitte anmelden um einen Beitrag zu verfassen.
 

Themenoptionen

11.978 Betrachtungen

Unbenanntvor 0 min.
RudiB.16.05.2021
Jörg Sellmeyer01.06.2018
H.Brill23.09.2017
Wilfried22.05.2016
Mehr...

Themeninformationen



Admins  |  AGB  |  Anwendungen  |  Autoren  |  Chat  |  Datenschutz  |  Download  |  Eingangshalle  |  Hilfe  |  Händlerportal  |  Impressum  |  Mart  |  Schnittstellen  |  SDK  |  Services  |  Spiele  |  Suche  |  Support

Ein Projekt aller XProfaner, die es gibt!


Mein XProfan
Private Nachrichten
Eigenes Ablageforum
Themen-Merkliste
Eigene Beiträge
Eigene Themen
Zwischenablage
Abmelden
 Deutsch English Français Español Italia
Übersetzungen

Datenschutz


Wir verwenden Cookies nur als Session-Cookies wegen der technischen Notwendigkeit und bei uns gibt es keine Cookies von Drittanbietern.

Wenn du hier auf unsere Webseite klickst oder navigierst, stimmst du unserer Erfassung von Informationen in unseren Cookies auf XProfan.Net zu.

Weitere Informationen zu unseren Cookies und dazu, wie du die Kontrolle darüber behältst, findest du in unserer nachfolgenden Datenschutzerklärung.


einverstandenDatenschutzerklärung
Ich möchte keinen Cookie