Användargränssnitt med Wimark Controls  

Kontrollen MonthCalendar

Kontrollen MonthCalendar visar en datumkalender där användaren kan välja ett eller fler datum. Kalendern är uppdelad i en eller flera vyer som representerar månader. Varje månadsvy består av en titelrad och en tabell.

I titelraden visas månad och år. Månaden kan ändras genom att klicka på texten och välja en ny månad från den meny som visas. Året kan ändras genom att klicka på texten och välja ett nytt år från den up-down kontroll som visas. Månadsvyn längst till vänster och längst till höger visas scroll-knappar för att navigera bakåt och framåt i tiden.

Tabellen visar månadens dagar samt eventuellt några av föregående och nästa månads dagar. Överst i tabellen visas en rubriklist med veckodagarna. Till vänster (till höger om informationen skrivs från höger till vänster) kan veckonummer visas (ShowWeekNumbers).

Viktiga datum kan markeras med en egen bakgrundsfärg och textfärg samt tilldelas ett eget tooltip. Dagens datum kan visas i kontrollens nedre del samt markeras i kalendern.

Kontrollen kan ställas in i tre moder som bestämmer hur användaren kan välja datum:


MonthCalendar som visar sex månader.

Bilden visar en MonthCalendar kontroll med sex månadsvyer. Dagens datum och veckonummer visas. Helgdagar har markerats med en röd textfärg.

MonthCalendar kontrollen har byggts ut och förbättrats en hel del jämfört med motsvarande kontroll i Microsoft .NET. Markerade datum representeras av en egen klass, BoldedDate, som stödjer tooltip, textfärg, bakgrundsfärg. Användaren kan välja flera datum som inte ligger efter varandra (Multi) och applikationen kan själv bestämma storlek och hantera utritning av datum.

Gränssnitt med egen utritning av datum.

Bilden visar en MonthCalendar kontroll där applikationen hanterar utritning av datum för att efterlikna Outlook. Den 14 juli visas ett möte som bokats in.

Kalendern kan göras aktiv för olika mus-händelser genom att lyssna på händelsen och ta reda på datumet med hjälp av HitTest metoden. Även menyn kan konfigureras under händelsen BeforeMenu.

Kod för att rita kalendern ovan:

// C#
private void monthCalendar2_MeasureDate(object sender, MeasureItemEventArgs e) {
    e.ItemHeight = 40;
    e.ItemWidth = 70;
}

private void monthCalendar2_DrawDate(object sender, DrawDateEventArgs e) {

    // Definiera var datumet skall skrivas ut.
    Rectangle textFillBounds = new Rectangle(e.Bounds.Left + 1, 
        e.Bounds.Top + 1, e.Bounds.Width - 2, e.Font.Height + 2);
    Rectangle textBounds = new Rectangle(e.Bounds.Left + 2, 
        e.Bounds.Top + 2, e.Bounds.Width - 4, e.Font.Height);

    // Rita bakgrunden.
    e.Graphics.FillRectangle(SystemBrushes.Window, e.Bounds);
    e.Graphics.DrawRectangle(Pens.Gray, e.Bounds.Left, 
        e.Bounds.Top - 1, e.Bounds.Width, e.Bounds.Height);
    Brush back = new SolidBrush(e.BackColor);
    e.Graphics.FillRectangle(back, textFillBounds);
    back.Dispose();

    // Definiera string format flags.
    StringFormat format = new StringFormat();
    format.LineAlignment = StringAlignment.Center;
    format.Trimming = StringTrimming.EllipsisCharacter;
    format.Alignment = StringAlignment.Far;

    // Skriv datumet.
    Brush fore = new SolidBrush(e.ForeColor);
    string pattern = "'den' d";
    if (e.Index == 0 || e.Date.Day == 1) pattern += " MMM";
    e.Graphics.DrawString(e.Date.ToString(pattern), 
          e.Font, fore, textBounds, format);
    fore.Dispose();

    // Rita markering för dagens datum.
    if (e.Date == monthCalendar2.TodayDate && monthCalendar2.ShowTodayCircle) {
      e.Graphics.DrawRectangle(Pens.Red, textFillBounds.Left, 
          textFillBounds.Top, textFillBounds.Width-1, textFillBounds.Height-1); 
    }

    // Rita fokus markering
    if (e.State == DrawItemState.Focus) {
      Pen focusPen = new Pen(SystemColors.ControlDarkDark);
      focusPen.DashStyle = DashStyle.Dot;
      e.Graphics.DrawRectangle(focusPen, textFillBounds.Left, 
          textFillBounds.Top, textFillBounds.Width-1, textFillBounds.Height-1);
      focusPen.Dispose();
    }

    // Markera in ett möte.
    if (e.Date == DateTime.Today.AddDays(-5)) {
      textBounds.Y = e.Bounds.Bottom - e.Font.Height - 4;
      format.Alignment = StringAlignment.Near;
      e.Graphics.DrawString("Möte: 7.00", 
          monthCalendar2.Font, Brushes.Red, textBounds, format);
    }
    format.Dispose();    
}

Kort beskrivning av klasserna:

Klass Beskrivning
MonthCalendar Representerar en kontroll som visar en datumkalender uppdelad i månader.
BoldedDate Representerar ett markerat datum i MonthCalendar kontrollen.
MonthCalendar.HitTestInfo Information som returneras av HitTest metoden i MonthCalendar kontrollen.
MonthCalendar.BoldedDateCollection Representerar en lista med markerade datum i MonthCalendar kontrollen.
MonthCalendar.SelectedDateCollection Representerar en lista med valda datum i MonthCalendar kontrollen.

För mer information

Wimark.Controls Namespace | MonthCalendar Class