Accueil > > > [.NET3.5] EXTENSION METHODS: PROGRESSBAR ET VISTA
[.NET3.5] EXTENSION METHODS: PROGRESSBAR ET VISTA
Information sur la source
Description
Je rappel pour ceux qui ne connaissent pas les "extensions methods" qu'il s'agit d'une nouveauté de c#3. Elles permettent d'étendre les méthodes sur des classes existantes. Ceci peut s'avérer pratique dans le cas ou l'on souhaite ajouter des méthodes sur une classe dont on a pas les sources et/ou on ne peut pas en hériter. J'ai mis en application cette nouveauté sur le contrôle ProgressBar en y ajoutant des méthodes propres à des fonctionnalités de Vista. (voir la capture) Le code est commenté bien que la source soit simple.
Source
- using System;
- using System.Runtime.InteropServices;
-
- namespace ExtensionMethods
- {
- public static class Progressbar
- {
- #region "Native methods"
-
- [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = false)]
- private static extern IntPtr SendMessage(IntPtr hWnd, uint Msg, IntPtr wParam, IntPtr lParam);
-
- [DllImport("user32.dll", EntryPoint = "GetWindowLong", SetLastError = true)]
- private static extern IntPtr GetWindowLong32(IntPtr hWnd, int nIndex);
-
- [DllImport("user32.dll", SetLastError = true)]
- private static extern IntPtr GetWindowLongPtr(IntPtr hWnd, int nIndex);
-
- [DllImport("user32.dll", EntryPoint = "SetWindowLong", SetLastError = true)]
- private static extern int SetWindowLong32(IntPtr hWnd, int nIndex, int dwNewLong);
-
- [DllImport("user32.dll", SetLastError = true)]
- private static extern IntPtr SetWindowLongPtr(IntPtr hWnd, int nIndex, IntPtr dwNewLong);
-
- const int WM_USER = 0x400;
- const int GWL_STYLE = (-16);
- const int PBM_SETPOS = (WM_USER + 2);
- const int PBM_SETSTATE = (WM_USER + 16);
- const int PBM_GETSTATE = (WM_USER + 17);
- const int PBS_SMOOTH = 0x01;
- const int PBS_SMOOTHREVERSE = 0x10;
-
- #endregion
-
- /// <summary>
- /// Etat de la barre de progression.
- /// </summary>
- public enum PBM_STATE : int
- {
- NORMAL = 0x1,
- ERROR,
- PAUSE
- }
-
- /// <summary>
- /// Obtient l'état de la barre de progression.
- /// </summary>
- /// <param name="pb"><see cref="System.Windows.Forms.ProgressBar"/></param>
- /// <returns>L'état <see cref="PBM_STATE"/>.</returns>
- public static PBM_STATE GetState(this System.Windows.Forms.ProgressBar pb)
- {
- if (Environment.OSVersion.Version.Major >= 6)
- {
- IntPtr pValue = SendMessage(pb.Handle, PBM_GETSTATE, IntPtr.Zero, IntPtr.Zero);
-
- int iVal = pValue.ToInt32();
- return (PBM_STATE)iVal;
- }
- else
- throw new Exception("Supported on Vista or later only !.");
- }
-
- /// <summary>
- /// Définit l'état de la barre de progression.
- /// </summary>
- /// <param name="pb"><see cref="System.Windows.Forms.ProgressBar"/></param>
- /// <param name="state">Nouvel état <see cref="PBM_STATE"/>.</param>
- public static void SetState(this System.Windows.Forms.ProgressBar pb, PBM_STATE state)
- {
- if (Environment.OSVersion.Version.Major >= 6)
- {
- SendMessage(pb.Handle, PBM_SETSTATE, new IntPtr((int)state), IntPtr.Zero);
- }
- else
- throw new Exception("Supported on Vista or later only !.");
- }
-
- /// <summary>
- /// Change la manière dont la décrémentation de la valeur de la progress bar se fait.
- /// </summary>
- /// <param name="pb"><see cref="System.Windows.Forms.ProgressBar"/></param>
- /// <param name="turnOn"><b>True</b> pour décrémentation fluide; <b>False</b> pour décrémentation direct.</param>
- public static void SmoothReverse(this System.Windows.Forms.ProgressBar pb, bool turnOn)
- {
- if (Environment.OSVersion.Version.Major >= 6)
- {
- //Récupère le style.
- IntPtr pStyle = GetWindowLong(pb.Handle, GWL_STYLE);
-
- //Garde la valeur actuelle pour redéfinir celle de la progress bar une fois la modification de style effectué.
- int iOldVal = pb.Value;
-
- if (turnOn)
- {
- //Si pas activé?
- //On active.
- if ((pStyle.ToInt32() & PBS_SMOOTHREVERSE) != PBS_SMOOTHREVERSE)
- {
- SetWindowLong(pb.Handle, GWL_STYLE, new IntPtr((pStyle.ToInt32() | PBS_SMOOTHREVERSE)));
- SendMessage(pb.Handle, PBM_SETPOS, new IntPtr(iOldVal), IntPtr.Zero);
- }
- }
- else
- {
- //Si activé?
- //On désactive.
- if ((pStyle.ToInt32() & PBS_SMOOTHREVERSE) == PBS_SMOOTHREVERSE)
- {
- SetWindowLong(pb.Handle, GWL_STYLE, new IntPtr((pStyle.ToInt32() - PBS_SMOOTHREVERSE)));
- SendMessage(pb.Handle, PBM_SETPOS, new IntPtr(iOldVal), IntPtr.Zero);
- }
- }
- }
- else
- throw new Exception("Supported on Vista or later only !.");
- }
-
- /// <summary>
- /// GetWindowLong avec support 32 et 64 bits.
- /// </summary>
- private static IntPtr GetWindowLong(IntPtr hWnd, int nIndex)
- {
- if (IntPtr.Size == 8)
- return GetWindowLongPtr(hWnd, nIndex);
- else
- return GetWindowLong32(hWnd, nIndex);
- }
-
- /// <summary>
- /// SetWindowLong avec support 32 et 64 bits.
- /// </summary>
- private static IntPtr SetWindowLong(IntPtr hWnd, int nIndex, IntPtr dwNewLong)
- {
- if (IntPtr.Size == 8)
- return SetWindowLongPtr(hWnd, nIndex, dwNewLong);
- else
- return new IntPtr(SetWindowLong32(hWnd, nIndex, dwNewLong.ToInt32()));
- }
- }
- }
using System;
using System.Runtime.InteropServices;
namespace ExtensionMethods
{
public static class Progressbar
{
#region "Native methods"
[DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = false)]
private static extern IntPtr SendMessage(IntPtr hWnd, uint Msg, IntPtr wParam, IntPtr lParam);
[DllImport("user32.dll", EntryPoint = "GetWindowLong", SetLastError = true)]
private static extern IntPtr GetWindowLong32(IntPtr hWnd, int nIndex);
[DllImport("user32.dll", SetLastError = true)]
private static extern IntPtr GetWindowLongPtr(IntPtr hWnd, int nIndex);
[DllImport("user32.dll", EntryPoint = "SetWindowLong", SetLastError = true)]
private static extern int SetWindowLong32(IntPtr hWnd, int nIndex, int dwNewLong);
[DllImport("user32.dll", SetLastError = true)]
private static extern IntPtr SetWindowLongPtr(IntPtr hWnd, int nIndex, IntPtr dwNewLong);
const int WM_USER = 0x400;
const int GWL_STYLE = (-16);
const int PBM_SETPOS = (WM_USER + 2);
const int PBM_SETSTATE = (WM_USER + 16);
const int PBM_GETSTATE = (WM_USER + 17);
const int PBS_SMOOTH = 0x01;
const int PBS_SMOOTHREVERSE = 0x10;
#endregion
/// <summary>
/// Etat de la barre de progression.
/// </summary>
public enum PBM_STATE : int
{
NORMAL = 0x1,
ERROR,
PAUSE
}
/// <summary>
/// Obtient l'état de la barre de progression.
/// </summary>
/// <param name="pb"><see cref="System.Windows.Forms.ProgressBar"/></param>
/// <returns>L'état <see cref="PBM_STATE"/>.</returns>
public static PBM_STATE GetState(this System.Windows.Forms.ProgressBar pb)
{
if (Environment.OSVersion.Version.Major >= 6)
{
IntPtr pValue = SendMessage(pb.Handle, PBM_GETSTATE, IntPtr.Zero, IntPtr.Zero);
int iVal = pValue.ToInt32();
return (PBM_STATE)iVal;
}
else
throw new Exception("Supported on Vista or later only !.");
}
/// <summary>
/// Définit l'état de la barre de progression.
/// </summary>
/// <param name="pb"><see cref="System.Windows.Forms.ProgressBar"/></param>
/// <param name="state">Nouvel état <see cref="PBM_STATE"/>.</param>
public static void SetState(this System.Windows.Forms.ProgressBar pb, PBM_STATE state)
{
if (Environment.OSVersion.Version.Major >= 6)
{
SendMessage(pb.Handle, PBM_SETSTATE, new IntPtr((int)state), IntPtr.Zero);
}
else
throw new Exception("Supported on Vista or later only !.");
}
/// <summary>
/// Change la manière dont la décrémentation de la valeur de la progress bar se fait.
/// </summary>
/// <param name="pb"><see cref="System.Windows.Forms.ProgressBar"/></param>
/// <param name="turnOn"><b>True</b> pour décrémentation fluide; <b>False</b> pour décrémentation direct.</param>
public static void SmoothReverse(this System.Windows.Forms.ProgressBar pb, bool turnOn)
{
if (Environment.OSVersion.Version.Major >= 6)
{
//Récupère le style.
IntPtr pStyle = GetWindowLong(pb.Handle, GWL_STYLE);
//Garde la valeur actuelle pour redéfinir celle de la progress bar une fois la modification de style effectué.
int iOldVal = pb.Value;
if (turnOn)
{
//Si pas activé?
//On active.
if ((pStyle.ToInt32() & PBS_SMOOTHREVERSE) != PBS_SMOOTHREVERSE)
{
SetWindowLong(pb.Handle, GWL_STYLE, new IntPtr((pStyle.ToInt32() | PBS_SMOOTHREVERSE)));
SendMessage(pb.Handle, PBM_SETPOS, new IntPtr(iOldVal), IntPtr.Zero);
}
}
else
{
//Si activé?
//On désactive.
if ((pStyle.ToInt32() & PBS_SMOOTHREVERSE) == PBS_SMOOTHREVERSE)
{
SetWindowLong(pb.Handle, GWL_STYLE, new IntPtr((pStyle.ToInt32() - PBS_SMOOTHREVERSE)));
SendMessage(pb.Handle, PBM_SETPOS, new IntPtr(iOldVal), IntPtr.Zero);
}
}
}
else
throw new Exception("Supported on Vista or later only !.");
}
/// <summary>
/// GetWindowLong avec support 32 et 64 bits.
/// </summary>
private static IntPtr GetWindowLong(IntPtr hWnd, int nIndex)
{
if (IntPtr.Size == 8)
return GetWindowLongPtr(hWnd, nIndex);
else
return GetWindowLong32(hWnd, nIndex);
}
/// <summary>
/// SetWindowLong avec support 32 et 64 bits.
/// </summary>
private static IntPtr SetWindowLong(IntPtr hWnd, int nIndex, IntPtr dwNewLong)
{
if (IntPtr.Size == 8)
return SetWindowLongPtr(hWnd, nIndex, dwNewLong);
else
return new IntPtr(SetWindowLong32(hWnd, nIndex, dwNewLong.ToInt32()));
}
}
}
Conclusion
Bon dév à tous ^^
Sources du même auteur
Sources de la même categorie
Commentaires et avis
Discussions en rapport avec ce code source dans le forum
changer l'extension d'un fichier dans vista [ par volcom20 ]
Bonjour, j'aimerais voir les extension de mais fichiers sous windows vista car je veux renommer un fichier .txt pour un .zif ou .css ou .html merci!
exception non catchée : VS2005 ne break pas [ par leprov ]
Bonjour,Je viens de passer sous vista 64, et depuis, visual studio 2005 ne break plus automatiquement sur les exceptions non catchées. Une simple entr
Fichier, changement du nom du fichier [ par vagg ]
Bonjour,Dans mon programme, l'utilisateur peut aller chercher un fichier texte grâce à un OpenFileDialog qui ensuite se charge en objet.J'aimerais que
Zone rétractable façon Vista [ par Dodo299 ]
Bonjour, Je développe une petite application en C# et cela fait maintenant un petit moment que je cherche, en vain, un moyen d'ajouter à mon applicati
Vista x64 & AudioVideoPlayback = BadImageFormatException [ par fifrelin70 ]
Bonjour à tous,je suis sous windows vista ultimate 64 bits et je souhaite réaliser un petit contrôle.net réveil avec lecture de fichiers mp3.J'ai donc
Synthèse/Reconnaissance Vocale sous XP/Vista [ par chiqitoss ]
Voila mon problème: Je dois faire une appli qui permet de translater le code en morse en français écrit, et translater le français en morse.Premièreme
Probleme de navigateur avec asp.net [ par ddove53 ]
Bonjour,j'ai fait des pages web avec asp.net et quand je lance une page avec le navigateur sur xp pro, ca marche bien. Mais avec vista, j'ai le messag
Installation VS2008 sur windows Vista [ par YbenAli ]
bonjour Est ce visual studio tourne correctement sur Windows Vista. merci...
détecter click "long" bouton [ par bigger ]
Bonjour à tous,J'ai deux boutons de chaque côté d'une progressbar continue, l'un pour incrémenter et l'autre pour décrémenter cette derniere (bouton +
Deplacer des fichiers en fonction des extensions [ par damsdu64 ]
Bonjour, Je voudrais déplacer des fichiers d'un endroit à un autre. Cependant je ne connais pas par avance le nom de ces fichiers ni leur nombre, la s
|
Derniers Blogs
[TECHDAYS2012] OUI J'Y SERAI![TECHDAYS2012] OUI J'Y SERAI! par JeremyJeanson
Bonsoir, Certes, je l'annonce avec un peu de retard, mais je serai effectivement au Techdays demain. Comme l'an dernier, je participerai au programme ATE (Ask The Expert). Si vous avez des questions Workflow, WCF, AppFabric ou plus généralement .net, n'hé...
Cliquez pour lire la suite de l'article par JeremyJeanson TFS INTEGRATION TOOLS - SUIVI DES SYNCHRONISATIONS AVEC REPORTING SERVICESTFS INTEGRATION TOOLS - SUIVI DES SYNCHRONISATIONS AVEC REPORTING SERVICES par vfabing
Afin de s'assurer du bon fonctionnement des différentes synchronisations effectuées par les TFS Integration Tools, 2 rapports sont présents dès l'installation. Il suffit alors d'effectuer les manipulations suivantes pour pouvoir les visualiser : Loca...
Cliquez pour lire la suite de l'article par vfabing CSS CONTENT STATE SELECTORS (PERSONNAL DRAFT)CSS CONTENT STATE SELECTORS (PERSONNAL DRAFT) par FREMYCOMPANY
Bonjour à tous, Je viens de publier une proposition comprenant 5 pseudo-classes pour le CSS Working Group ayant trait à l'état de chargement d'un élément (ex: IMG,VIDEO,AUDIO,OBJECT pour l'HTML.). Si le c½ur vous en dit, vous pouvez retrouver cette p...
Cliquez pour lire la suite de l'article par FREMYCOMPANY MBA : POURQUOI FAIRE ET COMMENT LE CHOISIR ?MBA : POURQUOI FAIRE ET COMMENT LE CHOISIR ? par ROMELARD Fabrice
Formation initiale Durant la formation, le découpage classique est le suivant (je donnerai les équivalences Suisse lorsque je les connaîtrais) : Ecole primaire jusqu'au Collège : Formation générale permettant d'obtenir les méthodes...
Cliquez pour lire la suite de l'article par ROMELARD Fabrice Y'A DES ERREURS QUI PEUVENT RENDRE LE DéVELOPPEUR VIOLENTY'A DES ERREURS QUI PEUVENT RENDRE LE DéVELOPPEUR VIOLENT par Aleks
Quand on a ce genre d'erreur sans log :
Et bas on a juste envie de choper le gas de Microsoft qu'a développé ça et lui foutre des baffes de Coboye ! ...
Cliquez pour lire la suite de l'article par Aleks
Logiciels
Academy System (17.2.1.0)ACADEMY SYSTEM (17.2.1.0)Logiciel de gestion des établissements.
- élèves/étudiants (inscription, dossier, absence...)
-... Cliquez pour télécharger Academy System Easy-Planning (1.0.0.1)EASY-PLANNING (1.0.0.1)Basé sur les mêmes principes que MyPlanning, Easy-Planning permet de créer des plannings sous la ... Cliquez pour télécharger Easy-Planning COLLECTOR PLUS (3.00B)COLLECTOR PLUS (3.00B)COLLECTOR PLUS version 3.00B est un logiciel utilisant une base de données alimentée par :
- L... Cliquez pour télécharger COLLECTOR PLUS PONAMEDIA PREMIUM - HELLLOOO FLASH DEMO (V7.4)PONAMEDIA PREMIUM - HELLLOOO FLASH DEMO (V7.4)PONAMEDIA TV DEVIENS HELLLOOO FLASH
LA TV SUR VOTRE ORDINATEUR.
Toute une plateforme Multi... Cliquez pour télécharger PONAMEDIA PREMIUM - HELLLOOO FLASH DEMO LettresFaciles 2011 (8.0.0.1)LETTRESFACILES 2011 (8.0.0.1)LettresFaciles est un logiciel facilitant la création et la rédaction de lettres types.
Son inte... Cliquez pour télécharger LettresFaciles 2011
|