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
- Anonymous
June 10, 2006
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.