elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Entrar al Canal Oficial Telegram de elhacker.net


  Mostrar Mensajes
Páginas: [1] 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 ... 1236
1  Media / Multimedia / Re: Busco: Programa para editar (cortar/pegar) un archivo de audio AC-3 sin volver a codificarlo en: Ayer a las 01:52
Elektro, hecha un vistazo a este post:

Manual para sacar y editar AC3 5.1
https://www.foroseldoblaje.com/foro/viewtopic.php?t=4052

No es lo que estoy buscando, Daniel, pero gracias una vez más por ayudar.



Elektro creo que tengo lo que buscas, osea un programa que trabaje con ac3 sin recodificar. Al menos cortar corta por que lo e probado yo mismo. Las demás funciones tendrás que comprobarlo tu. Se trata del Shutter Encoder, y puedes bajarlo de aquí:
https://www.shutterencoder.com
Suerte y saludos...

Songoku


Pues.... ¡oye!, se hace algo tediosa de manejar, tan en pequeñito y escondido todo, pero lo cierto es que la función de cortar (que no es la que se llama "cortar", sino "eliminar") funciona perfectamente para cortar un segmento y preservar todo lo demás del lado izquierdo y derecho del segmento cortado, sin recodificar. Lo he probado con un audio AC-3 de 2, y 6 canales.

Si el programa tuviese una función adicional para añadir un silencio en un punto específico, eso ya sería maravilloso, pero creo que esa funcionalidad no está implementada.

Lo bueno es que es open-source y el proyecto parece bastante activo, así que... preguntaré a ver si el autor puede añadir esa función en el futuro.

Yo soy muy exigente (intento buscar el perfeccionismo), pero también soy realista, y con lo difícil que es encontrar un programa que cumpla con una o varias de estas funcionalidades... creo que por ahora no se le puede pedir más. Cortar era lo principal.

Al final lo lograste, Songoku, ¡MUCHAS GRACIAS!.
2  Media / Multimedia / Re: Busco: Programa para editar (cortar/pegar) un archivo de audio AC-3 sin volver a codificarlo en: 22 Abril 2024, 17:43 pm
Hola, algo que se me ocurrió de probar es convertir el audio AC-3 a mp3, hacer la edición con mp3DirectCut y volver a convertirlo a AC-3.

Como ya te han sugerido, Audacity es bastante bueno para eso.

Tengo las herramientas para llevar a cabo ese procedimiento, pero quiero evitarlo.

Cualquier procedimiento que implique convertir/recodificar el audio original AC-3 a otro formato compatible con el editor de audio en cuestión, no me sirve.

Además, si el audio AC-3 es 5.1, los canales adicionales se pierden (se unen) en la conversión a MP3 estéreo (2 canales).



eso de poder cortar un trozo es posible hacerlo sin recodificar siempre que lo que cortes y pegues sea del mismo archivo, pero si pretendes como me a parecido entender

En realidad yo lo que pretendo es hacer cortes y pegar segmentos del mismo audio que esté editando en ese momento; no tengo intención de hacer nada que no se haría con un MP3 en el programa "mp3DirectCut".



dependiendo de lo que quieras hacer no va a quedar mas remedio que recodificar, no es cuestión de un software u otro.

La recodificación es obligatoria, siempre que cortes o añadas a la línea de tiempo.

No quiero parecer cabezota, y os agradezco la ayuda a los cuatro, pero estoy convencido de que la recodificación no es obligatoria...

Simplemente tenemos esa percepción de obligatoriedad, por que no hemos descubierto un software que nos permita, de forma tan versátil y guiada como "mp3DirectCut", trabajar directamente sobre archivos AC-3. Quizás simplemente es que todavía nadie ha desarrollado un software así, o quizás sí, pero sea muy poco conocido y por ende difícil de hallar.

Pero en mi anterior comentario mencioné un programa por nombre "DelayCut" que se acerca algo... se acerca bastante, y cumple con el requisito de trabajar directamente (de forma lossless) sobre el archivo AC-3, aunque la forma en que se presenta la interfaz de usuario deja muchísimo que desear, sin un visualizador de ondas para reproducir el audio y permitir seleccionar un segmento que cortar (o insertar un silencio o pegar) no sirve de mucho para ciertas tareas de edición de audio, la verdad.

Antes de darme por vencido necesito seguir buscando, manteniendo la esperanza en encontrar este tipo de programa.

Gracias de nuevo.
3  Media / Multimedia / Re: Busco: Programa para editar (cortar/pegar) un archivo de audio AC-3 sin volver a codificarlo en: 22 Abril 2024, 00:32 am
da igual si sea en ac3 o en el formato que sea, osea algunas actuaciones requieren recodificación, y eso vale para CUALQUIER programa.

En realidad, Songoku, hay editores de audio, como por ejemplo mp3DirectCut, que sirve para realizar cortes, pegar, añadir silencios, hacer fade-in/fade-out entre otras cosas, y con soporte directo para los formatos MP3, MP2 y AAC, pues este programa, entre otros, es capaz de realizar todas estas ediciones directamente sobre el archivo, o también se puede guardar a un nuevo archivo, creando el archivo sin recodificación de la pista de audio editada.

Pero vamos tampoco le veo el problema.

Con Audacity (por mencionar uno de tantos editores de audio), al requerir recodificar, se pierde calidad. La pérdida en la calidad de audio puede ser mínima / ínfima / imperceptible si se codifica usando el mismo codec, mismo bitrate y los parámetros de calidad adecuados, pero siempre se va a perder una cantidad mínima, que aunque sea imperceptible, pues se pierde, y yo quiero intentar evitarlo.

En cambio, con un editor de audio que no necesitase recodificar (como mp3DirectCut), se garantiza que la calidad de audio se mantenga intacta, sin perder ni una "milésima" de calidad por imperceptible que fuese. Esto es lo que se denomina "LOSSLESS" (edición sin pérdidas) y es el tipo de edición que busco, pero para formato AC-3.

Otra opción pero de pago sería el MAGIX Sound Forge Audio Studio. Se supone que lo que no haga ese programa no lo podrá hacer nadie. Pero vamos como ya digo los milagros no existen y ciertas cosas son imposibles para cualquier programa.
Saludos...

Ni el Sound Forge ni el Vegas permiten editar de forma lossless.

Lo que busco es complicado, pero no imposible.

Mira, un programa que se acerca a lo que busco es DelayCut (https://www.videohelp.com/software/delaycut) capaz de añadir silencios a pistas AC-3 de forma lossless. El programa tiene una función para hacer cortes, pero... esa función de cortar no sirve para realizar cortes de un segmento específico en el audio (digamos, por ejemplo, que no sirve para hacer un corte desde el segundo 10, hasta el segundo 11, dejando intacto el audio anterior al segundo 10 y el audio posterior al segundo 11), o al menos yo no lo he sabido utilizar de esa forma, y además es que la interfaz gráfica... no hay visualizador de ondas, por lo que se ha de introducir manualmente los códigos de tiempo... ni siquiera eso, no se pueden introducir códigos de tiempo para hacerlo algo más fácil, sino que hay que introducir valores en milisegundos (o en otros formatos, pero valores en general que no son códigos de tiempo). Esto son cosas que puedo hacer perfectamente con otros programas command-line (ej. FFMPEG) y de forma mucho menos tediosa. No es lo que busco.

Gracias igualmente, seguiré buscando!
4  Media / Multimedia / Re: Busco: Programa para editar (cortar/pegar) un archivo de audio AC-3 sin volver a codificarlo en: 21 Abril 2024, 20:19 pm

Conocía esa opción, lamentablemente Audacity requiere recodificar el audio AC-3 para aplicar los cambios realizados al proyecto.

Gracias igualmente!
5  Media / Multimedia / Busco: Programa para editar (cortar/pegar) un archivo de audio AC-3 sin volver a codificarlo en: 21 Abril 2024, 18:11 pm
Me gustaría descubrir un programa para Windows, con una interfaz gráfica de usuario, que sea capaz de cargar un archivo de audio AC-3 para cortar (y pegar) en algunos puntos del stream de audio, sin volver a codificar el audio.

Cuando pienso en este tipo de aplicación, lo ideal sería que tuviera similitud con la interfaz de usuario de mp3DirectCut (https://mpesch3.de/):

  

Requisitos:
-----------

  - Freeware (de código abierto o no, no importa) o Freemium (parcialmente gratuito con funciones premium deshabilitadas).
  - Funciona en Windows 10 (x64).
  - Con interfaz gráfica de usuario (GUI) donde puedes seleccionar un rango, por lo que no necesitas ingresar manualmente los códigos de tiempo para cortar.
  - Tiene un visualizador de flujo de audio (o "visualizador de ondas"), como en la captura de pantalla anterior.
  - Puede reproducir el audio, cortarlo en cualquier punto y pegar un silencio en cualquier punto.
  - Edición sin pérdidas, "lossless" (es decir, no requiere volver a codificar el archivo de audio).
  - Soporta estéreo o canales 5.1.

Nota: las sugerencias de software pago también son bienvenidas, si son económicas para uso privado (no soluciones corporativas que cuestan cientos o miles de euros).

Muchas gracias por su atención.
6  Programación / .NET (C#, VB.NET, ASP) / Re: Librería de Snippets para VB.NET !! (Compartan aquí sus snippets) en: 19 Abril 2024, 18:48 pm
El siguiente código es un módulo por nombre 'Wildcard' que representa un algoritmo de coincidencia de cadenas con uso de comodines * (wildcards). Sirve como alternativa al operador Like de VB.NET.

Ejemplo de uso:

Código
  1. Dim input As String = "Hello World!"
  2. Dim pattern As String = "*e*l*o *!"
  3.  
  4. Console.WriteLine($"{NameOf(Wildcard.IsMatch)} {Wildcard.IsMatch(input, pattern)}")

El código lo he extraído del código fuente de la aplicación "RomyView" escrita en C#:


Lo he convertido a VB.NET de forma automática, y lo comparto tal cual, sin modificaciones ni adiciones. Lo he probado con varias cadenas y combinaciones de patrones de comodines, y parece funcionar a la perfección.

Wildcard.vb
Código
  1. ''' <summary>The IsMatch function below was downloaded from:
  2. ''' <a href="https://www.c-sharpcorner.com/uploadfile/b81385/efficient-string-matching-algorithm-with-use-of-wildcard-characters/">
  3. ''' Efficient String Matching Algorithm with Use of Wildcard Characters</a></summary>
  4. Public Module Wildcard
  5. ''' <summary>Tests whether specified string can be matched against provided pattern string, where
  6. ''' the pattern string may contain wildcards as follows: ? to replace any single character, and *
  7. ''' to replace any string.</summary>
  8. ''' <param name="input">String which is matched against the pattern.</param>
  9. ''' <param name="pattern">Pattern against which string is matched.</param>
  10. ''' <returns>true if <paramref name="pattern"/> matches the string <paramref name="input"/>; otherwise false.</returns>
  11. Public Function IsMatch(input As String, pattern As String) As Boolean
  12. Return IsMatch(input, pattern, "?"c, "*"c)
  13. End Function
  14.  
  15. ''' <summary>Tests whether specified string can be matched against provided pattern string.
  16. ''' Pattern may contain single- and multiple-replacing wildcard characters.</summary>
  17. ''' <param name="input">String which is matched against the pattern.</param>
  18. ''' <param name="pattern">Pattern against which string is matched.</param>
  19. ''' <param name="singleWildcard">Character which can be used to replace any single character in input string.</param>
  20. ''' <param name="multipleWildcard">Character which can be used to replace zero or more characters in input string.</param>
  21. ''' <returns>true if <paramref name="pattern"/> matches the string <paramref name="input"/>; otherwise false.</returns>
  22. Public Function IsMatch(input As String, pattern As String, singleWildcard As Char, multipleWildcard As Char) As Boolean
  23. Dim inputPosStack(((input.Length + 1) * (pattern.Length + 1)) - 1) As Integer ' Stack containing input positions that should be tested for further matching
  24. Dim patternPosStack(inputPosStack.Length - 1) As Integer ' Stack containing pattern positions that should be tested for further matching
  25. Dim stackPos As Integer = -1 ' Points to last occupied entry in stack; -1 indicates that stack is empty
  26. Dim pointTested()() As Boolean = {
  27. New Boolean(input.Length) {},
  28. New Boolean(pattern.Length) {}
  29. }
  30.  
  31. Dim inputPos As Integer = 0 ' Position in input matched up to the first multiple wildcard in pattern
  32. Dim patternPos As Integer = 0 ' Position in pattern matched up to the first multiple wildcard in pattern
  33.  
  34. ' Match beginning of the string until first multiple wildcard in pattern
  35. Do While inputPos < input.Length AndAlso patternPos < pattern.Length AndAlso pattern.Chars(patternPos) <> multipleWildcard AndAlso (input.Chars(inputPos) = pattern.Chars(patternPos) OrElse pattern.Chars(patternPos) = singleWildcard)
  36. inputPos += 1
  37. patternPos += 1
  38. Loop
  39.  
  40. ' Push this position to stack if it points to end of pattern or to a general wildcard
  41. If patternPos = pattern.Length OrElse pattern.Chars(patternPos) = multipleWildcard Then
  42. pointTested(0)(inputPos) = True
  43. pointTested(1)(patternPos) = True
  44.  
  45. stackPos += 1
  46. inputPosStack(stackPos) = inputPos
  47. patternPosStack(stackPos) = patternPos
  48. End If
  49. Dim matched As Boolean = False
  50.  
  51. ' Repeat matching until either string is matched against the pattern or no more parts remain on stack to test
  52. Do While stackPos >= 0 AndAlso Not matched
  53. inputPos = inputPosStack(stackPos) ' Pop input and pattern positions from stack
  54. patternPos = patternPosStack(stackPos) ' Matching will succeed if rest of the input string matches rest of the pattern
  55. stackPos -= 1
  56.  
  57. If inputPos = input.Length AndAlso patternPos = pattern.Length Then
  58. matched = True ' Reached end of both pattern and input string, hence matching is successful
  59. Else
  60. ' First character in next pattern block is guaranteed to be multiple wildcard
  61. ' So skip it and search for all matches in value string until next multiple wildcard character is reached in pattern
  62.  
  63. For curInputStart As Integer = inputPos To input.Length - 1
  64. Dim curInputPos As Integer = curInputStart
  65. Dim curPatternPos As Integer = patternPos + 1
  66.  
  67. If curPatternPos = pattern.Length Then ' Pattern ends with multiple wildcard, hence rest of the input string is matched with that character
  68. curInputPos = input.Length
  69. Else
  70. Do While curInputPos < input.Length AndAlso curPatternPos < pattern.Length AndAlso pattern.Chars(curPatternPos) <> multipleWildcard AndAlso (input.Chars(curInputPos) = pattern.Chars(curPatternPos) OrElse pattern.Chars(curPatternPos) = singleWildcard)
  71. curInputPos += 1
  72. curPatternPos += 1
  73. Loop
  74. End If
  75.  
  76. ' If we have reached next multiple wildcard character in pattern without breaking the matching sequence, then we have another candidate for full match
  77. ' This candidate should be pushed to stack for further processing
  78. ' At the same time, pair (input position, pattern position) will be marked as tested, so that it will not be pushed to stack later again
  79. If ((curPatternPos = pattern.Length AndAlso curInputPos = input.Length) OrElse (curPatternPos < pattern.Length AndAlso pattern.Chars(curPatternPos) = multipleWildcard)) AndAlso Not pointTested(0)(curInputPos) AndAlso Not pointTested(1)(curPatternPos) Then
  80. pointTested(0)(curInputPos) = True
  81. pointTested(1)(curPatternPos) = True
  82.  
  83. stackPos += 1
  84. inputPosStack(stackPos) = curInputPos
  85. patternPosStack(stackPos) = curPatternPos
  86. End If
  87. Next curInputStart
  88. End If
  89. Loop
  90.  
  91. Return matched
  92. End Function
  93. End Module
7  Programación / .NET (C#, VB.NET, ASP) / Re: Librería de Snippets para VB.NET !! (Compartan aquí sus snippets) en: 19 Abril 2024, 18:37 pm
El siguiente código es un ejemplo oficial de Microsoft que sirve para modificar el fondo de pantalla (wallpaper) del escritorio.

El código está escrito originalmente en C#, lo he convertido a VB.NET, pero no lo he refactorizado, lo comparto tal cual.

Modo de empleo:
Código
  1. Dim supportJpgAsWallpaper As Boolean = Wallpaper.SupportJpgAsWallpaper
  2. Dim supportFitFillWallpaperStyles As Boolean = Wallpaper.SupportFitFillWallpaperStyles
  3.  
  4. Debug.WriteLine($"{NameOf(supportJpgAsWallpaper)}: {supportJpgAsWallpaper}")
  5. Debug.WriteLine($"{NameOf(supportFitFillWallpaperStyles)}: {supportFitFillWallpaperStyles}")
  6.  
  7. ' If supportJpgAsWallpaper AndAlso supportFitFillWallpaperStyles Then
  8.    Wallpaper.SetDesktopWallpaper("C:\wallpaper.jpg", WallpaperStyle.Fill)
  9. ' Else
  10. '   ...
  11. ' End If

Wallpaper.vb
Código
  1. Imports Microsoft.Win32
  2.  
  3. Imports System.ComponentModel
  4. Imports System.Drawing
  5. Imports System.Drawing.Imaging
  6. Imports System.IO
  7. Imports System.Runtime.InteropServices
  8.  
  9. '''********************************* Module Header ***********************************\
  10. '''Module Name:  Wallpaper.cs
  11. '''Project:      CSSetDesktopWallpaper
  12. '''Copyright (c) Microsoft Corporation.
  13. '''
  14. '''The file defines a wallpaper helper class.
  15. '''
  16. '''    Wallpaper.SetDesktopWallpaper(string fileName, WallpaperStyle style)
  17. '''
  18. '''This is the key method that sets the desktop wallpaper. The method body is composed of
  19. '''configuring the wallpaper style in the registry and setting the wallpaper with
  20. '''SystemParametersInfo.
  21. '''
  22. '''This source is subject to the Microsoft Public License.
  23. '''See http://www.microsoft.com/opensource/licenses.mspx#Ms-PL.
  24. '''All other rights reserved.
  25. '''
  26. '''THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER
  27. '''EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF
  28. '''MERCHANTABILITY AND/OR FITNESS FOR A PARTICULAR PURPOSE.
  29. '''\************************************************************************************
  30. Public Module Wallpaper
  31. ''' <summary>
  32. ''' Determine if the fit and fill wallpaper styles are supported in
  33. ''' the current operating system. The styles are not supported before
  34. ''' Windows 7.
  35. ''' </summary>
  36. Public ReadOnly Property SupportFitFillWallpaperStyles As Boolean
  37. Get
  38. Return (Environment.OSVersion.Version >= New Version(6, 1))
  39. End Get
  40. End Property
  41.  
  42. ''' <summary>
  43. ''' Determine if .jpg files are supported as wallpaper in the current
  44. ''' operating system. The .jpg wallpapers are not supported before
  45. ''' Windows Vista.
  46. ''' </summary>
  47. Public ReadOnly Property SupportJpgAsWallpaper As Boolean
  48. Get
  49. Return (Environment.OSVersion.Version >= New Version(6, 0))
  50. End Get
  51. End Property
  52.  
  53. ''' <summary>
  54. ''' Set the desktop wallpaper.
  55. ''' </summary>
  56. ''' <param name="fileName">Path of the wallpaper</param>
  57. ''' <param name="style">Wallpaper style</param>
  58. Public Sub SetDesktopWallpaper(path As String, style As WallpaperStyle)
  59. ' Set the wallpaper style and tile.
  60. ' Two registry values are set in the Control Panel\Desktop key.
  61. ' TileWallpaper
  62. '  0: The wallpaper picture should not be tiled
  63. '  1: The wallpaper picture should be tiled
  64. ' WallpaperStyle
  65. '  0:  The image is centered if TileWallpaper=0 or tiled if TileWallpaper=1
  66. '  2:  The image is stretched to fill the screen
  67. '  6:  The image is resized to fit the screen while maintaining the aspect
  68. '      ratio. (Windows 7 and later)
  69. '  10: The image is resized and cropped to fill the screen while
  70. '      maintaining the aspect ratio. (Windows 7 and later)
  71. Dim key As RegistryKey = Registry.CurrentUser.OpenSubKey("Control Panel\Desktop", True)
  72.  
  73. Select Case style
  74. Case WallpaperStyle.Tile
  75. key.SetValue("WallpaperStyle", "0")
  76. key.SetValue("TileWallpaper", "1")
  77. Case WallpaperStyle.Center
  78. key.SetValue("WallpaperStyle", "0")
  79. key.SetValue("TileWallpaper", "0")
  80. Case WallpaperStyle.Stretch
  81. key.SetValue("WallpaperStyle", "2")
  82. key.SetValue("TileWallpaper", "0")
  83. Case WallpaperStyle.Fit ' (Windows 7 and later)
  84. key.SetValue("WallpaperStyle", "6")
  85. key.SetValue("TileWallpaper", "0")
  86. Case WallpaperStyle.Fill ' (Windows 7 and later)
  87. key.SetValue("WallpaperStyle", "10")
  88. key.SetValue("TileWallpaper", "0")
  89. End Select
  90.  
  91. key.Close()
  92.  
  93. ' If the specified image file is neither .bmp nor .jpg, - or -
  94. ' if the image is a .jpg file but the operating system is Windows Server
  95. ' 2003 or Windows XP/2000 that does not support .jpg as the desktop
  96. ' wallpaper, convert the image file to .bmp and save it to the
  97. ' %appdata%\Microsoft\Windows\Themes folder.
  98. Dim ext As String = System.IO.Path.GetExtension(path)
  99. If (Not ext.Equals(".bmp", StringComparison.OrdinalIgnoreCase) AndAlso Not ext.Equals(".jpg", StringComparison.OrdinalIgnoreCase)) OrElse (ext.Equals(".jpg", StringComparison.OrdinalIgnoreCase) AndAlso Not SupportJpgAsWallpaper) Then
  100. Using image As Image = System.Drawing.Image.FromFile(path)
  101. path = String.Format("{0}\Microsoft\Windows\Themes\{1}.bmp", Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), System.IO.Path.GetFileNameWithoutExtension(path))
  102. image.Save(path, ImageFormat.Bmp)
  103. End Using
  104. End If
  105.  
  106. ' Set the desktop wallpapaer by calling the NativeMethods API SystemParametersInfo
  107. ' with the SPI_SETDESKWALLPAPER desktop parameter. The changes should
  108. ' persist, and also be immediately visible.
  109. If Not SafeNativeMethods.SystemParametersInfo(SPI_SETDESKWALLPAPER, 0, path, SPIF_UPDATEINIFILE Or SPIF_SENDWININICHANGE) Then
  110. Throw New Win32Exception()
  111. End If
  112. End Sub
  113.  
  114. Friend NotInheritable Class SafeNativeMethods
  115. <DllImport("user32.dll", CharSet:=CharSet.Unicode, SetLastError:=True)>
  116. Public Shared Function SystemParametersInfo(uiAction As UInteger, uiParam As UInteger, pvParam As String, fWinIni As UInteger) As <MarshalAs(UnmanagedType.Bool)> Boolean
  117. End Function
  118. End Class
  119.  
  120. Private Const SPI_SETDESKWALLPAPER As UInteger = 20
  121.  
  122. Private Const SPIF_UPDATEINIFILE As UInteger = &H1
  123.  
  124. Private Const SPIF_SENDWININICHANGE As UInteger = &H2
  125. End Module
  126.  
  127. Public Enum WallpaperStyle
  128. Tile
  129. Center
  130. Stretch
  131. Fit
  132. Fill
  133. End Enum
  134.  
8  Programación / .NET (C#, VB.NET, ASP) / Re: Librería de Snippets para VB.NET !! (Compartan aquí sus snippets) en: 19 Abril 2024, 18:16 pm
En esta ocasión comparto el código fuente de un control de tipo NumericUpDown para poder usarlo en una barra ToolStrip o StatusStrip, y también un control de tipo TrackBar con la misma finalidad.





ToolStripNumericUpDown.vb
Código
  1. ' ***********************************************************************
  2. ' Author   : ElektroStudios
  3. ' Modified : 19-April-2024
  4. ' ***********************************************************************
  5.  
  6. #Region " Option Statements "
  7.  
  8. Option Strict On
  9. Option Explicit On
  10. Option Infer Off
  11.  
  12. #End Region
  13.  
  14. #Region " Imports "
  15.  
  16. Imports System.ComponentModel
  17. Imports System.Drawing
  18. Imports System.Runtime.InteropServices
  19. Imports System.Windows.Forms
  20. Imports System.Windows.Forms.Design
  21.  
  22. #End Region
  23.  
  24. #Region " ToolStripNumericUpDown "
  25.  
  26. ' ReSharper disable once CheckNamespace
  27.  
  28. Namespace DevCase.UI.Components
  29.  
  30.    ''' <summary>
  31.    ''' Represents a selectable Windows spin box <see cref="ToolStripItem"/> that displays numeric values.
  32.    ''' </summary>
  33.    ''' <seealso cref="ToolStripControlHost"/>
  34.    <
  35.        ComVisible(True),
  36.        DebuggerStepThrough,
  37.        DefaultEvent(NameOf(ToolStripNumericUpDown.ValueChanged)),
  38.        DefaultProperty(NameOf(ToolStripNumericUpDown.Value)),
  39.        DefaultBindingProperty(NameOf(ToolStripNumericUpDown.Value)),
  40.        Description("Represents a selectable Windows spin box ToolStripItem that displays numeric values."),
  41.        Designer("System.Windows.Forms.Design.ToolStripItemDesigner, System.Design, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"),
  42.        DesignerCategory(NameOf(DesignerCategoryAttribute.Generic)),
  43.        DesignTimeVisible(False),
  44.        DisplayName(NameOf(ToolStripNumericUpDown)),
  45.        Localizable(True),
  46.        ToolboxBitmap(GetType(NumericUpDown), "NumericUpDown.bmp"),
  47.        ToolboxItem(False),
  48.        ToolboxItemFilter("System.Windows.Forms", ToolboxItemFilterType.Allow),
  49.        ToolStripItemDesignerAvailability(ToolStripItemDesignerAvailability.ToolStrip Or ToolStripItemDesignerAvailability.StatusStrip)
  50.    >
  51.    Public Class ToolStripNumericUpDown : Inherits ToolStripControlHost
  52.  
  53. #Region " Properties "
  54.  
  55.        ''' <summary>
  56.        ''' Gets the <see cref="NumericUpDown"/> control that is hosted by this <see cref="ToolStripNumericUpDown"/>.
  57.        ''' </summary>
  58.        <
  59.            Browsable(True), EditorBrowsable(EditorBrowsableState.Advanced),
  60.            DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden),
  61.            Category("Components"), Description("The NumericUpDown control that is hosted by this control.")
  62.        >
  63.        Public Shadows ReadOnly Property Control As NumericUpDown
  64.            Get
  65.                Return DirectCast(MyBase.Control, NumericUpDown)
  66.            End Get
  67.        End Property
  68.  
  69.        ''' <summary>
  70.        ''' Gets or sets the numeric value assigned to this <see cref="ToolStripNumericUpDown"/>.
  71.        ''' </summary>
  72.        '''
  73.        ''' <value>
  74.        ''' The numeric value assigned to this <see cref="ToolStripNumericUpDown"/>.
  75.        ''' </value>
  76.        <
  77.            Bindable(True),
  78.            DefaultValue(0D),
  79.            Category("Appearance"), Description("The numeric value assigned to this control.")
  80.        >
  81.        Public Property Value As Decimal
  82.            Get
  83.                Return Me.Control.Value
  84.            End Get
  85.            Set(value As Decimal)
  86.                Me.Control.Value = value
  87.            End Set
  88.        End Property
  89.  
  90.        ''' <summary>
  91.        ''' Gets or sets the text to be displayed in this <see cref="ToolStripNumericUpDown"/>.
  92.        ''' </summary>
  93.        '''
  94.        ''' <value>
  95.        ''' The text to be displayed in this <see cref="ToolStripNumericUpDown"/>.
  96.        ''' </value>
  97.        <
  98.            Browsable(False), EditorBrowsable(EditorBrowsableState.Never),
  99.            Bindable(False),
  100.            DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden),
  101.            Category("Behavior"), Description("The text to be displayed in this control.")
  102.        >
  103.        Public Overrides Property Text As String
  104.            Get
  105.                Return Me.Control.Text
  106.            End Get
  107.            Set(value As String)
  108.                Me.Control.Text = value
  109.            End Set
  110.        End Property
  111.  
  112.        ''' <summary>
  113.        ''' This property is not applicable for this control.
  114.        ''' </summary>
  115.        <
  116.            Browsable(False), EditorBrowsable(EditorBrowsableState.Never),
  117.            Category("Not Applicable"), Description("This property is not applicable for this control.")
  118.        >
  119.        Public Overrides Property BackgroundImage As Image
  120.            Get
  121.                Return Nothing
  122.            End Get
  123.            Set(value As Image)
  124.                MyBase.BackgroundImage = Nothing
  125.            End Set
  126.        End Property
  127.  
  128.        ''' <summary>
  129.        ''' This property is not applicable for this control.
  130.        ''' </summary>
  131.        <
  132.            Browsable(False), EditorBrowsable(EditorBrowsableState.Never),
  133.            Category("Not Applicable"), Description("This property is not applicable for this control.")
  134.        >
  135.        Public Overrides Property BackgroundImageLayout As ImageLayout
  136.            Get
  137.                Return MyBase.BackgroundImageLayout
  138.            End Get
  139.            Set(value As ImageLayout)
  140.                MyBase.BackgroundImageLayout = value
  141.            End Set
  142.        End Property
  143.  
  144.        ''' <summary>
  145.        ''' This property is not applicable for this control.
  146.        ''' </summary>
  147.        <
  148.            Browsable(False), EditorBrowsable(EditorBrowsableState.Never),
  149.            Category("Not Applicable"), Description("This property is not applicable for this control.")
  150.        >
  151.        Public Overrides Property Image As Image
  152.            Get
  153.                Return Nothing
  154.            End Get
  155.            Set(value As Image)
  156.                MyBase.Image = Nothing
  157.            End Set
  158.        End Property
  159.  
  160. #End Region
  161.  
  162. #Region " Events "
  163.  
  164.        ''' <summary>
  165.        ''' Occurs whenever the <see cref="ToolStripNumericUpDown.Value"/> property is changed.
  166.        ''' </summary>
  167.        <
  168.            Category("Action"), Description("Occurs whenever the Value property is changed.")
  169.        >
  170.        Public Event ValueChanged As EventHandler
  171.  
  172. #End Region
  173.  
  174. #Region " Constructors "
  175.  
  176.        ''' <summary>
  177.        ''' Initializes a new instance of the <see cref="ToolStripNumericUpDown"/> class.
  178.        ''' </summary>
  179.        Public Sub New()
  180.            MyBase.New(ToolStripNumericUpDown.CreateControlInstance())
  181.        End Sub
  182.  
  183. #End Region
  184.  
  185. #Region " Event Invocators "
  186.  
  187.        ''' <summary>
  188.        ''' Raises the <see cref="ToolStripNumericUpDown.ValueChanged"/> event.
  189.        ''' </summary>
  190.        '''
  191.        ''' <param name="sender">
  192.        ''' The source of the event.
  193.        ''' </param>
  194.        '''
  195.        ''' <param name="e">
  196.        ''' The <see cref="EventArgs"/> instance containing the event data.
  197.        ''' </param>
  198.        Private Sub OnValueChanged(sender As Object, e As EventArgs)
  199.            If Me.ValueChangedEvent IsNot Nothing Then
  200.                RaiseEvent ValueChanged(Me, e)
  201.            End If
  202.        End Sub
  203.  
  204. #End Region
  205.  
  206. #Region " Event Invocators (Overriden) "
  207.  
  208.        ''' <summary>
  209.        ''' Subscribes events from the hosted control
  210.        ''' </summary>
  211.        '''
  212.        ''' <param name="control">
  213.        ''' The control from which to subscribe events.
  214.        ''' </param>
  215.        Protected Overrides Sub OnSubscribeControlEvents(control As Control)
  216.            MyBase.OnSubscribeControlEvents(control)
  217.  
  218.            AddHandler DirectCast(control, NumericUpDown).ValueChanged, AddressOf Me.OnValueChanged
  219.        End Sub
  220.  
  221.        ''' <summary>
  222.        ''' Unsubscribes events from the hosted control
  223.        ''' </summary>
  224.        '''
  225.        ''' <param name="control">
  226.        ''' The control from which to unsubscribe events.
  227.        ''' </param>
  228.        Protected Overrides Sub OnUnsubscribeControlEvents(control As Control)
  229.            MyBase.OnUnsubscribeControlEvents(control)
  230.  
  231.            RemoveHandler DirectCast(control, NumericUpDown).ValueChanged, AddressOf Me.OnValueChanged
  232.        End Sub
  233.  
  234. #End Region
  235.  
  236. #Region " Private Methods "
  237.  
  238.        ''' <summary>
  239.        ''' Creates the control instance.
  240.        ''' </summary>
  241.        '''
  242.        ''' <returns>
  243.        ''' The control.
  244.        ''' </returns>
  245.        Private Shared Function CreateControlInstance() As Control
  246.            Return New NumericUpDown() With {.AutoSize = True}
  247.        End Function
  248.  
  249. #End Region
  250.  
  251.    End Class
  252.  
  253. End Namespace
  254.  
  255. #End Region
  256.  




ToolStripTrackBar.vb
Código
  1. ' ***********************************************************************
  2. ' Author   : ElektroStudios
  3. ' Modified : 19-April-2024
  4. ' ***********************************************************************
  5.  
  6. #Region " Option Statements "
  7.  
  8. Option Strict On
  9. Option Explicit On
  10. Option Infer Off
  11.  
  12. #End Region
  13.  
  14. #Region " Imports "
  15.  
  16. Imports System.ComponentModel
  17. Imports System.Drawing
  18. Imports System.Runtime.InteropServices
  19. Imports System.Windows.Forms
  20. Imports System.Windows.Forms.Design
  21.  
  22. #End Region
  23.  
  24. #Region " ToolStripTrackBar "
  25.  
  26. ' ReSharper disable once CheckNamespace
  27.  
  28. Namespace DevCase.UI.Components
  29.  
  30.    ''' <summary>
  31.    ''' Represents a selectable track bar <see cref="ToolStripItem"/>.
  32.    ''' </summary>
  33.    ''' <seealso cref="ToolStripControlHost"/>
  34.    <
  35.        ComVisible(True),
  36.        DebuggerStepThrough,
  37.        DefaultEvent(NameOf(ToolStripTrackBar.Scroll)),
  38.        DefaultProperty(NameOf(ToolStripTrackBar.Value)),
  39.        DefaultBindingProperty(NameOf(ToolStripTrackBar.Value)),
  40.        Description("Represents a selectable track bar ToolStripItem."),
  41.        Designer("System.Windows.Forms.Design.ToolStripItemDesigner, System.Design, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"),
  42.        DesignerCategory(NameOf(DesignerCategoryAttribute.Generic)),
  43.        DesignTimeVisible(False),
  44.        DisplayName(NameOf(ToolStripTrackBar)),
  45.        Localizable(True),
  46.        ToolboxBitmap(GetType(TrackBar), "TrackBar.bmp"),
  47.        ToolboxItem(False),
  48.        ToolboxItemFilter("System.Windows.Forms", ToolboxItemFilterType.Allow),
  49.        ToolStripItemDesignerAvailability(ToolStripItemDesignerAvailability.ToolStrip Or ToolStripItemDesignerAvailability.StatusStrip)
  50.    >
  51.    Public Class ToolStripTrackBar : Inherits ToolStripControlHost
  52.  
  53. #Region " Properties "
  54.  
  55.        ''' <summary>
  56.        ''' Gets the <see cref="TrackBar"/> control that is hosted by this <see cref="ToolStripTrackBar"/>.
  57.        ''' </summary>
  58.        <
  59.            Browsable(True), EditorBrowsable(EditorBrowsableState.Advanced),
  60.            DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden),
  61.            Category("Components"), Description("The TrackBar control that is hosted by this control.")
  62.        >
  63.        Public Shadows ReadOnly Property Control As TrackBar
  64.            Get
  65.                Return DirectCast(MyBase.Control, TrackBar)
  66.            End Get
  67.        End Property
  68.  
  69.        ''' <summary>
  70.        ''' Gets or sets a numeric value that represents the current position of the scroll box on this <see cref="ToolStripTrackBar"/>.
  71.        ''' </summary>
  72.        '''
  73.        ''' <value>
  74.        ''' The numeric value that represents the current position of the scroll box on this <see cref="ToolStripTrackBar"/>.
  75.        ''' </value>
  76.        <
  77.            Bindable(True),
  78.            DefaultValue(0I),
  79.            Category("Behavior"), Description("The numeric value that represents the current position of the scroll box on this control.")
  80.        >
  81.        Public Property Value As Integer
  82.            Get
  83.                Return Me.Control.Value
  84.            End Get
  85.            Set(value As Integer)
  86.                Me.Control.Value = value
  87.            End Set
  88.        End Property
  89.  
  90.        ''' <summary>
  91.        ''' Gets or sets the lower limit of the range this <see cref="ToolStripTrackBar"/> is working with.
  92.        ''' </summary>
  93.        '''
  94.        ''' <value>
  95.        ''' The minimum value for this <see cref="ToolStripTrackBar"/>. The default is 0.
  96.        ''' </value>
  97.        <
  98.            Bindable(True),
  99.            DefaultValue(0I),
  100.            RefreshProperties(RefreshProperties.All),
  101.            Category("Behavior"), Description("The minimum value for this control.")
  102.        >
  103.        Public Property Minimum As Integer
  104.            Get
  105.                Return Me.Control.Minimum
  106.            End Get
  107.            Set(value As Integer)
  108.                Me.Control.Minimum = value
  109.            End Set
  110.        End Property
  111.  
  112.        ''' <summary>
  113.        ''' Gets or sets the upper limit of the range this <see cref="ToolStripTrackBar"/> is working with.
  114.        ''' </summary>
  115.        '''
  116.        ''' <value>
  117.        ''' The maximum value for this <see cref="ToolStripTrackBar"/>. The default is 10.
  118.        ''' </value>
  119.        <
  120.            Bindable(True),
  121.            DefaultValue(10I),
  122.            RefreshProperties(RefreshProperties.All),
  123.            Category("Behavior"), Description("The maximum value for this control.")
  124.        >
  125.        Public Property Maximum As Integer
  126.            Get
  127.                Return Me.Control.Maximum
  128.            End Get
  129.            Set(value As Integer)
  130.                Me.Control.Maximum = value
  131.            End Set
  132.        End Property
  133.  
  134.        ''' <summary>
  135.        ''' This property is not applicable for this control.
  136.        ''' </summary>
  137.        <
  138.            Browsable(False), EditorBrowsable(EditorBrowsableState.Never),
  139.            Category("Not Applicable"), Description("This property is not applicable for this control.")
  140.        >
  141.        Public Overrides Property BackgroundImage As Image
  142.            Get
  143.                Return Nothing
  144.            End Get
  145.            Set(value As Image)
  146.                MyBase.BackgroundImage = Nothing
  147.            End Set
  148.        End Property
  149.  
  150.        ''' <summary>
  151.        ''' This property is not applicable for this control.
  152.        ''' </summary>
  153.        <
  154.            Browsable(False), EditorBrowsable(EditorBrowsableState.Never),
  155.            Category("Not Applicable"), Description("This property is not applicable for this control.")
  156.        >
  157.        Public Overrides Property BackgroundImageLayout As ImageLayout
  158.            Get
  159.                Return MyBase.BackgroundImageLayout
  160.            End Get
  161.            Set(value As ImageLayout)
  162.                MyBase.BackgroundImageLayout = value
  163.            End Set
  164.        End Property
  165.  
  166.        ''' <summary>
  167.        ''' This property is not applicable for this control.
  168.        ''' </summary>
  169.        <
  170.            Browsable(False), EditorBrowsable(EditorBrowsableState.Never),
  171.            Category("Not Applicable"), Description("This property is not applicable for this control.")
  172.        >
  173.        Public Overrides Property Image As Image
  174.            Get
  175.                Return Nothing
  176.            End Get
  177.            Set(value As Image)
  178.                MyBase.Image = Nothing
  179.            End Set
  180.        End Property
  181.  
  182. #End Region
  183.  
  184. #Region " Events "
  185.  
  186.        ''' <summary>
  187.        ''' Occurs when either a mouse or keyboard action moves the scroll box.
  188.        ''' </summary>
  189.        <
  190.            Category("Behavior"), Description("Occurs when either a mouse or keyboard action moves the scroll box.")
  191.        >
  192.        Public Event Scroll As EventHandler
  193.  
  194.        ''' <summary>
  195.        ''' Occurs when the <see cref="ToolStripTrackBar.Value"/> property changes,
  196.        ''' either by movement of the scroll box or by manipulation in code.
  197.        ''' </summary>
  198.        <
  199.            Category("Action"), Description("Occurs when the Value property changes, either by movement of the scroll box or by manipulation in code.")
  200.        >
  201.        Public Event ValueChanged As EventHandler
  202.  
  203. #End Region
  204.  
  205. #Region " Constructors "
  206.  
  207.        ''' <summary>
  208.        ''' Initializes a new instance of the <see cref="ToolStripTrackBar"/> class.
  209.        ''' </summary>
  210.        Public Sub New()
  211.            MyBase.New(ToolStripTrackBar.CreateControlInstance())
  212.        End Sub
  213.  
  214. #End Region
  215.  
  216. #Region " Event Invocators "
  217.  
  218.        ''' <summary>
  219.        ''' Raises the <see cref="ToolStripTrackBar.Scroll"/> event.
  220.        ''' </summary>
  221.        '''
  222.        ''' <param name="sender">
  223.        ''' The source of the event.
  224.        ''' </param>
  225.        '''
  226.        ''' <param name="e">
  227.        ''' The <see cref="EventArgs"/> instance containing the event data.
  228.        ''' </param>
  229.        Private Sub OnScroll(sender As Object, e As EventArgs)
  230.            If Me.ScrollEvent IsNot Nothing Then
  231.                RaiseEvent Scroll(Me, e)
  232.            End If
  233.        End Sub
  234.  
  235.        ''' <summary>
  236.        ''' Raises the <see cref="ToolStripTrackBar.Scroll"/> event.
  237.        ''' </summary>
  238.        '''
  239.        ''' <param name="sender">
  240.        ''' The source of the event.
  241.        ''' </param>
  242.        '''
  243.        ''' <param name="e">
  244.        ''' The <see cref="EventArgs"/> instance containing the event data.
  245.        ''' </param>
  246.        Private Sub OnValueChanged(sender As Object, e As EventArgs)
  247.            If Me.ValueChangedEvent IsNot Nothing Then
  248.                RaiseEvent ValueChanged(Me, e)
  249.            End If
  250.        End Sub
  251.  
  252. #End Region
  253.  
  254. #Region " Event Invocators (Overriden) "
  255.  
  256.        ''' <summary>
  257.        ''' Subscribes events from the hosted control
  258.        ''' </summary>
  259.        '''
  260.        ''' <param name="control">
  261.        ''' The control from which to subscribe events.
  262.        ''' </param>
  263.        Protected Overrides Sub OnSubscribeControlEvents(control As Control)
  264.            MyBase.OnSubscribeControlEvents(control)
  265.  
  266.            AddHandler DirectCast(control, TrackBar).Scroll, AddressOf Me.OnScroll
  267.            AddHandler DirectCast(control, TrackBar).ValueChanged, AddressOf Me.OnValueChanged
  268.        End Sub
  269.  
  270.        ''' <summary>
  271.        ''' Unsubscribes events from the hosted control
  272.        ''' </summary>
  273.        '''
  274.        ''' <param name="control">
  275.        ''' The control from which to unsubscribe events.
  276.        ''' </param>
  277.        Protected Overrides Sub OnUnsubscribeControlEvents(control As Control)
  278.            MyBase.OnUnsubscribeControlEvents(control)
  279.  
  280.            RemoveHandler DirectCast(control, TrackBar).Scroll, AddressOf Me.OnScroll
  281.            RemoveHandler DirectCast(control, TrackBar).ValueChanged, AddressOf Me.Onvaluechanged
  282.        End Sub
  283.  
  284. #End Region
  285.  
  286. #Region " Private Methods "
  287.  
  288.        ''' <summary>
  289.        ''' Creates the control instance.
  290.        ''' </summary>
  291.        '''
  292.        ''' <returns>
  293.        ''' The control.
  294.        ''' </returns>
  295.        Private Shared Function CreateControlInstance() As Control
  296.            Using ts As New ToolStrip()
  297.                Return New TrackBar() With {
  298.                    .AutoSize = False,
  299.                    .Size = New Size(80, ts.Height)
  300.                }
  301.            End Using
  302.        End Function
  303.  
  304. #End Region
  305.  
  306.    End Class
  307.  
  308. End Namespace
  309.  
  310. #End Region
  311.  
  312.  
9  Media / Multimedia / Re: Descargar video curso online alojado Vimeo en: 16 Abril 2024, 13:11 pm
Bueno, pues ya que el tema ha quedado resuelto (por cierto, me alegro de que lo hayas podido solucionar), aprovecho para decir lo siguiente:

@EdePC
Si estoy entendiendo que esta metodología realmente sirve para descargar videos de Vimeo protegidos con contraseña, es para besarte el... (_*_)

Me parecen bastantes meritorias todas las explicaciones expuestas en este hilo. Tengo que ponerlo en práctica más tarde.

Lástima que no haya una funcionalidad para dar en el foro, je!.

Un saludo.

10  Programación / .NET (C#, VB.NET, ASP) / Re: Librería de Snippets para VB.NET !! (Compartan aquí sus snippets) en: 16 Abril 2024, 12:24 pm
Un método de extensión para impedir que un ToolStripMenuItem se cierre al hacer click en uno de sus items hijos.

Ejemplo de uso:

Código
  1. Dim menuItem As ToolStripMenuItem = Me.ToolStripMenuItem1
  2. Dim preventClosure As Boolean = True
  3. Dim recursive As Boolean = False
  4. menuItem.SetClosureBehaviorOnClick(preventClosure, recursive)



El código:

Código
  1. ' ***********************************************************************
  2. ' Author   : ElektroStudios
  3. ' Modified : 12-April-2024
  4. ' ***********************************************************************
  5.  
  6. #Region " Public Members Summary "
  7.  
  8. ' ToolStripMenuItem.SetClosureBehaviorOnClick(Boolean, Boolean)
  9.  
  10. #End Region
  11.  
  12. #Region " Option Statements "
  13.  
  14. Option Strict On
  15. Option Explicit On
  16. Option Infer Off
  17.  
  18. #End Region
  19.  
  20. #Region " Imports "
  21.  
  22. Imports System.Collections.Generic
  23. Imports System.ComponentModel
  24. Imports System.Linq
  25. Imports System.Runtime.CompilerServices
  26. Imports System.Windows.Forms
  27.  
  28. #End Region
  29.  
  30. #Region " ToolStripMenuItem Extensions "
  31.  
  32. Namespace DevCase.Core.Extensions
  33.  
  34.    ''' ----------------------------------------------------------------------------------------------------
  35.    ''' <summary>
  36.    ''' Provides extension methods to use with the <see cref="ToolStripMenuItem"/> class.
  37.    ''' </summary>
  38.    ''' ----------------------------------------------------------------------------------------------------
  39.    <HideModuleName>
  40.    Public Module ToolStripMenuItemExtensions
  41.  
  42. #Region " Public Extension Methods "
  43.  
  44.        ''' <summary>
  45.        ''' A <see cref="ToolStripDropDownClosingEventHandler"/> delegate used to control
  46.        ''' the <see cref="ToolStripDropDown.Closing"/> event of a <see cref="ToolStripDropDown"/>.
  47.        ''' <para></para>
  48.        ''' This handler depends on <see cref="ToolStripMenuItemExtensions.SetClosureBehaviorOnClick"/> method.
  49.        ''' </summary>
  50.        Private closingHandler As ToolStripDropDownClosingEventHandler
  51.  
  52.        ''' <summary>
  53.        ''' A collection of <see cref="ToolStripDropDown"/> items
  54.        ''' whose <see cref="ToolStripDropDown.Closing"/> event
  55.        ''' has been associated to <see cref="ToolStripMenuItemExtensions.closingHandler"/>.
  56.        ''' <para></para>
  57.        ''' This collection depends on <see cref="ToolStripMenuItemExtensions.SetClosureBehaviorOnClick"/> method.
  58.        ''' </summary>
  59.        Private closingHandlerAssociatedItems As HashSet(Of ToolStripDropDown)
  60.  
  61.        ''' <summary>
  62.        ''' Sets the closure behavior for the source <see cref="ToolStripMenuItem"/> when its drop-down items are clicked.
  63.        ''' </summary>
  64.        '''
  65.        ''' <remarks>
  66.        ''' This method associates the underlying
  67.        ''' <see cref="ToolStripMenuItem.DropDown"/>'s <see cref="ToolStripDropDown.Closing"/> event
  68.        ''' with a handler to control the closure behavior.
  69.        ''' </remarks>
  70.        '''
  71.        ''' <example> This is a code example.
  72.        ''' <code language="VB">
  73.        ''' Dim menuItem As ToolStripMenuItem = Me.ToolStripMenuItem1
  74.        ''' Dim preventClosure As Boolean = True
  75.        ''' Dim recursive As Boolean = True
  76.        '''
  77.        ''' menuItem.SetClosureBehaviorOnClick(preventClosure, recursive)
  78.        ''' </code>
  79.        ''' </example>
  80.        '''
  81.        ''' <param name="menuItem">
  82.        ''' The <see cref="ToolStripMenuItem"/> to set the closure behavior for.
  83.        ''' </param>
  84.        '''
  85.        ''' <param name="preventClosure">
  86.        ''' <see langword="True"/> to prevent closure of the source <see cref="ToolStripMenuItem"/>
  87.        ''' when its drop-down items are clicked; otherwise, <see langword="False"/>.
  88.        ''' </param>
  89.        <DebuggerStepThrough>
  90.        <Extension>
  91.        <EditorBrowsable(EditorBrowsableState.Always)>
  92.        Public Sub SetClosureBehaviorOnClick(menuItem As ToolStripMenuItem, preventClosure As Boolean, recursive As Boolean)
  93.            If menuItem Is Nothing Then
  94.                Throw New ArgumentNullException(paramName:=NameOf(menuItem))
  95.            End If
  96.  
  97.            If Not menuItem.HasDropDown Then
  98.                Throw New InvalidOperationException(
  99.                "The ToolStripDropDownItem.DropDown for the ToolStripDropDownItem has not been created.")
  100.            End If
  101.  
  102.            If ToolStripMenuItemExtensions.closingHandler Is Nothing Then
  103.                ToolStripMenuItemExtensions.closingHandler =
  104.                    Sub(sender As Object, e As ToolStripDropDownClosingEventArgs)
  105.                        e.Cancel = (e.CloseReason = ToolStripDropDownCloseReason.ItemClicked)
  106.                    End Sub
  107.            End If
  108.  
  109.            If ToolStripMenuItemExtensions.closingHandlerAssociatedItems Is Nothing Then
  110.                ToolStripMenuItemExtensions.closingHandlerAssociatedItems = New HashSet(Of ToolStripDropDown)
  111.            End If
  112.  
  113.            Dim dropdownAction As Action(Of ToolStripDropDown) =
  114.                Sub(dropdown As ToolStripDropDown)
  115.                    If preventClosure Then
  116.                        If Not ToolStripMenuItemExtensions.closingHandlerAssociatedItems.Contains(dropdown) Then
  117.                            AddHandler dropdown.Closing, ToolStripMenuItemExtensions.closingHandler
  118.                            ToolStripMenuItemExtensions.closingHandlerAssociatedItems.Add(dropdown)
  119.                        End If
  120.                    Else
  121.                        If ToolStripMenuItemExtensions.closingHandlerAssociatedItems.Contains(dropdown) Then
  122.                            RemoveHandler dropdown.Closing, ToolStripMenuItemExtensions.closingHandler
  123.                            ToolStripMenuItemExtensions.closingHandlerAssociatedItems.Remove(dropdown)
  124.                        End If
  125.                    End If
  126.                End Sub
  127.  
  128.            Dim queue As New Queue(Of ToolStripDropDown)
  129.  
  130.            ' Root level items iteration.
  131.            If recursive Then
  132.                queue.Enqueue(menuItem.DropDown)
  133.            Else
  134.                If TypeOf menuItem Is ToolStripMenuItem Then
  135.                    dropdownAction(menuItem.DropDown)
  136.                End If
  137.            End If
  138.  
  139.            ' Recursive items iteration.
  140.            While queue.Any()
  141.                Dim currentItem As ToolStripDropDown = queue.Dequeue()
  142.                dropdownAction(currentItem)
  143.  
  144.                If currentItem.HasChildren Then
  145.                    For Each subMenuItem As ToolStripMenuItem In currentItem.Items.OfType(Of ToolStripMenuItem)
  146.                        If subMenuItem.HasDropDown Then
  147.                            queue.Enqueue(subMenuItem.DropDown)
  148.                        End If
  149.                    Next
  150.                End If
  151.            End While
  152.        End Sub
  153.  
  154. #End Region
  155.  
  156.    End Module
  157.  
  158. End Namespace
  159.  
  160. #End Region
  161.  
Páginas: [1] 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 ... 1236
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines