Meine letzte Frage zu Winapi-C

Fragen zu allen anderen Programmiersprachen.
Andi
Beiträge: 73
Registriert: 27.05.2008 17:29
Wohnort: Berlin

Meine letzte Frage zu Winapi-C

Beitrag von Andi »

Nach meinem kleinen Abstecher in Richtung C ist mir klar geworden, wie mächtig PureBasic ist, wenn man kleine, aber schnelle und leistungsstarke Fenster-Applikationen schreiben will. Ich denke dabei nicht nur an die Erstellung der Steuerelemente mit entsprechendem Event-Handling, auch das Handling der Strings in C (die gibt es dort ja leider nicht in der gewohnten Form) ist recht sperrig und gewöhnungsbedürftig. Da lobe ich mir doch PB! Trotzdem war die Beschäftigung mit C und Winapi sehr lehrreich. Als krönenden Abschluss wollte ich eine Combobox mit Autocomplete-Eigenschaft erstellen, wie es in PB beispielsweise so möglich ist:

Code: Alles auswählen

#combo = 1

Procedure ComboboxAutoComplete(WindowID, Message, wParam, lParam)
 
Protected comboWert.s, comboIndex.l, comboLang.l, comboStart.l, parameter.l
Protected start.l, ende.l
  
result = #PB_ProcessPureBasicEvents
 
Select Message
   
   Case #WM_COMMAND
      Select lParam
         Case GadgetID(#combo)
            Select (wParam >> 16 & $FFFF)
               Case #CBN_EDITUPDATE
                  If GetAsyncKeyState_(#VK_BACK) Or GetAsyncKeyState_(#VK_DELETE)
                     ;tu nix
                  Else
                     comboWert = GetGadgetText(#combo)
                     comboIndex = SendMessage_(lParam, #CB_FINDSTRING, -1, @comboWert)
                     comboStart = Len(comboWert)
                     ;Länge des eingegebenen Textes
                     If comboIndex >= 0
                        SendMessage_(lParam, #CB_SETCURSEL, comboIndex, 0)
                        comboLang = Len(GetGadgetText(#combo))
                        ;Länge des gefundenen Textes
                        parameter = (comboLang << 16 & $FFFFFFFF) + comboStart
                        SendMessage_(lParam, #CB_SETEDITSEL, 0, parameter)
                     EndIf
                  EndIf
            EndSelect
      EndSelect
      
EndSelect

ProcedureReturn result

EndProcedure


OpenWindow(0, 40, 40, 300, 400,"Combobox", #PB_Window_SystemMenu)
ComboBoxGadget(#combo, 10, 40, 150, 20, #PB_ComboBox_Editable)


SetWindowCallback(@ComboboxAutoComplete())
SendMessage_(GadgetID(#combo),#CB_SHOWDROPDOWN,1,0) 
SetCursor_(LoadCursor_(0, #IDC_ARROW) )
SetActiveGadget(#combo)

AddGadgetItem(#combo, -1, "Angela")      
AddGadgetItem(#combo, -1, "Beate")      
AddGadgetItem(#combo, -1, "Belinda")      
AddGadgetItem(#combo, -1, "Brigitte")      
AddGadgetItem(#combo, -1, "Britta")      
AddGadgetItem(#combo, -1, "Brittney")      
AddGadgetItem(#combo, -1, "Claudia")      
      

Repeat
   event = WaitWindowEvent()
Until event = #PB_Event_CloseWindow


End 

Bis jetzt konnte ich aber mittels Winapi-C nur eine Listbox erstellen und füllen, und zwar so:

Code: Alles auswählen

case WM_CREATE:          
           hwndCombo =  CreateWindow("Combobox"), NULL, WS_CHILD | WS_VISIBLE | 
                              CBS_SIMPLE,  100, 20, 140, 120, hwnd, (HMENU)ID_LIST,  
                        (HINSTANCE)GetWindowLong(hwnd, GWL_HINSTANCE), NULL);
for (i = 0; i<=7; i++)
          {
          SendMessage(hwndCombo, CB_ADDSTRING, 0, (LPARAM)datensatz[i]);
          }   
Mir ist es jedoch nicht gelungen, das Event-Handling analog dem PB-Code hinzukriegen, dass also der Cursor nach dem Start im Editierfeld steht und ich mich dann mit dem Tippen von Buchstaben dem gewünschten Eintrag immer mehr annähere. Auch meine Google-Suche blieb erfolglos. Kann mir vielleicht jemand aus dem Forum weiterhelfen?
PB + B4X = greatest tools on earth
Win 10 | PB 5.72
Benutzeravatar
hjbremer
Beiträge: 822
Registriert: 27.02.2006 22:30
Computerausstattung: von gestern
Wohnort: Neumünster

Re: Meine letzte Frage zu Winapi-C

Beitrag von hjbremer »

auch wenn dieser Code schon recht alt ist

so finde ich ihn doch sehr gelungen :allright: fast schon genial
Purebasic 5.70 x86 5.72 X 64 - Windows 10

Der Computer hat dem menschlichen Gehirn gegenüber nur einen Vorteil: Er wird benutzt
grüße hjbremer
Antworten