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