Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Перехват перерисовки чужого окна

18K
19 марта 2007 года
Mind Maker
25 / / 11.12.2006
У меня собственно два вопроса:
1) Подскажите как мне перехватить сообщение чужому окну
[SIZE=2]WM_PAINT и заменить его обработчик своим.[/SIZE]
[SIZE=2]2) Какой WindowName и ClassName имеет рамка окна или если к ней это не применимо как получить её handle для рисования на ней, опять же.[/SIZE]
1.8K
19 марта 2007 года
k3Eahn
365 / / 19.12.2005
Цитата: Mind Maker
У меня собственно два вопроса:
1) Подскажите как мне перехватить сообщение чужому окну
[SIZE=2]WM_PAINT и заменить его обработчик своим.[/SIZE]
[SIZE=2][/SIZE]


Хуки? (Если окно принадлежит потоку другого процесса);
Сабклассинг?

Цитата: Mind Maker

[SIZE=2]2) Какой WindowName и ClassName имеет рамка окна или если к ней это не применимо как получить её handle для рисования на ней, опять же.[/SIZE]


Дык рамка окна не является окном. Она относится к неклиентской части окна. Соответственно и обрабатывать надо не WM_PAINT, а WM_NCPAINT.

18K
19 марта 2007 года
Mind Maker
25 / / 11.12.2006
Дано:
1) Моя программа, которая должна отлавливать и заменять
функцию перерисовки чужих окон на свою какую то ф-ю;
2) Допусти Notepad - другая программа, ф-ю перерисовки которой
надо подменить (например нарисовать в центре окна кружек, красный).

Если можно, то желательно поближе к коду, нежели абстрактным советам.
334
19 марта 2007 года
HexEdit
809 / / 27.07.2006
Приведу однако небольшой примерчик:

Для основной функции:
 
Код:
...
//допустим HWND необходиного окна известен...
    g_fnOldProc = GetWindowLong(hWnd,GWL_WNDPROC); // получаем адрес оригинальной функции
    SetWindowLong(hWnd,GWL_WNDPROC,(LONG)NewProc); // заменяем на нашу
...


Для нашей функции:
 
Код:
LRESULT CALLBACK NewProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) {
    LRESULT res = g_fnWndProc(hWnd,uMsg,wParam,lParam);
    if (uMsg == WM_PAINT) {
        // выполняем требуемые действия
    }
    return (res);
}

Насчет g_fnWndProc = ... уже не помню, но вроде там (FARPROC) или что-то в этом роде... Поправьте если что).
18K
20 марта 2007 года
Mind Maker
25 / / 11.12.2006
OK, hook поставил.
Подскажите как получить handle рамки окна или к какому классу она относится.
1.8K
20 марта 2007 года
k3Eahn
365 / / 19.12.2005
А что ты понимаешь под рамкой?
18K
20 марта 2007 года
Mind Maker
25 / / 11.12.2006
Есть окно у которого есть клиентская область, в которой распологаются TComboBoxы, TButtonы, etc. Есть у окна рамка на которой две кнопки - Close, Restore/Maximize, Minimize и иконка приложения.
1.8K
20 марта 2007 года
k3Eahn
365 / / 19.12.2005
Ну так я же говорю - это такая же часть окна. Просто для того чтобы на ней рисовать нужно обрабатывать WM_NCPAINT, а все операции по рисованию проводить через DС целого окна (GetWindowDC, GetDCEx), а не DC, настроенного только на вывод в клиентскую часть.
К примеру, обработчик WM_NCPAINT для своего окна может выглядеть так:
Код:
case WM_NCPAINT:
{
     DefWindowProc(hWnd, message, wParam, lParam);
       
     //Смотреть также GetDCEx
     HDC hDC = GetWindowDC(hWnd);
       
     HBRUSH hBrush = CreateHatchBrush(HS_BDIAGONAL, RGB(0, 0, 0));
       
     RECT rc;
     GetWindowRect(hWnd, &rc);

     rc.right -= rc.left;
     rc.bottom -= rc.top;
     rc.left = rc.top = 0;
           
     FrameRect(hDC, &rc, hBrush);
       
     DeleteObject(hBrush);
     ReleaseDC(hWnd, hDC);
     break;
}
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог