Вниз
Скачать: CL | DM;

Как создать подкласс WC_LISTVIEW("SysListView32") ?   Найти похожие ветки 

← →
Atrion ©   (2005-01-28 01:30) [0]

Уважаемые Мастера подскажите как создавать свои подклассы...
Я перелопатил  ComCtrls и Controls, сделал идентично, но происходят глюки..Дайте кодик пожалуйсто....


← →
Cobalt ©   (2005-01-28 22:39) [1]

А можно взглянуть на твой код?
Любопытно...


← →
Atrion ©   (2005-01-30 01:14) [2]

Сразу предупреждаю я никаких АКАДЕМИЙ не заканчивал...
Если есть ошибки и причем грубые, то очень прошу подсказать как их исправить...
Желательно получить ответ на вопрос "Я хоть в ту сторону копаю?"

(В исходных до черта разных оконных стилей...я их убрал чтобы они общую картину не загараживали)
procedure Create_SubClass(var WinClass:TWndClass;SubClass:string);
const CS_OFF = CS_OWNDC or CS_CLASSDC or CS_PARENTDC or CS_GLOBALCLASS;
     CS_ON = CS_VREDRAW or CS_HREDRAW;
var ICC: TInitCommonControlsEx;
   SaveInstance: THandle;
   TempClass: TWndClass;
   ClassRegistered: Boolean;
begin
 ICC.dwSize := SizeOf(TInitCommonControlsEx);
 ICC.dwICC :=ICC_LISTVIEW_CLASSES;
 if not InitCommonControlsEx(ICC) then InitCommonControls;

 FillChar(WinClass, SizeOf(TWndClass), 0);
 with WinClass do
 begin
   Style := CS_VREDRAW + CS_HREDRAW + CS_DBLCLKS;
   lpfnWndProc := @DefWindowProc;
   hCursor := LoadCursor(0, IDC_ARROW);
   hbrBackground := 0;
   hInstance := HInstance;
   lpszClassName:=PChar(SubClass); {этот кусок в Delphi от родителя-TWinControl,
                                    как я понял он ничего не меняет}

   if SubClass<>"" then
    begin
     SaveInstance := WinClass.hInstance;
     if not GetClassInfo(HInstance,WC_LISTVIEW,WinClass) and
       not GetClassInfo(0,WC_LISTVIEW, WinClass) and
       not GetClassInfo(MainInstance,WC_LISTVIEW, WinClass) then
       GetClassInfo(WinClass.hInstance,WC_LISTVIEW, WinClass);
     hInstance := SaveInstance;
     Style := WinClass.Style and not CS_OFF or CS_ON;
   end;
   Style := WinClass.style and not (CS_HREDRAW or CS_VREDRAW);
   lpszClassName:=PСhar(SubClass);

   ClassRegistered := GetClassInfo(WinClass.hInstance, WinClass.lpszClassName,TempClass);
   if not ClassRegistered or (TempClass.lpfnWndProc <> @SubClassMainProc) then
   begin
     if ClassRegistered then Windows.UnregisterClass(PChar(SubClass),
     WinClass.hInstance);
     WinClass.lpfnWndProc := @SubClassMainProc; {SubClassMainProc(Handle:HWND;mes:UINT;wParamlParam:integer):longint;stdcall;}
     WinClass.lpszClassName := PChar(SubClass);
     if RegisterClass(WinClass)<>0 then
    .........................................  
   end;
 end;
end;


Потом  создаю окно CreateWindowEx(.,WinClass.lpszClassName.....) и получаю шишь,а не SubClass
Хочется разобраться как разработчики из Borland осуществили надстройку над базисом (API).


← →
Cobalt ©   (2005-01-30 14:26) [3]

Во-первых, давай разберёмся - для чего тебе "подкласс"?


← →
Atrion ©   (2005-01-31 01:40) [4]

Зачем нужен подкласс?(Это практически ритарический вопрос...)…Когда я написал свой первый код только с API был ряд элементов от которых нужно было обрабатывать сообщение wm_notify.(в общем контролы подвисали-это я исправил потом)…спросил на форуме-не ответили…подумал что не плохо бы было как в VCL каждому элементу свою процедуру(да еще бы и свойства свои добавить) …начал смотреть выше упомянутые файлы и пошло поехало…куча вопросов-вот теперь пытаюсь прояснить их для себя…
Подкласс- это практически автономная единица, обладающая рядом свойств и методов, если не так то поправьте меня…

Calling SetWindowLong with the GWL_WNDPROC index creates a subclass of the window class used to create the window. An application should not subclass a window created by another process. The SetWindowLong function creates the window subclass by changing the window procedure associated with a particular window, causing Windows to call the new window procedure instead of the previous one. An application must pass any messages not processed by the new window procedure to the previous window procedure by calling CallWindowProc. This allows the application to create a chain of window procedures.

SetClassLong and SetWindowLong with GWL_WNDPROC--- это все понятно…только куда у меня раньше глаза смотрели?….



Страницы: 1 вся ветка

Скачать: CL | DM;



Память: 0.46 MB
Время: 0.025 c
3-1108407976
SilverDragon
2005-02-14 22:06
2005.03.13
Создание dBase БД


6-1104693820
JorSand
2005-01-02 22:23
2005.03.13
Как используя Wininet команды (wininet.dll) очистить кэш?


14-1108713903
07BB:080Dh
2005-02-18 11:05
2005.03.13
Пить или не пить. за и против ?


14-1108974584
Cosinus
2005-02-21 11:29
2005.03.13
TChart - Invalid Pointer Operation. Достало уже.


1-1109266347
ki11er
2005-02-24 20:32
2005.03.13
TShockwaveFlash и интерфейсы ....




   Наверх