Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - Общий форум

Страница: 1 |

 

  Вопрос: Класс RgnMake - идиотская ошибка! Добавлено: 04.09.04 16:37  

Автор вопроса:  magish
Скачал пример с этого сайта
(http://www.vbnet.ru/samples/zip/class.rgnmake.zip)

Запустил... Работает нормально...

Но вот тупая ошибка:
В этом же проекте создайте новую форму, пропишите её как стартовую и вот это засуньте в новую форму:

Private Sub Form_Load()
frmMain.Show
End Sub

При старте прога начинает ругаться...

Помогите кто может... Напишите какие строчки надо поменять на другие... ПЛИZZZZZZZZZЗЗЗЗЗЗ!!!

Ответить

  Ответы Всего ответов: 8  

Номер ответа: 1
Автор ответа:
 magish



Вопросов: 47
Ответов: 47
 Профиль | | #1 Добавлено: 04.09.04 18:01
Жду ответа... ПЛИЗЗЗЗЗЗ!!!

Ответить

Номер ответа: 2
Автор ответа:
 Comanche



Вопросов: 87
Ответов: 459
 Профиль | | #2 Добавлено: 04.09.04 18:02
Да там вообще странно написан код события Class_Initialize: с одной стороны, там есть цикл по переборке ВСЕХ форм проекта ("For Each frm In Forms";), а с другой стороны - он написан так, что всегда выполнится только один раз (прямо перед "Next frm" стоит "Exit For";)! Чудеса, да и только.
А вообще-то понятно: весь код писался исключительно под одну-единственную форму. По уму, у класса RgnMake надо завести свойство AttachedForm или что-нить типа этого (ну или метод AttachForm [hWnd формы]).

Я так понимаю, ты вторую форму (включённую в этот проект самостоятельно) тоже хочешь "отрисовать"? Если да, то придётся повозиться с кодом, чтобы обеспечить поддержку нескольких форм. Ну а если нет - то просто переделай код вот так:

Private Sub Class_Initialize()
    isOk = False
    mOnTop = False
    mTransparent = 255
    Set frm = frmMain
    For Each ctl In frm.Controls
        If TypeName(ctl) = "PictureBox" Then
            Exit For
        End If
    Next ctl
    ctl.AutoRedraw = True
    ctl.BorderStyle = 0
    ctl.AutoSize = True
End Sub

Ответить

Номер ответа: 3
Автор ответа:
 magish



Вопросов: 47
Ответов: 47
 Профиль | | #3 Добавлено: 04.09.04 18:16
Спасибо! Я нашел простой выход:

1 - Удалил событие "Class_Initialize"
2 - добавил новое событие:

Public Function setFRM(frm1 As Form)
Set frm = frm1
    isOk = False
    mOnTop = False
    mTransparent = 255
    'Set frm = Form2
    For Each ctl In frm.Controls
        If TypeName(ctl) = "PictureBox" Then
            Exit For
        End If
    Next ctl
    ctl.AutoRedraw = True
    ctl.BorderStyle = 0
    ctl.AutoSize = True
End Function

И всё! Теперь я могу создавать хоть 20, а то и больше форм и все с разными скинами.

Естественно я и добавил события при "Form_Load"
rmk.setFrm frmMain

Ещё раз спасибо!

Ответить

Номер ответа: 4
Автор ответа:
 Alexander



Вопросов: 19
Ответов: 118
 Профиль | | #4 Добавлено: 05.09.04 03:01
глюки глюками а у меня эта прога ваще дает
какието полуразбитые скиноподобные куски формы
ели не опоздал то вот мною собственоручно сделанный модуль.есть возможность задавать цвет маски в RGB. вроди я чтото с ним делал и не доделал но проект пашет нормально хотя притормажевает с начала
вот код

Private Declare Function CombineRgn Lib "gdi32" (ByVal hDestRgn As Long, ByVal hSrcRgn1 As Long, ByVal hSrcRgn2 As Long, ByVal nCombineMode As Long) As Long
Private Declare Function CreateRectRgn Lib "gdi32" (ByVal X1 As Long, ByVal Y1 As Long, ByVal X2 As Long, ByVal Y2 As Long) As Long
Private Declare Function DeleteObject Lib "gdi32" (ByVal hObject As Long) As Long
Private Declare Function GetPixel Lib "gdi32" (ByVal hDC As Long, ByVal X As Long, ByVal Y As Long) As Long
Private Declare Function SetWindowRgn Lib "user32" (ByVal hWnd As Long, ByVal hRgn As Long, ByVal bRedraw As Boolean) As Long

Private Const RGN_OR = 2

Private Function RegionFromBitmap(picSource As PictureBox, Optional lngTransColor As Long) As Long

  lngHeight& = picSource.Height / Screen.TwipsPerPixelY
  lngWidth& = picSource.Width / Screen.TwipsPerPixelX
  lngRgnFinal& = CreateRectRgn(0, 0, 0, 0)
  For lngRow& = 0 To lngHeight& - 1
    lngCol& = 0
    ;Do While lngCol& < lngWidth&
      ;Do While lngCol& < lngWidth& And GetPixel(picSource.hDC, lngCol&, lngRow&;) = lngTransColor&
        lngCol& = lngCol& + 1
      Loop
      If lngCol& < lngWidth& Then
        lngStart& = lngCol&
        ;Do While lngCol& < lngWidth& And GetPixel(picSource.hDC, lngCol&, lngRow&;) <> lngTransColor&
          lngCol& = lngCol& + 1
        Loop
        If lngCol& > lngWidth& Then lngCol& = lngWidth&
        lngRgnTmp& = CreateRectRgn(lngStart&, lngRow&, lngCol&, lngRow& + 1)
        lngRetr& = CombineRgn(lngRgnFinal&, lngRgnFinal&, lngRgnTmp&, RGN_OR)
        ;DeleteObject (lngRgnTmp&;)
      End If
    Loop
  Next
  RegionFromBitmap& = lngRgnFinal&
End Function

Public Sub SetSkin(Form As Form, Picture As PictureBox, ColorRed As RGB, ColorGreen As RGB, ColorBlue As RGB)
On Error Resume Next
  ;Dim lngRetr As Long
  lngRegion& = RegionFromBitmap(Picture, RGB(ColorRed, ColorGreen, ColorBlue))
  lngRetr& = SetWindowRgn(Form.hWnd, lngRegion&, True)
End Sub

Ответить

Номер ответа: 5
Автор ответа:
 mc-black



ICQ: 308-534-060 

Вопросов: 20
Ответов: 1860
 Web-сайт: mc-black.narod.ru/dzp.htm
 Профиль | | #5
Добавлено: 05.09.04 22:49
Приколько... это я когда-то писал, мне на самом деле не приходило в голову, что кому-то понадобится несколько форм перерисовать. В этом смысле лучше использовать _контрол_ (был и такой) RgnMake - он здесь на сайте с исходниками. Там такой проблемы быть не должно, хотя и его может понадобится кому-то под себя переделывать. Например, если пишет под Win98 там нет анализа используемой операционки - ошибка 1. Кто-то захочет грузить картинки из ресурсов - надо переделать - ошибка 2. Кстати, вырезать регион произвольной формы очень легко, я бы обошелся без контрола/класса. Насчет быстродействия: алгоритм очень тормозной, быстрее не сделать на VB, хотите разогнать - учите Assembler (кстати, там есть не один готоавый исходник на эту тему www.wasm.ru). Особенно заметно на огромных формах, которые часто перерисовываются.

2 magish, Comanche, Alexsandr:
Спасибо! Все пожелания учтутся... Вот только приспособить бы алгоритм Asm под VB!..

Ответить

Номер ответа: 6
Автор ответа:
 Alexander



Вопросов: 19
Ответов: 118
 Профиль | | #6 Добавлено: 06.09.04 01:16
И еще меня как то переклинило
тут недавно скачал по ссылкам с какого то
сайта прогу для вырезания форм каой хотите формы
три клика по форме (может больше) и четвертый в меню и форма аля исходник на экране очень удобно для примерной подгонки регионов, а далее
можно и ручками в код.если надо то могу намылить.

Ответить

Номер ответа: 7
Автор ответа:
 SnowWolf



ICQ: 164216596 

Вопросов: 8
Ответов: 10
 Профиль | | #7 Добавлено: 06.09.04 22:29

Ответить

Номер ответа: 8
Автор ответа:
 SnowWolf



ICQ: 164216596 

Вопросов: 8
Ответов: 10
 Профиль | | #8 Добавлено: 06.09.04 22:31
сорри, случайно запостил...

Ответить

Страница: 1 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам