Andrew Dunaway
Andrew Dunaway

Reputation: 1226

What is an easy way to create a MessageBox with custom button text in Managed C++?

I would like to keep the overhead at a minimum. Right now I have:

// Launch a Message Box with advice to the user
DialogResult result = MessageBox::Show("This may take awhile, do you wish to continue?", "Warning", MessageBoxButtons::YesNo, MessageBoxIcon::Exclamation);

// The test will only be launched if the user has selected Yes on the Message Box
if(result == DialogResult::Yes)
{
    // Execute code
}

Unfortunately my client would prefer "Continue" and "Cancel" in place of the default "Yes" and "No" button text. It seems like there should be an easy way to do this.

Upvotes: 3

Views: 12357

Answers (3)

Andrew Dunaway
Andrew Dunaway

Reputation: 1226

From everything I can find it looks like Corin is right. Here is the code that I used to accomplish the original goal. I am not usually a Managed C++ programmer, so any editing would be appreciated.

CustomMessageBox.h:

using namespace System::Windows::Forms;

/// <summary>
/// A message box for the test. Used to ensure user wishes to continue before starting the test.
/// </summary>
public ref class CustomMessageBox : Form
{
private:
    /// Used to determine which button is pressed, default action is Cancel
    static String^ Button_ID_ = "Cancel";

    // GUI Elements
    Label^ warningLabel_;
    Button^ continueButton_;
    Button^ cancelButton_;

    // Button Events
    void CustomMessageBox::btnContinue_Click(System::Object^ sender, EventArgs^ e);
    void CustomMessageBox::btnCancel_Click(System::Object^ sender, EventArgs^ e);

    // Constructor is private. CustomMessageBox should be accessed through the public ShowBox() method
    CustomMessageBox();

public:
    /// <summary>
    /// Displays the CustomMessageBox and returns a string value of "Continue" or "Cancel"
    /// </summary>
    static String^ ShowBox();
};

CustomMessageBox.cpp:

#include "StdAfx.h"
#include "CustomMessageBox.h"

using namespace System::Windows::Forms;
using namespace System::Drawing;

CustomMessageBox::CustomMessageBox()
{
    this->Size = System::Drawing::Size(420, 150);
    this->Text="Warning";
    this->AcceptButton=continueButton_;
    this->CancelButton=cancelButton_;
    this->FormBorderStyle= ::FormBorderStyle::FixedDialog;
    this->StartPosition= FormStartPosition::CenterScreen;
    this->MaximizeBox=false;
    this->MinimizeBox=false;
    this->ShowInTaskbar=false;

    // Warning Label
    warningLabel_ = gcnew Label();
    warningLabel_->Text="This may take awhile, do you wish to continue?";
    warningLabel_->Location=Point(5,5);
    warningLabel_->Size=System::Drawing::Size(400, 78);
    Controls->Add(warningLabel_);

    // Continue Button
    continueButton_ = gcnew Button();
    continueButton_->Text="Continue";
    continueButton_->Location=Point(105,87);
    continueButton_->Size=System::Drawing::Size(70,22);
    continueButton_->Click += gcnew System::EventHandler(this, &CustomMessageBox::btnContinue_Click);
    Controls->Add(continueButton_);

    // Cancel Button
    cancelButton_ = gcnew Button();
    cancelButton_->Text="Cancel";
    cancelButton_->Location=Point(237,87);
    cancelButton_->Size=System::Drawing::Size(70,22);
    cancelButton_->Click += gcnew System::EventHandler(this, &CustomMessageBox::btnCancel_Click);
    Controls->Add(cancelButton_);
}

/// <summary>
/// Displays the CustomMessageBox and returns a string value of "Continue" or "Cancel", depending on the button
/// clicked.
/// </summary>
String^ CustomMessageBox::ShowBox()
{
    CustomMessageBox^ box = gcnew CustomMessageBox();
    box->ShowDialog();

    return Button_ID_;
}

/// <summary>
/// Event handler: When the Continue button is clicked, set the Button_ID_ value and close the CustomMessageBox.
/// </summary>
/// <param name="sender">The source of the event.</param>
/// <param name="e">The <see cref="System.EventArgs"/> instance containing the event data.</param>
void CustomMessageBox::btnContinue_Click(System::Object^ sender, EventArgs^ e)
{
    Button_ID_ = "Continue";
    this->Close();
}

/// <summary>
/// Event handler: When the Cancel button is clicked, set the Button_ID_ value and close the CustomMessageBox.
/// </summary>
/// <param name="sender">The source of the event.</param>
/// <param name="e">The <see cref="System.EventArgs"/> instance containing the event data.</param>
void CustomMessageBox::btnCancel_Click(System::Object^ sender, EventArgs^ e)
{
    Button_ID_ = "Cancel";
    this->Close();
}

And then finally the modification to the original code:

// Launch a Message Box with advice to the user
String^ result = CustomMessageBox::ShowBox();

// The test will only be launched if the user has selected Continue on the Message Box
if(result == "Continue")
{
    // Execute Code
}

Upvotes: 0

Namhwan Sung
Namhwan Sung

Reputation: 9

Change the message as below. This may be the simplest way I think.

DialogResult result = MessageBox::Show(
       "This may take awhile, do you wish to continue?**\nClick Yes to continue.\nClick No to cancel.**",
       "Warning",
       MessageBoxButtons::YesNo,
       MessageBoxIcon::Exclamation
);

Upvotes: 0

Corin Blaikie
Corin Blaikie

Reputation: 18108

You can use "OK" and "Cancel"

By substituting MessageBoxButtons::YesNo with MessageBoxButtons::OKCancel

MessageBoxButtons Enum

Short of that you would have to create a new form, as I don't believe the Enum can be extended.

Upvotes: 2

Related Questions