Managed C++ and .NET Development: Visual Studio .NET 2003 Edition

The StatusBar is an easy-to-use control for displaying status information to the user. You will find the status bar at the bottom of many Windows applications. There are two approaches to the status bar provided by the .NET Framework class library. You can use that status bar as one long text area within which you can place your status information, or you can break the status bar into panels. Each of these panels can be updated independently.

In most cases when you work with the StatusBar, you will only have to deal with three properties. If you are working with the status bar as one long area to enter text into, then you only really have to worry about placing your status information into the Text property. If, on the other hand, you are breaking your status bar into panels, you need to work with Panels property, which you will place your collection of StatusBarPanels components and the ShowPanels property, which turns these panels on and off.

Creating a status bar as a single long text area is trivial. Either drag the StatusBar control to the design form or enter the following code:

private: StatusBar *statusbar; //...In constructor StatusBar = new StatusBar(); Controls->Add(statusBar); //...Later when you want to update the status StatusBar->Text = S"status info goes here";

Creating a status bar using panels is not much more difficult, but the StatusBarPanel does have a number of properties available for configuration. Some of the more common properties are as follows:

Listing 10-6 shows the creation of the status bar with panels. The status information displayed is the mouse x, y location and the last mouse button pressed while within the client area of the form.

Listing 10-6: Status Bar Display of x, y Coordinates

namespace StatusBar1 { using namespace System; using namespace System::ComponentModel; using namespace System::Collections; using namespace System::Windows::Forms; using namespace System::Data; using namespace System::Drawing; public __gc class Form1 : public System::Windows::Forms::Form { public: Form1(void) //... protected: void Dispose(Boolean disposing) //... private: System::Windows::Forms::StatusBar * statusBar; private: System::Windows::Forms::StatusBarPanel * statusButtons; private: System::Windows::Forms::StatusBarPanel * statusXCoord; private: System::Windows::Forms::StatusBarPanel * statusYCoord; private: System::ComponentModel::Container * components; void InitializeComponent(void) { this->statusBar = new System::Windows::Forms::StatusBar(); this->statusButtons = new System::Windows::Forms::StatusBarPanel(); this->statusXCoord = new System::Windows::Forms::StatusBarPanel(); this->statusYCoord = new System::Windows::Forms::StatusBarPanel(); (dynamic_cast<System::ComponentModel::ISupportInitialize * > (this->statusButtons))->BeginInit(); (dynamic_cast<System::ComponentModel::ISupportInitialize * > (this->statusXCoord))->BeginInit(); (dynamic_cast<System::ComponentModel::ISupportInitialize * > (this->statusYCoord))->BeginInit(); this->SuspendLayout(); // // statusBar // this->statusBar->Name = S"statusBar"; System::Windows::Forms::StatusBarPanel* _mcTemp_1[] = new System::Windows::Forms::StatusBarPanel*[3]; __mcTemp__1[0] = this->statusButtons; __mcTemp__1[1] = this->statusXCoord; __mcTemp__1[2] = this->statusYCoord; this->statusBar->Panels->AddRange(_mcTemp_1); this->statusBar->ShowPanels = true; // // statusButtons // this->statusButtons->AutoSize = System::Windows::Forms::StatusBarPanelAutoSize::Spring; // // statusXCoord // this->statusXCoord->Width = 50; // // statusYCoord // this->statusYCoord->Width = 50; // // Form1 // this->AutoScaleBaseSize = System::Drawing::Size(6, 15); this->ClientSize = System::Drawing::Size(300, 322); this->Controls->Add(this->statusBar); this->Name = S"Form1"; this->Text = S"Status Bar Mouse Tracking"; this->MouseDown += new System::Windows::Forms::MouseEventHandler(this, Form1_MouseDown); this->MouseMove += new System::Windows::Forms::MouseEventHandler(this, Form1_MouseMove); (dynamic_cast<System::ComponentModel::ISupportInitialize * > (this->statusButtons))->EndInit(); (dynamic_cast<System::ComponentModel::ISupportInitialize * > (this->statusXCoord))->EndInit(); (dynamic_cast<System::ComponentModel::ISupportInitialize * > (this->statusYCoord))->EndInit(); this->ResumeLayout(false); } private: System::Void Form1_MouseMove(System::Object * sender, System::Windows::Forms::MouseEventArgs * e) { // x,y coords in second and third status bar panels statusXCoord->Text = String::Format("X={0}", __box(e->X)); statusYCoord->Text = String::Format("Y={0}", __box(e->Y)); } private: System::Void Form1_MouseDown(System::Object * sender, System::Windows::Forms::MouseEventArgs * e) { // clicked mouse button in first status bar panel if (e->Button == MouseButtons::Right) statusButtons->Text = S"Right"; else if (e->Button == MouseButtons::Left) statusButtons->Text = S"Left"; else statusButtons->Text = S"Middle"; } }; }

The preceding code builds a three-panel status bar. The first panel expands to take up any unclaimed area on the status bar due to StatusBarPanelAutoSize::Spring. The other two panels are 50 pixels wide. All of the panels are added to the StatusBar, which in turn is added to the form. The only tricky part of this program is remembering to set the property ShowPanels to true.

Figure 10-8 shows what StatusBar.exe looks like when you execute it.

Figure 10-8: A three-panel status bar

Категории