8. díl - Bitové operátory, odposlouchávání kláves, kreslení - ISIM

C# .NET Pro pokročilé Instant Messenger Bitové operátory, odposlouchávání kláves, kreslení - ISIM

ChatForm.cs

Taj se pošéfí odposlouchání kláves (změna tabu, zavření tabu).

Zajímavé je zde totok -> if (keyData == (Keys.Control | Keys.Shift | Keys.Tab)) -> | (OR) je tzv. bitový operátor logického součtu. Funguje to tak, že sečte jednotlivé bity a porovná je. Nejlepší je si to vyzkoušet například Console.WriteLine(3 | 2) co vypíše?

Logický součet | OR

3 -> 0101
2 -> 0011
     1000 -> 8

Je pak ještě logický součin & (AND) a non ekvivalence ^ (XOR) a známá negace ! (NOT)

Logický součin & AND

3 -> 0101
2 -> 0011
     0001 -> 1

Non ekvivalence ^

3 -> 0101
2 -> 0011
     0110 -> 6

A negace je jasná !1 = 0, !0 = 1

protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
{
        if (keyData == (Keys.Control | Keys.Shift | Keys.Tab))
        {
                if (chatTabs.SelectedIndex > 0)
                        chatTabs.SelectedIndex--;
                else
                        chatTabs.SelectedIndex = chatTabs.TabPages.Count - 1;
                return true;
        }
        else if (keyData == (Keys.Control | Keys.Tab))
        {
                if (chatTabs.SelectedIndex < chatTabs.TabPages.Count - 1)
                        chatTabs.SelectedIndex++;
                else
                        chatTabs.SelectedIndex = 0;
                return true;
        }

        if ((keyData == Keys.Escape) || (keyData == (Keys.Control | Keys.W)))
        {
                chatTabs.RemoveTab(chatTabs.SelectedTab);

                if (chatTabs.TabCount == 0)
                        this.Close();
        }

        return base.ProcessCmdKey(ref msg, keyData);
}

U TabControl komponenty je Vlastnost DrawMode když tam nastavíme OwnerDrawFixed můžeme v události DrawItem a ostatních Draw událostech kreslit co chceme. Já jsem si udělal takovýhle krásný kresleníčko.

private void chatTabs_DrawItem(object sender, DrawItemEventArgs e)
{
        if (e.Index == -1) return;

        using (Brush textBrush = new SolidBrush(Color.White))
        {
                ChatTabPage tab = (ChatTabPage)chatTabs.TabPages[e.Index];

                // Rámečky
                if ((e.State == DrawItemState.Selected) && ((tab.contact != null) || (tab.contact == null)))
                        e.Graphics.FillRectangle(Brushes.White, e.Bounds.Left, e.Bounds.Top, e.Bounds.Width, e.Bounds.Height);
                else if ((tab.contact != null) && (tab.contact.unreadedMessage == true))
                        e.Graphics.FillRectangle(Brushes.Orange, e.Bounds.Left, e.Bounds.Top, e.Bounds.Width, e.Bounds.Height);
                else
                        e.Graphics.FillRectangle(Brushes.LightGray, e.Bounds.Left, e.Bounds.Top, e.Bounds.Width, e.Bounds.Height);

                // Ikonka dostupnosti, případně psaní nepřečtené zprávy
                Bitmap image;
                if ((tab.contact != null) && (tab.contact.unreadedMessage == true))
                        image = new Bitmap(Global.appRunPath + "graphics" + Path.DirectorySeparatorChar + "messageIcon.png");
                else
                {
                        if (Global.OpenForms.mainForm.contactListView.Items.ContainsKey(tab.Name))
                                image = Global.Converter.GetContactAvailabilityImage(tab.contact.availability);
                        else
                                image = new Bitmap(Global.appRunPath + "graphics" + Path.DirectorySeparatorChar + "conferenceIcon.png");
                }

                e.Graphics.DrawImage(image, e.Bounds.Left + 5, e.Bounds.Top + 5, 12, 12);

                e.Graphics.DrawString(tab.contact.name.SortText(20), e.Font, Brushes.Black, e.Bounds.Left + 17, e.Bounds.Top + 3);
        }
}

 

  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?
Celkem (1 hlasů) :
55555


 



 

 

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í!