Как определить что у произвольного окна есть ScrollBar
От: Аноним  
Дата: 25.08.04 15:24
Оценка:
Уважаемый All,

Есть нэндл окна нужно по нему определить есть ли ScrollBar который им управляет

может кто решал такие задачи
Re: Как определить
От: Pavel Dvorkin Россия  
Дата: 26.08.04 05:28
Оценка:
Привет!

Unknown wrote:
>
> Уважаемый All,
>
> Есть нэндл окна нужно по нему определить есть ли ScrollBar который им управляет
>
> может кто решал такие задачи

Проверить в его стиляж наличие WS_V(H)SCROLL

if (GetWindowLong(hWnd,GWL_STYLE) & WS_VSCROLL)
// есть вертикальный скроллбар


--
With best regards,
Pavel Dvorkin
Posted via RSDN NNTP Server 1.7 "Bedlam"
With best regards
Pavel Dvorkin
Re[2]: Как определить
От: ghostik Россия http://www.deepseo.ru/
Дата: 26.08.04 08:13
Оценка:
Здравствуйте, Pavel Dvorkin, Вы писали:

PD>Привет!


PD>Проверить в его стиляж наличие WS_V(H)SCROLL

PD>if (GetWindowLong(hWnd,GWL_STYLE) & WS_VSCROLL)
PD> // есть вертикальный скроллбар

Это только один из возможных вариантов т.е покрывает только часть задачи
Целиком задачу вообще невозможно решить
это даже не говоря о том что есть ownerdraw тулбары

Есть только частные случаи например
Когда хэндл указывает на окошко IE
пройдет вариант что то вроде этого

CString strWindowClassName;
GetClassName(pWnd->GetSafeHwnd() , strWindowClassName.GetBuffer(MAX_PATH), MAX_PATH);
strWindowClassName.ReleaseBuffer();

if ( 0 == strWindowClassName.Compare(_T("Internet Explorer_Server")))
{
     IsScrollWindow =   TRUE; // возможно есть вертикальный скроллбар.
}

что бы быть 100% уверенным что есть скроллбар нужно получить IHTMLDocument2 и хорошенько пропарсить там разобрать на фреймы и тд...
тут тебе поможет How To Get IHTMLDocument2 from a HWND
а так же Measuring Element Dimension and Location
если нужно будет управлять этим окном то опят же через IHTMLDocument2



Т.е уже получается 2 частных случая
Когда управление окном происходит через CScrollBar практичесски невозможно сказать каким окном он управляет

В принципе есть интерестные попытки определит есть ли скролл у окна но они тоже работают не во всех случаях.. (если нужно могу поведать)
Исспользую совокупность всех средст возможно и можно получить более — менее хороший результат
Re[2]: Как определить
От: Аноним  
Дата: 26.08.04 11:15
Оценка:
PD>Проверить в его стиляж наличие WS_V(H)SCROLL
PD>if (GetWindowLong(hWnd,GWL_STYLE) & WS_VSCROLL)
PD> // есть вертикальный скроллбар

А как быть с CScrollBar?
Re[3]: Как определить
От: Pavel Dvorkin Россия  
Дата: 26.08.04 11:18
Оценка:
Привет!

Unknown wrote:
>
> PD>Проверить в его стиляж наличие WS_V(H)SCROLL
> PD>if (GetWindowLong(hWnd,GWL_STYLE) & WS_VSCROLL)
> PD> // есть вертикальный скроллбар
>
> А как быть с CScrollBar?

А это не скроллбар в окне, а отдельный контрол.

--
With best regards,
Pavel Dvorkin
Posted via RSDN NNTP Server 1.7 "Bedlam"
With best regards
Pavel Dvorkin
Re[3]: Как определить
От: Pavel Dvorkin Россия  
Дата: 26.08.04 11:25
Оценка:
Привет!

ghostik wrote:
>
> Здравствуйте, Pavel Dvorkin, Вы писали:

> Это только один из возможных вариантов т.е покрывает только часть задачи

> Целиком задачу вообще невозможно решить
> это даже не говоря о том что есть ownerdraw тулбары

Owner draw скроллбар ? Можно поподробнее ?

>
> CString strWindowClassName;
> GetClassName(pWnd->GetSafeHwnd() , strWindowClassName.GetBuffer(MAX_PATH), MAX_PATH);
> strWindowClassName.ReleaseBuffer();
> 
> if ( 0 == strWindowClassName.Compare(_T("Internet Explorer_Server")))
> {
>      IsScrollWindow =   TRUE; // возможно есть вертикальный скроллбар.
> }
>


Что-то я не понял. Если класс есть Internet Explorer_Server, то
возможно, есть верт. скроллбар. ИМХО это можно про многие классы
сказать. Скорее уж можно сказать, у каких классов его нет — button, к
примеру, точно не имеет

> что бы быть 100% уверенным что есть скроллбар нужно получить IHTMLDocument2 и хорошенько пропарсить там разобрать на фреймы и тд...


А фреймы — не отдельные окна ?

> Когда управление окном происходит через CScrollBar практичесски невозможно сказать каким окном он управляет


Ну если иметь в виду, что им отдельный контрол управляет — вопрос вообще
не решаемый. Так как этот отдельный контрол можно в принципе и в другое
приложение засадить и пусть управляет


--
With best regards,
Pavel Dvorkin
Posted via RSDN NNTP Server 1.7 "Bedlam"
With best regards
Pavel Dvorkin
Re[4]: Как определить
От: ghostik Россия http://www.deepseo.ru/
Дата: 27.08.04 07:41
Оценка:
Здравствуйте, Pavel Dvorkin, Вы писали:

PD>Owner draw скроллбар ? Можно поподробнее ?

Конечно
Возможно я и применил не совсем корректный термин, но под Owner draw я хотел сказать что сам скроллбар рисуется и обрабатывается приложением
Самым простым примером является окошко IE

>>
>> CString strWindowClassName;
>> GetClassName(pWnd->GetSafeHwnd() , strWindowClassName.GetBuffer(MAX_PATH), MAX_PATH);
>> strWindowClassName.ReleaseBuffer();
>> 
>> if ( 0 == strWindowClassName.Compare(_T("Internet Explorer_Server")))
>> {
>>      IsScrollWindow =   TRUE; // возможно есть вертикальный скроллбар.
>> }
>>

PD>Что-то я не понял. Если класс есть Internet Explorer_Server, то
PD>возможно, есть верт. скроллбар. ИМХО это можно про многие классы

Так задача стояла не определить окна в которые нет Скрола а определить окна в которых он ТОЧНО есть...
А я ко всему прочему сказал как определить есть ли у класса Internet Explorer_Server скролл или нет
правда и это не во всех случаях возможно. Но тем не менее кол-во найденных окон со скролом увеличивается...

PD>сказать. Скорее уж можно сказать, у каких классов его нет — button, к

PD>примеру, точно не имеет

Вот как раз тут сказать "точно не имеет" нельзя
Мне же ни что не мешает засабклассить кнопку пририсовать к ней скрол и сделать так что бы текст на кнопке был скролируемый ))
И ни у кого не бедет механизма выяснит есть ли скрол на кнопке или нет

>> что бы быть 100% уверенным что есть скроллбар нужно получить IHTMLDocument2 и хорошенько пропарсить там разобрать на фреймы и тд...

PD>А фреймы — не отдельные окна ?

К сожалению нет и вы можете сами в этом убедится натравив Spy

>> Когда управление окном происходит через CScrollBar практичесски невозможно сказать каким окном он управляет


PD>Ну если иметь в виду, что им отдельный контрол управляет — вопрос вообще

PD>не решаемый. Так как этот отдельный контрол можно в принципе и в другое
PD>приложение засадить и пусть управляет

Вопрос решаемый для определенных случаев...
Тем самым мы просто увеличиваем вероятность найти окно со скролом не более того
Re[3]: Как определить
От: ghostik Россия http://www.deepseo.ru/
Дата: 27.08.04 07:42
Оценка:
Здравствуйте, Аноним, Вы писали:


А>А как быть с CScrollBar?


А для чего вообще нужна эта задача?
Re[4]: Как определить
От: Аноним  
Дата: 27.08.04 07:57
Оценка:
Здравствуйте, Pavel Dvorkin, Вы писали:

>> PD>Проверить в его стиляж наличие WS_V(H)SCROLL

>> PD>if (GetWindowLong(hWnd,GWL_STYLE) & WS_VSCROLL)
>> PD> // есть вертикальный скроллбар
>> А как быть с CScrollBar?

PD>А это не скроллбар в окне, а отдельный контрол.


А как вообще определить можно ли окно проскролировать?
Re[5]: Как определить
От: rus blood Россия  
Дата: 27.08.04 08:11
Оценка:
Здравствуйте, Аноним, Вы писали:

А>А как вообще определить можно ли окно проскролировать?


ScrollWindow

По-видимому, проскроллировать можно любое окно.
Это всего лишь вопрос взаимной настройки систем координа окна и его DC (viewport-ы и пр.)
Имею скафандр — готов путешествовать!
Re[5]: Как определить
От: Pavel Dvorkin Россия  
Дата: 27.08.04 08:22
Оценка:
Привет!

ghostik wrote:
>
> Здравствуйте, Pavel Dvorkin, Вы писали:
>
> PD>Owner draw скроллбар ? Можно поподробнее ?
> Конечно
> Возможно я и применил не совсем корректный термин, но под Owner draw я хотел сказать что сам скроллбар рисуется и обрабатывается приложением
> Самым простым примером является окошко IE

Давай ч терминами разберемся. Есть скроллбар в окне, устанавливается
стилями WS_V(H)SCROLL. Есть плоский скроллбар в окне
(FlatSB_EnableScrollBar и т.д.). Есть отдельный контрол — окно класса
scrollbar.

ВСЕ.
Если можешь сказать, как сделать owner-draw скроллбар этих трех типов —
поблагодарю за информацию.

Все остальные затеи, пусть они 30 раз выглядят как скроллбар и работают,
как он, скроллбарами не явялются. Не слишком уж сложно нарисовать в
правой части окна нечто, похожее на скроллбар и обрабатывать там
WM_LBUTTONDOWN etc. Но это не скроллбар MS.


> PD>сказать. Скорее уж можно сказать, у каких классов его нет — button, к

> PD>примеру, точно не имеет
>
> Вот как раз тут сказать "точно не имеет" нельзя
> Мне же ни что не мешает засабклассить кнопку пририсовать к ней скрол и сделать так что бы текст на кнопке был скролируемый ))

Да, у меня один раз студент такое сделал. Я долго не мог понять, почему
у кнопки UpDown появился (именно так это выглядело

> И ни у кого не бедет механизма выяснит есть ли скрол на кнопке или нет


Ну почему же ? Проверить наличие стиля WS_V(H)SCROLL, как я и писал в
начале этого обсуждения.

>

> >> что бы быть 100% уверенным что есть скроллбар нужно получить IHTMLDocument2 и хорошенько пропарсить там разобрать на фреймы и тд...
> PD>А фреймы — не отдельные окна ?
>
> К сожалению нет и вы можете сами в этом убедится натравив Spy

Убедился. Здесь ты прав!

> PD>Ну если иметь в виду, что им отдельный контрол управляет — вопрос вообще

> PD>не решаемый. Так как этот отдельный контрол можно в принципе и в другое
> PD>приложение засадить и пусть управляет
>
> Вопрос решаемый для определенных случаев...
> Тем самым мы просто увеличиваем вероятность найти окно со скролом не более того

И с эти тоже не могу не согласиться.

--
With best regards,
Pavel Dvorkin
Posted via RSDN NNTP Server 1.7 "Bedlam"
With best regards
Pavel Dvorkin
Re[6]: Как определить
От: ghostik Россия http://www.deepseo.ru/
Дата: 27.08.04 11:08
Оценка:
Здравствуйте, Pavel Dvorkin, Вы писали:

>> PD>Owner draw скроллбар ? Можно поподробнее ?

>> Конечно
>> Возможно я и применил не совсем корректный термин, но под Owner draw я хотел сказать что сам скроллбар рисуется и обрабатывается приложением
>> Самым простым примером является окошко IE

PD>Давай ч терминами разберемся. Есть скроллбар в окне, устанавливается

PD>стилями WS_V(H)SCROLL. Есть плоский скроллбар в окне
PD>(FlatSB_EnableScrollBar и т.д.). Есть отдельный контрол — окно класса
PD>scrollbar.

Ок о терминах
Есть термин СкролБар это понятие относится к элементу пользовательского интерфейса
не важно как он был создан и не важно как он рисуется не важно кто им управляет

есть термин стандартный скрол бар (Standard Scroll Bars) это относится к WS_V(H)SCROLL
есть термин плоский скроллбар (Flat Scroll Bars) это к FlatSB_EnableScrollBar
есть термин Scroll Bar Controls это к окно класса scrollbar.

PD>ВСЕ.

PD>Если можешь сказать, как сделать owner-draw скроллбар этих трех типов -
PD>поблагодарю за информацию.

очень интересный примерчик здесь

PD>Все остальные затеи, пусть они 30 раз выглядят как скроллбар и работают,

PD>как он, скроллбарами не явялются.

Писал выше... Скролбарами являются
не являются стандартными скрол барами , плоскиими скроллбарами и Scroll Bar Controls


> Не слишком уж сложно нарисовать в

PD>правой части окна нечто, похожее на скроллбар и обрабатывать там
PD>WM_LBUTTONDOWN etc. Но это не скроллбар MS.

просто ради интереса... скрол бары в IE они не относятся ни к одному из типов перечисленных вами...
Что же это ?

PD>Да, у меня один раз студент такое сделал. Я долго не мог понять, почему

PD>у кнопки UpDown появился (именно так это выглядело
))))))))

>> И ни у кого не бедет механизма выяснит есть ли скрол на кнопке или нет

PD>Ну почему же ? Проверить наличие стиля WS_V(H)SCROLL, как я и писал в
PD>начале этого обсуждения.
А если стиля нет а скрол есть
Re[4]: Как определить
От: Аноним  
Дата: 27.08.04 11:15
Оценка:
Здравствуйте, ghostik, Вы писали:

А>>А как быть с CScrollBar?

G>А для чего вообще нужна эта задача?

Мне нужно сделать картинку всего окна вместе с тем что не помещается в область видимую на экране (вместе со скролом)
для этого думал определить есть ли у окна хоть какой нибудь скрол бар что бы вынуть информацию из него
а затем принудительно скролируя делать картинку из части которая появляется на экране и плюсовать к тому что было до этого
Re[7]: Как определить
От: Pavel Dvorkin Россия  
Дата: 27.08.04 11:34
Оценка:
Привет!

Похоже, флейм начинается, так что я в последний раз, сорри!

ghostik wrote:
> Ок о терминах
> Есть термин СкролБар это понятие относится к элементу пользовательского интерфейса
> не важно как он был создан и не важно как он рисуется не важно кто им управляет

Если так — снимаю все возражения. Потому что в этом случае я напишу свой
контрол, осуществляющий прокрутку, и как он устроен — никто знать не
будет. А прокручивать он будет.

Еще могу в консольном окне скролл устроить . Как FAR, к примеру. Как
насчет того, чтобы определить, есть там сейчас в файловой панели скролл
или нет ?

>

> есть термин стандартный скрол бар (Standard Scroll Bars) это относится к WS_V(H)SCROLL
> есть термин плоский скроллбар (Flat Scroll Bars) это к FlatSB_EnableScrollBar
> есть термин Scroll Bar Controls это к окно класса scrollbar.

> очень интересный примерчик здесь


Посмотрю.

> просто ради интереса... скрол бары в IE они не относятся ни к одному из типов перечисленных вами...

> Что же это ?

Нечто сделанное MS для прокрутки в IE. См., что я написал выше.

>

> >> И ни у кого не бедет механизма выяснит есть ли скрол на кнопке или нет
> PD>Ну почему же ? Проверить наличие стиля WS_V(H)SCROLL, как я и писал в
> PD>начале этого обсуждения.
> А если стиля нет а скрол есть

Если стиля нет, а скролл есть — значит это скролл, сделанный без стиля,
т.е. без Windows специальных средств, предназначенных для скроллинга

--
With best regards,
Pavel Dvorkin
Posted via RSDN NNTP Server 1.7 "Bedlam"
With best regards
Pavel Dvorkin
Re[5]: Как определить
От: black hermit Россия  
Дата: 27.08.04 11:47
Оценка:
Здравствуйте, <Аноним>, Вы писали:

А>Здравствуйте, ghostik, Вы писали:


А>>>А как быть с CScrollBar?

G>>А для чего вообще нужна эта задача?

А>Мне нужно сделать картинку всего окна вместе с тем что не помещается в область видимую на экране (вместе со скролом)

А>для этого думал определить есть ли у окна хоть какой нибудь скрол бар что бы вынуть информацию из него
А>а затем принудительно скролируя делать картинку из части которая появляется на экране и плюсовать к тому что было до этого
Ч чему этот гемор?
WM_PRINT

The WM_PRINT message is sent to a window to request that it draw itself in the specified device context, most commonly in a printer device context.


WM_PRINTCLIENT

The WM_PRINTCLIENT message is sent to a window to request that it draw its client area in the specified device context, most commonly in a printer device context.

... << RSDN@Home 1.1.3 stable >>
The darkness around me
Shores of solar sea
Oh how i wish to go down with the sun....
Re[6]: Как определить
От: Аноним  
Дата: 27.08.04 12:21
Оценка:
Здравствуйте, black hermit, Вы писали:

А>>>>А как быть с CScrollBar?

G>>>А для чего вообще нужна эта задача?
А>>Мне нужно сделать картинку всего окна вместе с тем что не помещается в область видимую на экране (вместе со скролом)
А>>для этого думал определить есть ли у окна хоть какой нибудь скрол бар что бы вынуть информацию из него
А>>а затем принудительно скролируя делать картинку из части которая появляется на экране и плюсовать к тому что было до этого
BH>Ч чему этот гемор?
BH>WM_PRINT
BH>

BH>The WM_PRINT message is sent to a window to request that it draw itself in the specified device context, most commonly in a printer device context.

BH>WM_PRINTCLIENT
BH>

BH>The WM_PRINTCLIENT message is sent to a window to request that it draw its client area in the specified device context, most commonly in a printer device context.


А можно подробнее?


CDC       MemoryDC;  
MemoryDC.Attach(::CreateCompatibleDC(NULL));
m_Wnd.SendMessage(WM_PRINT, (WPARAM)MemoryDC.GetSafeHdc(), (LPARAM)(PRF_NONCLIENT | PRF_OWNED));

так?
и как мне теперь получить CBitmap
Re[7]: Как определить
От: black hermit Россия  
Дата: 27.08.04 12:25
Оценка:
Здравствуйте, <Аноним>, Вы писали:

А>Здравствуйте, black hermit, Вы писали:


А>>>>>А как быть с CScrollBar?

G>>>>А для чего вообще нужна эта задача?
А>>>Мне нужно сделать картинку всего окна вместе с тем что не помещается в область видимую на экране (вместе со скролом)
А>>>для этого думал определить есть ли у окна хоть какой нибудь скрол бар что бы вынуть информацию из него
А>>>а затем принудительно скролируя делать картинку из части которая появляется на экране и плюсовать к тому что было до этого
BH>>Ч чему этот гемор?
BH>>WM_PRINT
BH>>

BH>>The WM_PRINT message is sent to a window to request that it draw itself in the specified device context, most commonly in a printer device context.

BH>>WM_PRINTCLIENT
BH>>

BH>>The WM_PRINTCLIENT message is sent to a window to request that it draw its client area in the specified device context, most commonly in a printer device context.


А>А можно подробнее?



А>
А>CDC       MemoryDC;  
А>MemoryDC.Attach(::CreateCompatibleDC(NULL));
А>m_Wnd.SendMessage(WM_PRINT, (WPARAM)MemoryDC.GetSafeHdc(), (LPARAM)(PRF_NONCLIENT | PRF_OWNED));
А>

А>так?
А>и как мне теперь получить CBitmap

CreateCompatibleBitmap + MemoryDC
... << RSDN@Home 1.1.3 stable >>
The darkness around me
Shores of solar sea
Oh how i wish to go down with the sun....
Re[8]: Как определить
От: ghostik Россия http://www.deepseo.ru/
Дата: 27.08.04 12:25
Оценка:
Здравствуйте, Pavel Dvorkin, Вы писали:

PD>Похоже, флейм начинается, так что я в последний раз, сорри!

мдя...

PD>Если так — снимаю все возражения. Потому что в этом случае я напишу свой

PD>контрол, осуществляющий прокрутку, и как он устроен — никто знать не
PD>будет. А прокручивать он будет.

>> просто ради интереса... скрол бары в IE они не относятся ни к одному из типов перечисленных вами...

>> Что же это ?
PD>Нечто сделанное MS для прокрутки в IE. См., что я написал выше.

так вот для этого случая есть способ получить скроллбар
собственно о котором я и писал ранее...
Re[8]: Как определить
От: Аноним  
Дата: 27.08.04 12:34
Оценка:
BH>CreateCompatibleBitmap + MemoryDC

CreateCompatibleBitmap принимает на вход
nWidth
Specifies the width (in pixels) of the bitmap.
nHeight
Specifies the height (in pixels) of the bitmap.

а я их не знаю....
Я могу взять GetClientRect но это размеры только клиенской области
А мне нужно + еще не видимая часть


а еще допустим даже когда я знаю размеры (Width, Height)

VirtualBitmap.CreateCompatibleBitmapEx(srcDC, Width, Height);
MemoryDC.Attach(::CreateCompatibleDC(srcDC));
pOldBitmap = MemoryDC.SelectObject(&VirtualBitmap);

m_Wnd.SendMessage(WM_PRINT, (WPARAM)MemoryDC.GetSafeHdc(), (LPARAM)PRF_CHILDREN | PRF_CLIENT | PRF_OWNED);

memDC.SelectObject(pOldBitmap);


в итоге получаю черный битмап
Re[9]: Как определить
От: black hermit Россия  
Дата: 27.08.04 12:42
Оценка:
Здравствуйте, <Аноним>, Вы писали:

А>в итоге получаю черный битмап

typedef struct tagBITMAP { /* bm */
int bmType;
int bmWidth;
int bmHeight;
int bmWidthBytes;
BYTE bmPlanes;
BYTE bmBitsPixel;
LPVOID bmBits;
} BITMAP;


BITMAP bmp;
CDC::GetCurrentBitmap()->GetBitmap(&bmp);

... << RSDN@Home 1.1.3 stable >>
The darkness around me
Shores of solar sea
Oh how i wish to go down with the sun....
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.