На главную
ПРАВИЛА FAQ Помощь Участники Календарь Избранное DigiMania RSS
msm.ru
! user posted image
Пожалуйста, выделяйте текст программы тегом [сode=pas] ... [/сode]. Для этого используйте кнопку [code=pas] в форме ответа или комбобокс, если нужно вставить код на языке, отличном от Дельфи/Паскаля.

Соблюдайте общие правила форума

Следующие вопросы задаются очень часто, подробно разобраны в FAQ и, поэтому, будут безжалостно удаляться:
1. Преобразовать переменную типа String в тип PChar (PAnsiChar)
2. Как "свернуть" программу в трей.
3. Как "скрыться" от Ctrl + Alt + Del (заблокировать их и т.п.)
4. Как запустить программу/файл? (и дождаться ее завершения)
5. Как перехватить API-функции, поставить hook? (перехват сообщений от мыши, клавиатуры - внедрение в удаленное адресное прстранство)
... (продолжение следует) ...

Внимание:
Попытки открытия обсуждений реализации вредоносного ПО, включая различные интерпретации спам-ботов, наказывается предупреждением на 30 дней.
Повторная попытка - 60 дней. Последующие попытки - бан.
Мат в разделе - бан на три месяца...

Полезные ссылки:
user posted image MSDN Library user posted image FAQ раздела user posted image Поиск по разделу user posted image Как правильно задавать вопросы


Выразить свое отношение к модераторам раздела можно здесь: user posted image Rouse_, user posted image Krid

Модераторы: Rouse_, Krid
Страницы: (2) 1 [2]  все  ( Перейти к последнему сообщению )  
> Почему не отрабатывает WM_GETFONT?
Ну вот так сработает:
ExpandedWrap disabled
    class TMyCntrl : public TControl
    {
        public:
        TMyCntrl(TComponent *a, int) : TControl(a) {} // фикция
        long MyOffset() // смещение, где FFont;
        {
            char *ono = (char*)this->Font;
            char *fini = &((char*)this)[sizeof(TControl)-2*sizeof(TFont*)];
            for( int t=0; t<sizeof(TFont*); t++)
            for( TFont **f=(TFont**)(t+(char*)this); f<fini; f++)
                if( *f==ono ) return (long)f - (long)this; // поиск адреса
            return 0; // не нашли
        }
    };
     
    void MyProc(TControl *AControl)
    {
        TMyCntrl *a = new TMyCntrl(AControl,0);
        long o = a->MyOffset(); // смещение, где FFont;
        if( !o ) return;
        TFont *f = *(TFont **)&(((char*)AControl)[o]);
        ShowMessage(f->Name);
    }
     
    void __fastcall TForm1::Button1Click(TObject *Sender)
    {
        MyProc(this);
        MyProc(Button1);
        MyProc(Panel1);
        Caption = this->Font->Name + Panel1->Font->Name + Button1->Font->Name;
        ...
Но за такое следовало бы сразу руки отрывать и никогда не делать так более... :'( :oops:
П.С. да и надёжность низкая, и куча других недостатков.
Да и вообще это C++Builder :) , так что руки отрывать надо однозначно :D
Кто рано встает, тому целый день спать хочется
Цитата Krid @
не сработает :no:

Это ты про THackControl? Почему не сработает?
Должно работать для всех контролов и форм, наследующих стандартное хранение\изменение свойств Font и ParentFont от TControl.
Цитата leo @
Это ты про THackControl? Почему не сработает?

WM_GETFONT всё равно ноль возвращает (не смотря на Form1.ParentFont)
Кто рано встает, тому целый день спать хочется
Цитата Krid @
WM_GETFONT всё равно ноль возвращает (не смотря на Form1.ParentFont)

Причем тут WM_GETFONT?
MBo же привел ссылки, да и в мсдн черным по белому сказано, что WM_GETFONT работает для контролов (читай - стандартных виндовых), а не для любых окон. Для форм\диалогов и самопальных контролов нужно самому задавать обработчик сообщения WM_GETFONT. Но в VCL этого не сделано, т.к. для любого наследника TControl можно получить всю инфу о шрифте проще - через св-во Font. Вот THackControl и обеспечивает доступ к Font для любого наследника TControl. А если нужно добраться до этого св-ва через дескриптор окна, то для VCL-окон можно использовать функцию FindControl
1 пользователей читают эту тему (1 гостей и 0 скрытых пользователей)
0 пользователей:


[ Script Execution time: 0,0909 ]   [ 20 queries used ]   [ Generated: 28.03.17, 23:22 GMT ]