Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "WinAPI";
Текущий архив: 2005.03.13;
Скачать: [xml.tar.bz2];

Вниз

Как создать подкласс 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 вся ветка

Форум: "WinAPI";
Текущий архив: 2005.03.13;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.47 MB
Время: 0.04 c
6-1105369923
Константинов
2005-01-10 18:12
2005.03.13
Имитация локальной сети на одном ПК


11-1091000180
DeimosX7
2004-07-28 11:36
2005.03.13
KOLScktComp


1-1109574458
hgd
2005-02-28 10:07
2005.03.13
О знаке разделителе


1-1109592246
}|{yk
2005-02-28 15:04
2005.03.13
После окончания генерации отчета Excel виснет


3-1108034345
Mamed
2005-02-10 14:19
2005.03.13
RTF Fayli





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский