IT rekvalifikace s garancí práce. Seniorní programátoři vydělávají až 160 000 Kč/měsíc a rekvalifikace je prvním krokem. Zjisti, jak na to!
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í.

3. diel - Modifikovaný ListView ako kontakt list a mutex - isim

MainForm.cs

ListView

designer

Properties

  • Name: contactListView
  • Dock: Fill // zaujme celé miesto okienka
  • Modifiers: Public // aby bola prístupná zo vsadí
  • Multiselect: False // nechcem vyberať viac položiek
  • View: Tile // sa mi páči najviac
  • OwnerDraw: true // vlastné kreslenie itemov

Groups

  • onlineListViewGroup
  • offlineListVi­ewGroup

code view

Táto metůdka zachytáva signál ktorý sa volá v Singleinstance vďaka mutex, ten skontroluje, či súhlasí a zobrazí okienko (aby sa niečo stalo, keď klopem na súbor)

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();
}

Pri double clicku na položku sa zobrazí okienko chate:

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žke

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);
    }
}

 

Predchádzajúci článok
Prítomnosť .NET 3.5 SP1 a mutex - isim
Všetky články v sekcii
Programujeme vlastné Instant Messenger :: isim ::
Preskočiť článok
(neodporúčame)
Interface pre kontakt, Adaptee Wrapper a komparátor - isim
Článok pre vás napísal David Jančík
Avatar
Užívateľské hodnotenie:
Ešte nikto nehodnotil, buď prvý!
Autor je vášnivý programátor. Nezná slovo "nelze", nebojí se zkoušet nepoznané a pronikat do nových technologií.
Aktivity