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:

ComboBox mit Bildern

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



Anmeldungsdatum: 08.08.2006
Beiträge: 1783
Wohnort: BW/KA

BeitragVerfasst am: 05.03.2014, 12:37    Titel: ComboBox mit Bildern Antworten mit Zitat

Ich suche Verzweifelt einen Weg Vorschaubilder in einem DropDown Gadget unter zu bringen wie sowas zB

Habe bisher aber leider noch kein hilfreiches Beispiel gefunden das auch richtig funktioniert...
_________________
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen MSN Messenger
Jojo
alter Rang


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

BeitragVerfasst am: 06.03.2014, 00:25    Titel: Antworten mit Zitat

Das Stichwort heißt bei sowas unter Win32 grundsätzlich owner-draw.
_________________
» 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
Eternal_pain



Anmeldungsdatum: 08.08.2006
Beiträge: 1783
Wohnort: BW/KA

BeitragVerfasst am: 06.03.2014, 03:13    Titel: Antworten mit Zitat

Das habe ich schon mehrfach gelesen und das Beispiel ist mehr als unübersichtlich finde ich...

Ich erstelle ein fenster mit eigenem proc... soweit so gut... und schon is ende.. ich seh im beispiel nicht wo wirklich die combobox verständlich umgesetzt wird... lauter resourcen, die ich nicht habe... und IDCOMBO ist nirgendwo dabei...
_________________
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen MSN Messenger
Jojo
alter Rang


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

BeitragVerfasst am: 06.03.2014, 04:09    Titel: Antworten mit Zitat

Deine Combobox kann auch beliebig anders heißen. Solange du eine Combobox in deiner Ressourcendatei hast, kannst du sie auch beliebig anders nennen und dann halt die passenden defines verwenden. Ansonsten, falls du deine Combobox dynamisch erstellst und nicht per Ressource, musst du halt die passenden Funktionen verwenden, z.B. SendMessage mit dem HWND der Combobox statt SendDlgItemMessage mit HWND des Fensters + Resource ID der Combobox. Das läuft bei allen WinAPI-Programmen exakt nach dem gleichen Schema. Man muss halt die Dokumentation zu den ganzen Funktionen lesen, um sie zu verstehen und übertragen zu können.
_________________
» 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
Eternal_pain



Anmeldungsdatum: 08.08.2006
Beiträge: 1783
Wohnort: BW/KA

BeitragVerfasst am: 06.03.2014, 04:48    Titel: Antworten mit Zitat

Ich finde nur nicht viel das wirklich hilft, insbesondere die beispiele und das meiste was ich mit google finde ist für .net

Code:

Function test(hwnd as HWND, msg as UINT, wParam as WPARAM, lParam as LPARAM) as LRESULT
    ?msg
    return 0
End Function

Dim as Integer Style = CBS_DROPDOWN OR CBS_HASSTRINGS OR WS_CHILD OR WS_OVERLAPPED OR WS_VISIBLE OR CBS_OWNERDRAWFIXED
Dim as HWND hWndComboBox = CreateWindow(WC_COMBOBOX, "", Style, 10, 10, 200, 200, hwnd, NULL, 0, NULL)

Dim as WNDPROC lpfnEditWndProc
Dim as Function(hwnd as HWND, msg as UINT, wParam as WPARAM, lParam as LPARAM) as LRESULT proc = @test()

lpfnEditWndProc = SetWindowLong(hWndComboBox, GWL_WNDPROC, Cast(long,proc))

SendMessage(hWndComboBox, CB_ADDSTRING, 0, cast(integer,strptr("test")))


Das geht soweit schon (bis auf ein suspicious pointer...)
Erstelle eine ComboBox als Child, weiße den ein eigenen Proc zu und dort kommen messages an...

Edit:
Jetzt habe ich es immerhin hinbekommen das er mir ein Item anzeigt in gewünschter größe.. aber ich hab immernoch nicht kapiert, wie ich die items eigentlich richtig initialisiere und entsprechend auch mehr als nur ein item gelistet wird.. auch wird mir das item nicht als auswahl angezeigt und irgendwie ist die box jetzt editable...

Code:
Function test(hwnd as HWND, msg as UINT, wParam as WPARAM, lParam as LPARAM) as LPARAM
    Select Case msg
        Case WM_INITDIALOG
            ?"ComboBox Init()"

            return TRUE
        Case WM_MEASUREITEM
            Dim as LPMEASUREITEMSTRUCT lpmis = cast(LPMEASUREITEMSTRUCT, lParam)
            lpmis->ctlType = ODT_COMBOBOX
            lpmis->itemwidth = 500
            lpmis->itemHeight = 68
           
            ?"????"
            return TRUE
        Case WM_DRAWITEM
            Dim as LPDRAWITEMSTRUCT lpdis = cast(LPDRAWITEMSTRUCT, lParam)
            Dim as HDC hdc = CreateCompatibleDC(lpdis->hDC)
            Dim as HBITMAP Image = Load_Image("test.bmp")
           
            SelectObject(hdc, Image)
                BitBlt(lpdis->hDC, 0, 0, 500, 68, hdc, 0, 0, SRCAND)           
            DeleteDC(hdc)
        Case WM_COMMAND:
             
            ?LOWORD(wParam)
            Select Case LOWORD(wParam)
                Case 1001'???
                    ?"Hier passiert irgendwas"
                    'SendMessage(hwnd, CB_ADDSTRING, 0, cast(integer,strptr("test")))
                    'SendMessage(hwnd, CB_SETCURSEL, 0, 1)
                   
            End Select
               
    End Select
   
    return FALSE
End Function


Habs nu glaub halbwegs hinbekommen...


Jetzt brauch ich blos noch eine Funktion um fb.Images zu HBitmaps convertieren zu können lächeln
_________________
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen MSN Messenger
Eternal_pain



Anmeldungsdatum: 08.08.2006
Beiträge: 1783
Wohnort: BW/KA

BeitragVerfasst am: 06.03.2014, 10:43    Titel: Antworten mit Zitat

Ein Problem gelöst da kommt auch schon das nächste...
Ich hab zusammen mit der windows9 lib nun ein laufendes Beispiel zusammengebastelt... aber jetzt ist es halt so das EINE Combobox in der WindowProc verarbeitet wird...
Was muss ich nun anstellen wenn ich mehrere Handlen möchte?

Code:

# Include "window9.bi"
Declare Function test(hwnd as HWND, msg as UINT, wParam as WPARAM, lParam as LPARAM) as LPARAM

Dim Shared as HBITMAP Image(0 to 3)




                                       
'Dim as Integer Style = WS_CHILD OR CBS_DROPDOWNLIST OR CBS_OWNERDRAWFIXED OR CBS_SORT OR CBS_HASSTRINGS OR WS_VSCROLL OR WS_TABSTOP OR WS_OVERLAPPEDWINDOW or WS_VISIBLE
Dim as HWND hwnd = OpenWindow ("SimpleSignatur (2014)", 100,100,800,600,WS_CAPTION OR WS_SYSMENU OR WS_MINIMIZEBOX OR WS_VISIBLE)
CenterWindow(hwnd)
SetWindowCallback (cast(Integer,@test()),0)

Function test(hwnd as HWND, msg as UINT, wParam as WPARAM, lParam as LPARAM) as LPARAM
    Select Case msg
        Case WM_INITDIALOG
            'will not used...
            return TRUE
        Case WM_MEASUREITEM
            'set
            Dim as LPMEASUREITEMSTRUCT lpmis = cast(LPMEASUREITEMSTRUCT, lParam)
            lpmis->ctlType = ODT_COMBOBOX
            lpmis->itemwidth = 510
            lpmis->itemHeight = 70
           
            return TRUE
        Case WM_DRAWITEM
            'draw
            Dim as LPDRAWITEMSTRUCT lpdis = cast(LPDRAWITEMSTRUCT, lParam)
            Dim as HDC hdc = CreateCompatibleDC(lpdis->hDC)

            If cast(Integer,lpdis->ItemID)>-1 Then
                SelectObject(hdc, Image(lpdis->ItemID)) 'select image
                    BitBlt(lpdis->hDC, 2, lpdis->rcItem.top, 500, 68, hdc, 0, 0, SRCAND) 'draw
                DeleteDC(hdc)
           
                if (lpdis->itemState AND ODS_FOCUS) Then DrawFocusRect(lpdis->hDC, @lpdis->rcItem) 'frame
            End IF
           
            Return TRUE
        Case WM_COMMAND
             
            Select Case LOWORD(wParam)
                Case 0
                '... dont know ...
            End Select
            Return TRUE
    End Select
   
    return FALSE
End Function


           

Dim as Integer Style = WS_CHILD OR WS_VISIBLE OR WS_CLIPCHILDREN OR WS_VSCROLL OR CBS_DROPDOWNLIST OR CBS_OWNERDRAWFIXED OR CBS_HASSTRINGS OR CBS_SORT
Dim as HWND hWndComboBox = CreateWindowEx(WS_EX_CLIENTEDGE, "Combobox", NULL, Style, 10, 10, 520, 500, hwnd, NULL, GetModuleHandle(NULL), NULL)

Dim ItemString as String                       
For i as Integer = 0 to 3
    Image(i)=Load_Image(str(i+1) & ".bmp")
    ItemString = str(i)
    SendMessage(hWndComboBox, CB_ADDSTRING, 0, cast(integer,strptr(ItemString)))
Next i           


Dim ev as Integer
Do
    ev = WaitEvent
    '?SendMessage(hWndComboBox, CB_GETCURSEL, 0, 0)

   
    sleep 10
Loop until (ev = EventClose)

_________________
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen MSN Messenger
Jojo
alter Rang


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

BeitragVerfasst am: 06.03.2014, 14:02    Titel: Antworten mit Zitat

Einfach nur rauskopieren hilft halt nicht. Wie schon so oft gesagt: Die MSDN ist eine super Dokumentation, für solche alltäglichen Probleme findet man da zu allem die Antwort. Eventuell fehlt dir da einfach noch die richtige Denkweise. Meine wäre hier jetzt "Hmm, ich möchte mit WM_DRAWITEM mehr als nur eine Combobox verwalten. Schauen wir doch mal in der MSDN nach, was WM_DRAWITEM für Parameter nimmt."

Also mal schnell die Doku dazu aufmachen: http://msdn.microsoft.com/en-us/library/windows/desktop/bb775923%28v=vs.85%29.aspx

Zitat:
wParam

Specifies the identifier of the control that sent the WM_DRAWITEM message. If the message was sent by a menu, this parameter is zero.


Könnte man verwenden, aber es ist nicht näher spezifiziert, was dieser identifier ist, evtl die resource ID oder ein HWND, denke ich. Also mal schauen, ob man mit dem DRAWITEMSTRUCT weiter kommt:

http://msdn.microsoft.com/en-us/library/windows/desktop/bb775802%28v=vs.85%29.aspx

Zitat:
hwndItem

Type: HWND

A handle to the control for combo boxes, list boxes, buttons, and static controls. For menus, this member is a handle to the menu that contains the item.

Bittesehr! Mit Lesen kommt man in der MSDN immer weiter.

BTW: Grade zur WinAPI findet man im Internet tausende Quellcodes in C, das könnte bis auf die Klammern FB nicht ähnlicher sein, was das Handling angeht.
_________________
» 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
Eternal_pain



Anmeldungsdatum: 08.08.2006
Beiträge: 1783
Wohnort: BW/KA

BeitragVerfasst am: 06.03.2014, 17:46    Titel: Antworten mit Zitat

Zitat:
BTW: Grade zur WinAPI findet man im Internet tausende Quellcodes in C, das könnte bis auf die Klammern FB nicht ähnlicher sein, was das Handling angeht.
Naja, man findet viel mehr in C#, VB.Net ect...

Naja, mit der Winapi war ich nie wirklich warm geworden... aber es klappt ja halbwegs.. mich stört hier halt ein wenig das die WindowProc das Zeichnen eines Gadgets übernimmt...
Aber das ist wohl hin zu bekommen... was ich nun aber auch noch habe...

Ich Zeichne einen rahmen um das Item das gerade Fokusiert ist:
Code:
if (lpdis->itemState AND ODS_FOCUS) Then DrawFocusRect(lpdis->hDC, @lpdis->rcItem)

Jetzt werden die anderen sichtbaren Items nur nicht alle neu gezeichnet und so habe ich wenn ich mit der Maus von oben nach unten fahre alle mit Rahmen... hab schon mit UpdateWindow versucht... suche auch nach etwas das wvtl alles neu zeichnet während es auf ist damit ich eben nur einen rahmen um das eine item ist das gerade im fokus ist...
_________________
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen MSN Messenger
Jojo
alter Rang


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

BeitragVerfasst am: 07.03.2014, 02:43    Titel: Antworten mit Zitat

Eternal_pain hat Folgendes geschrieben:
Naja, man findet viel mehr in C#, VB.Net ect...

Und selbst wenn - die Syntax ist anders, na und? WinAPI ist WinAPI.

Eternal_pain hat Folgendes geschrieben:
Naja, mit der Winapi war ich nie wirklich warm geworden... aber es klappt ja halbwegs.. mich stört hier halt ein wenig das die WindowProc das Zeichnen eines Gadgets übernimmt...

Du kannst natürlich auch deine ganzen Widgets in Klassen kapseln und dann jeweils auf diese Klassen eine Funktion OnDraw(DRAWITEMSTRUCT PTR) definieren, die aufgerufen wird, wenn das jeweilige Objekt gezeichnet werden soll - nichts anderes machen auch die ganzen Frameworks, die auf der WinAPI aufsetzen. Die WindowProc dient dann nur noch als Dispatcher für die einzelnen Objekte.

Zitat:
suche auch nach etwas das wvtl alles neu zeichnet während es auf ist damit ich eben nur einen rahmen um das eine item ist das gerade im fokus ist...

Du kannst mal versuchen, mit InvalidateRect jeweils den vorher markierten Eintrag zu invalidieren, sodass er neugezeichnet wird.
_________________
» 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
Eternal_pain



Anmeldungsdatum: 08.08.2006
Beiträge: 1783
Wohnort: BW/KA

BeitragVerfasst am: 07.03.2014, 03:17    Titel: Antworten mit Zitat

Jojo hat Folgendes geschrieben:
Du kannst natürlich auch deine ganzen Widgets in Klassen kapseln und dann jeweils auf diese Klassen eine Funktion OnDraw(DRAWITEMSTRUCT PTR) definieren, die aufgerufen wird, wenn das jeweilige Objekt gezeichnet werden soll - nichts anderes machen auch die ganzen Frameworks, die auf der WinAPI aufsetzen. Die WindowProc dient dann nur noch als Dispatcher für die einzelnen Objekte.


Für das Zeichnen (WM_DRAWITEM) geht das wohl, in der LPDRAWITEMSTRUCT ist ja das Handle.. bei den Boxen allerdings hab ich das Problem das die Größe zuerst angegeben werden muss in der WM_MEASUREITEM und hier bekomme ich kein Handle, ich kann mein Item nicht identifizieren um dort variable für jede Box eine größe angeben zu können... leider hab ich grad genau darauf aufgebaut peinlich
_________________
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen MSN Messenger
Jojo
alter Rang


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

BeitragVerfasst am: 07.03.2014, 14:55    Titel: Antworten mit Zitat

Auch bei WM_MEASUREITEM befindet sich die Control ID in wParam, d.h. du vergleichst diesen Parameter einfach mit der beim Erzeugen oder in der Ressource festgelegten ID (z.B. IDC_COMBO1).
_________________
» 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
Eternal_pain



Anmeldungsdatum: 08.08.2006
Beiträge: 1783
Wohnort: BW/KA

BeitragVerfasst am: 07.03.2014, 14:58    Titel: Antworten mit Zitat

das hatte ich schon gemacht, hab das handle als string übergeben und genutzt, problem dabei ist nach der initialisierung der box steht es auf -1 (kein item) und ohne item, keine info.. so bleibt die geschlossene box immer auf standardgröse... die items dagegen das klappt so super... aber halt blöd wenn man dann nur 1/3 des bildes in der auswahl sehen kann...

Edit:
Zitat:
...beim Erzeugen...

Das Problem wollte ich mit den Neuen Thread nun umgehen, ich hate bisher mit dieser windows9 lib gearbeitet und alle WM_CREATE Messages gingen an die ursprungs WndProc irgendwoe in den tiefen der Lib auf die ich keinen einfluss habe, die kann ich nicht abfangen wie in meinen neuen Versuch... dort werden die WindowDaten direkt mit vergeben so das ich von überall drauf zugreifen kann... das sollte solche Probleme wie hier eigentlich verhindern... vorrausgesetzt ich krieg es halbwegs zum laufen :S
_________________
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen MSN Messenger
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Windows-spezifische Fragen 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