Форум программистов, компьютерный форум, киберфорум
Visual Basic .NET
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.99/2938: Рейтинг темы: голосов - 2938, средняя оценка - 4.99
Почетный модератор
 Аватар для Памирыч
23251 / 9163 / 1084
Регистрация: 11.04.2010
Сообщений: 11,014

Готовые решения и полезные коды на Visual Basic .NET (Часть-1)

18.08.2011, 22:44. Показов 584033. Ответов 250
Метки faq (Все метки)

Студворк — интернет-сервис помощи студентам
Предлагаю в этой теме размещать ответы на часто задаваемые вопросы и просто делиться полезными кодами.
Обращаю внимание на некоторые моменты, которые являются дополнением к основным правилам
  1. Запрещается копировать материалы с других сайтов или форумов
  2. Решения должны быть написаны с использованием языка Visual Basic .NET
  3. Запрещено создавать посты с уточнениями и замечаниями. Такие вопросы задавайте на форуме
  4. Код, в котором присутствуют комментарии, читается и понимается намного легче и быстрее
  5. Длинные коды и объемные вопросы одного содержания заключайте в теги [SPОILER]Большой код[/SPОILER]
  6. При создании поста убедитесь, что этот вопрос не был освещен ранее
  7. Код должен быть написан грамотно, большие и неэффективные коды будут удаляться
  8. Список вопросов по конкретной теме нельзя "разрывать" на 2 и более поста

Просьба к постившим: не спешите постить решения "сгоряча", тщательно обдумайте список вопросов, их тематику и порядок
Если вы найдете информацию, которой можно было бы дополнить ваши предыдущие сообщения, что-то изменить или перегруппировать, пишите в л/с.

 Комментарий модератора 
Данные правила обязательны к исполнению в рамках темы


Примечание: некоторые коды приведены без учета строгой типизации (Параметр Strict), поэтому для их использования необходимо выполнить приведение типов
55
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
18.08.2011, 22:44
Ответы с готовыми решениями:

Готовые решения и полезные коды на Visual Basic .NET (Часть-2)
Данная тема является продолжение одноимённой темы https://www.cyberforum.ru/vb-net/thread343195.html Предлагаю в этой теме размещать...

Готовые решения и полезные коды на Visual Basic 6.0
Запрещаются любые обсуждения выложенных здесь работ (читаем спойлер). Собственно тут буду публиковать разные коды (как собственные или...

Продам готовые коды и решения на Visual Basic за 400 рублей
душу продаю:cry: Продам коды исходные на VB !!10 лет копил за 400р !!размер тока кодов 312метров там есть все ! мыло контакты удалены....

250
Строитель
 Аватар для Nord790
889 / 556 / 194
Регистрация: 01.04.2014
Сообщений: 610
Записей в блоге: 6
07.06.2014, 12:54
Студворк — интернет-сервис помощи студентам
Как сделать Popup элемент?
И так создаём элемент UserControl и переименовываем его в PopupControl и размещаем на нём не сколько элементов. После того как добавили элементы, добавляем следующий код
VB.NET
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Public Class PopupControl
Private popup As New ToolStripDropDown()
Private host As New ToolStripControlHost(Me)
Sub New()
        popup.Margin = Padding.Empty
        popup.Padding = Padding.Empty
        host.Margin = Padding.Empty
        host.Padding = Padding.Empty
        popup.Items.Add(host)
        InitializeComponent()
End Sub
Public Sub ShowPopup(control As System.Windows.Forms.Control, point As System.Drawing.Point)
        popup.Show(control, point)
End Sub
End Class
а потом уже создаём элемент на форме к примеру Label и для него размещаем следующий код
VB.NET
1
2
3
4
Private Sub Label1_Click(sender As Object, e As EventArgs) Handles Label1.Click
Dim popup1 As New PopupControl
popup1.ShowPopup(sender, New Point(sender.Width, 0))
End Sub
запускаем проект и должны получить к примеру как показано на скриншоте.
Миниатюры
Готовые решения и полезные коды на Visual Basic .NET (Часть-1)  
9
Заблокирован
09.06.2014, 06:09
Вход в ВКонтакте

Вводим логин, пароль (кнопка рядом с полем для пароля показывает буквы пароля), нажимаем Вход - в WebBrowser загружается наша страница ВКонтакте, мы авторизованы.

Вместо WebBrowser целесообразно использовать Awesomium (см здесь).
Он не завешивает форму на момент загрузки страницы и вообще быстрее (по сути, это хром).

Код кнопки Вход и как я до него додумался.

VB.NET
1
WebBrowser1.Navigate("https://login.vk.com/?act=login&email=" & textBoxLogin.Text & "&pass=" & maskedTextBoxPassword.Text)
Как додумался
Кликните здесь для просмотра всего текста



P.S. Проект написан в SharpDevelop (за неимением иного на данный момент), однако в Visual Studio 2005 и новее должен открываться.
2
Строитель
 Аватар для Nord790
889 / 556 / 194
Регистрация: 01.04.2014
Сообщений: 610
Записей в блоге: 6
10.06.2014, 10:18
Как узнать какой объекта находится на форме по координатам?
Думаю здесь объяснять ничего не надо, если честно код очень простой.
VB.NET
1
2
3
4
5
6
Dim Element As Control = GetChildAtPoint(New Point("указываем координаты X", "указываем координаты Y"))
If Element Is Nothing Then
            ' нету объекта
Else
            ' есть объект
End If
3
1548 / 1525 / 325
Регистрация: 03.10.2012
Сообщений: 1,551
11.06.2014, 19:20
Пример использования GPS-координат добытых из файла JPEG.

Если ваше приложение умеет просматривать фотографии, то с помощью этого примера вы можете добавить в него такую функциональность как "Показать на карте". Файл должен содержать GPS-координаты. Если таковые отсутствуют, код покажет точку с координатами 0,0 (в Атлантическом океане).

Вот класс для вытаскивания GPS-координат из JPEG-файла:
VB.NET
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
''' <summary>
''' Получает GPS-координаты из метаданных файла JPEG
''' </summary>
''' <remarks></remarks>
Public Class GPSCoordinate
    Private sLat As String
    Private sLng As String
 
    Public Sub New(ByVal image As Bitmap)
        
        Dim gradLat, minLat, secLat As String
        Dim gradLng, minLng, secLng As String
        Dim ns As Integer = 1
        Dim ew As Integer = 1
        Dim strNS, strEW As String
 
        Try
            'Свойство 1 определяет полушарие "S"- южное, "N"- северное
            'Свойство 3 определяет стороны света : "W"- к западу от Гринвича, "E"- к востоку от Гринвича 
 
            strNS = Encoding.Default.GetString(image.GetPropertyItem(1).Value)
            strEW = Encoding.Default.GetString(image.GetPropertyItem(3).Value)
 
            If strNS = "S" Then
                ns = -1    'Южное полушарие
            End If
 
            If strEW = "W" Then
                ew = -1     'К западу от Гринвича
            End If
 
            gradLat = image.GetPropertyItem(2).Value(0).ToString 'Целые градусы широты (нулевой байт)
            minLat = image.GetPropertyItem(2).Value(8).ToString  'Целые минуты широты (восьмой байт)
 
            'С секундами сложнее, разные камеры дают разное количество байтов
            'Этот алгоритм создан эмпирическим путем т.к. не нашел стандарта
            'Точность 5-6 знаков после запятой в сравнении со штатным декодером аппарата
 
            With image.GetPropertyItem(2) 'Секунды широты
                If .Value(17) = 0 Then
                    secLat = BitConverter.ToUInt16({.Value(16), .Value(17)}, 0)
                Else
                    secLat = (BitConverter.ToUInt32({.Value(16), .Value(17), .Value(18), .Value(19)}, 0)) / 1000
                End If
            End With
 
            'Широта в десятичном представлении с учетом полушария
            sLat = ((CSng(gradLat) + CSng(minLat) / 60 + CSng(secLat) / 3600) * ns).ToString.Replace(",", ".")
 
            gradLng = image.GetPropertyItem(4).Value(0).ToString  'Целые градусы долготы (нулевой байт)
            minLng = image.GetPropertyItem(4).Value(8).ToString   'Целые минуты долготы (восьмой  байт)
 
            With image.GetPropertyItem(4)  'Секунды долготы
                If .Value(17) = 0 Then
                    secLng = BitConverter.ToUInt16({.Value(16), .Value(17)}, 0)
                Else
                    secLng = (BitConverter.ToUInt32({.Value(16), .Value(17), .Value(18), .Value(19)}, 0)) / 1000
                End If
            End With
 
            'Долгота в десятичном представлении с учетом стороны света
            sLng = ((CSng(gradLng) + CSng(minLng) / 60 + CSng(secLng) / 3600) * ew).ToString.Replace(",", ".")
 
        Catch ex As Exception
            sLat = "0"
            sLng = "0"
        End Try
        
    End Sub
    ''' <summary>
    ''' Десятичное значение широты GPS-координаты
    ''' </summary>
    ''' <value></value>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public ReadOnly Property Lat() As String
        Get
            Return sLat
        End Get
    End Property
    ''' <summary>
    ''' Десятичное значение долготы GPS-координаты 
    ''' </summary>
    ''' <value></value>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public ReadOnly Property Lng() As String
        Get
            Return sLng
        End Get
    End Property
 
End Class
Кроме этого нужен еще скрипт для взаимодействия с API Яндекс карт.
Он находится во вложении в папке с программой (ViewPoint.htm). Также, в папке с программой есть для примера файл содержащий GPS-координаты (01.jpg).
Хочу предупредить, что, поскольку это пример, интерфейс упрощен до предела, дабы не загромождать код.
Вложения
Тип файла: rar GPSDemo.rar (1.51 Мб, 217 просмотров)
9
 Аватар для GSXL
172 / 180 / 27
Регистрация: 26.11.2011
Сообщений: 386
Записей в блоге: 1
18.06.2014, 11:48
Как отправить SMS на мобильный номер используя API сервиса Comtube на VB.NET 3.5
-Сервис COMTUBE.RU
-Необходима предварительная регистрация
-Сервис платный (на день написания поста 1 sms = 0.65 руб.)
-Все необходимые API расписаны в PDF (там же есть ссылки на другие API сервиса)
-Так же есть рабочий пример в ZIP
-Минус данной системы в том что SMS отправляется оператору почти моментально, но скорость отправки SMS оператор > абонент может достигать от минуты до /знак бесконечности/
Миниатюры
Готовые решения и полезные коды на Visual Basic .NET (Часть-1)   Готовые решения и полезные коды на Visual Basic .NET (Часть-1)  
Вложения
Тип файла: zip API_SMS_COMTUBE.RU_VB.NET.zip (90.0 Кб, 105 просмотров)
Тип файла: pdf API_comtube.pdf (129.5 Кб, 105 просмотров)
8
Строитель
 Аватар для Nord790
889 / 556 / 194
Регистрация: 01.04.2014
Сообщений: 610
Записей в блоге: 6
26.06.2014, 03:43
Как отследить нажатие клавиши когда приложение свёрнуто?

И так, размещаем на форме таймер и в классе Form1.vb размещаем этот код
VB.NET
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
Public Class Form1
    Declare Function GetAsyncKeyState Lib "user32" (key As System.Windows.Forms.Keys) As Short
 
    Private Sub TimerKey_Tick(sender As Object, e As EventArgs) Handles TimerKey.Tick
        Select Case Control.ModifierKeys
            Case Keys.Control
                If GetAsyncKeyState(Keys.F1) Then
                    MsgBox("Привет " & Environment.UserName & "!")
                End If
        End Select
    End Sub
 
    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        TimerKey.Start()
    End Sub
End Class
В данном коде мы будем использовать клавиши Ctrl+F1 что бы отобразить сообщение.
5
Заблокирован
28.06.2014, 18:35
Глубины WebBrowser и MSHTML.
Рассмотрим несколько простых, но в то же время интересных и полезных трюков с WebBrowser и MSHTML.
Для справок: MSHTML (он же Trident) - это движок от Internet Explorer, то есть библиотека, работающая с DOM-содержимым - HTML-кодом страницы. MSHTML хранит код страницы, при необходимости редактирует и указывает IWebBrowser2 (на котором основан WebBrowser), как страницу отображать визуально, а он отображает.

1. Как сделать, чтобы форма не зависала, пока WebBrowser загружает страницу?
VB.NET
1
2
3
4
5
6
7
8
WebBrowser1.Navigate("http://mail.ru/")
 
While WebBrowser1.Document Is Nothing
    Application.DoEvents()
End While
While WebBrowser1.Document.Body Is Nothing
    Application.DoEvents()
End While
Примечание: это решение позволяет также убедиться, что:
1) WebBrowser1.Document загружен, после первого цикла (чтобы, например, внедрить в страницу скрипт)
2) WebBrowser1.Document.Body загружено, после второго цикла (чтобы, например, изменить код body страницы)
И всё это не используя DocumentCompleted.

2. Как по-быстрому сделать визуальный (WYSIWYG) редактор страниц типа очень простого аналога Dreamweaver?
(Предварительно добавляем ссылку на COM Microsoft HTML Object Library или файл mshtml.tlb)
VB.NET
1
2
3
4
5
6
7
Imports mshtml
...
Private HtmlDoc2 As IHTMLDocument2
...
' в DocumentCompleted или не раньше, чем после первого цикла из трюка 1!
HtmlDoc2 = DirectCast(WebBrowser1.Document.DomDocument, IHTMLDocument2)
HtmlDoc2.designMode = "on" ' обратно - "off"
Примечание: условия типа If ...designMode = "on" Then не работают.

3. Как сфокусировать документ в WebBrowser в режиме редактирования, чтобы не тыкать его мышью, прежде чем печатать символы? WebBrowser1.Focus не работает.
VB.NET
1
2
' в DocumentCompleted или после второго цикла из трюка 1!
WebBrowser1.Document.Body.Focus()
4. Нет ли в WebBrowser стандартных функций для вставки кнопок, картинок, ссылок и т.д. в режиме редактирования?
В WebBrowser - нет. Как уже говорилось, IWebBrowser2, на котором он основан, не работает с кодом страницы (авторы WebBrowser прикрутили к нему ещё кое-какие выжимки MSHTML, но там только самое основное вроде Cut, Copy, Paste).
А вот в MSHTML - есть.
Используя HtmlDoc2 из трюка 2:
VB.NET
1
2
3
4
5
6
'кнопка
HtmlDoc2.execCommand("InsertButton", False, Nothing)
'картинка
HtmlDoc2.execCommand("InsertImage", True, Nothing)
'ссылка
HtmlDoc2.execCommand("CreateLink", True, Nothing)
Примечание: полный список команд + описание ещё нескольких интересных трюков есть тут.
Примечание № 2: включенный WYSIWYG для этого дела НЕ нужен.

4А. А если я захочу ссылку на локальный файл вставить, мне тоже URL руками вводить?!
VB.NET
1
HtmlDoc2.execCommand("CreateLink", False, "URL")
5. Как же всё-таки уныла эта вставка элементов через execCommand()... По-другому-то никак?
VB.NET
1
2
3
Dim img As HtmlElement = WebBrowser1.Document.CreateElement("img")
img.SetAttribute("src", "путь к картинке")
WebBrowser1.Document.Body.AppendChild(img)
Обратите внимание, без MSHTML.
Потому что в WebBrowser, в отличие от нативного IWebBrowser2, включена сыроватая оболочка для части его функционала.
Примечание: включенный WYSIWYG опять НЕ нужен.

P.S.
Во вложении - проект с трюками 1, 2, 3.
Вложения
Тип файла: zip Enable WYSIWYG.zip (66.6 Кб, 109 просмотров)
6
Заблокирован
03.07.2014, 22:17
Как читать и редактировать БД Access (*.mdb), не используя ADO/ADO.NET и вовсе не зная SQL?
или DAO vs ADO

0. В чем плюсы DAO
Кликните здесь для просмотра всего текста

ADO - вещь не очень приятная, достаточно сложная для новичка и достаточно глючная.
Чтобы просто прочесть данные из таблицы, уже нужно иметь базовые знания языка SQL.
Чтобы отредактировать данные, нужно как минимум добавить в таблицу ключевое поле-счетчик и написать как минимум 1 SQL-запрос (UPDATE, INSERT, DELETE). А SQL-запросы - это частые проблемы с зарезервированными словами и опять же знание языка SQL. Можно, правда, использовать OleDbCommandBuilder, но это глюки (достаточно добавить один столбец с пробелом в названии и билдер уже не сработает), тоже проблемы с зарезервированными словами и в конечном итоге снова знание SQL.

...Было бы здорово, если бы можно было читать и редактировать данные в таблицах БД без необходимости использовать SQL как таковой и, как следствие, без нужды в ключевом столбце, проблем с зарезервированными словами и без многих прочих глюков.
То есть так, как это делает сам MS Access. Или так, как мы читаем и редактируем книги Excel с помощью библиотеки NPOI.
И чтобы при всём этом мы всегда могли написать что-нибудь на SQL, если это понадобится или мы просто захотим.

Так вот, такое возможно, если использовать не ADO, а DAO. Разница в двух буквах, а общего - ничего


1. Как использовать DAO?
1. Добавляем в проект ссылку на COM Microsoft DAO *.* Object Library.
Я брал версии 3.6.
2. Создаём объект DBEngine
VB.NET
1
Dim DbEng = New DAO.DBEngine()
3. Открываем базу данных
VB.NET
1
2
'файл DataBase1.mdb лежит в папке с exe
Dim Db As DAO.Database = DbEng.OpenDatabase(Application.StartupPath & "\Database1.mdb")
4. Открываем таблицу
VB.NET
1
Dim Rs As DAO.Recordset = Db.OpenRecordset("Таблица1")
5. Чтобы считать данные из какой-то ячейки, используем
VB.NET
1
Rs.Fields("номер столбца с нуля").Value
При этом читаются данные из ячейки текущей строки (перед этим вызовем Rs.MoveFirst, чтобы оказаться на самой первой строке).
Чтобы переключиться на другую строку, используем MoveNext(), MovePrevious(), Move(), MoveLast().
6. Чтобы добавить строку, используем:
VB.NET
1
2
Rs.AddNew()
Rs.Update()
Чтобы удалить строку:
VB.NET
1
2
3
4
Rs.MoveFirst()
Rs.Move(номер строки с нуля)
 
Rs.Delete()
Чтобы отредактировать ячейку в строке:
VB.NET
1
2
3
4
5
6
Rs.MoveFirst()
Rs.Move(номер строки с нуля)
 
Rs.Edit()
Rs.Fields(номер столбца с нуля).Value = "значение"
Rs.Update()
2. Как вызвать SQL-запрос через DAO?
Если SQL всё-таки понадобится, чтобы сделать нечто такое, что не предусмотрено в DAO по умолчанию, можно использовать
VB.NET
1
Db.Execute
3. Как работать с форматом accdb?
Можно через Microsoft.Office.Interop.Access.Ado.
Нужно ли или есть более удобный способ - не знаю.

4. Примеры проектов
Ну и напоследок пара примеров проектов.
MS Access by DAO without ADO - это чтение и редактирование таблиц в БД mdb.
ACCDB without ADO.NET - аналогично для accdb. Правда, там я зачем-то стал использовать COM Access, хотя достаточно было и Microsoft.Office.Interop.Access.Ado. Но, может, это и к лучшему
Версия VS - 2010.
Вложения
Тип файла: zip ACCDB without ADO.NET.zip (143.7 Кб, 160 просмотров)
Тип файла: zip MS Access by DAO without ADO.zip (111.4 Кб, 177 просмотров)
7
27 / 27 / 8
Регистрация: 30.04.2012
Сообщений: 96
06.07.2014, 23:19
Конвертировать изображения в PDF с помощью iTextSharp
В этом примере для каждого изображения имеющего расширение jpg и находящегося в папке C:\Temp будет создан отдельный PDF-файл. имя PDF-файла совпадает с именем изображения. Размер листа в PDF-файле соответствует размеру ихображения.
На форму кинуть кнопку.
VB.NET
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
Imports iTextSharp.text
Imports iTextSharp.text.pdf
Imports System.IO
 
Public Class Form1
 
    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        ' получаем имена всех файлов с расширением jpg
        Dim ArrImg() As String
        ArrImg = Directory.GetFiles("C:\Temp", "*.jpg", SearchOption.TopDirectoryOnly)
        If ArrImg.Length < 1 Then
            MessageBox.Show("Файлы изображений в указанной папке не найдены. Проверьте существование изображений в указанной папке.", "Внимание !!!!", MessageBoxButtons.OK, MessageBoxIcon.Error)
            Exit Sub
        End If
        Dim oImage As Bitmap
        For i As Integer = 0 To UBound(ArrImg)
            oImage = New Bitmap(ArrImg(i)) ' получаем картинку
 
            ' имя pdf-файла получаем из имени изображения
            Dim oPdfFileName As String = Replace(Path.GetFullPath(ArrImg(i)), Path.GetExtension(ArrImg(i)), ".pdf")
 
            ' создаем новый документ. размер страницы вычисляем по размеру изображения
            Dim doc As New Document(New Rectangle(oImage.Width * 72 / oImage.HorizontalResolution, oImage.Height * 72 / oImage.VerticalResolution))
 
            Try
                PdfWriter.GetInstance(doc, New FileStream(oPdfFileName, FileMode.Create))
                doc.Open()
                Dim oIMG As Image = Image.GetInstance(ArrImg(i))
                oIMG.ScaleToFit(doc.PageSize)
                oIMG.SetAbsolutePosition(0, 0)
                doc.Add(oIMG)
            Catch ex As Exception
            Finally
                doc.Close()
            End Try
 
            Me.Close()
        Next i
    End Sub
End Class
4
 Аватар для XIST
1962 / 1072 / 148
Регистрация: 01.10.2009
Сообщений: 3,620
Записей в блоге: 1
10.07.2014, 21:11
Реализация вертикального ProgressBar-a
Инструменты и технологии: VS 2010, Net Framework 4.0
VB.NET
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
Public Class Form1
    Inherits Form
    Private bar1 As New VerticalProgressBar()
    Private button1 As New Button()
 
    <STAThread()> _
    Public Shared Sub Main()
        ' The call to EnableVisualStyles below does not affect
        ' whether ProgressBarRenderer.IsSupported is true; as 
        ' long as visual styles are enabled by the operating system, 
        ' IsSupported is true.
        Application.EnableVisualStyles()
        Application.Run(New Form1())
 
    End Sub 'Main
    ' Start the VerticalProgressBar.
    Private Sub button1_Click(ByVal sender As Object, ByVal e As EventArgs)
        bar1.Start()
 
    End Sub 'button1_Click
 
    Private Sub InitializeComponent()
        Me.SuspendLayout()
        '
        'Form1
        '
        Me.ClientSize = New System.Drawing.Size(692, 433)
        Me.Name = "Form1"
        Me.ResumeLayout(False)
 
        Me.Size = New Size(500, 500)
        bar1.NumberChunks = 30
        button1.Location = New Point(150, 10)
        button1.Size = New Size(150, 30)
        button1.Text = "Start VerticalProgressBar"
        AddHandler button1.Click, AddressOf button1_Click
        Controls.AddRange(New Control() {button1, bar1})
    End Sub
End Class 'Form1
 
 
Public Class VerticalProgressBar
    Inherits Control
    Private numberChunksValue As Integer
    Private ticks As Integer
    Private progressTimer As New Timer()
    Private progressBarRectangles() As Rectangle
 
 
    Public Sub New()
        Me.Location = New Point(10, 10)
        Me.Width = 50
 
        ' The progress bar will update every second.
        progressTimer.Interval = 1000
        AddHandler progressTimer.Tick, AddressOf progressTimer_Tick
 
        ' This property also calls SetupProgressBar to initialize 
        ' the progress bar rectangles if styles are enabled.
        NumberChunks = 20
 
        ' Set the default height if visual styles are not enabled.
        If Not ProgressBarRenderer.IsSupported Then
            Me.Height = 100
        End If
 
    End Sub 'New
 
    ' Specify the number of progress bar chunks to base the height on.
 
    Public Property NumberChunks() As Integer
        Get
            Return numberChunksValue
        End Get
 
        Set(ByVal value As Integer)
            If value <= 50 AndAlso value > 0 Then
                numberChunksValue = value
            Else
                MessageBox.Show("Number of chunks must be between " + "0 and 50; defaulting to 10")
                numberChunksValue = 10
            End If
 
            ' Recalculate the progress bar size, if visual styles 
            ' are active.
            If ProgressBarRenderer.IsSupported Then
                SetupProgressBar()
            End If
        End Set
    End Property
 
 
    ' Draw the progress bar in its normal state.
    Protected Overrides Sub OnPaint(ByVal e As PaintEventArgs)
        MyBase.OnPaint(e)
 
        If ProgressBarRenderer.IsSupported Then
            ProgressBarRenderer.DrawVerticalBar(e.Graphics, ClientRectangle)
            Me.Parent.Text = "VerticalProgressBar Enabled"
        Else
            Me.Parent.Text = "VerticalProgressBar Disabled"
        End If
 
    End Sub 'OnPaint
 
    ' Initialize the rectangles used to paint the states of the 
    ' progress bar.
    Private Sub SetupProgressBar()
        If Not ProgressBarRenderer.IsSupported Then
            Return
        End If
 
        ' Determine the size of the progress bar frame.
        Me.Size = New Size(ClientRectangle.Width, NumberChunks * (ProgressBarRenderer.ChunkThickness + 2 * ProgressBarRenderer.ChunkSpaceThickness) + 6)
 
        ' Initialize the rectangles to draw each step of the 
        ' progress bar.
        progressBarRectangles = New Rectangle(NumberChunks) {}
 
        Dim i As Integer
        For i = 0 To NumberChunks
            ' Use the thickness defined by the current visual style 
            ' to calculate the height of each rectangle. The size 
            ' adjustments ensure that the chunks do not paint over 
            ' the frame.
            Dim filledRectangleHeight As Integer = (i + 1) _
  * (ProgressBarRenderer.ChunkThickness + 2 * ProgressBarRenderer.ChunkSpaceThickness)
 
            progressBarRectangles(i) = New Rectangle(ClientRectangle.X + 3, _
                ClientRectangle.Y + ClientRectangle.Height - 3 - filledRectangleHeight, _
                ClientRectangle.Width - 6, filledRectangleHeight)
        Next i
 
    End Sub 'SetupProgressBar
 
    ' Handle the timer tick; draw each progressively larger rectangle.
    Private Sub progressTimer_Tick(ByVal myObject As [Object], ByVal e As EventArgs)
        If ticks < NumberChunks Then
            Dim g As Graphics = Me.CreateGraphics()
            Try
                ProgressBarRenderer.DrawVerticalChunks(g, progressBarRectangles(ticks))
                ticks += 1
            Finally
                g.Dispose()
            End Try
        Else
            progressTimer.Enabled = False
        End If
 
    End Sub 'progressTimer_Tick
 
    ' Start the progress bar.
    Public Sub Start()
        If ProgressBarRenderer.IsSupported Then
            progressTimer.Start()
        Else
            MessageBox.Show("VerticalScrollBar requires visual styles")
        End If
 
    End Sub 'Start
 
End Class
3
Заблокирован
15.07.2014, 07:39
Контрол для показа( и редактирования) документов Ms Word
Для Екзела написано много библиотек, дающих нам возможность читать и xls и xlsx, и даже есть специальный элемент для показа листов Екзела на форме - Reogrid. Бесплатный и open-source-ный

С Вордом, в особенности старого образца Doc, дело не так блестяще. Показывать и редактировать документы можно только Com-объектом Microsoft Word x.x Object Library, или его Managed-оболочкой Microsoft.Office.Interop.Word. Остальное стоит $$$

Microsoft Word x.x Object Library из-коробки не предусматривает показ документа Ворд в контроле. Но мы можем
1) создать новый Com-объект Ворд
VB.NET
1
2
3
 ' Dim wd As Word.Application
' Import Word = Microsoft.Office.Interop.Word
wd = New Word.Application()
2) загрузить в него документ
VB.NET
1
document = wd.Documents.Add(...)
3) скрыть все лишние элементы интерфейса Ворда( панели инструментов)
VB.NET
1
2
3
4
5
6
7
8
wd.CommandBars.AdaptiveMenus = False
.......
wd.ActiveWindow.DisplayRightRuler = False
wd.ActiveWindow.DisplayScreenTips = False
wd.ActiveWindow.DisplayVerticalRuler = False
wd.ActiveWindow.DisplayRightRuler = False
wd.ActiveWindow.ActivePane.DisplayRulers = False
wd.ActiveWindow.ActivePane.View.Type = Word.WdViewType.wdWebView
3) сделать Com-объект( окно Ворда) видимым
wd.Visible = True
4) применяя Winapi вставить окно Ворда в контрол
dirty trick, как говорят в англоязычных странах. Но работает

По этому пути пошли авторы контрола Winwordcontrol, написанного на c# и работающего с Вордом 2000
http://www.codeproject.com/Art... ol-for-NET

Я портировал их код на Vb.net под Ворд 2003 (просто добавил ссылку на Microsoft Word 11.0 Object Library вместо более старой и слегка поменял код) и внес несколько мелких правок, которые счел нужным
При конвертации кода с шарпа на барсик пользовал http://converter.telerik.com/

ЕЩЕ РАЗ
Работало в Ворд2003. Вы можете добавить ссылку на Microsoft Word x.x Object Library другой версии, той которая у вас, возможно слегка поменять код (если это Ворд2000 или старше) и попытаться запуститься.
Не гарантирую что будет работать в Ворд2007 и выше, где ленточный интерфейс


А вот и сам проект
Вложения
Тип файла: zip 0 - Simplest WordControl.zip (189.9 Кб, 133 просмотров)
3
Заблокирован
17.07.2014, 03:53
Управление окнами другой программы

Немного теории
Окно абсолютно любой программы на Windows создается, рисуется на мониторе и управляется с помощью набора библиотек WinApi. Такие библиотеки и фрэймворки как Winforms, MFC, Qt (на Windows), служат всего лишь оболочками-посредниками над Winapi, упрощающими доступ к функционалу Winapi и приводящими его в стиль ООП. Непосредственно управляет окнами только WinApi. Поэтому независимо от примененного фрэймворка все окна на Windows идентичны
Любое окно Windows имеет три параметра:
  • хендл, он же дескриптор и hWnd. Это уникальный номер окна, присваиваемый ему системой, чтобы отличать его от других окон. hWnd присваивается окну при его создании и постоянен до закрытия окна. Но при следующем открытии он может быть совсем не таким, каким был в прошлый раз
  • заголовок окна. Это текстовая строка, присваиваемая окну самой программой. Me.Text в Vb.net -- это заголовок. Очевидно, заголовок может быть или не быть уникальным и постоянным -- все зависит от программы
  • класс окна. Это тоже текстовая строка. Она присваивается окну самой программой, или фрэймворком, например .Net, где задание класса программистом сочли излишним. (Класс вида Form1 здесь ни при чём, это уровень фрэймворка, а не WinApi) Уникальным класс может и не быть, но он всегда постоянен и никогда не меняется.
Получить доступ к окну можно имея его хендл, заголовок или класс. Хендл нам взять неоткуда, класс (на первый взгляд) тоже. А вот заголовок окна виден невооруженным глазом - это он отображается на панели задач и в шапке окна.
С помощью функции WinApi FindWindow по заголовку можно получить хендл hWnd
VB.NET
1
2
Dim hWnd As Long
hWnd = FindWindow(vbNullString, "Калькулятор")
(Откуда брать FindWindow и пр. - см. готовый проект "разворачиваем калькулятор" в аттаче)
А с хендлом уже можно работать другими функциям WinApi. Например, ShowWindow с параметром SW_MAXIMIZE разворачивает окно во весь экран
VB.NET
1
ShowWindow(hWnd, SW_MAXIMIZE)


Вот такой код разворачивает окно калькулятора Windows во весь экран
(невзирая на то, что кнопка "Развернуть" у него всегда заблокирована!)
VB.NET
1
2
3
Dim hWnd As Long
hWnd = FindWindow(vbNullString, "Калькулятор")
ShowWindow(hWnd, SW_MAXIMIZE)
FindWindow и ShowWindow -- функции WinApi, SW_MAXIMIZE - константа WinApi.
См. проект в аттаче -- и поймете, как их оттуда "извлечь"

Как можно догадаться, к окну калькулятора мы здесь обратились по его заголовку с текстом "Калькулятор".
А что, если заголовок все время меняется? Как, напр., у блокнота?
Тогда мы можем обратиться к окну по имени оконного класса -- он не меняется никогда.
VB.NET
1
2
3
Dim hWnd As Long
hWnd = FindWindow("имя оконного класса", vbNullString)
ShowWindow(hWnd, SW_MAXIMIZE)
Если вы прочитали "Немного теории" выше, то вы знаете, что такое оконный класс.
Но как же узнать его имя? А здесь опять надо применить кое-какие функции WinApi.
Для этой цели я написал утилиту Window browser, тоже на Vb.net. Она в аттаче.
Запускаете, наводить мышку на окно -- и видите имя класса окна.
Это имя класса нужно запомнить и использовать в FindWindow -- все будет работать
Вложения
Тип файла: zip разворачиваем калькулятор.zip (67.6 Кб, 167 просмотров)
Тип файла: zip window browser.zip (73.8 Кб, 163 просмотров)
6
Заблокирован
18.07.2014, 05:58
Четвертая кнопка в шапке окна (Wpf, реализация для включенного Aero glass)

Применен класс WindowChrome библиотеки Microsoft.Windows.Shell.dll

Код (голый Xaml)
XML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
<Window x:Class="Window1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:shell="clr-namespace:Microsoft.Windows.Shell;assembly=Microsoft.Windows.Shell"
    Title="Window1" Height="300" Width="300">
 
    <Window.Style>
        <Style TargetType="{x:Type Window}">
            <Setter Property="shell:WindowChrome.WindowChrome">
                <Setter.Value>
                    <shell:WindowChrome />
                </Setter.Value>
            </Setter>
            <Setter Property="Template">
                <Setter.Value>
                    <ControlTemplate TargetType="{x:Type Window}">
                        <Grid>
                            <!-- Фон окна -->
                            <Border Background="White" Margin="{Binding Source={x:Static shell:SystemParameters2.Current}, Path=WindowNonClientFrameThickness}">
                                <ContentPresenter Content="{TemplateBinding Content}" />
                            </Border>
                            <!-- Четвертая кнопка-->
                            <Button Height="25" HorizontalAlignment="Right" Margin="0,0,120,0" Name="btnHelp" VerticalAlignment="Top" Width="40" shell:WindowChrome.IsHitTestVisibleInChrome="True">?</Button>
                        </Grid>
                    </ControlTemplate>
                </Setter.Value>
            </Setter>
        </Style>
    </Window.Style>
 
    <Grid></Grid>
</Window>


Иконку и текст заголовка дорисуете сами.
По вопросу текста DrawThemeTextEx в помощь

Пы.Сы. Ежели пораскинуть мозгами, то этим способом можно написать еще адову кучу полезных контролов!
Панель быстрого доступа как в ленточном интерфейсе...
Компактная панель вкладок как в Хромиум (Не в честь него ли класс назван WindowChrome?)...
Только не злоупотребляйте, а то юзверь не сможет окно перетягивать если вся шапка будет закрыта кнопками
Миниатюры
Готовые решения и полезные коды на Visual Basic .NET (Часть-1)  
Вложения
Тип файла: zip Четвертая кнопка.zip (227.1 Кб, 149 просмотров)
4
Строитель
 Аватар для Nord790
889 / 556 / 194
Регистрация: 01.04.2014
Сообщений: 610
Записей в блоге: 6
28.07.2014, 10:02
Как сделать изображение (Bitmap, Image) прозрачным?
VB.NET
1
2
3
4
5
6
7
8
9
    Public Function SetOpacityImage(image As System.Drawing.Image, t As Single) As Image
        Dim resultImage As New System.Drawing.Bitmap(image.Width, image.Height)
        Dim Graphics As System.Drawing.Graphics = System.Drawing.Graphics.FromImage(resultImage)
        Dim ImageAttributes As New System.Drawing.Imaging.ImageAttributes
        ImageAttributes.SetColorMatrix(New System.Drawing.Imaging.ColorMatrix() With {.Matrix33 = t})
        Graphics.DrawImage(image, New Rectangle(0, 0, image.Width, image.Height), 0, 0, image.Width, image.Height, GraphicsUnit.Pixel, ImageAttributes)
        Graphics.Save() : Graphics.Dispose()
        Return resultImage
    End Function
6
Заблокирован
05.08.2014, 21:28
Желтый и зеленый ProgressBar и прочие Vista GUI API

В Windows Vista появился ряд интересных API пользовательского интерфейса, которые затем перекочевали в Win 7 и Win 8 и были слегка доработаны.
Среди этих API - новые видоизмененные типы контролов и новые функции для стадартных элементов UI приложения (рамка окна и кнопка на панели задач), а также, например, новые типы диалоговых окон.

Я потихоньку пишу Managed-оболочку Vista API для http://codeproject.com/, в обзоре которой постараюсь рассмотреть все Vista API, о которых найду информацию в интернете, причем не только на VB.NET для WinForms, но и на VB.NET для WPF, C# для Winforms и WPF, C++/CLI для Winforms и C/C++ для чистого WinAPI.

Это недоделанная, сырая версия обзора (в последствии планирую написать сюда еще один пост, где уже будет полная), поэтому в ней рассмотрены далеко не все Vista API и не полностью. Но все-таки кое-что интересное, отсюда почерпнуть, ИМХО, можно.

Так как многие контролы Vista API не имеют официальных наименований или эти названия мало кто знает, прилагаю скриншот, где наглядно видно, что сюда входит.

Кнопка - канал управления (BS_COMMANDLINK)

VB.NET
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
Private Const BS_COMMANDLINK As Integer = &HEL
 
Private Const BCM_SETNOTE As Integer = &H1609
 
Protected Overrides ReadOnly Property CreateParams() As CreateParams
    Get
        Dim sp As New SecurityPermission(SecurityPermissionFlag.UnmanagedCode)
        sp.Demand()
 
        Dim cp As CreateParams = MyBase.CreateParams
            cp.Style = cp.Style Or BS_COMMANDLINK
 
        Return cp
    End Get
End Property
 
 
Private szNote As String = ""
Public Property Note() As String
    Get
        Return szNote
    End Get
    Set(ByVal value As String)
        szNote = value
        Win32Api.SendMessage(Me.Handle, BCM_SETNOTE, IntPtr.Zero, value)
    End Set
End Property
 
...
 
Public Sub New()
    InitializeComponent()
 
    Me.FlatStyle = Windows.Forms.FlatStyle.System
End Sub


Кнопка с разделителем (кнопка-комбобокс BS_SPLITBUTTON)

VB.NET
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
Private Const BS_SPLITBUTTON As Integer = &HC
 
Public Sub New()
    InitializeComponent()
 
    Me.FlatStyle = Windows.Forms.FlatStyle.System
End Sub
 
Protected Overrides ReadOnly Property CreateParams() As CreateParams
    Get
        Dim sp As New SecurityPermission(SecurityPermissionFlag.UnmanagedCode)
        sp.Demand()
 
        Dim cp As CreateParams = MyBase.CreateParams
        cp.Style = cp.Style Or BS_SPLITBUTTON
 
        Return cp
    End Get
End Property


ProgressBar желтого или красного цвета, но со стандартной темой оформления (PBM_SETSTATE)

Желтый прогрессбар обычно означает, что процесс поставлен на паузу, красный - что произошла ошибка.
VB.NET
1
2
3
4
5
Private Const PBM_SETSTATE = &H410
...
SendMessage(Me.Handle, PBM_SETSTATE, 1, vbNull) ' зеленый
SendMessage(Me.Handle, PBM_SETSTATE, 2, vbNull) ' красный
SendMessage(Me.Handle, PBM_SETSTATE, 3, vbNull) ' желтый


Кнопка со щитом "требуются права администратора"

Иконка щита на кнопке означает, что действие, которое делает кнопка, можно сделать только из-под админа.
Благодаря параноидальности WinVista/7/8, пожалуй, самый практичный контрол Vista API
VB.NET
1
2
3
4
5
6
7
8
Private Const BCM_SETSHIELD As Integer = &H160C
...
Public Sub New()
    InitializeComponent()
    Me.FlatStyle = Windows.Forms.FlatStyle.System
 
    SendMessage(Me.Handle, BCM_SETSHIELD, 0, 1)
End Sub


TextBox с подсказкой (пока в поле не введен текст, отображается некая надпись)

Можно, например, отображать формат, в котором в поле нужно ввести номер телефона, типа 7 (XXX) XXX-XX-XX
Довольно практично... Позволяет сделать интерфейс компактнее.
Хотя отдельный Label для этой цели все-таки удобнее. А своя модификация TextBox специально для этих целей - и подавно.
VB.NET
1
2
3
Private Const EM_SETCUEBANNER As Integer = &H1501
...
SendMessage(oTextBox.Handle, EM_SETCUEBANNER, fHideOnKeyOnly, szText)


Аналогичный ComboBox

VB.NET
1
2
3
Private Const CB_SETCUEBANNER As Integer = &H1703
...
SendMessage(oComboBox.Handle, CB_SETCUEBANNER, True, szText)


Ну и расширенный стеклянный фрейм Aero средствами DwmApi (тоже Vista API)

VB.NET
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<StructLayout(LayoutKind.Sequential)> _
Public Structure MARGINS
    Public leftWidth As Integer
    Public rightWidth As Integer
    Public topHeight As Integer
    Public bottomHeight As Integer
End Structure
 
<DllImport("dwmapi.dll")> _
Public Shared Function DwmExtendFrameIntoClientArea(ByVal hwnd As IntPtr, ByRef margins As MARGINS) As Integer
End Function
 
...
 
Dim oMargins As MARGINS
oMargins.topHeight = 30
oMargins.leftWidth = 0
oMargins.bottomHeight = 0
oMargins.rightWidth = 0
DwmExtendFrameIntoClientArea(Me.Handle, oMargins)


P.S. А в качестве нагрузки, в модуле Win32Api показано как на VB.NET импортировать некоторые функции WinAPI, причем способом наиболее совместимом с VB 6, без DllImport.
SendMessage, например.

P.P.S. Проект в VS 2008.
Миниатюры
Готовые решения и полезные коды на Visual Basic .NET (Часть-1)  
Вложения
Тип файла: zip VistaApi Big Overview.zip (153.3 Кб, 195 просмотров)
1
Заблокирован
09.08.2014, 22:57
Получение писем из почтового ящика по протоколу POP3 с помощью библиотеки OpenPOP.NET

В отличие от протокола исходящей почты SMTP, какие-либо средства для работы по протоколам входящей почты - POP3 и IMAP - в платформу .NET не включены.
Для получения писем из почтового ящика по протоколу POP3 (о IMAP - позже) необходимо использовать ту или иную библиотеку сторонней разработки, выложенную в Интернет.
Я выбрал библиотеку OpenPOP.NET как простую, удобную и бесплатную. Нашел я её на одном из форумов, кажется, StackOverflow, когда гуглил на соответствующую тему.

Читать далее

Необходимо подключить к проекту:
  • библиотеку OpenPop.dll (это и есть OpenPOP.NET), добавив на неё ссылку через меню Проект -> Добавить ссылку
  • пространство имен OpenPop.Pop3 из этой библиотеки - через Imports

Внимание!
1. Библиотеку OpenPop.dll нужно положить рядом со скомпилированным exe, и добавлять в проект именно оттуда.
2. Чтобы получение писем работало, нужно включить специальную опцию в настройках Вашего почтового сервиса.
Обычно такая опция бывает в разделе Почтовые клиенты или Почтовые программы.
В Яндексе эта опция здесь: https://mail.yandex.ru/neo2/#setup/client

Примечание: по POP можно стабильно получать почту только из папки Входящие.
Возможность получения почты в других папках зависит от почтового сервиса и его настроек.

VB.NET
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
Using client As Pop3Client = New Pop3Client()
                 
    client.Connect("pop.mail.ru", 995, True)
             
    client.Authenticate("ящик@mail.ru", "пароль")
 
    Dim iMsgCount as Integer = client.GetMessageCount()
 
    For i = iMsgCount To 0 Step -1
        Dim msg As OpenPop.Mime.Message = client.GetMessage(i)
        ' Основные данные о письме:
        ' msg.Headers.From.Address - ящик отправителя
        ' msg.Headers.To - ящик(и) получателя(ей)
        ' msg.Headers.Subject - тема письма
        ' System.Text.Encoding.Default.GetString(msg.MessagePart.Body) - содержание письма
    Next
 
End Using


Эквивалентные примеры на других языках:
C++/CLI
1
Заблокирован
10.08.2014, 05:42
Простой локальный клиент-сервер

Взято отсюда и портировано на VB.NET.
Код клиента переведён вручную, сервера - конвертирован с помощью http://converter.telerik.com/

Принцип такой: Запускаем сервер. Запускаем клиента. Вводим в клиента сообщение. Его принимает сервер.

Сам не разбирался.


Код сервера

VB.NET
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
Imports System.Text
Imports System.Net
Imports System.Net.Sockets
 
Module ModuleServer
 
    Sub Main()
 
        Dim ipHost As IPHostEntry = Dns.GetHostEntry("localhost")
        Dim ipAddr As IPAddress = ipHost.AddressList(0)
        Dim ipEndPoint As New IPEndPoint(ipAddr, 11000)
 
        Dim sListener As New Socket(ipAddr.AddressFamily, SocketType.Stream, ProtocolType.Tcp)
 
        Try
            sListener.Bind(ipEndPoint)
            sListener.Listen(10)
 
            While True
                Console.WriteLine("Ожидаем соединение через порт {0}", ipEndPoint)
 
                Dim handler As Socket = sListener.Accept()
                Dim data As String = Nothing
 
                Dim bytes As Byte() = New Byte(1023) {}
                Dim bytesRec As Integer = handler.Receive(bytes)
 
                data += Encoding.UTF8.GetString(bytes, 0, bytesRec)
 
                Console.Write((Convert.ToString("Полученный текст: ") & data) + vbLf & vbLf)
 
                If data.IndexOf("<TheEnd>") > -1 Then
                    Console.WriteLine("Сервер завершил соединение с клиентом.")
                    Exit While
                End If
 
                handler.Shutdown(SocketShutdown.Both)
                handler.Close()
            End While
        Catch ex As Exception
            Console.WriteLine(ex.ToString())
        Finally
            Console.ReadLine()
        End Try
 
        '=======================================================
        'Service provided by Telerik ([url]www.telerik.com[/url])
        'Conversion powered by NRefactory.
        'Twitter: @telerik
        'Facebook: facebook.com/telerik
        '=======================================================
    End Sub
 
End Module

Код клиента

VB.NET
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
Imports System.Text
Imports System.Net
Imports System.Net.Sockets
 
Module ModuleClient
 
    Const host = "localhost"
    Const port = 11000
 
    Sub Main()
        While True
            Dim bytes(1024) As Byte
 
            Dim IpHost As IPHostEntry = Dns.GetHostEntry(host)
            Dim IpAd As IPAddress = IpHost.AddressList(0)
            Dim IPEP As IPEndPoint = New IPEndPoint(IpAd, port)
 
            Dim sender As Socket = New Socket(IpAd.AddressFamily, _
                                              SocketType.Stream, _
                                              ProtocolType.Tcp)
            sender.Connect(IPEP)
 
            Console.Write("Введите сообщение: ")
            Dim msg As String = Console.ReadLine()
 
            Console.WriteLine("Сокет соединяется с {0} ", sender.RemoteEndPoint.ToString())
            Dim msgb() As Byte = Encoding.UTF8.GetBytes(msg)
 
            Dim BytesSent As Integer = sender.Send(msgb)
 
            Dim BytesRec As Integer = sender.Receive(bytes)
 
            Console.WriteLine("Ответ от сервера: {0}", Encoding.UTF8.GetString(bytes, 0, BytesRec))
 
            sender.Shutdown(SocketShutdown.Both)
            sender.Close()
        End While
    End Sub
 
End Module
Вложения
Тип файла: zip Локальный клиент-сервер.zip (97.8 Кб, 119 просмотров)
Тип файла: zip Локальный клиент-сервер [ТОЛЬКО EXE].zip (14.8 Кб, 75 просмотров)
1
Заблокирован
11.08.2014, 02:30
Вопрос: Как применить контрол WPF в приложении Winforms, и наоборот?

Ответ: Использовать особый контрол ElementHost. А наоборот - WindowsFormsHost.
В первом случае проект должен быть под .NET версии 3.0 или выше, иначе WPF в нем просто не будет доступно.

Как использовать ElementHost

1. Меню Проект -> Добавить новый элемент -> выбрать Пользовательский элемент управления WPF -> ОК.
2. Разместить на созданном юзерконтроле WPF нужные элементы управления WPF.
3. На окне Winforms разместить контрол ElementHost (он должен быть внизу панели элементов, в группе Взаимодействие WPF).
4. Построить проект. Это нужно для того, чтобы сделать юзерконтрол WPF доступным.
5. В свойство Child Вашего ElementHost поставить Ваш юзерконтрол WPF.


Как использовать WindowsFormsHost

1. Меню Проект -> Добавить новый элемент -> выбрать Пользовательский элемент управления -> ОК.
2. Разместить на созданном юзерконтроле Winforms нужные элементы управления Winforms.
3. На окне WPF разместить контрол WindowsFormsHost.
4. Построить проект. Это нужно для того, чтобы сделать юзерконтрол доступным.
5. В XAML-разметке окна добавить тэгу Window аттрибут
XML
1
xmlns:my="clr-namespace:Пространство_имен_проекта"
(используйте всплывающие подсказки, чтобы правильно указать пространство имен)
6. Внутрь элемента WindowsFormsHost добавить код
XML
1
2
<my:UserControl1 x:Name="userControl1">
</my:UserControl1>
7. В результате должно получиться примерно так:
XML
1
2
3
4
5
6
7
8
9
10
11
12
<Window x:Class="Window1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:my="clr-namespace:WindowsFormsHost_Test"
    Title="Window1" Height="300" Width="300">
    <Grid>
        <WindowsFormsHost Margin="37,88,41,74" Name="WindowsFormsHost1">
            <my:UserControl1 x:Name="userControl1">
            </my:UserControl1>
        </WindowsFormsHost>
    </Grid>
</Window>
8. В событии Window1_Loaded (создается двойным кликом по окну) напишите
VB.NET
1
System.Windows.Forms.Application.EnableVisualStyles()
Это нужно для того, чтобы контролы Winform отображались в системной цветовой схеме, а не в цветовой схеме времен Win2000.

Примечание: похожим способом можно добавить на форму и готовый контрол Winforms, например, DataGridView:
XML
1
2
3
4
5
6
7
8
9
10
11
12
<Window x:Class="MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:WinForms="clr-namespace:System.Windows.Forms;assembly=System.Windows.Forms"
        Title="MainWindow" Height="350" Width="525" Loaded="Window_Loaded">
    <Grid>
        <WindowsFormsHost Height="Auto" HorizontalAlignment="Stretch" Margin="10" Name="windowsFormsHost1" VerticalAlignment="Stretch" Width="Auto">
            <WinForms:DataGridView x:Name="dataGridView1">
            </WinForms:DataGridView>
        </WindowsFormsHost>
    </Grid>
</Window>

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

Примеры на других языках:
PascalABC.NET (только ElementHost)

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

P.S. Вижу, что в топике, как говорится, давно уже "черт ногу сломит"...
И неудивительно, ведь тут нет даже элементарной сортировки исходников по каким-либо категориям.
Но если поиск по топику научится находить посты по ключевым словам, то все-таки порядка будет больше и в целом пользы от топика - тоже.
А если это научится делать еще и Гугл или Яндекс, то будет вообще отлично.

Вот решил провести эксперимент - добавить к этому посту тэгов и через некоторое время понаблюдать за эффективностью поиска.
Тэгов мало, чтобы не делать лишней работы - очень может быть, что окажется напрасно.

Тэги: vb.net , vb.net elementhost , vb.net windowsformshost , vb.net wpf control in winforms , vb.net winforms control in wpf , vb.net elementhost example , vb.net windowsformshost example , visualbasic .net , visualbasic .net elementhost , visualbasic .net windowsformshost , visualbasic .net wpf control in winforms , visualbasic .net winforms control in wpf , visualbasic .net elementhost example , visualbasic .net windowsformshost example
Изображения
 
Вложения
Тип файла: zip ElementHost Test.zip (74.2 Кб, 77 просмотров)
Тип файла: zip ElementHost Test — ТОЛЬКО EXE.zip (9.4 Кб, 51 просмотров)
Тип файла: zip WindowsFormsHost Test.zip (79.5 Кб, 62 просмотров)
Тип файла: zip WindowsFormsHost Test — ТОЛЬКО EXE.zip (9.2 Кб, 46 просмотров)
1
Заблокирован
11.08.2014, 03:03
Вопрос: Как с помощью WinAPI заблокировать некую клавишу, чтобы она не нажималась ни в 1 программе?

Ответ: Можно поставить хук на клавиатуру.
Этим способом можно не только заблокировать клавишу(-и) от нажатия, но и назначить ей (им) какое-либо действие.
Учтите, что хук исчезает при завершении приложения, его установившего.
Пример с клавишей Win (которая вызывает меню Пуск)

VB.NET
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
Imports System.Runtime.InteropServices
 
Public Class Form1
 
    <DllImport("user32.dll", CharSet:=CharSet.Auto, SetLastError:=True)> _
Private Shared Function SetWindowsHookEx(ByVal idHook As Integer, ByVal lpfn As LowLevelKeyboardProc, ByVal hMod As IntPtr, ByVal dwThreadId As UInteger) As IntPtr
    End Function
 
    <DllImport("user32.dll", CharSet:=CharSet.Auto, SetLastError:=True)> _
    Private Shared Function UnhookWindowsHookEx(ByVal hhk As IntPtr) As Boolean
    End Function
 
    <DllImport("user32.dll", CharSet:=CharSet.Auto, SetLastError:=True)> _
    Private Shared Function CallNextHookEx(ByVal hhk As IntPtr, ByVal nCode As Integer, ByVal wParam As IntPtr, ByVal lParam As IntPtr) As IntPtr
    End Function
 
    <DllImport("kernel32.dll", CharSet:=CharSet.Auto, SetLastError:=True)> _
    Private Shared Function GetModuleHandle(ByVal lpModuleName As String) As IntPtr
    End Function
 
    Private Const WH_KEYBOARD_LL As Integer = 13
    Private Const WM_KEYDOWN As Integer = &H100
    Private Const WM_ACTIVATE As Integer = &H6
    Private Const WM_PAINT As Integer = &HF
    Private Shared _proc As LowLevelKeyboardProc = AddressOf HookCallback
    Private Shared _hookID As IntPtr = IntPtr.Zero
 
    Private Shared Function SetHook(ByVal proc As LowLevelKeyboardProc) As IntPtr
        Using curProcess As Process = Process.GetCurrentProcess()
            Using curModule As ProcessModule = curProcess.MainModule
                Return SetWindowsHookEx(WH_KEYBOARD_LL, proc, GetModuleHandle(curModule.ModuleName), 0)
            End Using
        End Using
    End Function
 
    Private Delegate Function LowLevelKeyboardProc(ByVal nCode As Integer, ByVal wParam As IntPtr, ByVal lParam As IntPtr) As IntPtr
 
    Private Shared Function HookCallback(ByVal nCode As Integer, ByVal wParam As IntPtr, ByVal lParam As IntPtr) As IntPtr
        If (CInt(wParam) = WM_KEYDOWN) Then
            Dim VkCode As Integer = Marshal.ReadInt32(lParam)
 
            If VkCode = Keys.LWin Then
                Return CType(1, IntPtr)
            End If
 
            Return CType(0, IntPtr)
        End If
 
        Return CallNextHookEx(_hookID, nCode, wParam, lParam)
    End Function
 
    '=======================================================
    'Service provided by Telerik ([url]www.telerik.com[/url])
    'Conversion powered by NRefactory.
    'Twitter: @telerik
    'Facebook: facebook.com/telerik
    '=======================================================
 
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        _hookID = SetHook(_proc)
    End Sub
 
    Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
        UnhookWindowsHookEx(_hookID)
    End Sub
 
    Private Sub Form1_FormClosed(ByVal sender As System.Object, ByVal e As System.Windows.Forms.FormClosedEventArgs) Handles MyBase.FormClosed
        UnhookWindowsHookEx(_hookID)
    End Sub
End Class

P.S.
Товарищи! Чтите Уголовный Кодекс!
Если напишете троян и вас поймают, отвечать буду не я, а вы.

Все равно как если вы кого-то убьете кухонным ножом, посадят вас, а не того, кто сделал нож.
Я написал всего лишь пример хука, который можно применить и во вполне мирных целях, например, создать свой аналог ClassicShell для Win8.
А вы сделали на его основе мерзопакость и в лицензионном соглашении не предупредили пользователя об ее подлинном назначении, или же установили ее пользователю против его воли. Это уже статья.
Хотя... Найти программу без каких-либолишних функций сейчас практически невозможно, так что по идее под нее должно подходить очень много что.


P.P.S.
Код откуда-то скопипастил и портанул-конвертнул на VB.NET вот этой штукой http://converter.telerik.com/
Если явится автор кода и потребует указать источник, пускай дает ссылку - укажем.
Вложения
Тип файла: zip Keyboard Hook.zip (69.0 Кб, 121 просмотров)
Тип файла: zip Keyboard Hook — ТОЛЬКО ЕХЕ.zip (9.5 Кб, 61 просмотров)
2
Заблокирован
11.08.2014, 21:19
Вопрос: Как получить данные со страницы сайта (например, температуру воздуха с http://qip.ru/) без регулярок и не вникая в API сайта (если оно вообще есть)?
Ответ: Скачать код страницы с помощью WebClient в строку String, после чего распарсить ее с помощью специальной библиотеки HtmlAgilityPack.

Скачивание кода страницы с помощью WebClient в строку

Импортируем пространство имен System.Net, добавив строку кода
VB.NET
1
Imports System.Net
над объявлением класса формы (Public Class ***)

Вставим этот код в любой обработчик события, например, Form_Load
VB.NET
1
2
3
4
5
6
Dim html As String
Using wc = New WebClient()
    html = wc.DownloadString("http://mail.ru/")
End Using
 
MessageBox.Show(html)
Запустив код и полождав некоторое время (зависит от размера кода сайта), мы увидим MessageBox с html-кодом сайта.


Парсинг строки со скачанным кодом страницы


Скачаем архив с библиотекой HtmlAgilityPack с ее сайта (щелкаем ссылку Release Binaries - это все нужные dll без кода).
Эта библиотека позволяет работать с HTML-кодом как с DOM-деревом, подобно тому, как его можно парсить в JavaScript, используя document.getElementById() и тому подобное.

Откроем архив. Увидим папки с разными сборками библиотеки для разных платформ (.NET 2.0, .NET 3.0, .NET 4.0, .NET 4.0 Client Profile, .NET 4.5, Windows RT - Metro, Windows Phone).
Распакуем 3 файла (dll, xml, pdb) версии для .NET 2.0 в папку с нашим exe (bin\Debug\ или bin\Release\).

Добавим в проект ссылку на библиотеку HtmlAgilityPack.dll (меню Проект -> Добавить ссылку).

Импортируем пространство имен HtmlAgilityPack.

Добавим к предыдущему коду следующий код:
VB.NET
1
2
3
4
Dim haDoc As New HtmlDocument()
haDoc.LoadHtml(html)
 
MessageBox.Show(haDoc.GetElementbyId("qip_weather_day").InnerText)
Запустив код, увидим MessageBox с температурой воздуха, указанной на http://qip.ru/

P.S. Рядом с ехе всегда должен лежать файл HtmlAgilityPack.dll, иначе он не запустится.
Вложения
Тип файла: zip WebClient HtmlAgilityPack Parse.zip (199.9 Кб, 151 просмотров)
Тип файла: zip WebClient HtmlAgilityPack Parse — ТОЛЬКО ЕХЕ.zip (57.3 Кб, 84 просмотров)
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
11.08.2014, 21:19
Помогаю со студенческими работами здесь

Basic4Android. Готовые решения полезные коды
Предлагаю в этой теме делиться полезными кодами. Ну как Visual Basic.NET. Там есть такая тема. Думаю многим будет интересно. ...

Полезные коды для PascalABC.NET
В этой теме размещаются полезные исходники программ, различные процедуры и функции, а так же готовые решения на часто задаваемые вопросы,...

Готовые коды для решения лабораторных работ
Доброго времени суток всем! Очень срочно нужны готовые коды для решения лабораторных работ в С# по учебнику Павловской!!! Вариант 16, нужны...

Где бесплатно скачать учебник по Visual Basic 6 и Visual Basic .Net ?
Где бесплатно скачать учебник по Visual Basic 6 и Visual Basic .Net

Visual Basic 6 и Visual Basic .NET - в чем различия?
Visual Basic и Visual studio это не одно и тоже? если нет то в чём разница, по мимо оформления?


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
120
Закрытая тема Создать тему
Новые блоги и статьи
Отчёт о затраченных материалах за определенный период с макетом печатной формы
Maks 21.04.2026
Отчёт из решения ниже размещён в конфигурации КА2. Задача: разработка отчёта по затраченным материалам за определённый период, с возможностью вывода печатной формы отчёта с шапкой и подвалом. В. . .
Отчёт о спецтехнике находящейся в ремонте
Maks 20.04.2026
Отчёт из решения ниже размещен в конфигурации КА2. Задача: отобразить спецтехнику, которая на данный момент находится в ремонте. Есть нетиповой документ "Заявка на ремонт спецтехники" который. . .
Памятка для бота и "визитка" для читателей "Semantic Universe Layer (Слой семантической вселенной)"
Hrethgir 19.04.2026
Сгенерировано для краткого описания по случаю сборки и компиляции скелета серверного приложения. И пусть после этого скажут, что статьи сгенерированные AI - туфта и не интересно. И это не реклама -. . .
Запрет удаления строк ТЧ документа при определённом условии
Maks 19.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "Аккумуляторы", разработанного в конфигурации КА2. У данного документа есть ТЧ, в которой в зависимости от прав доступа. . .
Модель заражения группы наркоманов
alhaos 17.04.2026
Условия задачи сформулированы тут Суть: - Группа наркоманов из 10 человек. - Только один инфицирован ВИЧ. - Колются одной иглой. - Колются раз в день. - Колются последовательно через. . .
Мысли в слух. Про "навсегда".
kumehtar 16.04.2026
Подумалось тут, что наверное очень глупо использовать во всяких своих установках понятие "навсегда". Это очень сильное понятие, и я только начинаю понимать край его смысла, не смотря на то что давно. . .
My Business CRM
MaGz GoLd 16.04.2026
Всем привет, недавно возникла потребность создать CRM, для личных нужд. Собственно программа предоставляет из себя базу данных клиентов, в которой можно фиксировать звонки, стадии сделки, а также. . .
Знаешь почему 90% людей редко бывают счастливыми?
kumehtar 14.04.2026
Потому что они ждут. Ждут выходных, ждут отпуска, ждут удачного момента. . . а удачный момент так и не приходит.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru