CommandLink wrapper in C++/CLI for you managed code under Vista


Catherine, una amiga mía, Technical Evangelist en DPE, wrote some C# code that will be shared soon during a “Light Up” lab event in Munich. When reading it, the first thing that came to my mind was: “Ce serait tellement plus élégant en C++/CLI”. Before I share it, let me point you to a related folder you might find interesting if you want to take advantage of the new stuff in Vista from your managed application:


%ProgramFiles%\Microsoft SDKs\Windows\v1.0\Samples\CrossTechnologySamples\VistaBridge


I heard her and Jeff talk about this the other day and I’m guessing we’ll see a lot more soon. But hey, I don’t want to put pressure on their shoulders! 😉


Don’t hesitate to send me ideas on how to improve it:


#pragma once


#pragma comment( lib, “user32” )


#define _WIN32_WINNT 0x0600


#include <Windows.h>


#include <CommCtrl.h>


#include <vcclr.h>


#include <malloc.h>


using namespace System;


 


namespace CommandLinkControl {


 


public ref class CommandLink : Windows::Forms::Button {


    public:


      CommandLink() {


         FlatStyle = Windows::Forms::FlatStyle::System;


      }


 


      [ComponentModel::Category(“Appearance”)]


      [ComponentModel::Description(“Specifies the note.”)]


      [ComponentModel::BrowsableAttribute(true)]


      [ComponentModel::DefaultValue(“(Note Text)”)]


      property String ^ Note {


         String ^ get() {


            HWND hwnd = static_cast<HWND>(static_cast<void *>(Handle));


            LRESULT noteLength = Button_GetNoteLength(hwnd) + 1;


            if ( noteLength <= 1 )


               return String::Empty;


                  wchar_t * note = static_cast<wchar_t *>(_malloca(noteLength*sizeof(*note)));


            Button_GetNote(hwnd, note,& noteLength);


            String ^ s = gcnew String(note);


                  _freea(note);


            return s;


         }


         void set( String ^ value ) {


            pin_ptr<const wchar_t> p = PtrToStringChars(value) ;


            Button_SetNote(static_cast<HWND>(static_cast<void *>(Handle)), p);


         }


      }


 


     [ComponentModel::Category(“Appearance”)]


     [ComponentModel::Description(“Indicates whether the button should be decorated with the security shield icon (Windows Vista only).”)]


     [ComponentModel::BrowsableAttribute(true)]


     [ComponentModel::DefaultValue(false)]


     property bool ShieldIcon {


         bool get() {


            return shieldIconDisplayed;


         }


         void set( bool value ) {


            shieldIconDisplayed = value;


            Button_SetElevationRequiredState( static_cast<HWND>(static_cast<void *>(Handle)), value ? TRUE : FALSE);


         }


     }


 


      protected:


         property Windows::Forms::CreateParams ^ CreateParams  {


            virtual Windows::Forms::CreateParams ^ get() override {


               Windows::Forms::CreateParams ^ cp = Button::CreateParams;


               if ( Environment::OSVersion->Version->Major >= 6) {


                  cp->Style |= BS_COMMANDLINK;


               }


               return cp;


            }


        }


 


         property Drawing::Size DefaultSize {


            virtual Drawing::Size get() override {


               return Drawing::Size(180,60);


            }


        }


   private:


      bool shieldIconDisplayed;


 


};


 


} // namespace CommandLinkControl

Comments (1)

  1. JohanLindfors says:

    Great post, good demonstration of C++/CLI benefits.

    Remember that you have to "Register the Windows SDK Directories with Visual Studio 2005" prior to compiling this code. Otherwise the #include <CommCtrl.h> will default to old platform SDK version and complain about some of the macros.