Возможно ли на ВБ сделать форму которая будет поверх ВСЕГО
Возможно ли на ВБ сделать форму которая будет поверх ВСЕГО, включая и игры. Как я понимаю форму сделать нельзя, а вот возможно ли сделать как бы прорисовку(я хочу сделать часы, которые будут поверх всего) какойто надписи поверх всего? Буду благодарен если дадите ссылки на исходники либо на информацию связанную с этим вопросом.
Сделай её олвейс он топ, по-моему, и всё.
Сделай её олвейс он топ, по-моему, и всё.
Да, олвейс он топ в большинстве случаев прокатит, но вот если ты запустишь игрушку которая выводит на экран через DirectX, то она все закрасит, и это окно тоже.
Как вариант, можно делать так, как делают в дровах к мультимедийным клавам, там когда например громкость нажимаешь, она рисует прогрессбар на экране поверх всего и в игрушках тоже. Делается это через рисование на экране посредством win GDI. Используя функции GDI и выбрав в качестве hdc, hdc DesktopWindow'а ты спокойно можешь рисовать на экране все что душе захочется, только вот одно момент, поскоку ты рисуешь напрямую, без всякого окна, то винды не смогут гарантировать сохранение твоего рисунка, что твой рисунок не затрет другое окно, винды вообще не в курсе что ты нарисовал и нигде это не хранят, поэтому если хочешь чтобы картинка висела постоянно, надо озаботится регулярной перерисовкой.
В дровах к клаве кстати делают также, токо там она перерисовывает только тогда, когда пользователь нажимает на клавишу громкости и меняют текущий уровень, поэтому например в том же КС можно словить момент, когда прогрессбар еще не исчез, а половинка его уже затерлась движущейся фигуркой противника.
...Делается это через рисование на экране посредством win GDI. Используя функции GDI и выбрав в качестве hdc, hdc DesktopWindow'а...
Поподробнее можно? Лучше с кодом, который это и осуществляет, я с графой совсем слабо разбираюсь...
Поподробнее можно? Лучше с кодом, который это и осуществляет, я с графой совсем слабо разбираюсь...
Насчет графики и примеров с использованием GDI хорошая книга Петзольда: http://anatolix.naumen.com/win32books.htm
Чтобы привязать все сишные примеры к VB выложу свой немного переделанный, можешь смотреть на него, а за объяснениями лазить в Петзольда.
Public Declare Function GetWindowDC Lib "user32" (ByVal hWnd As Long) As Long
Public Declare Function Ellipse Lib "gdi32" (ByVal hdc As Long, ByVal X1 As Long, ByVal Y1 As Long, ByVal X2 As Long, ByVal Y2 As Long) As Long
Public Declare Function SelectObject Lib "gdi32" (ByVal hdc As Long, ByVal hObject As Long) As Long
Public Declare Function ReleaseDC Lib "user32" (ByVal hWnd As Long, ByVal hdc As Long) As Long
Public Declare Function DeleteObject Lib "gdi32" (ByVal hObject As Long) As Long
Public Sub DrawRound(LineStyle As Long, LineWidth As Long, LineColor As Long, x As Long, y As Long)
' Рисует окружность на десктопе
Dim hWnd As Long
Dim lPen As Long, lOldPen As Long
Dim DeskTophDc As Long
' создаем перо
lPen = CreatePen(LineStyle, LineWidth, LineColor)
' получаем hWnd окна (раб. стол)
hWnd = GetDesktopWindow
' получаем hdc раб. стола
DeskTophDc = GetWindowDC(hWnd)
' выбираем созданное перо в hdc раб. стола
OldPen = SelectObject(DeskTophDc, lPen)
' рисуем эллипс
Call Ellipse(DeskTophDc, x, y, x + 20, y + 20)
' выбираем в hdc пред. перо
SelectObject DeskTophDc, OldPen
' теперь можно удалить наш объект-перо
DeleteObject PenHND
' освобождаем hdc раб. стола
ReleaseDC GetDesktopWindow, DeskTopDc
End Sub
Помести этот код в модуль а потом запусти процедуру DrawRound например с такими параметрами:
DrawRound(1, 1, 1, 100, 100)
в этом коде отражены большинство основных моментов рисования, нету только часто используемого варианта рисования в виртуальном окна и копирования потом все этого сразу одним махом в выбранный hdc (импользуется функция CreateCompatibleDC), но это ты уже можешь у Петзольда почитать, ну или я подскажу, там ничего сложного, просто создается точная копия выбранного hdc и вся работа идет с ним, а в конце побитово копируем получив. картинку с одного hdc на другой hdc.
DeleteObject lPen
' освобождаем hdc раб. стола
ReleaseDC hWnd, DeskTophDc
End Sub
Так правильно будет
Сразу задам несколько вопросов, чтобы не растягивать топик...
1) В играх, наблюдается сильное мерцание(проверял в таймере с задержкой 10 мсек). Возможно ли как-нибудь процесс прорисовки синхронизировать с процессом обновления изображения на мониторе? Или повысить частоту частоту обновления(я гдето читал, что в таймере максимальная чувтстветельность гдето 27 обновлений в сек, но в играх фпс составляет где-то 40-60, а то и больше...)
2) Часы я хотел сделать чтобы писалось число(электронные то есть), а не циферблат. Мне нужна функция писания текста.
3) Вот я смотрю что вы берете API функции...ну вот есть в VB ApiViewer, а толку от него...он по названию функции ищет, которых я как раз и не знаю. Вы чем то другм пользуетесь или просто крутите список и читаете что в нем написано?(примерно понять там можно что делает функция, но проверять каждую функцию, которая вроде бы подходит, что она делает - этоже долго)
4)...учебники то по Си...разобраться бы как все в ВБ делать, а тут еще и с Си рабираться который я вообще не знаю...
В примере, ты функцию CreatePen забыл объявить ;)
Сразу задам несколько вопросов, чтобы не растягивать топик...
1) В играх, наблюдается сильное мерцание(проверял в таймере с задержкой 10 мсек). Возможно ли как-нибудь процесс прорисовки синхронизировать с процессом обновления изображения на мониторе? Или повысить частоту частоту обновления(я гдето читал, что в таймере максимальная чувтстветельность гдето 27 обновлений в сек, но в играх фпс составляет где-то 40-60, а то и больше...)
2) Часы я хотел сделать чтобы писалось число(электронные то есть), а не циферблат. Мне нужна функция писания текста.
3) Вот я смотрю что вы берете API функции...ну вот есть в VB ApiViewer, а толку от него...он по названию функции ищет, которых я как раз и не знаю. Вы чем то другм пользуетесь или просто крутите список и читаете что в нем написано?(примерно понять там можно что делает функция, но проверять каждую функцию, которая вроде бы подходит, что она делает - этоже долго)
4)...учебники то по Си...разобраться бы как все в ВБ делать, а тут еще и с Си рабираться который я вообще не знаю...
Да, про CreatePen забыл, каюсь... :(
Насчет поиска функций: в APIвьере я конечно как правило уже ищу какую-то определенную функцию, о о которой узнал либо от кого-то либо из книжки, в третьем случае я еще смотрю APIвьере функции разбитые по тематике или в разделе похожие (или как он там называется, когда внизу показываются близкие функции)
Но в основном конечно из книжек и интернет статей. Не разделяю твои опасения на счет книжки Петзольда. То что там примеры на Си не должно тебя пугать, ведь это примеры именно программ, а описаний работы API функций в тексте книжки вообще не привязаны никакому языку. Например твой вопрос по функциям вывода текста очень хорошо рассмотрен у Петзольда на странице 154.
(Единственно что в Си может смущать, это то что они объявляют переменные с помощью разных вспомогательных типов, Brush, Pen, Handle и т.д. - в VB все эти типы будут иметь один аналог - это Long)
Насчет таймера. Если надо рисовать быстрее, тот тут тогда делают не таймер, а цикл например с проверкой точного времени (API GetTime) или тактов процессора. и на определенных условиях она срабатывает. Т.е. твоя программа работает как отдельный поток (если таймер надо реализовать параллельно основному коду программы). У тебя же будет программа будет заниматься только этим, так что отдельный поток не нужен
Подскажи какие-нибудь интересные ресурсы.
>Например твой вопрос по функциям вывода текста >очень хорошо рассмотрен у Петзольда на странице >154.
я скачал две части русской книжки...оказалось одно и тоже и только примеры и исходники никаких книжек...щас англ версию скачаю посмотрю что там...
>Единственно что в Си может смущать, это то что >они объявляют переменные с помощью разных >вспомогательных типов, Brush, Pen, Handle и >т.д. - в VB все эти типы будут иметь один >аналог - это Long)
Спасибо, учту
>тут тогда делают не таймер, а цикл...
Насколько я знаю если ввести в программу цикл то она полностью стопарится выполняя этот цикл. Мне это не надо.
Больше никак?
редактирование:
в электронной версии учебника Petzold'a нет страниц, скажи название главы, думаю тут расхождений не будет...
>Но в основном конечно из книжек и интернет >статей.
Подскажи какие-нибудь интересные ресурсы.
>Например твой вопрос по функциям вывода текста >очень хорошо рассмотрен у Петзольда на странице >154.
я скачал две части русской книжки...оказалось одно и тоже и только примеры и исходники никаких книжек...щас англ версию скачаю посмотрю что там...
>Единственно что в Си может смущать, это то что >они объявляют переменные с помощью разных >вспомогательных типов, Brush, Pen, Handle и >т.д. - в VB все эти типы будут иметь один >аналог - это Long)
Спасибо, учту
>тут тогда делают не таймер, а цикл...
Насколько я знаю если ввести в программу цикл то она полностью стопарится выполняя этот цикл. Мне это не надо.
Больше никак?
редактирование:
в электронной версии учебника Petzold'a нет страниц, скажи название главы, думаю тут расхождений не будет...
У них в двух архивах примеры одинаковые, а в директориях Book лежат разные файлы:
Programming Windows 95. Part I.pdf
Programming Windows 95. Part II.pdf
соотв. первая и вторая часть. Setup можешь не запускать, главное из архива все вынуть.
В этих двух pdf файлах вся книга. Кроме того в pdf поддерживает разбивка на страницы, так что с этим проблемы быть не должно. Ты в какой программе открываешь pdf? Лучше использовать родной, Acrobat Reader (а так вообще глава 4 "Главное о графике", "Текст и шрифты")
Насчет цикла. Если конечно делать пустой цикл, то он будет постоянно крутиться и лишний раз напрягать систему (другие программы он конечно не заблокирует - все таки у нас многозадачная система, она сама поделит время процессора между программи). Так вот, чтобы облегчить такой цикл, внутри него либо ставят API функцию ождающее ввод с клавиатуры и мыши или просто поток засыпает на
время, чтобы дать поработать другим. В твоем случае тебе надо использовать функцию Sleep внутри цикла, укажи ей в миллисекундах время сна, что-нибудь 50-100 миллсек. и все, твой программа будет просыпаться каждые 100 миллесек, делать свое черное/белое дело и засыпать дальше.
Мне надо НЕ ЧТОБЫ программа дала поработать другим программ, а ЧТОБЫ ОНА САМА сохраняла свою функциональность вне этого цикла...она должна обрабатывать другие таймеры, имеющиеся в ней и другие функции.
И прошу более конкретней приводить примеры, если имеешь возможность - то с кодами. В общем виде я сам понимаю как это доджно происходить, сюда я обращаюсь именно с просьбой помочь в помощи поиска кода.
На счет учебника - я когда ставил его, как то проскочила мимо взгляда папочка Book :) в которой и находился учебник, бывает :) А в англ версии которую я щас скачал, учебник находится в .chm формате.
ps. Может в асе поговорим? :)
my icq: 330837479 - только скажи на сколько у тебя разница с Москвой...у меня +7...
Как кем-то было сказно: "Умный переспросит, а дурак промолчит".
Мне надо НЕ ЧТОБЫ программа дала поработать другим программ, а ЧТОБЫ ОНА САМА сохраняла свою функциональность вне этого цикла...она должна обрабатывать другие таймеры, имеющиеся в ней и другие функции.
И прошу более конкретней приводить примеры, если имеешь возможность - то с кодами. В общем виде я сам понимаю как это доджно происходить, сюда я обращаюсь именно с просьбой помочь в помощи поиска кода.
На счет учебника - я когда ставил его, как то проскочила мимо взгляда папочка Book :) в которой и находился учебник, бывает :) А в англ версии которую я щас скачал, учебник находится в .chm формате.
ps. Может в асе поговорим? :)
my icq: 330837479 - только скажи на сколько у тебя разница с Москвой...у меня +7...
Разница с Москвой у меня 0 :) вот токо Аси у меня нет, все админы позакрывали на работе, так что не пролезть.
Насчет цикла. Если у тебя конечно прога занимается еще кучей других дел и одновременно хочется получить очень быстрый таймер, то без цикла в отдельном потоке здесь не обойтись ИМХО я других вариантов не знаю. Сам на VB никогда многопотоковостью не занимался, но регулярно натыкался на написанные классы под VB реализующие эти возможности. Лучше пользоваться ими, уже готовыми и проверенными, потому что в реализации многопотоковости под VB как я слышал много всяких подводных камней которые признают сами программисты microsoft (но ведь они и не расчитывали чтобы из VB писали такие сложные программы, вот и весь их ответ)
Насчет кода,.... уже убегаю с работы, завтра уточним детали
Ну а теперь все тоже про мерцание. Попробовал я сделть ее однопоточной как ты предложил, поставил рисование в цикл...толку нет совсем, мерцание так же наблюдалось сильное, даже не лучше чем в таймере. Внутри функции ставил sleep 10-100, эффекта было ноль. Может знаешь еще какие-нибудь варианты как всетаки вывод можно синхронизировать с обновлением экрана?
На работе вообще все порты позакрывали или просто порт на асю прикрыли? :)
Книга - класс! Нашел я как текст выводить.
Ну а теперь все тоже про мерцание. Попробовал я сделть ее однопоточной как ты предложил, поставил рисование в цикл...толку нет совсем, мерцание так же наблюдалось сильное, даже не лучше чем в таймере. Внутри функции ставил sleep 10-100, эффекта было ноль. Может знаешь еще какие-нибудь варианты как всетаки вывод можно синхронизировать с обновлением экрана?
На работе вообще все порты позакрывали или просто порт на асю прикрыли? :)
Мигает говоришь... даже не знаю чем тебе помочь, программы DirectX писуют на экране в обход window GDI, обращаясь напрямую в видеопамять (для этого и был написан DirectX), поэтому как можно синхронизоваться с DirectX программой (и при этом использовать еще GDI) я себе не представляю...
У меня тут кстати такая мысль возникла, я очень мало что знаю про DirectX и не могу предсказать как поведет себя полноэкранная DirectX программа если поверх вывести popup окно. Я тут как раз накарябал класс под VB создающий и показывающий popup окно... не знаю что произойдет, может directX программа свернется, а может и нет.... просто такая мысль мне пришла, когда я наблюдал появление MsgBox поверх CS, ничего так, появилось это окошко и спокойно висело себе поверх CS, он правда конечно чебе фокус забрала (ведь это же MsgBox, у него тип окна модальный), а вот если popup попробовать, оно же фокус не забирает
Вообщем можно рискнуть, если это тебя заинтересует, то напиши, я выложу здесь модуль класса и опишу основные методы.
программы DirectX писуют на экране
И кто только придумал буквы "п" и "р" на клавиатуре рядом разместить :)
Немного юмора :) - http://fasco.nm.ru/files/ymor.jpg , вот они то и придумали :)
Если бы меня это не интересовало, то я бы уже давно перестал писать тут ;)
ps. Не в тему, но ты случеаем в АВ не играешь? А то видел тут неделю назад пробегал кто-то точно с таким же ником как и у тебя здесь :) - SergeySV то есть...
с нетерпеньем жду...
ps. Не в тему, но ты случеаем в АВ не играешь? А то видел тут неделю назад пробегал кто-то точно с таким же ником как и у тебя здесь :) - SergeySV то есть...
Не, это не Я был, ник очень распространенный, тем более что если у меня и выдается свободное минутка, то я тогда либо в КС по локалке рублюсь или в CMR3 рассекаю (скоро кстати CMR4 должен выйти :o )
Значит вот два файла, я там по возможности закоментировал свои изыскания, так что должно просто создаваться простое окно типа "STATIC" (ну со стилем POPUP еще конечно)
Как с этим классом работать. Кроме метода Show, лучше ничего не трогать, потому что какие-то методы недоделанные и просто подвесишь программу, я их уже комментировать не стал.
Так, значит, в коде пишешь например так:
Dim a As clsPopup
' создал окно
Set a = New clsPopup
' показываем окно
a.Show
' уничтожаем окно
Set a = Nothing
Теперь такой момент. Этот класс я разрабатывал под Access, поэтому там стоит ссылка на главное окно Access. Под ссылкой понимается, то что при создании popup окна необходимо указать hInst программы, я в своем коде делал это через hWnd (ну на самом деле я hWnd окна Access еще указал чтобы окно было дочерним для окна Access, но тебе это не нужно, поэтому в твоем примере я убрал hWdn Access из функции CreateWindowEx)
' hWnd гл. окна Access
hWndAccess = Application.hWndAccessApp
' получение hInstance Access'а
hInst = GetWindowLong(hWndAccess, GWL_HINSTANCE)
Соответсвенно, для тебя главное получить hInst, если ты пишешь в VB6, то там у формы помойму есть такое свойство(hInstants), или тогда вместо Application.hWndAccessApp укажи hWnd своей основной формы (а уж hInst автоматом вычислится через GetWindowLong).
К стилю окна я добавил расширенный стиль WS_EX_TOPMOST, так что по крайне мере на раб. столе это окно будет всегда сверху, а вот что будет в DirectX не знаю, может быть тут еще и от самой DirectX программы зависит...
Ну классы работают, рисутеся окошко с надписью "Привет!", но в играх его не видно. Ладно,остановимся на варианте вывода через gdi. Я уже сам посмотрю что можно сделать чтобы не мерцало, в крайнем случае сделаю отдельную однопотоковую форму как ты и говорил.
Спасибо за помощь...