Не клиентская область окна

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
Diamock
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 388
Зарегистрирован: 26.10.2009 (Пн) 4:19
Откуда: Кемерово

Не клиентская область окна

Сообщение Diamock » 10.06.2010 (Чт) 19:16

Здравствуйте Уважаемые!
Очень интересует перерисовка не клиентской области окна (заголовка, бордюра, кнопок). Поискав информацию, много чего нашёл, но ничего не понял. Подскажите с каких основ начать, чтобы разобраться.
С уважением...
In der Beschrankung zeigt sich erst der Meister
Графоманю...

Twister
Теоретик
Теоретик
Аватара пользователя
 
Сообщения: 2251
Зарегистрирован: 28.06.2005 (Вт) 12:32
Откуда: Алматы

Re: Не клиентская область окна

Сообщение Twister » 11.06.2010 (Пт) 9:53

Ну так может лучше озвучить то, что конкретно не ясно в механизме перерисовки неклиентской области? Врядли кто-то будет описывать всё с нуля.
А я все практикую лечение травами...

FireFenix
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1640
Зарегистрирован: 25.05.2007 (Пт) 10:24
Откуда: Mugen no Sora

Re: Не клиентская область окна

Сообщение FireFenix » 11.06.2010 (Пт) 11:22

Сделать голую форму (вроде WindowStyle=None) и нарисовать вверху самому нужные элементы?
Птицей Гермеса меня называют, свои крылья пожирая... сам себя я укрощаю
私はヘルメスの鳥 私は自らの羽根を喰らい 飼い慣らされる

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Не клиентская область окна

Сообщение Хакер » 11.06.2010 (Пт) 11:38

Нельзя.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Joo
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 762
Зарегистрирован: 14.08.2008 (Чт) 11:55
Откуда: Казахстан

Re: Не клиентская область окна

Сообщение Joo » 11.06.2010 (Пт) 13:32

В поиск по WM_NCPAINT
"Им будет не просто, тем кто полагается на истину авторитета, вместо того чтобы полагаться на авторитет Истины"
Джеральд Месси, Египтолог

Diamock
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 388
Зарегистрирован: 26.10.2009 (Пн) 4:19
Откуда: Кемерово

Re: Не клиентская область окна

Сообщение Diamock » 21.06.2010 (Пн) 20:29

Покопавшись в MSDN, вынес для себя следующее:
    1. Получаю дескриптор окна с помощью GetWindowDC
    2. Посылаю окну сообщение WM_NCPAIN, используя SendMessage
    3. Здесь, насколько я понял, нужно заменить стандартную не клиентскую область окна своей, заранее созданной.
    4. При потере моим окном фокуса система посылает окну сообщение WM_NCACTIVATE, и моё окно снова должно перерисоваться в соответствии с заранее заготовленной неактивной заготовкой.
Если первые два пункта, мне более и менее понятны, то третий и четвёртый у меня вызывают затруднения. Каким образом мне изменить не клиентскую область?
In der Beschrankung zeigt sich erst der Meister
Графоманю...

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Не клиентская область окна

Сообщение Хакер » 22.06.2010 (Вт) 5:02

1) Где ты такое вычитал?
2) Достали уже. Каждому Get*DC должен соответствовать ReleaseDC.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Antonariy
Повелитель Internet Explorer
Повелитель Internet Explorer
Аватара пользователя
 
Сообщения: 4824
Зарегистрирован: 28.04.2005 (Чт) 14:33
Откуда: Мимо проходил

Re: Не клиентская область окна

Сообщение Antonariy » 22.06.2010 (Вт) 12:04

1. Дескриптор окна это hWnd, а GetWindowDC возвращает device context.
2. Зачем? Система сама пошлет это сообщение, когда сочтет нужным перерисовать. Твоя задача — его перехватить и обработать.

Remarks
The DefWindowProc function paints the window frame.

An application can intercept the WM_NCPAINT message and paint its own custom window frame. The clipping region for a window is always rectangular, even if the shape of the frame is altered.

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);
}
Лучший способ понять что-то самому — объяснить это другому.

SLIM
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1840
Зарегистрирован: 04.04.2008 (Пт) 18:21
Откуда: Краснодар

Re: Не клиентская область окна

Сообщение SLIM » 22.06.2010 (Вт) 18:32

Antonariy писал(а):1. Дескриптор окна это hWnd, а GetWindowDC возвращает device context.

Поправочка - вернет описатель device context
Пишите жизнь на чистовик.....переписать не удастся.....

pavel9000
Начинающий
Начинающий
 
Сообщения: 1
Зарегистрирован: 23.07.2013 (Вт) 11:58

Re: Не клиентская область окна

Сообщение pavel9000 » 23.07.2013 (Вт) 12:05

уважаемые как открыть не клиентскую область окна xp или 7?
подскажите пожалуйста :drunken:

bon818
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 267
Зарегистрирован: 29.08.2009 (Сб) 4:49
Откуда: Ташкент

Re: Не клиентская область окна

Сообщение bon818 » 23.07.2013 (Вт) 12:42

pavel9000 писал(а):уважаемые как открыть не клиентскую область окна xp или 7?
подскажите пожалуйста :drunken:

Ну её уже до тебя открыли.
А рисовать можно.
в1) Сделать голую форму (вроде WindowStyle=None) и нарисовать самому нужные элементы?
в2) Обрабатывать сообщения WM_NCPAINT и тп.. WM_NC.. и рисовать в этой не клиентской области окна.
Второе более правильнее но и тяжелее.
Рисовать с применением WinAPI субклассировать окно в котором рисуешь.

Вот на тему SKIN:
в1)
http://www.Planet-Source-Code.com/vb/sc ... 2&lngWId=1
в2)
http://www.vbaccelerator.com/home/VB/Co ... rticle.asp


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: AhrefsBot, SemrushBot и гости: 40

    TopList