Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > VB .NET > Динамический рабочий стол


Автор: piadmin 19.12.2005, 13:08
Привет всем.
Такая проблема: хочу на рабочем столе в виде фона (поверх фона рабочего стола) отображать ряд параметров. Параметры должны периодически обновляться...

Как это сделать? Нашел в инете ссылку как это делается через Delfi

http://www.delphimaster.ru/articles/directx/index.html

И никак не найду, как сделать в VB...
Помогите smile

Автор: Exception 19.12.2005, 13:21
Создай полупрозрачное окно с позицией поверх десктопа..

Автор: Гость_piadmin 20.12.2005, 10:39
В этом случае по нему можно будет клацнуть мышкой и выбрать... разве нет?
Не хотелось этого. smile

Автор: Гость_Папа 21.12.2005, 01:28
piadmin
Привет.
Посмотри следующую инфу.
Может пригодиться.
Ситуэйшен: На форме только picturebox и все.
Сама форма не видима и не кликабельна. Кликаешь по картинке, усе закрывается.
Что интересно для тебя. Тут есть решение скрыть саму форму. А элементы на форме будут видны. Если изменить свойство контрола Enable с True на False то, он видим но не кликабелен. Я правда не проверял будут ли к примеру тулбары отражать измениение значений в этом случае? Попробуй сам.
Не знаю как тут можно выложить файл. Приведу код формы, разберешся. А так могу выслать ZIP с проектом на VB.NET(2003).
Код



Option Explicit On 
Option Strict On

Public Class Form1
    Inherits System.Windows.Forms.Form

#Region " Windows Form Designer generated code "

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

        PictureBox1.Top = 0
        PictureBox1.Left = 0
        PictureBox1.SizeMode = PictureBoxSizeMode.AutoSize
        PictureBox1.Image = (Image.FromFile("gin.bmp"))

        Me.BackColor = Color.Magenta          'если указать одинаково свойство magenta в BackColor и в TransparencyKey то
        Me.TransparencyKey = Color.Magenta    'фон формы делается  прозрачным
        Me.FormBorderStyle = FormBorderStyle.None  ' в этом случае не отображается тительбалк и границы формы.    
    End Sub

    Private Sub PictureBox1_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles PictureBox1.Click
        Me.Close()
    End Sub
    'ниже приведен код для перетаскивания формы при нажатии левой кнопки мыши в любом месте формы, а не только в тительбалк
    'декларируем переменную нажатой кнопки мыши, исходное состояние кнопка не нажата
    'декларируем переменную содержащую координаты курсора мыши
    Private IsMouseDown As Boolean = False
    Private MouseOffset As Point
    'суб обработки события нажатия левой кнопки мыши
    'если нажата левая кнопка, то переменная кнопка нажата =true и мы получаем координаты курсора мыши
    Private Sub Form1_MouseDown(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles MyBase.MouseDown
        If e.Button = MouseButtons.Left Then
            IsMouseDown = True
            MouseOffset.X = e.X
            MouseOffset.Y = e.Y
        End If
    End Sub

    'суб нужен для определения события отпускания нажатой левой кнопки иначе курсор залипнет на форме
    Private Sub Form1_MouseUp(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles MyBase.MouseUp
        IsMouseDown = False
    End Sub

    'этот обработчик события перемещения курсора мыши дает нам новые координаты формы, которые вступают в силу после отпускания кнопки.
    Private Sub Form1_MouseMove(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles MyBase.MouseMove
        If IsMouseDown Then
            Me.Location = New Point(Me.Location.X + e.X - MouseOffset.X, Me.Location.Y + e.Y - MouseOffset.Y)
        End If
    End Sub

    'ниже аналогичный код перемещать пикчербокс

    'Private Sub PictureBox1_MouseDown(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles PictureBox1.MouseDown
    '    If e.Button = MouseButtons.Left Then
    '        IsMouseDown = True
    '        MouseOffset.X = e.X
    '        MouseOffset.Y = e.Y
    '    End If
    'End Sub

    'Private Sub PictureBox1_MouseMove(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles PictureBox1.MouseMove
    '    If IsMouseDown Then
    '        Me.Location = New Point( _
    '            Me.Location.X + e.X - MouseOffset.X, _
    '            Me.Location.Y + e.Y - MouseOffset.Y)
    '    End If
    'End Sub

End Class


В принципе тебе нужен кусок кода в Sub Form_Load(), где делаем саму форму прозрачной. Остальное так для перетаскивания, если можно кликать.

И как советовали свойство формы TopMost устанавливай True, тогда форма будет поверх всех окон.


Желаю удачи.

ЗЫ.Самого тоже заинтересовало, на каникулах буду что-то пробовать сделать.

Автор: arilou 21.12.2005, 17:35
piadmin
На десктопе можно рисовать. Попробуй заюзать API ф-цию GetDesktopWindow(). Она тебе вернет HWND, из которого можно будет создать объект Graphics и рисовать на desktop'е.

Автор: Varlok9000 11.2.2006, 23:41
arilou, а код можно вывисеть а я как то уже замучался!!! вроде как находил как это сделать не работало говорила арифмитическия ошибка и усе!!! smile
буду очень благодарен!!!

Автор: Exception 12.2.2006, 03:09
Varlok9000, приветствую на форуме!
Где именно возникает проблема? Объявление функции GetDesktopWindow выглядит так:
Код
Private Declare Auto Function GetDesktopWindow Lib "user32" () As Integer
. Получить объект Graphics можно так:
Код

Imports System.Drawing
'---
Dim hDesktop As Integer = GetDesktopWindow()
Dim g As Graphics = Graphics.FromHwnd(New IntPtr(hDesktop)
. Ну а далее вытворяй с этим g, что пожелаешь smile
P.S. Код отредактировал..

Автор: Varlok9000 12.2.2006, 21:15
Exception,
А ты уверен что это работает!?
у меня он матерится на hDesktop говорит не могу преоброзовать в intPrt

Автор: Varlok9000 12.2.2006, 22:15
вот так все работет

Код

Dim gr As Graphics = Graphics.FromHdc(New IntPtr(GetWindowDC(GetDesktopWindow())))


хм с этим я вроде как заработала только вот оны уж совсем жестко работает прям по верж всего рисует
а желательно чтобы только на рабочем столе и под ярлыками воть!

Автор: Exception 12.2.2006, 22:37
Насчет кода: у тебя проделана одна лишняя операция, надо так:
Код
Dim g As Graphics = Graphics.FromHwnd(New IntPtr(GetDesktopWindow()))
. Я подправил код.
Насчет "поверх всего": сейчас проверить не могу, можешь привести скриншот, что именно не нравится smile ?

Автор: Exception 13.2.2006, 00:26
Хм. Ты имеешь в виду - под ярлыками? Щас подумаю.. Но сомневаюсь, что это возможно.

Автор: Exception 13.2.2006, 01:10
А если написать
Код
Dim g As Graphics = Graphics.FromHwnd(New IntPtr(0))
? По идее, должно сработать.

Автор: arilou 13.2.2006, 11:15
Цитата(Exception @ 13.2.2006, 01:10 Найти цитируемый пост)
Graphics.FromHwnd(New IntPtr(0))

Только под Windows 98. Под NT платформой не гарантируется, что HDC Desktop'а будет 0.

Автор: Varlok9000 13.2.2006, 20:46
вот и именно не работаел ладно с этим понятно что ничего не получиться а как с картинку рабочего стола сначало дернуть а потом обратно вернуть!? smile

Автор: Exception 13.2.2006, 21:03
Цитата(Varlok9000 @ 13.2.2006, 21:46 Найти цитируемый пост)
а как с картинку рабочего стола сначало дернуть а потом обратно вернуть!?

Не понял, как это -- дёрнуть?

Автор: Varlok9000 14.3.2006, 23:07
Exception,
Всмысле как добраться до обоев на рабочем столе скопировать их а потом вернуть обратно где росло.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)