Allgemeine Fragen zur PROFAN Programmierung
Views (Heute): 249184 (10620)
  Suchen
 Zurück zur Übersicht
 AutorThema: Syntax-Problem bei API-CreateIcon
Uwe Beisler
Datum:10.02.02 18:13 Antwortenals Email verschicken (uwe.beisler@t-online.de) 



Hallo !

Um die Grösse meiner Image-List im Rahmen zu halten versuche ich eine Procedur zu schreiben die zur Laufzeit Icon-Teile austauscht. Die Anzahl der Icons insgesamt ist offen (TreeView - jeder Knoten ein eigenes Icon). Aber es werden sicher einige. Um nun für die nicht noch X Varianten zu erzeugen will ich 30 Icon-Teile im Speicher (Bereich oder separate Image-List) halten um sie dann über das aktuelle Icon zu legen.

Um es dann einzufügen brauche ich ein Handle. Da ich keine Möglichkeit gefunden habe den Bitmaps die ich mit Profanmitteln bearbeite ein Handle zu entlocken bin ich in der API auf die Suche gegangen.

Nun habe ich ein Syntax-Problem :

HICON CreateIcon(

HINSTANCE hInstance // handle of application instance
int nWidth, // icon width
int nHeight, // icon height
BYTE cPlanes, // number of planes in XOR bitmask
BYTE cBitsPixel, // number of bits per pixel in XOR bitmask
CONST BYTE *lpbANDbits, // address of AND bitmask array
CONST BYTE *lpbXORbits // address of XOR bitmask array
);

1. Versuch in Profan :

DEF CreateIcon(6) ! "USER32","CreateIcon"
Hicon&=CreateIcon(%HInstance,16,16,1,1,Zeiger1&,Zeiger2&)

- Falscher Parametertyp : 16

2. Versuch mit:

WORD Size#,0 =16
WORD Size#,2 =16
test&=@LONG(Size#,0)

blieb im Ansatz stecken, denn wie soll ich dann eine Adresse in einem CONST BYTE (was auch immer das sein mag) unterbringen ?

Es geht also nicht darum welche Parameter sondern wie.

Ich brauche nur die Zeile "Hicon&=CreateIcon(%HInstance,...",
dann komme ich mit meiner Try&Error-Methode mühsam aber lehrreich weiter.
Ich sitze schon Stunden an dem Punkt. Ohne eure Hilfe komme ich nicht weiter.

Uwe


Jörg Sellmeyer
Datum:10.02.02 23:48 Antwortenals Email verschicken (joerse@gmx.de) 


Hallo,
Ich vermute, das Ganze läuft, wenn Du einen anderen Funktionsnamen benutzt.
CreateIcon ist Profanintern und darum wird die Profanfunktion aufgerufen.
Gruß
Jörg


Uwe Beisler
Datum:11.02.02 09:02 Antwortenals Email verschicken (uwe.beisler@t-online.de) 


Hallo Jörg!

Danke für Deine Antwort. Ich habe zwar vorher den Test mit COMCTL32 gemacht und wie erwartet die Fehlermeldung "Funktion in DLL nicht vorhanden : CreateIcon" bekommen, aber das bedeutet ja nur, dass er die Funktion in der DLL sucht. Ob er sie auch von dort aufruft steht auf einem anderen Blatt.
Wenn ich mit "Def CIcon(6) ! "USER32"..." arbeite bekomme ich einen Anwendungsfehler. Du scheinst also recht zu haben.

Aber mein Problem besteht weiter. Wie kann ich zur Laufzeit ein Icon oder eine Bitmap erzeugen und dann in eine ImageList einfügen/tauschen ? Dazu brauche ich ein Handel.

Der Anwendungsfehler kann durch mein immer noch bestehendes Syntax-Problem oder der Namensgleichheit von der API- und der Profan-Funktion kommen.

Klar, ich könnte die Bitmap ganz normal bearbeiten, abspeichern und wieder laden. Dann hätte ich ein Handel. Aber, das kann es nicht sein. Oder ?

Uwe



Uwe Beisler
Datum:11.02.02 13:16 Antwortenals Email verschicken (uwe.beisler@t-online.de) 


Hallo !

In der Zwischenzeit habe ich eine API-Funktion gefunden die für meinen Zweck genauso gut ist, keine Namenskonflikte verursacht und bei der auch klar ist wie die Parameter zu übergeben sind.
Allerdings gelingt es mir damit nur Schwarz-Weiß-Bilder zu erzeugen :

DEF CreateBitmapIndirect(1) ! "GDI32","CreateBitmapIndirect"

...

BITMAP#.bmType&=0
BITMAP#.bmWidth&=16
BITMAP#.bmHeight&=16
' BITMAP#.bmWidthBytes&=16
BITMAP#.bmWidthBytes&=2
BITMAP#.bmPlanes%=1
' BITMAP#.bmPlanes%=3
' BITMAP#.bmBitsPixel%=8
BITMAP#.bmBitsPixel%=1
BITMAP#.bmBits&=test1#

LET i%=0
WHILENOT @Equ(i%,256)
BYTE test1#,i% = i%
INC i%
ENDWHILE
WHILENOT @Equ(i%,1024)
BYTE test1#,i% = 128
INC i%
ENDWHILE

Hicon&=CreateBitmapIndirect(BITMAP#)
'Hicon&=CreateBitmapDirect(16,16,1,1,test&)
case Hicon&: Windowtitle "CreateBitmapIndirect erfolgreich"

Ich denke die Lösung wäre nicht nur für mich interessant. Man könnte sich, um nur ein Beispiel zu nennen, so häufig das Thema Resourcen sparen.

Danke im voraus !

Uwe


Uwe Beisler
Datum:11.02.02 16:33 Antwortenals Email verschicken (uwe.beisler@t-online.de) 


Hallo,

es ist zwar frustrierend sich selbst zu antworten, aber vielleicht bewirkt es ja bei dem einen oder anderen das Gegenteil und er fühlt sich motiviert mit zu tüfteln.

Im Moment versuche ich es mit "CreateBitmap" (ohne "Indirect"),
aber erhalte den bekannten Anwendungsfehler.

Wenn sich jemand dafür interessiert wie es nicht geht :

Hicon&=CreateBitmapDirect(16,16,3,8,test&)
Hicon&=CreateBitmapDirect(16,16,1,8,test&)
Hicon&=CreateBitmapDirect(134287376,test&)
Hicon&=CreateBitmapDirect(1048592,524289,test&)
Hicon&=CreateBitmapDirect(1048592,524291,test&)

Ich wäre übrigens daran interessiert wie es geht :-).

Uwe


uwe beisler
Datum:11.02.02 20:53 Antwortenals Email verschicken (uwe.beisler@t-online.de) 


Hallo !

Ok, ich schreibe mir schon wieder selbst, aber das kann mir die Laune jetzt auch nicht verderben. Denn, ich habe einen gangbaren Weg :

DEF CreateBitmapDirect(5) ! "GDI32","CreateBitmap"
...
Hicon&=CreateBitmapDirect(16,16,1,32,test&)

Es scheint nur 1- oder 32-Bit möglich zu sein. Aber immerhin kann ich nun endlich Bitmaps mit Handel erzeugen. Ich hoffe, dass es noch jemand gebrauchen kann.

Uwe


Uwe ''Pascal'' Niemeier
Datum:12.02.02 23:37 Antwortenals Email verschicken (Pascalxd@owl-online.de) 


Hallo Namensvetter!

Mit CreateIcon kann man auch Icons erzeugen, nur mit der Farbgebung hab' ich so meine Probleme...

window 30,30-300,300
declare a&,a#,b#
def MakeIcon(7) !"USER32","CreateIcon"
def DrawIcon(4) !"USER32","DrawIcon"
def FillMemory(3) !"KERNEL32","RtlFillMemory"

dim a#,128
clear a#
dim b#,1024
clear b#

FillMemory(b#,512,%11111010)
FillMemory(b#+512,512,%00000010)

a&=MakeIcon(%hinstance,32,32,1,8,a#,b#)

DrawIcon(%hdc ,50,50,a&)
DrawIcon(%hdc2,50,50,a&)

dispose a#
dispose b#
waitkey

BTW: Wie kriegst du bei bei deinem "CreateBitmapDirect"-Prinzip die Farb-und Bildinformationen in die Bitmap?

P.S. Hier mein Lösungsvorschlag zur Erzeugung von bmp's zur Laufzeit:
http://www.tomcatsoft.de/CreateDIB.prf

HTH
Pascal


Uwe Beisler
Datum: 14.02.02 08:51 Antwortenals Email verschicken (uwe.beisler@t-online.de) 


Hallo Namensvetter!

Danke !

Daß ich gar kein Syntax-Problem hatte, habe ich schon gemerkt als CreateBitmapIndirect auch lief. Aber CreateBitmapDirect ist schnell, (nun auch) einfach und genügt meinen Zwecken.

Ich hatte bei etlichen Versuchen auch den Eindruck es müßte ein irrsinig komplizierter Aufbau dahinterstecken, denn ich bekam immer wilde Farbmuster. Tatsächlich hatte ich nur einen Flüchtigkeitsfehler und sah zufällige Speicherinhalte.

Manchmal ist es das sinnvollste die Kiste auszuschalten und es einen Tag später nocheinmal zu probieren und manchmal kommt man aber auch nur durch wenn man sich festbeißt. Ich gäbe was drum wenn ich als wüßte was nun gerade das Richtige ist :-).

Die Beschränkung auf 1- oder 32-Bit ist so ein Beispiel für "vor lauter Bäumen den Wald nicht sehen". - Meine Grafikkarte war im 32-Bit-Mode und ich habe ja eine DDB (geräteabhängige Bitmap - schnell und einfach) erzeugt.
Auf der anderen Seite wenn ich zu früh aufgegeben hätte
hätte ich nie erfahren, daß es DDB's gibt.

Für den Fall, daß das nicht Dein Problem war :

WHILENOT @Equ(i%,320) ' für 32 Bit-Color
BYTE test1#,i% = test2&
INC i%
ENDWHILE
WHILENOT @Equ(i%,640) ' für 32 Bit-Color
BYTE test1#,i% = 0 'b
INC i%
BYTE test1#,i% = 0 'g
INC i%
BYTE test1#,i% = 255 'r
INC i%
BYTE test1#,i% = 255 ' offensichtlich unwirksam
INC i%
ENDWHILE
WHILENOT @Equ(i%,1024) ' für 32 Bit-Color
BYTE test1#,i% = 0 'b
INC i%
BYTE test1#,i% = 255 'g
INC i%
BYTE test1#,i% = 255 'r
INC i%
BYTE test1#,i% = 0
INC i%
ENDWHILE

Der 32-Bit-Mode will 4 Byte pro Pixel auch wenn er nur 3 nutzt.

Wenn ich ein "richtiges Bild" lade habe ich eine gute Kontrollmöglichkeit ob ich nicht wieder zufällige Speicherinhalte sehe.
("richtiges Bild" - DIB entspr. dem BMP-Fileformat wird intern sowieso zeitraubend aber flexibel in DDB umgewandelt)

Beispiel:

String Iconname#,0="btest01.bmp"
Let Hicon2&=@LoadImage(%HInstance,Iconname#,0,16,16,$0050)
ImageList_Add(IcoList&,Hicon2&,0)

WHILELOOP 12
ImageList_Add(IcoList&,Hicon&,0)
ENDWHILE

'nun kann ich das "richtige Bild" überschreiben :

ImageList_Replace(IcoList&,0,Hicon&,0)

Wenn ich nun meinen TreeView anschaue sehe ich daran auf einen Blick ob es geklappt hat oder nicht.

Praktische Erfahrungen habe ich noch nicht da ich noch in der Entwurfsphase bin. Die Programme die ich zur Zeit schreibe brauche ich nur um Festzustellen ob das was mir vorschwebt machbar ist. Die Logik und Datenstruktur für mein Programm habe ich schon lange im Kopf, aber da ich die letzten 20 Jahre zwar hauptsächlich in der Branche aber eben an der Front war kann nur auf Basiswissen aus 64er-Tagen aufbauen. Was nutzen mir heute die vielen schönen Einsprungadressen, PEEKs und POKEs wenn ich etwas von der WinAPI will ?

...

habe mir gerade Deine Lösung nochmal angeschaut um zu sehen ob Du als 4. Parameter auch die 1 hast (die ist an der Stelle glaube ich Pflicht) und bin dabei über den 5. gestolpert. Bei 8 Bit stellt sich die Frage der Palette. Ich denke das System nimmt die Palette aus dem Gerätekontext. Sprich : entweder die Systempalette oder die aktuelle ( kann mich dunkel daran erinnern das sich frühr (zu 8-Bit-Zeiten) die anderen Fenster verfärbt haben wenn man ein Photo auf den Schirm holte.

Gruß Uwe

P.S.
Ich habe nun wieder ein neues API Problem
und hoffe auf Dich :-).


 Zurück zur Übersicht