On remet le couvert!!!

9. avril 2010

Après une BDC mémorable à Toulouse, on remet ça sur Aix le 18 Mai.

N’hésitez pas à vous inscrire…

Au menu : Du Sharepoint 2010, du Visual Studio 2010, du Silverlight 4, de l’ergonomie, du Windows Phone 7 et bien d’autres choses encore…

clip_image001

.Net, Divers

Je passe à la télé!

8. avril 2010

Ou presque:) En fait après une attente finalement plus longue que prévue, les webcasts des TechDays 2010 sont disponibles ici.

Pour vous faciliter la vie voici les liens vers mes sessions:

.Net

Composition d’images avec WPF

8. avril 2010

Dans le cadre d’un projet, j’ai eu besoin de générer une image contenant d’autres images composées ainsi que du texte. Ceci devait être fait dans un thread séparé pour des raisons de performances.

Pour cela, il existe une technologie bien sympatique en WPF, le RenderTargetBitmap. Ce dernier permet en effet de dessiner des Visual directement dans son contenu. Pour ce faire on s’appuie sur la classe DrawingVisual qui est un peu l’équivalent de la classe Graphics en Windows Forms/GDI+.

Cette dernière permet par exemple de dessiner des images (et donc de les redimensionner) ainsi que du texte (notamment).

Cela donne donc ceci:

FormattedText text = new FormattedText("Message à caractère informatif",
new CultureInfo("en-us"), FlowDirection.LeftToRight,
new Typeface(new FontFamily("Arial"), FontStyles.Normal, FontWeights.Bold, new FontStretch())
, 18, Brushes.Black); DrawingVisual drawingVisual = new DrawingVisual(); DrawingContext drawingContext = drawingVisual.RenderOpen(); drawingContext.DrawImage(image, new Rect(0, 0, renderTarget.PixelWidth, renderTarget.PixelHeight)); drawingContext.DrawText(text, new Point(renderTarget.PixelWidth - text.Width - 45, 350)); text.SetForegroundBrush(Brushes.White); drawingContext.DrawText(text, new Point(renderTarget.PixelWidth - text.Width - 45 - 1, 349)); drawingContext.Close(); renderTarget.Render(drawingVisual);

 

Par la suite, ce RenderTargetBitmap peut servir de source à un contrôle Image ou peut être sauvegarder sur le disque via la classe BmpBitmapEncoder:

string picturePath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments)
, "urza.bmp"); FileStream stream = new FileStream(picturePath, FileMode.Create); BmpBitmapEncoder encoder = new BmpBitmapEncoder(); encoder.Frames.Add(BitmapFrame.Create(renderTarget)); encoder.Save(stream);
 
Et le tour est joué!

.Net, WPF

Coup de gueule du jour : suite

28. mars 2010

Je suis obligé de blogguer sur ce que je viens de découvrir. Juste pour me calmer et ne pas avoir à tuer mon chien pour me passer les nerfs.

Donc résumé de l’épisode précédent : Direct3D11 ne fournit plus aucune API pour gérer le dessin de texte. Soit. Je veux bien. La solution semble être d’utiliser Direct2D et DirectWrite. Ok. Pas de soucis, je suis pas contrariant.

Le truc effarant, c’est que Direct2D ne supporte pas Direct3D11. Ce boulet ne sait pas dessiner sur une surface Direct3D11. Mais je suis MORT DE RIRE!!!! Mais comment on fait dans ces cas-la? On fait du GDI? On reste en Direct3D 10? On passe à OpenGL?

Mon dieu que j’en ai marre des ces mauvais qui sont pas foutus de garder une ligne de compatibilités fonctionnelles. Ca doit être la faute aux développeurs de jeux qui ne doivent pas écrire de textes dans leur application 3D.

DirectX

Coup de gueule du jour : Direct3D11

27. mars 2010

Il y avait longtemps! Direct3D 11 est soit disant une évolution de Direct3D 10 et le portage est rapide. Oui. Ou pas. Les charcutiers qui ont défini l’API de Direct3D11 devraient être lapidés avec des foies de faisans.

Alors prenons les choses pénibles dans l’ordre:

- Le framework Effect est maintenant un sample à coté. Bon soit, admettons.
- La gestion des fontes et des sprites nous a quitté après une longue maladie. Il faut vous démerder avec Direct2D et DirectWrite. Oui, pas de soucis.
- La classe Mesh a été supprimée parce que bon elle sentait le fioul. Parait-il que les développeurs de jeux (à dire avec une voix emplie de respect et d’admiration) ne s’en servent pas. Alors forcément. Pas grave, je m’en servais juste pour le calcul des intersections et pour les adjacencies. De toute manière on s’en fout on fait pas des jeux vidéos.

Bon là ca me broute de me taper des wrappers en chaine pour rajouter des fonctionnalités déjà présentes mais il faut quand même avouer que l’API est bien foutue et hormis les points du dessus ca coule assez vite à partir de Direct3D 10.

DirectX

BDC 2010 – Leak Preview

26. mars 2010

Je risque gros en faisant ce post mais mon devoir envers l’humanité est de faire passer la vérité!

Chez Bewise, les gens ne sont pas tout à fait normaux. Comme par exemple David Diop notre responsable de domaine métiers ASC.

J’ai même une vidéo sur le sujet :

.Net, Divers

SilverCollecto

24. mars 2010

Mon célèbre gestionnaire de collections (mondialement reconnu dans mon bureau et sur le tapis de la salle de bain) sort dans une nouvelle version en Silverlight 4.0.

Au menu des animations, des projections, des jolies couleurs, des projections, de l’entity framework, des projections, du WCF RIA Services et des projections.

Quelques captures de la bête:

image image

image image

SilverCollecto gère:

  • Liste des collections sous forme de TreeView
  • PictureFlow pour les images associées aux items
  • WCF RIA Services pour la synchro avec SQL Server
  • Drag’n’Drop

Je mettrai bientôt en ligne les sources mais on peut déjà tester le tout ici : http://collecto.catuhe.com (je crée des comptes utilisateurs sur simple demande).

Reste encore des bugs et surtout rien n’est sécurisé mais ca ne devrait plus tarder…

Silverlight

WPF : Chargement en asynchrone d’images dans un wrap panel

17. mars 2010

Déjà, juste le titre, ça calme bien. Un peu autant que le temps que j’ai passé à trouver la solution en fait.

Voici donc le problème : J’ai un wrap panel en WPF qui sert d’ItemPanel à une ListBox. Jusque là on ne se fatigue pas trop non plus:

<ListBox ItemsSource="{Binding}" x:Name="imagesList">
                    <ListBox.ItemsPanel>
                        <ItemsPanelTemplate>
                            <WrapPanel>
                            </WrapPanel>
                        </ItemsPanelTemplate>
                    </ListBox.ItemsPanel>
                </ListBox>

Toutefois, lorsque je veux binder une grosse liste d’images (plus de 300) en provenance de ma base de données à ma ListBox, je me récupére en supplément un bon gros lag car le gentil Wrap Panel ne sait pas virtualiser ses items et doit donc tous les créer pour s’afficher (contrairement par exemple à une ListView qui saura ne construire que les items qu’elles affichent en temps réel).

Donc, je me suis lancé à la recherche d’une solution qui me permettrait d’asynchroniser le remplissage de mon Wrap panel.

Première idée, on met benoitement notre imagesList.DataContext = maListe dans un ThreadPool.QueueUserWorkItem. Et là c’est le drame car WPF me bloque comme j’essaye d’accéder à un DispatcherObject depuis un autre thread que celui qui a servit à construire le contrôle.

La solution est un tantinet plus ardue:

Premièrement, il faut modifier notre objet qui porte l’image à afficher pour lui ajouter une propriété supplémentaire de type BitmapFrame (qui a l’énorme avantage de ne pas vérifier l’origine du thread appelant). Il est ici important de ne pas laisser le BitmapFrame se mettre en DelayLoad depuis le cache d’image d’ou l’utilisation du paramètre BitmapCacheOption.OnLoad:

    public partial class Card
    {
        BitmapFrame bitmapImage;

        public BitmapFrame Bitmap
        {
            get
            {
                return bitmapImage;
            }
        }

        public void GenerateBitmap()
        {
            if (bitmapImage != null)
            {
                return;
            }
            using (MemoryStream ms = new MemoryStream(Image))
            {
                bitmapImage = BitmapFrame.Create(ms, BitmapCreateOptions.None, 
BitmapCacheOption.OnLoad); } } }

Deuxièmement, avant d’affecter le DataContext de notre ListBox, nous allons appeler de manière asynchrone sur chacun de nos objets la méthode GenerateBitmap.

Finalement, il suffit de faire un petit Dispatcher.Invoke pour affecter notre DataContext:

ThreadPool.QueueUserWorkItem(o =>
          {
            foreach (Card card in list)
            {
               card.GenerateBitmap();
            }
            Dispatcher.Invoke(DispatcherPriority.Normal, new Action(()=>
            {
               imagesList.DataContext = source;
            }));
});

Le résultat fait plaisir à voir je vous l’assure :)

.Net, WPF

Le truc à la con du jour : Gérer le double clic en WPF

14. mars 2010

J’ai eu plusieurs fois la question : Maiiiiiis pourquoi WPF ne gère pas le double clic!!! C’est trop nul WPF.
Alors en fait oui mais non. Effectivement il n’y a pas un événement qui s’appelle “MouseDoubleClick”. Toutefois le double clic est bien géré ma bonne dame!

Et c’est même plutôt bien gérer. Car après tout, que se passerait-il si je voulais un MouseTripleClick? Il faudrait que je chiale auprès de l’équipe de développement de WPF ?

Alors pour couper court à ce suspens insoutenable, voici la solution : Abonnez vous à l’événement MouseDown (par exemple) et regarder le gentil paramètre MouseButtonEventArgs qui vous est fait passé. Notez surtout la propriété ClickCount. Et paf miracle:) Cette petite propriété gère le double clic (et plus) pour nous!

Un exemple en direct:

private void Grid_MouseDown(object sender, MouseButtonEventArgs e)
{
    if (e.ClickCount == 2)
    {
        if (FullImage.Visibility == Visibility.Hidden)
            FullImage.Visibility = Visibility.Visible;
        else
            FullImage.Visibility = Visibility.Hidden;
    }
}

 

Et voilou…

WPF, .Net

BDC 2010 – C’est reparti!

4. mars 2010

A la demande générale, la Bewise Day Conference est de retour pour une 4ème édition ! Encore une fois, venez découvrir ce qui se fait de mieux dans les technologies Microsoft.

Cette année, beaucoup de nouveautés, puisque Microsoft lance la gamme 2010 de ses produits, notamment Visual Studio, Sharepoint, mais aussi la version 4.0 de son framework .Net, MVC 2, Azure, Silverlight 4 et bien d’autres choses bien croustillantes.

J’animerai les plénières cette année et je vous conseille d’y participer car vous y découvrirez le grand secret de Bewise :).

Pour les inscriptions, rendez-vous sur le site officiel de la BDC 2010.

Bewise, .Net, 3D, Silverlight, Visual Studio, Windows Forms, Windows Mobile, WPF