Monthly Archives: May 2024

Create Tool Tip Using mfc ctooltipctrl

Tool-tips—those little yellow boxes that pop up with helpful text—add a touch of polish to your user interfaces. They guide users by providing context-sensitive information about buttons, text fields, and other controls. While MFC (Microsoft Foundation Classes) offers a built-in CToolTipCtrl class for tool-tips, let’s create a custom helper class to streamline their use and open up possibilities for future enhancements.

Understanding MFC Tool-Tips

Let’s refresh the basics:

  • Tool: A control within your MFC dialog (e.g., a button, edit box).
  • Tip: The descriptive text that appears in a yellow box when the user’s mouse hovers over the tool.
  • MFC’s CToolTipCtrl: The underlying MFC class that manages tracking mouse movement and displaying the tip.

Creating Our Helper Class

  1. New MFC Class (CToolTipCtrlExt)
    • Right-click your MFC project in Visual Studio and select “Add” -> “Class…”.
    • Name it CToolTipCtrlExt and make it derive from CToolTipCtrl.
  2. The Display_tooltip_text Function Inside CToolTipCtrlExt.h:
  3. C++
  4. void Display_tooltip_text(LPCTSTR display_text, CWnd* pWnd);

 

  1. Implementation (CToolTipCtrlExt.cpp)
  2. C++
  3. void CToolTipCtrlExt::Display_tooltip_text(LPCTSTR display_text, CWnd* pWnd)
  4. {
  5.     TOOLINFO ti;  
  6.     ti.cbSize = sizeof(TOOLINFO);
  7.     ti.lpszText = (LPSTR)display_text;  
  8.     ti.hwnd = pWnd->GetParent()->GetSafeHwnd(); // Parent of the control
  9.     ti.uFlags = TTF_IDISHWND | TTF_SUBCLASS;
  10.     ti.uId = (UINT_PTR)pWnd->GetSafeHwnd(); // Handle of the tool
  11.     SendMessage(TTM_ADDTOOL, 0, (LPARAM)&ti);
  12. }

 

Using CToolTipCtrlExt in Your Dialog

  1. Include Header:
  2. C++
  3. #include “ToolTipCtrlExt.h” 

 

  1. Declare Member:
  2. C++
  3. CToolTipCtrlExt m_ctrl_tooltip_ext; 

 

  1. OnInitDialog Setup:
  2. C++
  3. BOOL CMyDialog::OnInitDialog() {
  4.     //  existing initialization 
  5.     m_ctrl_tooltip_ext.Create(this); // ‘this’ refers to your dialog 
  6.     m_ctrl_tooltip_ext.Display_tooltip_text(“Saves the Data”, &m_ctrl_btn_save);
  7.     //  add more tool-tips as needed 
  8.     return TRUE; // …  
  9. }

 

Let’s Test It! Run your project. Hover your mouse over the designated controls and see the tool-tips appear.

Customization Possibilities

Our CToolTipCtrlExt now encapsulates basic tool-tip setup. Think about enhancements:

  • Dynamic Text: Change tool-tip text based on user actions.
  • Styling:  Experiment with colors, borders, and even hyperlinks inside the tool-tip.

Exception Bubbling in Java

  • When Errors Occur: In any program, unexpected errors, called exceptions, can occur during runtime (e.g., trying to divide by zero, opening a non-existent file).
  • Exception Handling:  Java provides a structured way to deal with these exceptions using the try-catch mechanism. This prevents programs from crashing abruptly and allows for graceful error recovery.
  • Exception Bubbling:  When an exception occurs within a method, Java will look for a matching catch block to handle it. If no catch block is found, the exception is propagated up the call stack – passed back to the method that called the current one, and so on. This process continues until either:
    • Matching catch Block Found: The exception is handled and execution resumes.
    • End of Call Stack: The exception reaches the main program entry point and no catch is found, usually causing your program to terminate with an error message.

Illustrative Example

Consider the example below:

Java

public class ExceptionBubblingExample {

 

    public static void main(String[] args) {

        System.out.println(“Main Entry”);

        funX();

        System.out.println(“Main Exit – This might not print!”);

    }

 

    static void funX() {

        System.out.println(“funX: Start”);

        try {

            funY();

        } catch (Exception ex) { // Catches a generic Exception

            System.out.println(“funX: Caught Exception: ” + ex.getMessage());

        }

        System.out.println(“funX: End”);

    }

 

    static void funY() {

        System.out.println(“funY: Start”);

        funZ();

        System.out.println(“funY: End”); 

    }

 

    static void funZ() {

        System.out.println(“funZ: Start”);

        int result = 10 / 0; // This will cause an ArithmeticException

        System.out.println(“funZ: End (This won’t print)”); 

    }

}

 

Explanation

  1. main Method: Program’s entry point, calls funX.
  2. funX: Starts executionhas a try-catch block with a generic Exception catch.
  3. funY:  Called by funX, but has no error handling.
  4. funZ: Called by funY, and causes an ArithmeticException by dividing by zero. Exception occurs here!

Bubbling Process

  • funZ doesn’t handle the exception, so it bubbles up to funY.
  • funY also has no try-catch, so the exception bubbles further up to funX.
  • funX has a try-catch block that catches the ArithmeticException (all exceptions inherit from the base Exception class), prints a message, and continues execution.

Key Takeaways

  • Purpose: Exception bubbling provides a way to centralize exception handling higher up the call stack if necessary.
    • Best Practices:Catch specific exceptions for more targeted handling.
    • When re-throwing exceptions, consider providing additional context.
    • Design your methods for robustness, so they either handle likely exceptions internally or declare the exceptions they might throw using the throws keyword.

RDLC Report & ReportViewer Control in C#

RDLC (Report Definition Language Client-side) is a powerful reporting tool in the Microsoft Visual Studio suite. It’s designed to create professional-looking reports embedded within your .NET applications.

With RDLC, you can:

Click here to host your ASP.NET application with $200 credit

  • Present Data in a Structured Manner: Display data from various sources (databases, web services, etc.) in tabular, chart, or free-form layouts.
  • Customizable Formatting:  Control the appearance of your reports with fonts, colors, images, headers, footers, and more.
  • Flexible Deployment: Embed RDLC reports directly into your Windows Forms or ASP.NET applications.

Key Concepts

  • DataSources: Represent a connection to a data source (e.g., SQL Server database, XML file) and the specific data to be used in the report (tables, views, etc.).
  • Report Templates (.RDLC): Define the layout, structure, and data elements of your report.
  • ReportViewer Control:  A .NET control that renders and displays the RDLC report within your application.

Building a Sample Sales Report

If you don’t have this resource book, you’re wasting your time

Step-by-Step Guide

  1. Project Setup: Create a new Windows Forms Application project in Visual Studio.
  2. Add a DataSource:
    • Right-click your project in Solution Explorer, go to “Add” -> “New Item…”.
    • Select “Data” -> “Dataset” and provide a name (e.g., “SalesData”).
    • Follow the wizard to establish a database connection and select the necessary data (e.g., product details, sales figures)
  3. Create the Report Template:
    • Add a new RDLC report to your project (“Add” -> “New Item…” -> “Report”). Name it (e.g., “SalesReport.rdlc”).
      • Report Design View:Drag a “Table” control from the Toolbox onto the report body.
      • Right-click in the table’s detail row and add columns as needed.
      • Drag fields from your DataSource onto the table’s detail cells to populate them.
  4. Add Headers and Footers:
    • Right-click on the gray area outside the report body and select “Add Page Header/Footer”.
    • Insert images (e.g., company logo) or text boxes into the header.
    • In the footer, insert text boxes and use built-in expressions for page numbers and report title (e.g., =Globals!ReportName).
  5. Conditional Formatting (Optional):
    • Select a table cell containing data you want to highlight.
    • In the Properties window, expand “Font”.
    • Click the expression builder button “fx” next to font properties like color.
    • Use an expression like =IIF(Fields!Price.Value >= 20, “Red”, “Black”) to change the text based on the data value.
  6. Embed Report into Windows Form:
    • Add a ReportViewer control to your form.
    • In the ReportViewer’s smart tag, select “Choose Report” and select your designed RDLC file.
    • Code (Form Load Event):

C#

private void Form1_Load(object sender, EventArgs e)

{

    this.reportViewer1.LocalReport.DataSources.Clear(); 

    this.reportViewer1.LocalReport.DataSources.Add(new ReportDataSource(“SalesData”, salesDataTable)); // Adapt to your DataSource and data object

    this.reportViewer1.RefreshReport();

 

Tips and Considerations

  • User Experience: Design your reports with a focus on clarity and readability.
  • Complex Layouts: Explore grouping, subreports, and matrices for organizing more intricate data.
  • Interactivity: Consider adding parameters and drill-down capabilities for dynamic reports.

C# WebBrowser Control Explained

The C# WebBrowser control seamlessly embeds web browsing capabilities into your Windows Forms applications. Use it to:

  • Display Web Content: Present web pages directly within your application.
  • Dynamic HTML Reports: Generate and display sophisticated HTML-based reports.
  • Hybrid Interfaces: Combine the power of web technologies with traditional desktop controls for rich user interfaces.

Understanding the WebBrowser Control

Key Concepts:

  • HTML Rendering Engine: Leverages the underlying Internet Explorer engine (or Edge in newer systems) to render web pages.
  • Navigating: Load web pages using the Navigate method.
  • Progress and Events: Monitor page load progress with events like Navigating, Navigated, and DocumentCompleted.
  • Customization: Display custom HTML content and inject JavaScript.
  • Interaction: Set up two-way communication between JavaScript in the web content and your C# code.

Building a Web Browser Application

Step-by-Step Guide

  1. Set up Your Project: Create a new Windows Forms Application project in Visual Studio.
  2. Design the Interface:
    • Drag and drop a ToolStrip control, a StatusStrip control, and a WebBrowser control onto your form.
    • Add the following to your ToolStrip: 
      • Address bar (TextBox)
      • Navigation buttons: Go, Back, Forward, Stop, Reload
    • Add a ProgressBar and StatusLabel to the StatusStrip
  3. Web Page Navigation: Implement event handlers:
  4. C#
  5. private void GoButton_Click(object sender, EventArgs e)
  6. {
  7.     webBrowser1.Navigate(addressBar.Text);
  8.     statusLabel.Text = “Loading…”;
  9. }
  10. // Implement similar handlers for other navigation buttons

 

  1. Track Progress:  Capture loading events:
  2. C#
  3. private void webBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
  4. {
  5.     progressBar.Visible = false; 
  6.     statusLabel.Text = “Web Page Loaded”;
  7. }
  8. // Implement similar logic for Navigating and Navigated events 

 

  1. Custom HTML Content:
  2. C#
  3. string customHTML = @”
  4.     <html>
  5.     <body>
  6.         <h1>My Custom Content</h1>
  7.         <button onclick=’window.external.CallCSharpMethod()’>Click Me</button>
  8.     </body>
  9.     </html>”;

 

webBrowser1.DocumentText = customHTML; “`

  1. C# and JavaScript Interaction
  2. a. C# to JavaScript:
  3. C#
  4. webBrowser1.Document.InvokeScript(“myJavaScriptFunction”, new object[] { “data from C#” });

 

  1. b. JavaScript to C#:
  2. C#
  3. // Expose a C# method to the web content
  4. webBrowser1.ObjectForScripting = this; 
  5. public void CallCSharpMethod()
  6. {
  7.     MessageBox.Show(“This method was called from JavaScript!”);
  8. }

 

Tips and Considerations

  • Performance: For complex web rendering, consider using the newer WebView2 control (based on Edge) for better performance and modern web standards support.
  • Security: Use caution when interacting with external web content or executing untrusted JavaScript. Implement appropriate security measures.
  • User Experience: Design your UI with the embedded browser in mind. Provide clear navigation and feedback mechanisms.

Example: Creating a Custom Product Catalog

Imagine building a product catalog application where product details are displayed in a WebBrowser control. You could fetch HTML formatted product information from a database or web service and seamlessly display it to the user.

C# TableLayoutPanel Example

The C# TableLayoutPanel control is a powerful tool for creating flexible and structured layouts in your Windows Forms applications. If you’re familiar with HTML tables, the TableLayoutPanel works in a similar way, allowing you to arrange controls in rows and columns. This makes it ideal for scenarios like:

  • Grid-based data entry forms
  • Calendar or schedule displays
  • Custom dashboard-style layouts

Understanding the TableLayoutPanel

Let’s break down the key concepts:

  • Cells:  The basic building blocks of the TableLayoutPanel. Each cell can hold one control or another container panel.
  • Rows and Columns: Define the structure. Add and customize them to fit your layout needs.
  • AutoSize: Automatically resizes rows or columns based on the content within the cells.
  • RowSpan and ColumnSpan: Allow a control to occupy multiple cells within the grid.
  • GrowStyle: Specifies how the TableLayoutPanel should handle adding new controls once the existing grid is filled (AddRows, AddColumns, or FixedSize).

Building a Sample Application

To illustrate these concepts effectively, let’s build a simple hospital bed allocation system. Our example will have:

  • Three floors of beds, arranged in two rows per floor.
  • Scroll bars to accommodate more beds if needed.
  • Visual indicators for allotted, reserved, and available beds.
  • A simple reservation flow.

Step-by-Step Guide

  1. Project Setup:
    • Create a new Windows Forms Application project in Visual Studio.
    • Add a SplitContainer control to the main form, and position its splitter horizontally.
    • Add a TableLayoutPanel to the top panel of the SplitContainer (Panel1).
    • Set the TableLayoutPanel’s Dock property to Fill.
  2. Document Outline:
    • Use the “Document Outline” window to easily visualize the container hierarchy and rename elements for clarity.
  3. Adding Rows and Columns:
    • Add rows to the TableLayoutPanel. Set their SizeType to AutoSize.
    • Initially, add one column.
  4. Controls and Layout:
    • Place labels, buttons, textboxes, etc., in the bottom panel (Panel2) of the SplitContainer.
    • Set the AutoScroll property to True for both the TableLayoutPanel and Panel1.
  5. Floor Labels:
    • Add labels to the TableLayoutPanel representing floor numbers.
    • Utilize the RowSpan property to make each label span two rows of beds.
  6. Adding Beds (Checkboxes):
    • GrowStyle: Set the TableLayoutPanel’s GrowStyle to FixedSize.
      • Coding: In the form’s Load event handler, use nested loops to create checkboxes for each bed:Set each checkbox’s Dock property to Fill.
      • Hook the CheckStateChanged event to a common handler function.
  7. Event Handlers:
      • Implement a handler (e.g., AllotOrFreeBed) to:Determine the bed and floor based on the checkbox that fired the event.
      • Change the checkbox’s appearance to visually indicate its allocation status.
      • Update a status label.
    • Implement a handler for the Reserve button, using GetControlFromPosition to modify the selected bed’s properties.

Code Example (AllotOrFreeBed):

C#

private void AllotOrFreeBed(object sender, EventArgs e)

{

    Control c = (Control)sender;

    TableLayoutPanelCellPosition position = contTable.GetPositionFromControl(c);

    int floorNumber = (position.Row > 1 && position.Row < 4) ? 2 : (position.Row < 2) ? 3 : 1;

 

    CheckBox chk = (CheckBox)sender;

    if (chk.Checked) 

    {

        chk.BackColor = Color.Yellow; 

        lblDisplay.Text = $”Bed Number {chk.Text} allocated on Floor {floorNumber}”;

    }

   else 

   {

       // … (reset appearance and update status)

   }

}

 

Tips and Considerations

  • Planning: Sketch your desired layout before coding.
  • Naming: Use meaningful names for controls and variables to improve code readability.

C# StatusStrip Control Explained

The StatusStrip control in C# Windows Forms applications is a versatile tool for displaying status information at the bottom of your windows. It’s ideal for providing:

  • Contextual updates (e.g., “Processing…”, “Ready”)
  • Progress indicators
  • Quick-view settings or data

In this guide, we’ll cover everything you need to know to use the StatusStrip control effectively.

Key Concepts

  • StatusStrip: The main container at the bottom of your form.
  • ToolStripStatusLabel: Individual slots within the StatusStrip to display text or other elements.
  • BorderStyle:  Decorates the edges of your status slots.
  • Spring Property: Makes a slot expand to fill the available space.
  • RenderMode: Controls the overall visual style of the StatusStrip.

Setting Up a Basic StatusStrip

  1. Create Project: Start a new Windows Forms Application project in Visual Studio.
  2. Add the Control: Locate the StatusStrip control in the Toolbox (under Menus & Toolbars) and drag it onto your form.
  3. Add Slots: Right-click the StatusStrip, select “Edit Items,” and add the desired number of ToolStripStatusLabel items. Give them meaningful names in the Properties window.

Example: A Multipurpose StatusStrip

Let’s imagine a form with these StatusStrip elements:

  • Slot 1: Current application state (“Idle”, “Processing”, etc.)
  • Slot 2: User settings (e.g., selected theme)
  • Slot 3: Progress bar (optional)

Code Examples

1. Setting Initial Text:

C#

private void Form1_Load(object sender, EventArgs e)

{

    toolStripStatusLabel1.Text = “Ready”;

    toolStripStatusLabel2.Text = “Theme: Default”;

}

 

2. Updating Status During a Task

C#

private void longRunningTaskButton_Click(object sender, EventArgs e)

{

    toolStripStatusLabel1.Text = “Processing…”;

 

    // Simulate a long-running task

    for (int i = 0; i < 100; i++)

    {

        Thread.Sleep(50);

        Application.DoEvents(); // Ensure UI updates

    }

 

    toolStripStatusLabel1.Text = “Ready”;

}

 

3. Customizing Appearance

C#

// Set border style

private void applyBorderStyleButton_Click(object sender, EventArgs e) 

{

    if (raisedOuterRadioButton.Checked) 

    {

        toolStripStatusLabel1.BorderStyle = Border3DStyle.RaisedOuter; 

    } else {

        toolStripStatusLabel1.BorderStyle = Border3DStyle.Etched; 

    }

}

 

// Toggle expanding behavior

private void springCheckbox_CheckedChanged(object sender, EventArgs e)

{

     toolStripStatusLabel2.Spring = springCheckbox.Checked;

}

 

Tips and Best Practices

  • Meaningful Names: Give your status slots descriptive names for better code readability.
  • Dynamic Updates: Use a timer or background thread to update the status during long-running processes.
  • Consider Progress Bars: For tasks with quantifiable progress, add a ToolStripProgressBar to your StatusStrip.

Conclusion

The C# StatusStrip control is a powerful way to enhance the usability and informativeness of your Windows Forms applications. Experiment with the different properties and options to create the perfect status display for your needs.

C# GroupBox Container Control Example

The GroupBox control in C# Windows Forms is a powerful tool for organizing and visually grouping related controls within your applications. This blog post will delve into the GroupBox, exploring its properties, uses, and how to effectively integrate it into your UI designs.

Understanding Container Controls

  • Container Controls: Containers in C# forms act as holders for other controls (like buttons, textboxes, etc.). They enable you to manage groups of controls collectively by applying common properties.
  • GroupBox as Container and Control: The GroupBox control uniquely serves as both a container for other controls and as a control itself within a parent container (e.g., your main form).

Example: Creating a User Preferences Form

Let’s imagine we’re building a user preferences section in our application. Here’s how GroupBoxes can be helpful:

  1. Main Form: The top-level container.
  2. Preferences GroupBox: A GroupBox on the main form titled “User Preferences.”
    • Nested GroupBoxes: Inside the Preferences GroupBox, we might have:”Theme Settings” GroupBox
    • “Notification Options” GroupBox

GroupBox Control Properties

  • Enabled: Enables/disables the GroupBox and all its contained controls.
  • Visible: Shows or hides the GroupBox and its contents.
  • BackColor: Sets the background color of the GroupBox and its child controls.
  • Font: Sets the font for the GroupBox’s title and the text of its child controls.
  • Text: The title displayed on the GroupBox.

Practical Code Examples

  1. Enabling/Disabling Options:
  2. C#
  3. private void enableOptionsCheckBox_CheckedChanged(object sender, EventArgs e)
  4. {
  5.     notificationOptionsGroupBox.Enabled = enableOptionsCheckBox.Checked;
  6. }

 

  1. Changing Background Color:
  2. C#
  3. private void themeColorButton_Click(object sender, EventArgs e)
  4. {
  5.     ColorDialog colorDialog = new ColorDialog();
  6.     if (colorDialog.ShowDialog() == DialogResult.OK)
  7.     {
  8.         themeSettingsGroupBox.BackColor = colorDialog.Color;
  9.     }
  10. }

 

  1. Showing/Hiding Sections:
  2. C#
  3. private void toggleNotificationsButton_Click(object sender, EventArgs e)
  4. {
  5.     notificationOptionsGroupBox.Visible = !notificationOptionsGroupBox.Visible;
  6.     toggleNotificationsButton.Text = notificationOptionsGroupBox.Visible ? “Hide Notifications” : “Show Notifications”; 
  7. }

Tips and Best Practices

  • Employ descriptive GroupBox titles to clearly indicate the purpose of the contained controls.
  • Nest GroupBoxes to create hierarchical organization within complex forms.
  • Use Enabled and Visible properties strategically to dynamically control sections of your UI.
  • Consider combining GroupBoxes with other container controls like Panels for refined layouts.

In Conclusion

The C# GroupBox control is a versatile tool for enhancing the structure and usability of your Windows Forms applications. By understanding its properties and how it interacts with other controls, you can create well-organized and intuitive user interfaces.

C# MenuStrip & ContextMenuStrip Controls

MenuStrip and ContextMenuStrip controls are essential building blocks for creating user-friendly, professional-looking Windows Forms applications in C#. This post will guide you through everything you need to know about these controls, from creating basic menus to advanced features like shortcuts, icons, and event handlers.

Key Concepts

  • MenuStrip: The main menu bar, typically located at the top of a window.
  • ContextMenuStrip: A pop-up menu that appears when the user right-clicks within a form.
  • MenuItems: Individual items within a menu.
  • Submenus: Nested menus that provide hierarchical organization.
  • Separators: Lines used to group menu items visually.
  • Shortcuts: Keyboard combinations for quick menu item access.
  • Icons: Small images that enhance menu item visual appeal.
  • Event Handlers: Code functions executed when a menu item is clicked.

Step-by-Step Guide

    • Creating a New ProjectOpen Visual Studio and create a new Windows Forms Application (.NET Framework) project.
    • Adding MenuStrip and ContextMenuStripDrag and drop the MenuStrip control from the Toolbox onto your form.
    • Drag and drop the ContextMenuStrip control onto your form. Notice that it doesn’t appear directly on the form, as it’s associated with form components.
    • Designing the Menu StructureClick on the MenuStrip and type the text for your top-level menus (e.g., “File“, “Edit“, “Help”).
    • Click inside a menu to add menu items.
    • For submenus, create additional menu items under a parent item.
    • Add separators by typing “-” as the menu item text.
      • Customizing AppearanceUse the Properties window to adjust:Text: The display text of menus and menu items.
      • Name: The code reference name.
      • ShortcutKeys: Define keyboard shortcuts (e.g., Ctrl+O for Open).
      • Image: Assign icons from your project’s resources.
    • Associating the Context MenuSelect a control on your form (e.g., a textbox, button, or the form itself).
    • In the Properties window, find the ContextMenuStrip property.
    • Select your created ContextMenuStrip from the dropdown.
    • Adding Event HandlersDouble-click a menu item in the design view to generate an event handler function.
    • Inside the handler, write code to execute when the item is clicked (e.g., opening dialogs, saving data, or exiting the application).

Example Code

C#

private void fileExitToolStripMenuItem_Click(object sender, EventArgs e)

{

    this.Close();

}

 

private void editCopyToolStripMenuItem_Click(object sender, EventArgs e)

{

    // Add your copy functionality here

}

Tips and Best Practices

  • Use standard menu naming conventions (File, Edit, View, etc.) for consistency.
  • Organize menu items logically, grouping related actions together.
  • Provide meaningful shortcuts that make sense for common actions.
  • Use icons sparingly to avoid visual clutter.
  • Test your menus and shortcuts thoroughly.

Conclusion

By following this guide, you’ll be well-equipped to build well-structured, user-friendly menus in your C# applications. If you’re looking for more advanced customization options, explore additional properties and events offered by these powerful controls.