Visual Basic: новости сайтов, советы, примеры кодов.
Выпуск 139.


VBNet VBMania
Голосование:

Голосования сайта VBNet.Ru. Результаты голосований передаются на сайт. Проследите, что есть соединение с интернетом.



Рассылки Subscribe.Ru
VB.NET-World
Новости сайта IgorykSoft и советы по программированию
DanSoft о Visual Basic
Visual Basic.NET Уроки.

Ссылки:

  • Улицы VB
  • Использование VB
  • Азбука VB
  • VB на русском
  • Улицы VB
  • Кирпичики VB
  • CообЧа VB
  • Snoozex Design
  • IgorykSoft
  • DanSoft
  • Господа!!! читайте MSDN!!!

    Несколько слов от автора:

       Очередной выпуск рассылки.
    Читайте!


    Содержание выпуска




    Книги

    Переход на VB .NET. Стратегии, концепции, код (цена ~ 158 руб.)

    Эта книга была задумана как одна из первых книг о .NET, которая ознакомит читателя с основными идеями новой архитектуры и подготовит его к знакомству с более детальной литературой, например документацией Microsoft и ее толкованиями, которая неизбежно появится на рынке. Она поможет вам взглянуть на эту технологию с позиций ваших собственных рабочих планов и быстро освоить те концепции, которые покажутся необычными для большинства прогр...

    Автор(ы): Дан Эпплман, Издательство: Питер, 2002 г.


    Программирование на VB.NET. Учебный курс (цена ~ 119 руб.)

    Эта книга является вводным курсом по изучению языка программирования Visual Basic .NET. Даны основные принципы объектно-ориентированного программирования в контексте языка VB .NET, поскольку без хорошей подготовки в этой области невозможно в полной мере пользоваться всеми преимуществами VB .NET.
    Изложены азы всех аспектов языка, которыми должен владеть любой профессиональный разработчик VB .NET

    Автор(ы): Г. Корнелл, Дж. Моррисон, Издательство: Питер, 2002 г.


    VB.NET для разработчиков (цена ~ 125 руб.)

    Основная задача книги - быстро ознакомить разработчиков Visual Basic с изменениями в .NET Framework. Программисты, использующие Java, C++, Delphi или другие инструменты разработки приложений и интересующиеся Visual Basic или технологией .NET Framework, также найдут эту книгу полезной. Хотя книга посвящена Visual Basic.NET, ее основная цель - продемонстрировать взаимодействие Visual Basic и ...

    Автор(ы): Кит Франклин, Издательство: Вильямс, 2002 г.




    Остальные книги о 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 владельцу сайта.
    Текст сообщения:
    Ваше имя
    E-mail для ответа

    наверх


    Выпуск подготовили:

    Сурменок Павел