ListView - Header selber gestallten
-
Ich will den Header eines ListViews selbst gestallten.
Ich hab mir hier schon ein paar beiträge durchgelesen, konnte es aber bis jetzt nicht realisieren.
Ich bin ja schon soweit, dass ich weiß, dass ich das ListView subclassen muss (wär schön wenn mir dass mal jmd. erklären könnte).hier hatte ich schon mal nen bisl code her (von WebFritzi), den ich bei mir aber nicht zum laufen bekommen hab.
http://www.c-plusplus.net/forum/viewtopic.php?t=57527&highlight=listview&sid=d35d12995d963da4717ce7a0889ca49fIch progge unter BCB6
-
Was genau heißt: "den ich bei mir aber nicht zum laufen bekommen hab" ?!
-
moin meister ...
könnte es sein, daß er mit der VCL arbeitet
mfg
RB
-
genau, ich arbeite mit der VCL
z.b. funzt folgende zuweisung aus dem code nicht
SetWindowLong(hwnd, GWL_WNDPROC, NewCtrlProc);
die methode NewCtrlProc will er nicht übernehmen, weils da offenbar nen typenkonflikt gibt
@RED-BARON: so wie du nach der VCL fragst scheinst du offenbar zu wissen worans liegt
hoffe ihr könnt mir weiterhelfen
-
Stichworte: FARPROC oder #define STRICT
-
Noch'n Hinweis:
#ifdef STRICT WNDPROC MyWindowProcedure #else FARPROC MyWindowProcedure #endif
-
moin meister ...
ich kenne mich leider nicht so gut mit der VCL aus, weiß nur, das
in der Hilfe drinn steht wie man ein neues Control erstellen kann.
Am Beipiel einer EditBox die dann mal ebend immer gelb als Hintergrund hat.Eventuell stellt ja BCB ganz andere Möglichkeiten zur Verfügung um eigene
Controls zu erstellen oder abzuleiten.Zeig lieber mal genau den Fehler (Typkonflikt) liegt sicher wie schon erwähnt
an der deklaration.mfg
RB
-
dass mit dem FARPROC funzt auch nicht
hier der Code:
FARPROC g_OldCtrlProc; HWND hwnd = ListView1->Handle; g_OldCtrlProc = GetWindowLong(hwnd, GWL_WNDPROC);
bei WNDPROC kommt folgender fehler:
[C++ Fehler] Unit1.cpp(21): E2034 Konvertierung von 'long' nach 'long (__stdcall *)(void *,unsigned int,unsigned int,long)' nicht möglichbei FARPROC der hier:
[C++ Fehler] Unit1.cpp(21): E2034 Konvertierung von 'long' nach 'int (__stdcall *)()' nicht möglich
-
g_OldCtrlProc = (FARPROC) GetWindowLong(hwnd, GWL_WNDPROC);
-
Cool, bin jetzt schon mal nen stück weiter, aber einen typenkonflikt hab ich noch:
__fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner) { HWND hwnd = ListView1->Handle; g_OldCtrlProc = (FARPROC) GetWindowLong(hwnd, GWL_WNDPROC); SetWindowLong(hwnd, GWL_WNDPROC, NewCtrlProc); // Fehler bei NewCtrlProc } //--------------------------------------------------------------------------- LRESULT CALLBACK TForm1::NewCtrlProc(HWND hwnd, UINT uiMsg, WPARAM wParam, LPARAM lParam) { ... }
Fehler: [C++ Fehler] Unit1.cpp(17): E2034 Konvertierung von 'long (__stdcall * (_closure )(void *,unsigned int,unsigned int,long))(void *,unsigned int,unsigned int,long)' nach 'long' nicht möglich
-
SetWindowLong(hwnd, GWL_WNDPROC, (LONG)NewCtrlProc);
-
@flenders: wenn ich das (LONG) davor schreib kommt nun folgender fehler:
[C++ Fehler] Unit1.cpp(17): E2235 Elementfunktion muß aufgerufen oder ihre Adresse übernommen werden
-
Na dann hast du die Funktion wohl nicht als static deklariert.
-
ok, static ist drin, aber da kommt auch schon der nächste fehler:
LRESULT CALLBACK TForm1::NewCtrlProc(HWND hwnd, UINT uiMsg, WPARAM wParam, LPARAM lParam) { .... return CallWindowProc(g_OldCtrlProc, hwnd, uiMsg, wParam, lParam); // ^---- hier kommt der Fehler }
Fehler: [C++ Fehler] Unit1.cpp(38): E2231 Element TForm1::g_OldCtrlProc kann nicht ohne ein Objekt verwendet werden
-
Wo und wie hast du g_OldCtrlProc deklariert?
-
g_OldCtrlProc ist als FARPROC im private teil des header-files deklariert.
-
Kann es sein das du gar keine Ahnung von C++ hast?
In statischen Member-Funktionen kann man nicht auf nicht-statische Member-Variablen zugreifen.
-
doch kann man, aber erst wenn man den Zeiger auf die Klasse hat
Da hilft den this Zeiger mit SetProp oder SetWindowLong bzw. SetWindowLongPtr als User Data zu setzen oder eine Thunk Klasse zu nehmen.
aber ich glaube Jester sollte es lieber lassen und sich mit grundlegenden WinAPI Themen beschäftigen.
-
ok, ich geb ja zu, dass ich von der winapi nicht wirklich nen plan hab. daher hab ich es jetzt anders gelöst. man kann beim ListView den Header ausblenden. das hab ich jetzt gemacht und hab mir nen eigenen gezeichnet, nach meinen vorstellungen.
trotzdem danke für eure bemühungen