Легенда:
новое сообщение
закрытая нитка
новое сообщение
в закрытой нитке
старое сообщение
|
- Напоминаю, что масса вопросов по функционированию форума снимается после прочтения его описания.
- Новичкам также крайне полезно ознакомиться с данным документом.
| | |
А зачем такой изврат? 20.07.07 03:14 Число просмотров: 3167
Автор: Zef <Alloo Zef> Статус: Elderman
|
Ты просто создаешь окно без заголовка и "приклеиваешь" к нему дочернее окно любой формы и типа, которое и будет выполнять функции заголовка.
|
<programming>
|
[Win32] Я не извращенец, просто люблю окошки 19.07.07 17:45
Автор: Vedrus <Serokhvostov Anton> Статус: Member
|
Давно известно, что в Windows с помощью регионов можно создавать окна произвольной формы. А как к обычному квадратному окну прикрутить ещё что-нибудь? Хочу сверху заголовка окна разместить ещё что-нибудь. Кто-нибудь в подобную сторону думал? Куда податься?
|
|
[Win32] По моему только еще одним липучим окном 19.07.07 19:47
Автор: amirul <Serge> Статус: The Elderman
|
> квадратному окну прикрутить ещё что-нибудь? Хочу сверху > заголовка окна разместить ещё что-нибудь. Кто-нибудь в > подобную сторону думал? Куда податься?
За заголовком идет не то, что не клиентская (куда рисуют обычные окна), но даже не неклиентская (куда можно самому рисовать заголовок, кнопки и т.д.). В общем создавай еще одно окно и обрабатывай WM_SIZE/WM_SIZING и WM_MOVE/WM_MOVING на главном окне, чтобы тягать "липучее" следом.
|
| |
Ищу все доступные окна с помощью функции EnumWindows. У меня... 20.07.07 11:08
Автор: Vedrus <Serokhvostov Anton> Статус: Member
|
Ищу все доступные окна с помощью функции EnumWindows. У меня открыто около 10 окон, а она перечисляет около 200. Это что, невидимки что ли? Можно ли как-то их отсечь? Есть ли функция для определения видимости окна (в MSDN не нашёл)?
|
| | |
IsWindowVisible жива и здравствует в user32.dll 23.07.07 12:32
Автор: HandleX <Александр М.> Статус: The Elderman
|
> Ищу все доступные окна с помощью функции EnumWindows. У > меня открыто около 10 окон, а она перечисляет около 200. > Это что, невидимки что ли? Можно ли как-то их отсечь? Есть > ли функция для определения видимости окна (в MSDN не > нашёл)? Subj. Ну и опять же, я там выше про Spy++ писал, она открывает капот винды в винды в винды в винды в винды в винды ;-)
|
| | | |
А я до неё не добрался. Спасибо, пригодится 23.07.07 14:28
Автор: Vedrus <Serokhvostov Anton> Статус: Member
|
|
| |
А кто отвечает за отрисовку окна? Может копию... 19.07.07 20:22
Автор: Vedrus <Serokhvostov Anton> Статус: Member
|
А кто отвечает за отрисовку окна? Может копию RegisterClass/CreateWindow в оперативной памяти изменить. Сложно конечно дизассемблировать, но можно..
|
| | |
WindowProc отвечает [update] 20.07.07 11:42
Автор: amirul <Serge> Статус: The Elderman Отредактировано 20.07.07 12:06 Количество правок: 1
|
> А кто отвечает за отрисовку окна? Может копию
WM_PAINT для клиентской области
WM_NCPAINT - для неклиентской (как раз рамка)
> RegisterClass/CreateWindow в оперативной памяти изменить. > Сложно конечно дизассемблировать, но можно.. На фига? Для этих целей давно есть SetWindowLongPtr с GWLP_WNDPROC/DWLP_DLGPROC
Сохраняешь старую WndProc, хучишь ее и обрабатываешь отрисовку как душа пожелает. Хоть до основного обработчика, хоть после, хоть вместо. Но насколько я понял, ты же хочешь рисовать НАД caption bar-ом. А там окно попросту рисовать не может. Для этого туда надо поместить еще одно окно.
-----------
Только что подумал, что мог неправильно тебя понять. "Сверху квадратного окна" это в твоем понимании выше по x-координате или по z? Дополнительное окно надо лепить только если по x
|
| | | |
Вопрос по поводу wm_ncpaint 20.07.07 17:32
Автор: Vedrus <Serokhvostov Anton> Статус: Member
|
Вопрос по поводу WM_NCPAINT
Написал следующий код:
case WM_NCPAINT:
hdc = GetDCEx(hwnd, (HRGN)wParam, DCX_WINDOW|DCX_INTERSECTRGN);
Rectangle(hdc, 0, 0, 20, 20);
ReleaseDC(hwnd, hdc);
return TRUE;
---
Но почему-то не видно, чтобы он что-то рисовал. Видно, что стандартный отрисовщик не работает, но мой не рисует. Почему?
|
| | | | |
Для того, чтобы рисовать в неклиентской части окна, контекст нужно брать функцией GetWindowDC. ИМХО. 23.07.07 12:37
Автор: HandleX <Александр М.> Статус: The Elderman
|
|
| | | | | |
MSDN думает иначе :-) 23.07.07 14:52
Автор: amirul <Serge> Статус: The Elderman Отредактировано 23.07.07 14:53 Количество правок: 1
|
http://msdn2.microsoft.com/en-us/library/ms534905.aspx
The wParam value can be passed to GetDCEx as in the following example.
case WM_NCPAINT:
{
HDC hdc;
hdc = GetDCEx(hwnd, (HRGN)wParam, DCX_WINDOW|DCX_INTERSECTRGN);
// Paint into this DC
ReleaseDC(hwnd, hdc);
} ---
Хотя по факту - GetDCEx не заработал.
|
| | | | | | |
Я тоже до этого додумал. Ниже по ветке код прилепил. 23.07.07 16:32
Автор: Vedrus <Serokhvostov Anton> Статус: Member
|
Я тоже до этого додумал. Ниже по ветке код прилепил.
ЗЫ. Этот кусок кода я в MSDN'е видел. Это один из не многих касяков MS
|
| | | | | | | |
Ты закрыл тему с энумом окон, поэтому отвечу здесь [update] 23.07.07 19:11
Автор: amirul <Serge> Статус: The Elderman Отредактировано 23.07.07 19:16 Количество правок: 1
|
Приглядись повнимательнее к условию - там логическая ошибка. В том виде, в котором оно у тебя есть - оно будет отлично пропускать WS_POPUP окна.
--------------
Только что глянул: и Shell_TrayWnd и Progman имеют WS_POPUP
|
| | | | | | | | |
Serg, спасибо. Я думал amirul тупит, а оказалось кое-кто... 23.07.07 19:58
Автор: Vedrus <Serokhvostov Anton> Статус: Member Отредактировано 23.07.07 20:11 Количество правок: 2
|
Serg, спасибо. Я думал amirul тупит, а оказалось кое-кто другой...
Вроде так будет:
if (!(dwStyle & WS_POPUP) && (dwStyle & WS_VISIBLE))
{
---
|
| | | | | | | | | |
Некоторые ф-ции, связанные с DC в отладчике работают иначе, 24.07.07 03:10
Автор: Zef <Alloo Zef> Статус: Elderman
|
чем в релизе. Например GetPixel иногда возвращает только 0 или FFFFFFFF.
|
| | | | | | | | | | |
GetDCEx болеет этим и в релизе. 24.07.07 06:04
Автор: Vedrus <Serokhvostov Anton> Статус: Member
|
|
| | | | | |
Второй вариант не смотрел (классы накручены), а второй то же... 21.07.07 05:23
Автор: Vedrus <Serokhvostov Anton> Статус: Member Отредактировано 21.07.07 16:50 Количество правок: 1
|
Второй вариант не смотрел (классы накручены), а первый то же что и мой делает, т.е. ничего.
|
| | | | | | |
Нашёл причину. GetDCEx почему-то не захотела есть хендл окна... 21.07.07 16:27
Автор: Vedrus <Serokhvostov Anton> Статус: Member Отредактировано 21.07.07 16:28 Количество правок: 1
|
Нашёл причину. GetDCEx почему-то не захотела есть хендл окна (говорит, что не верный дескриптор). Вот этот код работает:
case WM_NCPAINT:
DefWindowProc(hwnd, msg, wParam, lParam);
hDC = GetWindowDC(hwnd);
SetPixel(hDC, 0, 0, 0x00FF00);
ReleaseDC(hwnd, hDC);
return TRUE;
---
|
| | | |
Хочу именно по x, и именно НАД caption bar-ом. Из моих... 20.07.07 12:18
Автор: Vedrus <Serokhvostov Anton> Статус: Member
|
Хочу именно по x, и именно НАД caption bar-ом. Из моих разговоров может показаться, что я в идеологии Windows полный лох, но заверяю, что оконный механизм, модель перерисовки и передачи сообщений знаю достаточно хорошо.
ЗЫ. А за WM_NCPAINT спасибо. Не знал. Пригодится.
|
| | |
А зачем такой изврат? 20.07.07 03:14
Автор: Zef <Alloo Zef> Статус: Elderman
|
Ты просто создаешь окно без заголовка и "приклеиваешь" к нему дочернее окно любой формы и типа, которое и будет выполнять функции заголовка.
|
|
|