3. díl - Modifikovaný ListView jako kontakt list a Mutex - ISIM

C# .NET Pro pokročilé Instant Messenger 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);
        }
}

 

  Aktivity (1)

Článek pro vás napsal David Jančík [sczdavos]
Avatar
Autor je vášnivý programátor v .NET C# a PHP. Nezná slovo "nelze", nebojí se zkoušet nepoznané a pronikat do nových technologií.

Jak se ti líbí článek?
Ještě nikdo nehodnotil, buď první!


 



 

 

Komentáře

Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zatím nikdo nevložil komentář - buď první!