|
Das deutsche QBasic- und FreeBASIC-Forum Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
|
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
ALWIM
Anmeldungsdatum: 08.08.2006 Beiträge: 1041 Wohnort: Niederbayern
|
Verfasst am: 21.03.2016, 14:54 Titel: benutzerdefinierte Buttons? |
|
|
Ich bin momentan dabei, ein kleines Schachprogramm zu schreiben. Bei offiziellen Programmen, erscheint bei der Bauernumwandlung ein Fenster, wo ich auswählen kann, welche Figur ich nehme. Auf dem Fenster sieht man die entsprechenden Figuren als Grafik bzw. Buttons. Genau so was in der Art will ich in meinem Programm auch haben. Gibt es in FB eine Bibliothek, mit der man benutzerdefinierte Buttons erstellen kann? Welche Möglichkeiten habe ich das relativ schnell und auf sehr einfache Weise hinzubekommen? Geht das mit der WinApi auch?
Es soll wenn möglich, nicht im Hauptfenster sein, sondern in einem 2. seperaten Fenster!
Bin dankbar für jede Hilfe! _________________ SHELL SHUTDOWN -s -t 05 |
|
Nach oben |
|
|
Haubitze
Anmeldungsdatum: 14.10.2009 Beiträge: 132
|
Verfasst am: 21.03.2016, 15:01 Titel: |
|
|
so auf die schnelle wuerde ich sagen, schau dir mal Muttonheads
SGUI an da hatt er eigendlich alles drin wasn man braucht.
salute |
|
Nach oben |
|
|
ALWIM
Anmeldungsdatum: 08.08.2006 Beiträge: 1041 Wohnort: Niederbayern
|
Verfasst am: 21.03.2016, 16:14 Titel: |
|
|
Haubitze hat Folgendes geschrieben: | so auf die schnelle wuerde ich sagen, schau dir mal Muttonheads
SGUI an da hatt er eigendlich alles drin wasn man braucht.
salute | Gibt es sonst noch eine Möglichkeit? Es muss ein Button sein, wo eine Schachfigur als Bild drauf ist (Dame, Turm, Läufer, Springer). _________________ SHELL SHUTDOWN -s -t 05 |
|
Nach oben |
|
|
nemored
Anmeldungsdatum: 22.02.2007 Beiträge: 4609 Wohnort: ~/
|
Verfasst am: 21.03.2016, 17:47 Titel: |
|
|
Ich sehe da keinen Grund, warum du nicht sGui verwenden solltest; mit BMPSimpleGadget.bas hast du genau das, was du brauchst. Aber selbstverständlich gibt es noch andere Möglichkeiten:
- selbst ein kleines Auswahlfenster schreiben (meine bevorzugte Methode, weil es recht flott geht und keine externen Bibliotheken braucht)
- WinAPI-Elemente verwenden (nicht meine bevorzugte Methode, da es dann nur unter Windows läuft)
- GTK einsetzen (braucht eine ziemlich große Bibliothek, die vorhanden sein muss oder mitgeliegert werden muss)
- Qt einsetzen (ähnlich wie bei GTK, nur dass die benötigten Bibliothek-Teile meines Wissens deutlich kleiner sind)
- wxWidget verwenden (sehen dann unter Windows wie WinAPI-Elemente aus und unter Linux wie GTK-Elemente, also eine betriebssystem-eigene Benutzeroberfläche)
- auf eine der unzähligen anderen einfachen FreeBASIC-IDEs zurückgreifen (zu denen kann ich nichts weiter sagen)
_________________ Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1. |
|
Nach oben |
|
|
St_W
Anmeldungsdatum: 22.07.2007 Beiträge: 949 Wohnort: Austria
|
Verfasst am: 21.03.2016, 18:04 Titel: |
|
|
nemored hat Folgendes geschrieben: | [*]Qt einsetzen (ähnlich wie bei GTK, nur dass die benötigten Bibliothek-Teile meines Wissens deutlich kleiner sind) |
Soweit ich weiß gibt es keine Qt-Bindings für FB; also zumindest nichts brauchbares. Qt ist ja (wie wxWidgets) eine C++ Bibliothek und daher problematisch beim Einbinden in FB. GTK ist eine der wenigen C GUI Bibliotheken.
Das Problem bei einer Lösung mit FB-Mitteln ist wohl dein Wunsch das Ganze in einem separaten Fenster darzustellen (ich denke das betrifft u.a. sGUI). Eine in letzter Zeit für FB recht beliebte GUI Bibliothek ist IUP - im engl. Forum findest du alles notwendige dazu. Die ist cross-platform und relativ klein.
Möglich ist es natürlich auch mit anderen GUI Bibliotheken und auch der WinAPI. _________________ Aktuelle FreeBasic Builds, Projekte, Code-Snippets unter http://users.freebasic-portal.de/stw/
http://www.mv-lacken.at Musikverein Lacken (MV Lacken) |
|
Nach oben |
|
|
ALWIM
Anmeldungsdatum: 08.08.2006 Beiträge: 1041 Wohnort: Niederbayern
|
Verfasst am: 21.03.2016, 18:15 Titel: |
|
|
St_W hat Folgendes geschrieben: | nemored hat Folgendes geschrieben: | [*]Qt einsetzen (ähnlich wie bei GTK, nur dass die benötigten Bibliothek-Teile meines Wissens deutlich kleiner sind) |
Soweit ich weiß gibt es keine Qt-Bindings für FB; also zumindest nichts brauchbares. Qt ist ja (wie wxWidgets) eine C++ Bibliothek und daher problematisch beim Einbinden in FB. GTK ist eine der wenigen C GUI Bibliotheken.
Das Problem bei einer Lösung mit FB-Mitteln ist wohl dein Wunsch das Ganze in einem separaten Fenster darzustellen (ich denke das betrifft u.a. sGUI). Eine in letzter Zeit für FB recht beliebte GUI Bibliothek ist IUP - im engl. Forum findest du alles notwendige dazu. Die ist cross-platform und relativ klein.
Möglich ist es natürlich auch mit anderen GUI Bibliotheken und auch der WinAPI. | Vielen herzlichen Dank für die Antworten! Wie geht es dann mit der WinApi? Gibt es da einen speziellen Befehl? Ich habe mit sGui bisher noch nicht gearbeitet. Müsste mich zuerst einarbeiten. Deswegen, will ich nicht extra noch sGui mit einbinden, wenn WinApi eh schon verwendet wird. Außer es ginge nicht anders, dann ja. Bauernumwandlung in eine Dame funktioniert schon mal! Brauche nur noch die Abfrage in welche Figur.
Edit:
Zitat: | WinAPI-Elemente verwenden (nicht meine bevorzugte Methode, da es dann nur unter Windows läuft) | Ist eh nur für mich gedacht! Also kann es bei mir auch WinApi sein. _________________ SHELL SHUTDOWN -s -t 05 |
|
Nach oben |
|
|
Jojo alter Rang
Anmeldungsdatum: 12.02.2005 Beiträge: 9736 Wohnort: Neben der Festplatte
|
Verfasst am: 21.03.2016, 18:28 Titel: |
|
|
Mit reiner WinAPI ohne Vorwissen ein Bild auf einen Button zu zaubern wird wesentlich mehr Arbeit sein als sich in sGUI einzuarbeiten. _________________ » Die Mathematik wurde geschaffen, um Probleme zu lösen, die es nicht gäbe, wenn die Mathematik nicht erschaffen worden wäre.
|
|
Nach oben |
|
|
St_W
Anmeldungsdatum: 22.07.2007 Beiträge: 949 Wohnort: Austria
|
Verfasst am: 21.03.2016, 19:01 Titel: |
|
|
Jojo hat Folgendes geschrieben: | Mit reiner WinAPI ohne Vorwissen ein Bild auf einen Button zu zaubern wird wesentlich mehr Arbeit sein als sich in sGUI einzuarbeiten. |
Naja, ein Bild auf einen Button zu bringen ist sicher nicht die große Schwierigkeit, aber wenn WinAPI Kenntnisse fehlen (@Alwim: und nein, es reicht nicht aus einzelne Befehle wie MessageBox zu kennen) dann ist sicher die Realisierung mit etwas anderem einfacher, da stimme ich dir zu.
Wenn man das ganze drumherum (Fenster mit Buttons erstellen und Auswahllogik) schon hat, dann musst du eigentlich nur noch das Bild laden und entsprechend folgenden Hinweisen vorgehen:
https://msdn.microsoft.com/en-us/library/windows/desktop/bb761822.aspx
@Alwim: Wenn du glauben solltest, dass das ganze in nur wenigen Code-Zeilen möglich wäre, dann liegst du definitiv falsch. _________________ Aktuelle FreeBasic Builds, Projekte, Code-Snippets unter http://users.freebasic-portal.de/stw/
http://www.mv-lacken.at Musikverein Lacken (MV Lacken) |
|
Nach oben |
|
|
ALWIM
Anmeldungsdatum: 08.08.2006 Beiträge: 1041 Wohnort: Niederbayern
|
Verfasst am: 22.03.2016, 00:48 Titel: |
|
|
Code: | const ProgrammName = "Umwandlung"
DIM AS WNDCLASS wndcls
WITH wndcls
.style = CS_HREDRAW OR CS_VREDRAW
.lpfnWndProc = PROCPTR(WNDPROC)
.cbClsExtra = 0
.cbWndExtra = 0
.hInstance = GetModuleHandle(NULL)
.hCursor = LoadCursor(NULL, IDC_ARROW)
.hIcon = LoadIcon(NULL, IDI_APPLICATION)
.hbrBackground = GetSysColorBrush(COLOR_WINDOW)
.lpszClassName = STRPTR(ProgrammName)
.lpszMenuName = NULL
END WITH
RegisterClass @wndcls
DIM AS HWND hWnd = CreateWindow(_
ProgrammName, ProgrammName, WS_OVERLAPPED OR WS_SYSMENU,_
CW_USEDEFAULT, CW_USEDEFAULT, 180, 210,_
NULL, NULL, GetModuleHandle(NULL), NULL)
ShowWindow hWnd, SW_NORMAL
UpdateWindow hWnd
DIM AS MSG msg
DO WHILE getmessage(@msg, NULL, 0, 0) <> 0
DispatchMessage @msg
LOOP
' END msg.wParam
FUNCTION WNDPROC(BYVAL hWnd AS HWND, BYVAL message AS UINTEGER,_
BYVAL wParam AS WPARAM, BYVAL lParam AS LPARAM) AS LRESULT
STATIC AS HWND hDame, hBitmap
SELECT CASE message
CASE WM_DESTROY
PostQuitMessage 0
RETURN 0
CASE WM_CREATE
hBitmap= LoadImage (GetModuleHandle (NULL), "Dame.bmp",_
IMAGE_BITMAP,0, 0,LR_DEFAULTCOLOR OR LR_LOADFROMFILE)
hDame = CreateWindow("button", NULL,_
WS_CHILD OR WS_VISIBLE OR BS_PUSHBUTTON OR BS_BITMAP,_
5, 5, 60, 60, hWnd, NULL,_
CAST(LPCREATESTRUCT,lParam)->hInstance,NULL)
SendMessage hDame, BM_SETIMAGE, IMAGE_BITMAP, hBitmap
RETURN 0
END SELECT
RETURN DefWindowProc( hWnd, message, wParam, lParam )
END FUNCTION |
Der Quellcode funktioniert soweit und es wird auch die Grafik angezeigt, aber ich bekomme noch eine Compilermeldung!
Zitat: | Passing pointer to scalar, at parameter 4 of SENDMESSAGE() |
Den Fehler habe ich noch nicht beheben können. Immerhin klappt das schon mal! Kann man Teile der Grafik auf dem Button, Transparent machen? Ist aber nicht tragisch, da ich zur Not einfach nochmal Grafiken erstelle.
Danke an alle die mir geholfen haben!
Gruß
ALWIM _________________ SHELL SHUTDOWN -s -t 05 |
|
Nach oben |
|
|
grindstone
Anmeldungsdatum: 03.10.2010 Beiträge: 1220 Wohnort: Ruhrpott
|
Verfasst am: 22.03.2016, 11:12 Titel: |
|
|
Hallo ALWIM!
Das ist kein Fehler im eigentlichen Sinn, sondern nur eine Warnmeldung. Abhilfe schafft passendes Casten des Parameters: Code: | SendMessage hDame, BM_SETIMAGE, IMAGE_BITMAP, Cast(lParam,hBitmap) |
Und transparent bekommst du eine Grafik, indem du den gewünschten Stellen die Farbe RGB(255,0,255) gibst.
Gruß
grindstone _________________ For ein halbes Jahr wuste ich nich mahl wie man Proggramira schreibt. Jetzt bin ich einen! |
|
Nach oben |
|
|
ALWIM
Anmeldungsdatum: 08.08.2006 Beiträge: 1041 Wohnort: Niederbayern
|
Verfasst am: 22.03.2016, 16:33 Titel: |
|
|
grindstone hat Folgendes geschrieben: | Hallo ALWIM!
Das ist kein Fehler im eigentlichen Sinn, sondern nur eine Warnmeldung. Abhilfe schafft passendes Casten des Parameters: Code: | SendMessage hDame, BM_SETIMAGE, IMAGE_BITMAP, Cast(lParam,hBitmap) |
Und transparent bekommst du eine Grafik, indem du den gewünschten Stellen die Farbe RGB(255,0,255) gibst.
Gruß
grindstone |
Dass das nur eine Warnung ist, war mir klar. Das mit der Farbe funktioniert irgendwie nicht? Zumindest hat die Bilddatei genau dieses RGB(255,0,255). Kann es sein, dass man noch einen entsprechenden Parameter für Transparent mit angeben muss? Irgendwas habe ich da im Netz gelesen. Kann mich aber auch täuschen.
Was mich auch noch ein wenig stört, ist dass das Buttonfenster hinter dem eigentlichen Hauptfenster verschwindet. Und das auch noch versetzt!
Ich habe schon mal in der WinApi-Referenz nach einem passenden Befehl geschaut, aber nichts gefunden. Ideal wäre es, wenn das Buttonfenster mittig und oben auf, zum mit "Screenres" erstellten Hauptfenster geöffnet wird. Sonst aber, funktioniert das ganze hervorragend! _________________ SHELL SHUTDOWN -s -t 05 |
|
Nach oben |
|
|
micha
Anmeldungsdatum: 09.12.2005 Beiträge: 72
|
Verfasst am: 22.03.2016, 19:32 Titel: |
|
|
Schon FLTK ausprobiert ?
Sieht recht einfach aus.
Ein Button: Code: | #include "fltk-c.bi"
var win = Fl_WindowNew(320,200,"Button") ' erzeuge fenster
var btn = Fl_ButtonNew(80,80,48,48,"OK") ' ein button mit text
Fl_WindowShow win ' zeige fenster
Fl_Run ' läuft bis fenster geschlossen wird |
Ein Button mit Bild: Code: | #include "fltk-c.bi"
var win = Fl_WindowNew(320,200,"Image-Button") ' erzeuge fenster
var btn = Fl_ButtonNew(80,80,48,48) ' ein button
var img = Fl_PNG_ImageNew("Button32x32.png") ' ein bild (bmp,gif,png,jpg ...)
Fl_WidgetSetImage btn,img ' setze bild im button
Fl_WindowShow win ' zeige fenster
Fl_Run ' läuft bis fenster geschlossen wird | Ein Button mit Text und Bild: Code: | #include "fltk-c.bi"
var win = Fl_WindowNew(320,200,"Text-Image-Button")
var btn = Fl_ButtonNew(80,80,48,48,"OK") ' ein button mit text (text ist optional)
var img = Fl_PNG_ImageNew("Button32x32.png") ' ein bild (bmp,gif,png,jpg ...)
Fl_WidgetSetImage btn,img ' setze bild unter dem text
Fl_WidgetSetAlign btn,FL_ALIGN_IMAGE_BACKDROP ' bild ist nun hinter dem text
Fl_WindowShow win
Fl_Run |
|
|
Nach oben |
|
|
ALWIM
Anmeldungsdatum: 08.08.2006 Beiträge: 1041 Wohnort: Niederbayern
|
Verfasst am: 22.03.2016, 19:43 Titel: |
|
|
micha hat Folgendes geschrieben: | Schon FLTK ausprobiert ?
Sieht recht einfach aus.
Ein Button: Code: | #include "fltk-c.bi"
var win = Fl_WindowNew(320,200,"Button") ' erzeuge fenster
var btn = Fl_ButtonNew(80,80,48,48,"OK") ' ein button mit text
Fl_WindowShow win ' zeige fenster
Fl_Run ' läuft bis fenster geschlossen wird |
Ein Button mit Bild: Code: | #include "fltk-c.bi"
var win = Fl_WindowNew(320,200,"Image-Button") ' erzeuge fenster
var btn = Fl_ButtonNew(80,80,48,48) ' ein button
var img = Fl_PNG_ImageNew("Button32x32.png") ' ein bild (bmp,gif,png,jpg ...)
Fl_WidgetSetImage btn,img ' setze bild im button
Fl_WindowShow win ' zeige fenster
Fl_Run ' läuft bis fenster geschlossen wird | Ein Button mit Text und Bild: Code: | #include "fltk-c.bi"
var win = Fl_WindowNew(320,200,"Text-Image-Button")
var btn = Fl_ButtonNew(80,80,48,48,"OK") ' ein button mit text (text ist optional)
var img = Fl_PNG_ImageNew("Button32x32.png") ' ein bild (bmp,gif,png,jpg ...)
Fl_WidgetSetImage btn,img ' setze bild unter dem text
Fl_WidgetSetAlign btn,FL_ALIGN_IMAGE_BACKDROP ' bild ist nun hinter dem text
Fl_WindowShow win
Fl_Run |
| Nein, FLTK habe ich noch nicht getestet. Wie führe ich da eine Funktion aus, nach einem Klick auf den Button (Umwandlung in eine andere Figur beim Schach)? Mein Programm mit WinApi funktioniert. Deswegen will ich jetzt ungern eine andere Möglichkeit verwenden! Aber danke für den Hinweiß!
Edit:
Habe es mir fast gedacht! FLTK funktioniert mit Linux!!! Da will jemand auf Linux Schach spielen... Oder warum versucht man, dass ich was plattformübergreifendes nehme?
Gruß
ALWIM _________________ SHELL SHUTDOWN -s -t 05 |
|
Nach oben |
|
|
nemored
Anmeldungsdatum: 22.02.2007 Beiträge: 4609 Wohnort: ~/
|
Verfasst am: 22.03.2016, 20:57 Titel: |
|
|
Ojeoje, FreeBASIC funktioniert ebenfalls mit Linux. Schnell umsteigen. _________________ Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1. |
|
Nach oben |
|
|
grindstone
Anmeldungsdatum: 03.10.2010 Beiträge: 1220 Wohnort: Ruhrpott
|
Verfasst am: 23.03.2016, 16:38 Titel: |
|
|
@ALWIM:
Entschuldige, da habe ich jetzt etwas durcheinandergeworfen. Die Transparentfarbe RGB(255,0,255) gilt für die FB - Grafikfunktionen, nicht für die WinAPI. Der Parameter, den du meinst, ist LR_LOADTRANSPARENT, aber der funktioniert nur, wenn die Bitmap - Datei die passende Farbtabelle hat. Ich habe mir mal den Spass gemacht, diese Funktion für TrueColor - Bitmaps nachzubauen.
Zitat: | Was mich auch noch ein wenig stört, ist dass das Buttonfenster hinter dem eigentlichen Hauptfenster verschwindet. Und das auch noch versetzt!
Ich habe schon mal in der WinApi-Referenz nach einem passenden Befehl geschaut, aber nichts gefunden. Ideal wäre es, wenn das Buttonfenster mittig und oben auf, zum mit "Screenres" erstellten Hauptfenster geöffnet wird. |
Bitte sehr, auch das ist kein Problem. Ich poste der Einfachheit halber mal den ganzen Code: Code: | #Include "windows.bi"
Declare Function WNDPROC(ByVal hWnd As HWND, ByVal message As UInteger,_
ByVal wParam As WPARAM, ByVal lParam As LPARAM) As LRESULT
Const ProgrammName = "Umwandlung"
Dim As ZString * 1000 text
GetModuleFileName(GetModuleHandle(0),@text,300) 'dateiname dieses programms mit pfad
text = Left(text,InStr(text,".")-1) 'dateierweiterung abtrennen
text = Mid(text,InStrRev(text,Any "/\")+1) 'pfad abtrennen --> 'text' enthält den namen dieses programms
ScreenRes 500,500 'grafikscreen öffnen
Dim Shared As HWND hWndFenster
hWndFenster = FindWindow(0,text) 'fensterhandle des grafikfensters ermitteln (über den namen des fensters)
Dim Shared As RECT fensterPos
GetWindowRect(hWndFenster,@fensterPos) 'position des grafikfensters ermitteln
Dim As WNDCLASS wndcls
With wndcls
.style = CS_HREDRAW Or CS_VREDRAW
.lpfnWndProc = ProcPtr(WNDPROC)
.cbClsExtra = 0
.cbWndExtra = 0
.hInstance = GetModuleHandle(NULL)
.hCursor = LoadCursor(NULL, IDC_ARROW)
.hIcon = LoadIcon(NULL, IDI_APPLICATION)
.hbrBackground = GetSysColorBrush(COLOR_WINDOW)
.lpszClassName = StrPtr(ProgrammName)
.lpszMenuName = NULL
End With
RegisterClass @wndcls
Dim As HWND hWnd = CreateWindow(_
ProgrammName, ProgrammName, WS_OVERLAPPED Or WS_SYSMENU,_
fensterPos.left + 50, fensterPos.top -210, 180, 210,_ 'fenster oberhalb des grafikfensters positionieren
NULL, NULL, GetModuleHandle(NULL), NULL)
ShowWindow hWnd, SW_NORMAL
UpdateWindow hWnd
Dim As MSG msg
Do While getmessage(@msg, NULL, 0, 0) <> 0
DispatchMessage @msg
Loop
' END msg.wParam
Function WNDPROC(ByVal hWnd As HWND, ByVal message As UInteger,_
ByVal wParam As WPARAM, ByVal lParam As LPARAM) As LRESULT
Static As HWND hDame, hBitmap
Select Case message
Case WM_DESTROY
PostQuitMessage 0
Return 0
Case WM_CREATE
Dim As BITMAPINFOHEADER tbm
'imageheader aus file einlesen
Dim As Integer ff = FreeFile
Open "Dame.bmp" For Binary Access Read As #ff
Dim As String g = Input(14,ff) 'fileheader (14 bytes) überlesen
g = Input(SizeOf(tbm),ff) 'imageheader als string einlesen
Close #ff
Dim As BITMAPINFOHEADER Ptr p = Cast(BITMAPINFOHEADER Ptr,StrPtr(g)) 'pointer auf string mit imageheader setzen
tbm = *p 'string nach tbm übertragen
Dim As UInteger Ptr bild = Callocate(tbm.biWidth * tbm.biHeight * 32) 'puffer für image erstellen
Dim As BITMAPINFO bminfo
Dim As HDC gdc = GetDC(NULL)
Dim As HDC bitmap_dc = CreateCompatibleDC(gdc)
Dim As HBITMAP hBitmap = CreateCompatibleBitmap(gdc, tbm.biWidth, tbm.biHeight)
Dim As HGDIOBJ objectHandle = SelectObject(bitmap_dc, hBitmap)
hBitmap = LoadImage (GetModuleHandle (NULL), "Dame.bmp",_
IMAGE_BITMAP,0, 0,LR_DEFAULTCOLOR Or LR_LOADFROMFILE)
With bminfo.bmiHeader
.biSize = SizeOf(BITMAPINFOHEADER)
.biWidth = tbm.biWidth
.biHeight = -tbm.biHeight
.biPlanes = tbm.biPlanes
.biBitCount = 32
End With
GetDIBits(bitmap_dc,hBitmap,0,tbm.biHeight,bild,@bminfo,DIB_RGB_COLORS) 'image in puffer kopieren
Dim As UInteger hintergrundfarbe = GetSysColor(COLOR_WINDOW) 'hintergrundfarbe des fensters
Dim As UInteger transparenzfarbe = bild[0] 'farbe des ersten pixels (oben links) des images als transparenzfarbe
For x As Integer = 0 To (tbm.biWidth * tbm.biHeight) 'transparenzfarbe durch hintergrundfarbe ersetzen
If bild[x] = transparenzfarbe Then
bild[x] = hintergrundfarbe
EndIf
Next
SetDIBits(bitmap_dc,hBitmap,0,60,bild,@bminfo,DIB_RGB_COLORS) 'puffer in image kopieren
hDame = CreateWindow("button", NULL,_
WS_CHILD Or WS_VISIBLE Or BS_PUSHBUTTON Or BS_BITMAP,_
5, 5, 60, 60, hWnd, NULL,_
Cast(LPCREATESTRUCT,lParam)->hInstance,NULL)
SendMessage hDame, BM_SETIMAGE, IMAGE_BITMAP, Cast(lParam,hBitmap)
SetForegroundWindow(hWnd) '"button" als vordergrundfenster setzen
Return 0
End Select
Return DefWindowProc( hWnd, message, wParam, lParam )
End Function | Das genaue Positionieren des Fensters überlasse ich dir.
Gruß
grindstone _________________ For ein halbes Jahr wuste ich nich mahl wie man Proggramira schreibt. Jetzt bin ich einen!
Zuletzt bearbeitet von grindstone am 24.03.2016, 10:42, insgesamt einmal bearbeitet |
|
Nach oben |
|
|
Jojo alter Rang
Anmeldungsdatum: 12.02.2005 Beiträge: 9736 Wohnort: Neben der Festplatte
|
Verfasst am: 23.03.2016, 20:12 Titel: |
|
|
Zitat: | Dim As UInteger hintergrundfarbe = GetSysColor(COLOR_WINDOW) |
Das ist die falsche Farbkonstante für Buttons, und es funktioniert natürlich nicht mit Buttons im Luna- und Aero-Stil, da diese Farbverläufe enthalten.
Sinnvoller wäre es, direkt 32-Bit-Bitmaps mit Alphakanal zu verwenden.
Wenn man kein passendes Tool hat, um solche BMPs zu erstellen, tut's auch ein PNG und ein Konverter-Tool. _________________ » Die Mathematik wurde geschaffen, um Probleme zu lösen, die es nicht gäbe, wenn die Mathematik nicht erschaffen worden wäre.
|
|
Nach oben |
|
|
ALWIM
Anmeldungsdatum: 08.08.2006 Beiträge: 1041 Wohnort: Niederbayern
|
Verfasst am: 23.03.2016, 22:44 Titel: |
|
|
Zitat: | @ALWIM:
Entschuldige, da habe ich jetzt etwas durcheinandergeworfen. |
Kein Problem! Kann vorkommen.
Die Positon des Fensters kann man zwar jetzt angeben, doch es verschwindet hinter dem eigentlichen Hauptfenster! Es soll wenn möglich, sichtbar vor dem anderen sein. Ich habe noch nicht gleich die Stelle gefunden, wo die Position des Fensters realisiert wird.
Sind das die beiden Zeilen, die für die Realisierung der Position sorgen?
Code: | Dim Shared As RECT fensterPos
GetWindowRect(hWndFenster,@fensterPos) |
Wo man die Position des Fensters angibt ist mir klar. Aber wofür sind dann diese Zeilen:
Code: | Dim As ZString * 1000 text
GetModuleFileName(GetModuleHandle(0),@text,300) 'dateiname mit pfad
text = Left(text,InStr(text,".")-1)
text = Mid(text,InStrRev(text,Any "/\")+1)
|
Code: | Dim Shared As HWND hWndFenster
hWndFenster = FindWindow(0,text) |
Man müsste das Nebenfenster direkt zum Hauptfenster machen können. Dann würde es man auch sehen und verschwindet nicht hinterm bzw. unterm anderen Fenster.
Ich meinte eigentlich diesen Befehl zwecks Transparenz:
_________________ SHELL SHUTDOWN -s -t 05 |
|
Nach oben |
|
|
grindstone
Anmeldungsdatum: 03.10.2010 Beiträge: 1220 Wohnort: Ruhrpott
|
Verfasst am: 24.03.2016, 11:44 Titel: |
|
|
@ALWIM:
Ich sollte die gute alte Tradition beibehalten, meine Programme ausführlich zu kommentieren. Ich habe das nachgeholt und den geposteten Code ersetzt. Ich hoffe, das beantwortet deine Fragen.
@Jojo:
Zitat: | Sinnvoller wäre es, direkt 32-Bit-Bitmaps mit Alphakanal zu verwenden. | Interessanter Ansatz, aber ich bin mir nicht sicher, ob das so funktionieren würde. Beim Aufdröseln des internen Grafikformats habe ich gesehen, daß der Alphakanal bei allen Farbwerten 0 ist, das Image müsste also eigentlich komplett durchsichtig sein.
Ich habe es gerade einmal ausprobiert, der Alpha - Wert im internen Image - Speicher hat keinen Einfluss auf die Darstellung.
Aber da du gerade dabei bist, mein Wissen zu erweitern: Kannst du mir sagen, warum im o.g. Code Code: | GetDIBits(bitmap_dc,hBitmap,0,tbm.biHeight,NULL,@bminfo,DIB_RGB_COLORS) | nicht funktioniert? Laut Beschreibung müsste dieser Befehl (wenn ich es richtig verstanden habe) Format und Größe des Images in bminfo schreiben. Es passiert jedoch gar nichts.
Gruß
grindstone
EDIT: Es nutzt auch nichts, ein Image mit Alpha - Kanal zu laden. Der Alpha - Wert wird komplett ignoriert. _________________ For ein halbes Jahr wuste ich nich mahl wie man Proggramira schreibt. Jetzt bin ich einen! |
|
Nach oben |
|
|
grindstone
Anmeldungsdatum: 03.10.2010 Beiträge: 1220 Wohnort: Ruhrpott
|
Verfasst am: 25.03.2016, 12:27 Titel: |
|
|
So, das Problem mit den Formatinformationen habe ich jetzt auch gelöst, der Workaround über das Auslesen aus der Imagedatei ist nicht mehr erforderlich.
Code: | #Include "windows.bi"
Declare Function WNDPROC(ByVal hWnd As HWND, ByVal message As UInteger,_
ByVal wParam As WPARAM, ByVal lParam As LPARAM) As LRESULT
Const ProgrammName = "Umwandlung"
Dim As ZString * 1000 text
GetModuleFileName(GetModuleHandle(0),@text,300) 'dateiname dieses programms mit pfad
text = Left(text,InStr(text,".")-1) 'dateierweiterung abtrennen
text = Mid(text,InStrRev(text,Any "/\")+1) 'pfad abtrennen --> 'text' enthält den namen dieses programms
ScreenRes 500,500 'grafikscreen öffnen
Dim Shared As HWND hWndFenster
hWndFenster = FindWindow(0,text) 'fensterhandle des grafikfensters ermitteln (über den namen des fensters)
Dim Shared As RECT fensterPos
GetWindowRect(hWndFenster,@fensterPos) 'position des grafikfensters ermitteln
Dim As WNDCLASS wndcls
With wndcls
.style = CS_HREDRAW Or CS_VREDRAW
.lpfnWndProc = ProcPtr(WNDPROC)
.cbClsExtra = 0
.cbWndExtra = 0
.hInstance = GetModuleHandle(NULL)
.hCursor = LoadCursor(NULL, IDC_ARROW)
.hIcon = LoadIcon(NULL, IDI_APPLICATION)
.hbrBackground = GetSysColorBrush(COLOR_WINDOW)
.lpszClassName = StrPtr(ProgrammName)
.lpszMenuName = NULL
End With
RegisterClass @wndcls
Dim As HWND hWnd = CreateWindow(_
ProgrammName, ProgrammName, WS_OVERLAPPED Or WS_SYSMENU,_
fensterPos.left + 50, fensterPos.top -210, 180, 210,_ 'fenster oberhalb des grafikfensters positionieren
NULL, NULL, GetModuleHandle(NULL), NULL)
ShowWindow hWnd, SW_NORMAL
UpdateWindow hWnd
Dim As MSG msg
Do While getmessage(@msg, NULL, 0, 0) <> 0
DispatchMessage @msg
Loop
' END msg.wParam
Function WNDPROC(ByVal hWnd As HWND, ByVal message As UInteger,_
ByVal wParam As WPARAM, ByVal lParam As LPARAM) As LRESULT
Static As HWND hDame, hBitmap
Select Case message
Case WM_DESTROY
PostQuitMessage 0
Return 0
Case WM_CREATE
Dim As BITMAPINFOHEADER tbm
hBitmap = LoadImage (GetModuleHandle (NULL), "Dame.bmp",_
IMAGE_BITMAP,0, 0,LR_DEFAULTCOLOR Or LR_LOADFROMFILE)
Dim As BITMAPINFO bminfo
Dim As HDC gdc = GetDC(NULL)
Dim As HDC bitmap_dc = CreateCompatibleDC(gdc)
tbm.biSize = SizeOf(tbm)
GetDIBits(bitmap_dc,Cast(HBITMAP,hBitmap),0,0,0,Cast(BITMAPINFO Ptr,@tbm),DIB_RGB_COLORS) 'formatinformationen des images in tbm laden
Dim As UInteger Ptr bild = Callocate(tbm.biWidth * tbm.biHeight * tbm.biBitCount / 8) 'puffer für image erstellen
With bminfo.bmiHeader
.biSize = SizeOf(BITMAPINFOHEADER)
.biWidth = tbm.biWidth
.biHeight = -tbm.biHeight
.biPlanes = tbm.biPlanes
.biBitCount = tbm.biBitCount
End With
GetDIBits(bitmap_dc,Cast(HBITMAP,hBitmap),0,tbm.biHeight,bild,@bminfo,DIB_RGB_COLORS) 'image in puffer kopieren
Dim As UInteger hintergrundfarbe = GetSysColor(COLOR_WINDOW) 'hintergrundfarbe des fensters
Dim As UInteger transparenzfarbe = bild[0] 'farbe des ersten pixels (oben links) des images als transparenzfarbe
For x As Integer = 0 To (tbm.biWidth * tbm.biHeight) 'transparenzfarbe durch hintergrundfarbe ersetzen
If bild[x] = transparenzfarbe Then
bild[x] = hintergrundfarbe
EndIf
Next
SetDIBits(bitmap_dc,Cast(HBITMAP,hBitmap),0,tbm.biHeight,bild,@bminfo,DIB_RGB_COLORS) 'puffer in image kopieren
DeAllocate bild 'speicher freigeben
hDame = CreateWindow("button", NULL,_
WS_CHILD Or WS_VISIBLE Or BS_PUSHBUTTON Or BS_BITMAP,_
5, 5, 60, 60, hWnd, NULL,_
Cast(LPCREATESTRUCT,lParam)->hInstance,NULL)
SendMessage hDame, BM_SETIMAGE, IMAGE_BITMAP, Cast(lParam,hBitmap)
SetForegroundWindow(hWnd) '"button" als vordergrundfenster setzen
Return 0
End Select
Return DefWindowProc( hWnd, message, wParam, lParam )
End Function |
Gruß
grindstone _________________ For ein halbes Jahr wuste ich nich mahl wie man Proggramira schreibt. Jetzt bin ich einen! |
|
Nach oben |
|
|
|
|
Du kannst keine Beiträge in dieses Forum schreiben. Du kannst auf Beiträge in diesem Forum nicht antworten. Du kannst deine Beiträge in diesem Forum nicht bearbeiten. Du kannst deine Beiträge in diesem Forum nicht löschen. Du kannst an Umfragen in diesem Forum nicht mitmachen.
|
|