Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.03.13;
Скачать: 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 вся ветка

Текущий архив: 2005.03.13;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.052 c
3-1108027449
beginnn
2005-02-10 12:24
2005.03.13
как эспортировать содержимое DBGrid в Excel !?


1-1109412325
webpauk
2005-02-26 13:05
2005.03.13
Определение имени переменной


14-1109060950
kai
2005-02-22 11:29
2005.03.13
23 февраля


9-1102832958
GURU-ru
2004-12-12 09:29
2005.03.13
Как сделать, чтобы в GLScene не проходить сквозь стены


1-1109595981
ser35
2005-02-28 16:06
2005.03.13
Функция отсчета