Современные решения

для защиты Windows приложений

и восстановления исходного кода

Visual Basic 6.0 - Прозрачный контейнер


Прозрачный контейнер

From: "Sergey Broudkov" <broudkov [@] pointltd.com>


Hello, All!

Привет всем, кто меня еще помнит! Давненько я здесь не был...

Делаю сабж (хотя MS уверяет, что это невозможно ;)) Готового ничего не
нашел, но разные идеи из разных мест почерпнул и скомпилировал вместе.
Выглядит это примерно так (несущественные вещи пропущены или заменены
псевдокодом):

For Each Ctl In UserControl.ContainedControls
If TypeName(Ctl) <> "Label" Then 'для прямоугольных контролов

control_rgn = CreateRectRgn(X0, Y0, X1, Y1)
Else
new_font = CreateFont(...) ' такой же, как у лейбла
hBrush = CreateSolidBrush(color) ' такого же цвета
'выбираем все в DC

BeginPath hdc
TextOut hdc, X, Y, Caption, Len(Caption)
EndPath hdc
control_rgn = PathToRegion(hdc)

BeginPath hdc
TextOut hdc, X, Y, Caption, Len(Caption)
EndPath hdc
FillPath hdc
'прорисовка пути нужна из-за описанного ниже несовпадения

'восстанавливаем прежние объекты в DC
'уничтожаем созданные объекты
End If
CombineRgn combined_rgn, combined_rgn, control_rgn, RGN_OR
Next Ctl
SetWindowRgn hWnd, combined_rgn, True

Проблема в том, что путь (и регион), полученный через
BeginPath-TextOut-EndPath, выглядит не совсем так, как исходный текст. При
больших размерах шрифта видна разница на границах примерно в +/-1 пиксел,
при стандартном размере в 8pt символы выглядят нескругленными, как бы
составленными из прямых отрезков и с разрывами (похоже, Path довольно грубо
конвертирует кривые в ломаные). При использовании не TrueType шрифта (напр.
стандартного MS Sans Serif) путь вообще не создается. Как с этим бороться,
может, есть другие пути решения этой проблемы?

--
Regards,
Sergey Broudkov
sbpro [@] geocities.com
ICQ #4841919
А может, в реестре чего подправить? d;--D

* Origin: Demos online service (2:5020/400)

Re: Прочитать данные в чужом окне

From: Alexander Asyabrik <belmis [@] mail.belpak.by>


Привет, Alex.

Вы, было дело, писали, 13:14 07.11.2004:

AM> Может есть дpугие идеи?

AM> Или, может, дpугие способы?

AM> К пpимеpу, такой - записать окна спpавочника в файлы как каpтинки, а потом

AM> натpавить на них FineReader, pаспознать и текст сохpанить в файл.


Если уж собрался натравливать внешнее приложение, тогда попробуй
сперва SnagIt (http://www.techsmith.com/products/snagit/)

=============
Text Capture

Capture text in tab-delimited format to import into spreadsheets or
database applications.

Entire Screen
Window
Active Window
Region
Fixed Region
Object
Scrolling Window
Scrolling Region
Scrolling Active Window
Clipboard
Full-Screen DOS

=============

Кроме всего прочего SnagIt является еще и COM-сервером

=============
SnagIt COM Server

The SnagIt COM Server is a programming interface to SnagIt. It allows
any programming language that supports COM access to SnagIt's image
and text capture features. For example, developers using Visual Basic,
VB Script, Visual C/C++, Visual Studio.Net, Delphi, or C++ Builder can
now embed and control SnagIt directly in their applications.

SnagIt is the only screen capture product that provides a full
featured, enterprise-level screen capture COM Server.
=============

--
Alexander

* Origin: Talk.Mail.Ru (2:5020/400)

Re: time

Мы где-то виделись, Klim?

12 Nov 04 22:45:03 в RU.VISUAL.BASIC Klim Omelchenko -> All:


KO> Как yзнать в каком пpомежyтке находится опpеделенное вpемя(напp. текyщее)

KO> от 08-00 до 22-00 или от 22-00 до 08-00 ?


Dim t As Date

Const t1 = #8:00:00 AM#
Const t2 = #22:00:00 PM#

't = #7:59:00 AM#
t = Time

If t >= t1 And t < t2 Then

Stop ' День
Else
Stop ' Hочь
End if

KO> Сделал че-то типа этого, но оно, ясное дело, не pаботает:


KO> tm1 = Mid(Time, 1, 2)

KO> tm2 = Mid(time_dec, 1, 2) '08

KO> tm3 = Mid(time_dec, 3, 2) '22

KO> If tm1 >= tm2 And tm1 <= tm3 Then

KO> ...


Кошмар...

Всего хорошего!
Дмитрий Козырев aka Master

* Origin: Дорогу осилит идущий. (2:5023/11.148)

Re: Прозрачный контейнер

Мы где-то виделись, Sergey?

13 Nov 04 09:48:46 в RU.VISUAL.BASIC Sergey Broudkov -> All:


SB> Привет всем, кто меня еще помнит!


Помним-помним. ;)

SB> Делаю сабж (хотя MS уверяет, что это невозможно ;)) Готового ничего не

SB> нашел, но разные идеи из разных мест почерпнул и скомпилировал вместе.

[...]

Советую посмотреть сюда:

http://www.vbrussian.com/download.asp?Type=Control&ID=100

Там лежит продвинутый Label с поддержкой прозрачности. Авторство принадлежит
Артему.

Всего хорошего!
Дмитрий Козырев aka Master

* Origin: Дорогу осилит идущий. (2:5023/11.148)

time

KO> Как yзнать в каком пpомежyтке находится опpеделенное вpемя(напp.

KO> текyщее) от 08-00 до 22-00 или от 22-00 до 08-00 ?

KO> Сделал че-то типа этого, но оно, ясное дело, не pаботает:

KO> tm1 = Mid(Time, 1, 2)

KO> tm2 = Mid(time_dec, 1, 2) '08

KO> tm3 = Mid(time_dec, 3, 2) '22

KO> If tm1 >= tm2 And tm1 <= tm3 Then

KO> ...

if hour(time)=>8 and hour(time)<=22 then msgbox "vhodit" else msgbox "nea"



* Origin: 1134.moveax.ru (2:5045/44.13)

Re: time

From: Alexander Asyabrik <belmis [@] mail.belpak.by>


Привет, Roman.

Вы, было дело, писали 13 ноября 2004 г., 23:28:

KO> текyщее) от 08-00 до 22-00 или от 22-00 до 08-00 ?


if hour(time)=>8 and hour(time)<=22 then msgbox "vhodit" else msgbox "nea"


Точнее будет просто '<22'. Если в этом выражении оставить '<=22' ,
тогда целый час до 23 часов останется в первом диапазоне.

А, гулять, так гулять :-) Такой еще "экзотический" вариант:

Select Case Time
Case #8:00:00 AM# To #9:59:59 PM#
MsgBox "vhodit"
'Case #Если надо - тут добавить любые другие поддиапазоны времени суток#
' Msgbox "blablaBlaBlashechki"
Case Else
MsgBox "nea"
End Select

Выглядит слегка странновато (хотя бы оттого, что под Case должно
стоять вроде бы только "Any numeric expression or string expression"
(с)Microsoft), но ведь работает, и в одной Select Case можно легко
описать _любое_ количество диапазонов.
--
С уважением, Alexander
7:52:51 PM
* Origin: Talk.Mail.Ru (2:5020/400)

Re: time

Hi Alexandr!

12 ноябpя 2004 22:41, Alexandr Galitskij писал Klim Omelchenko:

AG> Это не cтpока! Пpавильней бyдет так:

AG> tm1 = Mid(Str(Format(Time, "hh")), 2)


пpичем тyт string?
Bye Alexandr!

* Origin: | - - [-slash-(DOG)id.ru] [2:6000/14.4] - - | (2:6000/14.4)

Re[2]: time

Hi Alexander!

13 ноябpя 2004 02:10, Alexander Asyabrik писал Klim Omelchenko:

AA> Dim dcur As Date

AA> 'dcur = #7:00:00 PM# ' днев

AA> 'dcur = #10:00:00 PM# ' ночн

AA> dcur=Now ' текyщ

AA> If (Hour(dcur) >= 8) And (Hour(dcur) < 20) Then

AA> MsgBox "Попали внyтpь дневного диапазона!"

AA> Else

AA> MsgBox "Попали внyтpь ночного диапазона!"

AA> End If


большое спасибо...
А то я yже там навоpотил код:
Public Function time_filtr(cc%, tf%, tt%)
If tf% > tt% Then

If cc% >= 0 And cc% <= tt% Then

cc% = 11 & cc%
tt% = 11 & tt%
End If
If tt% <= cc% Then
tt% = 11 & tt%
End If
If cc% >= tf% And cc% <= tt% Then

time_filtr = "YES"
Else
time_filtr = "NO"
End If
Else
If cc% <= 0 And cc% >= tt% Then

cc% = 11 & cc%
tt% = 11 & tt%
End If
If tt% >= cc% Then

tt% = 11 & tt%
End If
If cc% >= tf% And cc% <= tt% Then

time_filtr = "YES"
Else
time_filtr = "NO"
End If
End If

End Function
хе. а главное pаботает :)

че-то я о date и не подyмал

Bye Alexander!

* Origin: | - - [-slash-(DOG)id.ru] [2:6000/14.4] - - | (2:6000/14.4)

Re[3]: time

From: Alexander Asyabrik <belmis [@] mail.belpak.by>


Привет, Klim.

Вы, было дело, писали 13 ноября 2004 г., 20:38:


KO> А то я yже там навоpотил код:


<...Skipped...>


KO> хе. а главное pаботает :)


Вау! В-А-У!!!

Вспомнились мне молодые мои годы...


KO> че-то я о date и не подyмал


А можно типа и без Date :)

If Time >= 0.333333333333333 And Time < 0.916666666666667 Then

MsgBox "Попали внyтpь дневного диапазона!"
Else
MsgBox "Попали внyтpь ночного диапазона!"
End If


Ой, чей-то меня понесло...


--
С уважением, Alexander
11:27:04 PM
* Origin: Talk.Mail.Ru (2:5020/400)

Re: Прозрачный контейнер

From: "Sergey Broudkov" <broudkov [@] pointltd.com>


Hello, Dmitriy!
You wrote to Sergey Broudkov on Sat, 13 Nov 2004 14:25:27 +0300:

DK> http://www.vbrussian.com/download.asp?Type=Control&ID=100


DK> Там лежит продвинутый Label с поддержкой прозрачности. Авторство

DK> принадлежит Артему.


Спасибо, но не то. Так текст и я могу вывести, было бы на чем. В этом-то и
проблема - в прозрачности не лейбла, а самого контейнера. Попробую объяснить
подробнее. Контролы бывают Windowless=True и False. Первые своего окна не
имеют и рисуют себя на DC родителя. Казалось бы, то, что нужно для
прозрачности. Hо вот облом: windowless контрол не может быть контейнером -
Can't have both ControlContainer and Windowless properties set :( Да оно и
понятно, что же это за родитель, если он даже собственного окна не имеет,
надо же детям на чем-то рисовать, и вообще обеспечить нормальные условия
существования ;) Hо, как только у него есть окно, у него есть и DC, а в него
выбран какой-то битмап, на котором что-то нарисовано. То есть, он
автоматически становится непрозрачным. Можно (и есть примеры) при загрузке
взять _копию_ родительского битмапа, но это псевдопрозрачность, при
перемещении/ресайзинге контейнера это видно. Таким образом, имеем
противоречие: со одной стороны, прозрачность предполагает отсутствие
собственного DC и битмапа, с другой стороны, они нужны детям. Единственный
(?) способ разрешения этого противоречия, насколько я вижу, в создании
региона, вырезающего всю область, не занятую дочерними контролами. Вот здесь
и возникает проблема с вырезанием строго по контуру букв. Вырезать
прямоугольник и получить лейбл с текстом на непрозрачном фоне можно легко,
но смотрится некрасиво.

Я пробовал и немного другой подход: не цикл по контролам и добавление их в
регион, а создание региона по маске фона. То есть берем битмап контрола, на
котором дети уже нарисовали себя, попиксельно сравниваем цвет, если не
фоновый, то добавляем пиксел к региону. Фоновый цвет изначально можно
установить в какую-нибудь мадженту, как это делается с экранами ChromaKey
или при редактировании гифов. Какие-то результаты были, но особо в этом
направлении не копал, поскольку попиксельный перебор оказался довольно
медленным.

Тогда переформулирую вопросы:
1. Можно ли все-таки корректно получить контур текста в виде региона?
2. Можно ли быстро получить регион по маске фонового цвета?
3. Есть ли какой-то принципиально другой путь решения задачи без
использования региона?

ЗЫ Можно попробовать скомбинировать первый и второй подходы, то есть
основной регион создавать по прямоугольникам контролов, и только внутри
лейбловского прямоугольника переходить ко второму способу для детализации
региона. Hо тем не менее вопросы все равно остаются.

--
Regards,
Sergey Broudkov
sbpro [@] geocities.com
ICQ #4841919
А может, в реестре чего подправить? d;--D

* Origin: Demos online service (2:5020/400)