VBNet
VBMania
Голосование: Голосования сайта VBNet.Ru. Результаты голосований передаются на сайт. Проследите, что есть соединение с интернетом. Ссылки: |
Господа!!! читайте MSDN!!! Несколько слов от автора:
Очередной выпуск рассылки.
Читайте! Содержание выпуска
Книги
Остальные книги о VB можно найти здесь. наверх Сохранение файла из Интернета на жесткий диск Расположите на форме элемент CommandButton. После выполнения кода у вас на жестком диске появится новый файл - c:\1.gif Private Declare Function URLDownloadToFile Lib "urlmon" Alias "URLDownloadToFileA" (ByVal pCaller As Long, ByVal szURL As String, ByVal szFileName As String, ByVal dwReserved As Long, ByVal lpfnCB As Long) As Long Public Event ErrorDownload(FromPathName As String, ToPathName As String) Public Event DownloadComplete(FromPathName As String, ToPathName As String) Public Function DownloadFile(FromPathName As String, ToPathName As String) If URLDownloadToFile(0, FromPathName, ToPathName, 0, 0) = 0 Then DownloadFile = True RaiseEvent DownloadComplete(FromPathName, ToPathName) Else DownloadFile = False RaiseEvent ErrorDownload(FromPathName, ToPathName) End If End Function Private Sub Command1_Click() Call DownloadFile("http://vbnet.ru/subscribe/images/question.gif", "c:\1.gif") End Sub наверх Выделить кусок картинки Добавьте PictureBox на форму Dim X1 As Integer, X2 As Integer, Y1 As Integer, Y2 As Integer Dim SelectBox As Boolean Private Sub Picture1_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single) Picture1.DrawMode = 6 'Draw style to dots Picture1.DrawStyle = 2 'Check if a Select Box is already drawn If X2 > 0 Then Picture1.Line (X1, Y1)-(X2, Y2), , B 'Reset all the values to the current point X1 = X Y1 = Y X2 = X Y2 = Y End Sub Private Sub Picture1_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single) 'Проверить, нажата ли левая кнопка мыши If Button = 1 Then Picture1.Line (X1, Y1)-(X2, Y2), , B X2 = X Y2 = Y Picture1.Line (X1, Y1)-(X, Y), , B End If End Sub наверх Получить размеры картинки Получить размеры любого изображения, если оно может быть загружено в Image box. Добавьте 1 Image Box на форму. Установите свойства ImageBox Stretch и Visible в False. Private Sub Form_Load() 'замените путь c:\mypic.gif на ваш путь к картинке Image1.Picture = LoadPicture("c:\mypic.gif") 'Вы получите размеры в пикселях. (если вы хотите получить размеры в твипах, удалите текст "/ Screen.TwipsPerPixelY" и "/ Screen.TwipsPerPixelX".) MsgBox "Image Height: " & Image1.Height / Screen.TwipsPerPixelY & _ " Image width: " & Image1.Width / Screen.TwipsPerPixelX End Sub наверх Как осуществить скролинг картинки Данный пример покажет, как можно осуществить скролинг большой картинки в маленьком окне. Вам необходимо добавить 2 PictureBox, а также VScrollBar и HScrollBar (вертикальную и горизонтальную полосу прокрутки). (см. рисунок) Private Sub Form_Load() HScroll1.Min = 0 HScroll1.Max = ScaleX(Picture1.Picture.Width, 8, vbTwips) - Picture2.Width HScroll1.LargeChange = 10 * Screen.TwipsPerPixelX HScroll1.SmallChange = Screen.TwipsPerPixelX VScroll1.Min = 0 VScroll1.Max = ScaleX(Picture1.Picture.Height, 8, vbTwips) - Picture2.Height VScroll1.LargeChange = 10 * Screen.TwipsPerPixelY VScroll1.SmallChange = Screen.TwipsPerPixelY HScroll1_Change End Sub Private Sub HScroll1_Change() Picture2.PaintPicture Picture1.Picture, 0, 0, _ Picture2.Width, Picture2.Height, _ HScroll1.Value, VScroll1.Value, _ Picture2.Width, Picture2.Height End Sub Private Sub HScroll1_Scroll() Picture2.PaintPicture Picture1.Picture, 0, 0, _ Picture2.Width, Picture2.Height, _ HScroll1.Value, VScroll1.Value, _ Picture2.Width, Picture2.Height End Sub Private Sub VScroll1_Change() HScroll1_Change End Sub Private Sub VScroll1_Scroll() HScroll1_Scroll End Sub наверх Изменение цвета отдельного пикселя в элементе PictureBox Добавьте элемент PictureBox. Установите свойство AutoRedraw как True. В данном примере при нажатии левой клавишой мыши в PictureBox вы меняете цвет пикселя (в нашем примере - на красный цвет). Цвет фона для пикселя вы опеределяете функцией RGB (читайте справку по функции RGB) Private Declare Function SetPixel Lib "gdi32" (ByVal hdc As Long, ByVal X As Long, ByVal Y As Long, ByVal crColor As Long) As Long Dim s As Long, d As Long Private Sub Form_Load() d = RGB(255, 255, 0) 'замените переменную d на любой нужный вам цвет End Sub Private Sub Picture1_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single) s = SetPixel(Picture1.hdc, X / 15, Y / 15, d) Picture1.Refresh End Sub Private Sub Picture1_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single) If Button = 1 Then 'цвет пикселя меняется только при нажатой левой клавиши мыши s = SetPixel(Picture1.hdc, X / 15, Y / 15, d) Picture1.Refresh End If End Sub наверх Мои программы BalloonMessage for MS Agent BalloonMessage for Microsoft Agent реализует диалог программы с
пользователем, используя при этом технологию Microsoft Agent. OCX реализует три
типа диалоговых окон: InputBox, MsgBox и MsgLabels. Автора: Шатрыкин Иван и Павел Сурменок. наверх Вопрос/Ответ Здесь Вы можете задать вопрос, или ответить на уже имеющиеся вопросы. Вопросы:Автор вопроса: Michael Fezulaev Ответ ожидается по этому адресу Помагите с решением проблема такая. Есть функции как copy, cut, paste можно воспользаватся с помащю как Clipboard и как через WinApi Public Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hWnd As Long, ByVal wMsg As Long, ByVal wParam As Long,_ LParam As Any) As Long Какая разнится между ними разнится и какая из них боле эфектвна. Автор вопроса: Mister C Ответ ожидается по этому адресу Я столкнулся с такой проблемой. Хочу чтобы формулы в документе сами пресчитывались. Формулы написаны в редакторе формул MS Equation 3.0. Но никак не могу найти таких примеров. Автор вопроса: ]CBK[CRaSH Ответ ожидается по этому адресу ХА. Я наконец то отрыл код получения заводского серийника HDD!!!!!!!!!! Если каму-нибудь надо могу прислать. НО программа написана на С я ее подредактировал. Поевляется окошко консольного приложения и создается файл key.dat c номером Вобшем круто!!!!!!!!!!! Автор вопроса: Игорь Ответ ожидается по этому адресу Как определить, какие файлы, включая библиотеки, ActiveX-компоненты и т.д., необходимо включить в инсталлятор готового приложения? Стандартный VB Pack Wizard, по-моему, добавляет в пакет много лишнего ... Автор вопроса: Sergey Ответ ожидается по этому адресу Можно-ли запустить из VB файл *.mdb. Если да, то как это сделать? Автор вопроса: Sergey Ответ ожидается по этому адресу Как обновить DataEnvirinment при печати новой записи, а то после изменений в наборе recordset в DataReport выводится старая запись. Можно-ли в VB6 при формировании DataReport обойтись без DataEnvirinment? Автор вопроса: Dr_Max Ответ ожидается по этому адресу Как поставить vbnet на машину с win98 ?? Вылетает сообщение "типа не устанавливается не вин98", а в хелпе "On Windows 98 or Windows Me run instmsiA.exe" Автор вопроса: Константин Ответ ожидается по этому адресу Подскажите, плз, как можно перетаскивать объект по форме мышкой (хорошо бы, что-бы было видно контур, как в нормальных приложениях) и как можно соединить два объекта на форме линией (опять же, с помощью крысы). Автор вопроса: Eugene Ответ ожидается по этому адресу Как добиться того, чтобы в объекте DataGrid автоматически (без применения Datagrid.Requery) отражались изменения внесенные в таблицу другими пользователями. Автор вопроса: Yory Ответ ожидается по этому адресу Мой проект (VB6) использует DAO 3.50, работал без проблем (Win 95/98/2000). Появились машины с той же самой операционкой, не открывающие базу данных при работе из exe-шника. При работе в среде отладки все отлично. Тогда меняю DAO 3.50 на DAO 3.60. На этих машинах все отлично, но на части тех, где раньше проблем не было (не на всех!) база загружаться перестала. Новую .dll я, естественно, нормально устанавливаю и регистрирую. Кто поможет? Автор вопроса: Anatoly Ответ ожидается по этому адресу Как из программы изменить время включения компьютера в BIOS-е? Ответы: Вопрос: Как осуществить перебор всех контролов только на одной вкладке SSTab? Ответ: Автор ответа: Sergey Используешь св-во Parent контрола: For each vControl in Me.Controls if vControl.Parent.Name = "То что нужно" Then ... 'твой код End If Next vControl Вопрос: Может кто подскажет как быть: пишу на vbscript(asp), задача - с помощью word.application сохранить указанный документ ворда как html? На vb все работает, а на asp валится с сообщением "Не удается открыть банк макросов", хотя никаких макросов там нет. Вот кусок кода, валится на 3 строке: Dim objWdDoc Set objWdDoc=Server.CreateObject("Word.Application") objWdDoc.Documents.Open "C:\work\word-work\bar.doc" Ответ: Автор ответа: Sergey Эти и похожие проблемы могут возникать если вызывающая среда(в данном случае ASP) игнорирует или не имеет доступа к переменнным системы. Также возможны глюки когда текущая папка не совпадает с папкой где находятся исполняемые файлы и т.д. Вопрос: Можно ли привяяать координаты дочерней формы (свойства Top и Left) к координатам кнопки, по нажатию на котррую эта форма выяывается. Например, чтобы дочерняя форма появлялась строго под кнопкой неяависимо от положения самой кнопки на родительской форме? В приведенном ниже примере привяяка почему-то не работает: Form1.Left = MainForm.cmdButton.Left + 100 Form1.Top = MainForm.cmdButton.Top + 50 Ответ: Автор ответа: Sergey Не забывай, что для формы Top и Left - координаты относительно границы экрана а для кнопок - это смещения по отношению к границе контейнера(в данном случае формы) Вопрос: Есть ComboBox со значениями, в зависимости от выбираемого значения появляетяс Lebel. При задании Private Sub Combo1_Change() Select Case Combo1.Value Case "СУГ" Form.Label2.Visible = True Case "Нефть" Form.Label2.Visible = False End Sub В результате Label2 - не исчезает Ответ: Автор ответа: Sergey Попробуй использовать другие свойства: Text например. Вопрос: В режиме "Крупные значки" эксплорер отображает маленькие (16х16) иконки размазанными (до 32х32). Как получить такую размазанность при деформациях изображений в своём приложении? Ответ: Автор ответа: ShAdE Попробуй это, тока ари не забудь нужные вставить Sub ProcessSmooth(Picture1 as PictureBox) Dim i As Long, j As Long Dim red As Integer, green As Integer, blue As Integer hBMP = CreateCompatibleBitmap(Picture1.hdc, Picture1.ScaleWidth, Picture1.ScaleHeight) hDestDC = CreateCompatibleDC(Picture1.hdc) SelectObject hDestDC, hBMP For i = 1 To y - 2 For j = 1 To x - 2 red = ImagePixels(0, i - 1, j - 1) + ImagePixels(0, i - 1, j) + ImagePixels(0, i - 1, j + 1) + _ ImagePixels(0, i, j - 1) + ImagePixels(0, i, j) + ImagePixels(0, i, j + 1) + _ ImagePixels(0, i + 1, j - 1) + ImagePixels(0, i + 1, j) + ImagePixels(0, i + 1, j + 1) green = ImagePixels(1, i - 1, j - 1) + ImagePixels(1, i - 1, j) + ImagePixels(1, i - 1, j + 1) + _ ImagePixels(1, i, j - 1) + ImagePixels(1, i, j) + ImagePixels(1, i, j + 1) + _ ImagePixels(1, i + 1, j - 1) + ImagePixels(1, i + 1, j) + ImagePixels(1, i + 1, j + 1) blue = ImagePixels(2, i - 1, j - 1) + ImagePixels(2, i - 1, j) + ImagePixels(2, i - 1, j + 1) + _ ImagePixels(2, i, j - 1) + ImagePixels(2, i, j) + ImagePixels(2, i, j + 1) + _ ImagePixels(2, i + 1, j - 1) + ImagePixels(2, i + 1, j) + ImagePixels(2, i + 1, j + 1) SetPixelV hDestDC, j, i, RGB(red / 9, green / 9, blue / 9) Next Form3.ProgressBar1.Value = i * 100 / (y - 1) DoEvents Next Form3.Hide BitBlt Picture1.hdc, 1, 1, Picture1.ScaleWidth - 2, Picture1.ScaleHeight - 2, hDestDC, 1, 1, &HCC0020 Picture1.Refresh Call DeleteDC(hDestDC) Call DeleteObject(hBMP) End Sub Вопрос: Доброе время суток. А реально написать прогу на VB6 и сделать так чтобы она висела в трее (прям значком) а при нажатии на нее левой открывалась, а правой показывала меню? Ответ: Автор ответа: RaZoom 'Код модуля: Option Explicit Public Declare Function ReleaseCapture Lib "user32" () As Long Public Declare Function Shell_NotifyIconA Lib "SHELL32" (ByVal dwMessage As Long, lpData As NOTIFYICONDATA) As Integer Public Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long Public Const WM_NCLBUTTONDOWN = &HA1 Public Const HTCAPTION = 2 Public bTrayFlag As Boolean Public Const NIM_ADD = 0& Public Const NIM_MODIFY = 1& Public Const NIM_DELETE = 2& Public Const NIF_MESSAGE = 1& Public Const NIF_ICON = 2& Public Const NIF_TIP = 4& Public Const WM_LBUTTONDOWN = &H201& Public Const WM_LBUTTONUP = &H202& Public Const WM_LBUTTONDBLCLK = &H203& Public Const WM_RBUTTONDOWN = &H204& Public Const WM_RBUTTONUP = &H205& Public Const WM_RBUTTONDBLCLK = &H206& Public Const WM_MBUTTONDOWN = &H207& Public Const WM_MBUTTONUP = &H208& Public Const WM_MBUTTONDBLCLK = &H209& Type NOTIFYICONDATA cbSize As Long hwnd As Long uID As Long uFlags As Long uCallbackMessage As Long hIcon As Long szTip As String * 64 End Type Public Function SetTrayIcon(Mode As Long, hwnd As Long, Icon As Long, tip As String) As Long Dim nidTemp As NOTIFYICONDATA nidTemp.cbSize = Len(nidTemp) nidTemp.hwnd = hwnd nidTemp.uID = 0& nidTemp.uFlags = NIF_ICON Or NIF_TIP Or NIF_MESSAGE nidTemp.uCallbackMessage = WM_RBUTTONDOWN nidTemp.hIcon = Icon nidTemp.szTip = tip & Chr$(0) SetTrayIcon = Shell_NotifyIconA(Mode, nidTemp) End Function 'Код формы: Private Sub Form_MouseDown(Button As Integer, Shift As Integer, x As Single, y As Single) Dim msg As Long 'Проверка, сидит ли прога в tray'e, если да обрабатываем издевательства над иконкой If bTrayFlag Then If Me.ScaleMode = vbPixels Then msg = x Else msg = x / Screen.TwipsPerPixelX End If Select Case msg 'По левому даблклику по иконке - разворачиваем. Можно заменить на WM_LBUTTONUP Case WM_LBUTTONDBLCLK: Me.WindowState = vbNormal Me.Show Me.SetFocus Case WM_RBUTTONUP: 'По правой - показываем popup. Me.mnuPopMnu - создаем заранее Me.PopupMenu Me.mnuPopMnu, , , , mnuRestore End Select Else 'В противном случае - таскаем форму за любое место If y <> 0 Then ReleaseCapture SendMessage Me.hwnd, WM_NCLBUTTONDOWN, HTCAPTION, 0& End If End If End Sub Private Sub Form_QueryUnload(Cancel As Integer, UnloadMode As Integer) Cancel = 0 End Sub Private Sub Form_Resize() 'При нажатии на кнопку свернуть - прячем в tray If Me.WindowState = vbMinimized And (Not bTrayFlag) Then Me.Visible = False SetTrayIcon NIM_ADD, Me.hwnd, Me.Icon, "Текст подсказки" bTrayFlag = True Else 'При разворачивании - удаляем иконку из трэя If bTrayFlag Then SetTrayIcon NIM_DELETE, Me.hwnd, 0&, "" Me.Visible = True bTrayFlag = False End If End If End Sub Вопрос: У меня три вопроса, которые я сам пока не могу разрешить. 1. Как в VB6 запретить запуск экранной заставки на время работы моей программы? 2. Как проиграть avi-файл? В 71 выпуске была статья "Проиграть Avi-файл в Picture Box ". Пример рабочий, только есть одно большое НО. На время работы программа блокируется и невозможно выйти из нее, пока avi-файл не будет проигран. Т.е. если использовать этот пример, то необходимо добавить кнопку Stop и Pause, а также прогресс бар. Код программы привожу : Добавьте CommandButton и PictureBox на форму Private Declare Function mciSendString Lib "winmm" Alias "mciSendStringA" (ByVal lpstrCommand As String, ByVal lpstrReturnString As String, ByVal uReturnLength As Long, ByVal hwndCallback As Long) As Long Private Declare Function mciGetErrorString Lib "winmm" Alias "mciGetErrorStringA" (ByVal dwError As Long, ByVal lpstrBuffer As String, ByVal uLength As Long) As Long Private Declare Function GetShortPathName Lib "kernel32" Alias "GetShortPathNameA" (ByVal lpszLongPath As String, ByVal lpszShortPath As String, ByVal cchBuffer As Long) As Long Const WS_CHILD = &H40000000 Sub PlayAVIPictureBox(FileName As String, ByVal Window As PictureBox) Dim RetVal As Long Dim CommandString As String Dim ShortFileName As String * 260 Dim deviceIsOpen As Boolean 'Retrieve short file name format RetVal = GetShortPathName(FileName, ShortFileName, Len(ShortFileName)) FileName = Left$(ShortFileName, RetVal) 'Open the device CommandString = "Open " & FileName & " type AVIVideo alias AVIFile parent " & CStr(Window.hWnd) & " style " & CStr(WS_CHILD) RetVal = mciSendString(CommandString, vbNullString, 0, 0&) If RetVal Then GoTo error 'remember that the device is now open deviceIsOpen = True 'Resize the movie to PictureBox size CommandString = "put AVIFile window at 0 0 " & CStr(Window.ScaleWidth / _ Screen.TwipsPerPixelX) & " " & CStr(Window.ScaleHeight / _ Screen.TwipsPerPixelY) RetVal = mciSendString(CommandString, vbNullString, 0, 0&) If RetVal <> 0 Then GoTo error 'Play the file CommandString = "Play AVIFile wait" RetVal = mciSendString(CommandString, vbNullString, 0, 0&) If RetVal <> 0 Then GoTo error 'Close the device CommandString = "Close AVIFile" RetVal = mciSendString(CommandString, vbNullString, 0, 0&) If RetVal <> 0 Then GoTo error Exit Sub error: 'An error occurred. 'Get the error description Dim ErrorString As String ErrorString = Space$(256) mciGetErrorString RetVal, ErrorString, Len(ErrorString) ErrorString = Left$(ErrorString, InStr(ErrorString, vbNullChar) - 1) 'close the device if necessary If deviceIsOpen Then CommandString = "Close AVIFile" mciSendString CommandString, vbNullString, 0, 0& End If 'raise a custom error, with the proper description Err.Raise 999, , ErrorString End Sub Private Sub Command1_Click() 'replace 'c:\myfile.avi' with the name of the AVI file you want to 'play PlayAVIPictureBox "путь к файлу\*.avi", Picture1 End Sub 3. Есть код, позволяющий создать окно произвольной формы. В Win9x/Me все работает как положено, а в Win XP ненужные участки формы не обрезаются, т.е. на экране форма имеет вид прямоугольника. Кто подскажет, в чем дело и как это поправить? Код программы привожу: Option Explicit 'Объявляем API-функцию, которая так сказать 'накладывает созданный регион на окно (те 'части которые остались за пределами 'региона исчезают), где: hwnd - идентифика- 'тор окна, на котором нужно "выдавить" 'форму, hRgn - "формочка" для окна, 'bRedraw - перерисовывать ли окно после '"выдавления". Private Declare Function SetWindowRgn _ Lib "user32" (ByVal hwnd As Long, _ ByVal hRgn As Long, ByVal bRedraw As _ Boolean) As Long 'Объявляем API-функцию чтобы создать 'регион-"формочку" (состоит регион из n-ого 'количества точек, которое необходимо 'задать), где: lpPoint - первая точка 'региона, nCount - количество точек, 'nPolyFillMode - описание метода заливки 'полигона. Private Declare Function CreatePolygonRgn _ Lib "gdi32" (lpPoint As POINTAPI, _ ByVal nCount As Long, ByVal _ nPolyFillMode As Long) As Long 'Объявляем тип для описания координат 'каждой точки Private Type POINTAPI x As Long y As Long End Type 'Объявляем массив P по типу POINTAPI Dim P(128) As POINTAPI Private Sub Form_Load() 'Присвоим свойству Picture формы такого 'же вида свойство Picture = Image1 'Записываем код для каждой точки, 'описывающий её координаты в пикселах P(0).x = 448: P(0).y = 25 P(1).x = 97: P(1).y = 45 P(2).x = 98: P(2).y = 33 'Задаются остальные точки... P(126).x = 90: P(126).y = 43 P(127).x = 93: P(127).y = 45 P(128).x = 448: P(128).y = 25 'Объявляем переменную, содержащую 'регион Dim Rgn As Long 'Создаём регион Rgn = CreatePolygonRgn(P(0), 128, 0) '"Выдавливем форму" Call SetWindowRgn(hwnd, Rgn, True) End Sub Ответ: Автор ответа: ViTal Отвечу на 3-й вопрос: 'создаём регион 'последний параметр может принимать значения ALTERNATE=1 или WINDING=2!!! hRgn = CreatePolygonRgn(P(0), 128, ALTERNATE) 'присваиваем регион форме Call SetWindowRgn(hwnd, hRgn, True) 'удаляем созданый в памяти регион Call DeleteObject(hRgn) Можете заполнить эту форму, либо отослать вопрос СЮДА Форма для добавления нового вопроса в этот раздел. Информация отсылается по E-mail владельцу сайта. |
|||||||||||||||
Выпуск подготовили: |
Сурменок Павел |