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 {


      CommandLink() {

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




      [ComponentModel::Description("Specifies the note.")]


      [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);


            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::Description("Indicates whether the button should be decorated with the security shield icon (Windows Vista only).")]



     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);





         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);




      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.

Skip to main content