Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht Das deutsche QBasic- und FreeBASIC-Forum
Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
 
FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen  RegistrierenRegistrieren
ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin
Zur Begleitseite des Forums / Chat / Impressum
Aktueller Forenpartner:

benutzerdefinierte Buttons?

 
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Allgemeine Fragen zu FreeBASIC.
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
ALWIM



Anmeldungsdatum: 08.08.2006
Beiträge: 1037
Wohnort: Niederbayern

BeitragVerfasst am: 21.03.2016, 13:54    Titel: benutzerdefinierte Buttons? Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
Haubitze



Anmeldungsdatum: 14.10.2009
Beiträge: 132

BeitragVerfasst am: 21.03.2016, 14:01    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
ALWIM



Anmeldungsdatum: 08.08.2006
Beiträge: 1037
Wohnort: Niederbayern

BeitragVerfasst am: 21.03.2016, 15:14    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
nemored



Anmeldungsdatum: 22.02.2007
Beiträge: 4594
Wohnort: ~/

BeitragVerfasst am: 21.03.2016, 16:47    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
St_W



Anmeldungsdatum: 22.07.2007
Beiträge: 949
Wohnort: Austria

BeitragVerfasst am: 21.03.2016, 17:04    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
ALWIM



Anmeldungsdatum: 08.08.2006
Beiträge: 1037
Wohnort: Niederbayern

BeitragVerfasst am: 21.03.2016, 17:15    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
Jojo
alter Rang


Anmeldungsdatum: 12.02.2005
Beiträge: 9736
Wohnort: Neben der Festplatte

BeitragVerfasst am: 21.03.2016, 17:28    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
St_W



Anmeldungsdatum: 22.07.2007
Beiträge: 949
Wohnort: Austria

BeitragVerfasst am: 21.03.2016, 18:01    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
ALWIM



Anmeldungsdatum: 08.08.2006
Beiträge: 1037
Wohnort: Niederbayern

BeitragVerfasst am: 21.03.2016, 23:48    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
grindstone



Anmeldungsdatum: 03.10.2010
Beiträge: 1208
Wohnort: Ruhrpott

BeitragVerfasst am: 22.03.2016, 10:12    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
ALWIM



Anmeldungsdatum: 08.08.2006
Beiträge: 1037
Wohnort: Niederbayern

BeitragVerfasst am: 22.03.2016, 15:33    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
micha



Anmeldungsdatum: 09.12.2005
Beiträge: 72

BeitragVerfasst am: 22.03.2016, 18:32    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
ALWIM



Anmeldungsdatum: 08.08.2006
Beiträge: 1037
Wohnort: Niederbayern

BeitragVerfasst am: 22.03.2016, 18:43    Titel: Antworten mit Zitat

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. happy 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... grinsen Oder warum versucht man, dass ich was plattformübergreifendes nehme?

Gruß
ALWIM
_________________
SHELL SHUTDOWN -s -t 05
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
nemored



Anmeldungsdatum: 22.02.2007
Beiträge: 4594
Wohnort: ~/

BeitragVerfasst am: 22.03.2016, 19:57    Titel: Antworten mit Zitat

Ojeoje, FreeBASIC funktioniert ebenfalls mit Linux. Schnell umsteigen. Zunge rausstrecken
_________________
Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
grindstone



Anmeldungsdatum: 03.10.2010
Beiträge: 1208
Wohnort: Ruhrpott

BeitragVerfasst am: 23.03.2016, 15:38    Titel: Antworten mit Zitat

@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. zwinkern
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, 09:42, insgesamt einmal bearbeitet
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
Jojo
alter Rang


Anmeldungsdatum: 12.02.2005
Beiträge: 9736
Wohnort: Neben der Festplatte

BeitragVerfasst am: 23.03.2016, 19:12    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
ALWIM



Anmeldungsdatum: 08.08.2006
Beiträge: 1037
Wohnort: Niederbayern

BeitragVerfasst am: 23.03.2016, 21:44    Titel: Antworten mit Zitat

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:

Code:
WS_EX_TRANSPARENT

_________________
SHELL SHUTDOWN -s -t 05
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
grindstone



Anmeldungsdatum: 03.10.2010
Beiträge: 1208
Wohnort: Ruhrpott

BeitragVerfasst am: 24.03.2016, 10:44    Titel: Antworten mit Zitat

@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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
grindstone



Anmeldungsdatum: 03.10.2010
Beiträge: 1208
Wohnort: Ruhrpott

BeitragVerfasst am: 25.03.2016, 11:27    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Allgemeine Fragen zu FreeBASIC. Alle Zeiten sind GMT + 1 Stunde
Seite 1 von 1

 
Gehe zu:  
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.

 Impressum :: Datenschutz