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
UNE JOLIE-HORLOGE ET PAS QU'UN PEU !UNE JOLIE-HORLOGE ET PAS QU'UN PEU ! par neodante
Pour les possesseurs d'iPhone, ça y est Bijin Tokei - qui se traduit littéralement en Français par " Jolie Horloge " - est arrivé et GRATUITEMENT s'il vous plaît ! Après la version Tokyo, Hokkaido, night club, racing, Gal, "pour les mademoiselles'", . voi...
Cliquez pour lire la suite de l'article par neodante TECHDAYS PARIS 2010 : CONNECTEZ VOS DONNéES à SHAREPOINT 2010 AVEC LES BUSINESS CONNECTIVITY SERVICESTECHDAYS PARIS 2010 : CONNECTEZ VOS DONNéES à SHAREPOINT 2010 AVEC LES BUSINESS CONNECTIVITY SERVICES par ROMELARD Fabrice
Animé par: Gaetan Bouveret et Julien Chomarat Business Connectivity Services (BCS) est dans SharePoint 2010 la version 2 de Business Data Catalog (BDC dans SharePoint 2007). Il s'agit de la solution permettant de visualiser des données provenan...
Cliquez pour lire la suite de l'article par ROMELARD Fabrice [DIVERS] SUIVRE VOS SéRIES PRéFéRéS SUR LA TOILE[DIVERS] SUIVRE VOS SéRIES PRéFéRéS SUR LA TOILE par orion
Comme de nombreux geek, je suis un grand amateur de série TV et je rate régulièrement des épisodes de mes séries préférés. Une solution s'offre à vous avec ce merveilleux site : Tv Gorge - www.tvgorge.com Moteur de recherche à l'appui, vous pouvez ...
Cliquez pour lire la suite de l'article par orion TECHDAYS PARIS 2010 : LA BI DANS SHAREPOINT 2010TECHDAYS PARIS 2010 : LA BI DANS SHAREPOINT 2010 par ROMELARD Fabrice
Animé par: Vincent Bellet et Baptiste Giraudier La BI dans SharePoint 2010, Les nouveaux services d'application dans SP2010 et SQL Server Reporting services 2008 R2. La BI dans SharePoint est généralisée pour tous afin de permettre à tous les coll...
Cliquez pour lire la suite de l'article par ROMELARD Fabrice
Logiciels
DB-MAIN (9.1.0)DB-MAIN (9.1.0)DB-MAIN is a data-modeling and data-architecture tool. It is designed to help developers and anal... Cliquez pour télécharger DB-MAIN Xilisoft DPG Convertisseur (5.1.37.0120)XILISOFT DPG CONVERTISSEUR (5.1.37.0120)Xilisoft DPG Convertisseur offre aux fans de Nintendo DS une bonne solution leur permettant de dé... Cliquez pour télécharger Xilisoft DPG Convertisseur GraphicsGale (2.01.01)GRAPHICSGALE (2.01.01)GraphicsGale est un logiciel de PixelArt avec de nombreuse fonctionnalités permettant de réalisé ... Cliquez pour télécharger GraphicsGale Architecte 3D (Platinum 2010)ARCHITECTE 3D (PLATINUM 2010)Architecte 3D Platinium vous permet de concevoir facilement les plans votre future maison, de l'é... Cliquez pour télécharger Architecte 3D TeamViewer 5 (TeamViewer 5)TEAMVIEWER 5 (TEAMVIEWER 5)Dépanner un ami,expliquer une manipulation devient un jeu d'enfant.
Prise en main d'un autre ord... Cliquez pour télécharger TeamViewer 5
Comparez les prix

HTC Magic
Entre 429€ et 429€
|