Vydělávej až 160.000 Kč měsíčně! Akreditované rekvalifikační kurzy s garancí práce od 0 Kč. Více informací.
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.

Lekce 3 - Modifikovaný ListView jako kontakt list a Mutex - ISIM

MainForm.cs

ListView

Designer

Properties

  • Name: contactListView
  • Dock: Fill // zaujme celé místo okýnka
  • Modifiers: Public // aby byla přístupná ze všady
  • MultiSelect: False // nechci vybírat více položek
  • View: Tile // se mi líbí nejvíc
  • OwnerDraw: true // vlastní kreslení itemů

Groups

  • onlineListViewGroup
  • offlineListVi­ewGroup

Code view

Tato metůdka zachycuje signál který se volá v SingleInstance díky Mutexu, ten zkontroluje, zda souhlasí a zobrazí okénko (aby se něco stalo, když klepu na soubor)

protected override void WndProc(ref System.Windows.Forms.Message m)
{
    if (m.Msg == Global.SingleInstance.WM_SHOWME)
        this.ShowForm();

    base.WndProc(ref m);
}

public void ShowForm()
{
    Show();
    WindowState = FormWindowState.Normal;
    Activate();
}

Při double clicku na položku se zobrazí okénko chatu:

private void contactListView_DoubleClick(object sender, EventArgs e)
{
    if (contactListView.SelectedItems.Count == 0)
        return;

    Global.ISIMFunctions.OpenChatForm(((contactListView.SelectedItems[0]) as ContactListViewItem).contact, true);
}

A takto si kreslím položci

private void contactListView_DrawItem(object sender, DrawListViewItemEventArgs e)
{
    if (e.ItemIndex == -1) return;

    ISIMContact contact = (contactListView.Items[e.ItemIndex] as ContactListViewItem).contact;

    using (Brush textBrush = new SolidBrush(Color.White))
    {
        Brush textColor = Brushes.Black;

        // rámeček
        if (((e.State & ListViewItemStates.Selected) == ListViewItemStates.Selected) || (e.Item.Selected == true))
        {
            e.Graphics.FillRectangle(Brushes.MediumSeaGreen, e.Bounds);
            e.Graphics.DrawRectangle(new Pen(Brushes.DarkGreen), e.Bounds.X, e.Bounds.Y, e.Bounds.Width - 1, e.Bounds.Height - 1);
            textColor = Brushes.White;
        }
        else if (contact.unreadedMessage == true)
        {
            e.Graphics.FillRectangle(Brushes.Orange, e.Bounds);
            e.Graphics.DrawRectangle(new Pen(Brushes.Red), e.Bounds.X, e.Bounds.Y, e.Bounds.Width - 1, e.Bounds.Height - 1);
        }
        else
            e.Graphics.FillRectangle(Brushes.White, e.Bounds);

        // avatar
        Bitmap contactAvatar = Global.Converter.GetContactAvatar(contact.id);
        if (contact.availability == Global.Availability.Offline)
            contactAvatar = Global.ISIMFunctions.MakeImageGrayscale(contactAvatar);

        e.Graphics.DrawImage(contactAvatar, e.Bounds.Left + 1, e.Bounds.Top + 1, 26, 26);

        contactAvatar.Dispose();

        // dostupnost, píše, nepřečtená zpráva
        Bitmap availabilityImage;
        if (contact.unreadedMessage == true)
            availabilityImage = new Bitmap(Global.appRunPath + "graphics" + System.IO.Path.DirectorySeparatorChar + "messageIcon.png");
        else
            availabilityImage = Global.Converter.GetContactAvailabilityImage(contact.availability);

        e.Graphics.DrawImage(availabilityImage, e.Bounds.Left + 5 + 25, e.Bounds.Top + 1, 12, 12);

        e.Graphics.DrawImage(Global.Converter.GetProtocolIcon(contact.protocol), e.Bounds.Left + 5 + 25, e.Bounds.Top + 1 + 13, 12, 12);

        e.Graphics.DrawString(contact.name, e.Item.Font, textColor, e.Bounds.Left + 2 + 40, e.Bounds.Top + 1);
    }
}

 

Všechny články v sekci
Programujeme vlastní Instant Messenger ::ISIM::
Přeskočit článek
(nedoporučujeme)
Interface pro kontakt, Adaptee Wrapper a komparátor - ISIM
Článek pro vás napsal David Jančík
Avatar
Uživatelské hodnocení:
1 hlasů
Autor je vášnivý programátor. Nezná slovo "nelze", nebojí se zkoušet nepoznané a pronikat do nových technologií.
Aktivity