Black Friday Black Friday
Black Friday výprodej! Až 80 % extra bodů zdarma! Více informací zde

Lekce 8 - 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

ONEbit hosting Unicorn College Tento obsah je dostupný zdarma v rámci projektu IT lidem. Vydávání, hosting a aktualizace umožňují jeho sponzoři.

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

 

 

Článek pro vás napsal David Jančík
Avatar
Jak se ti líbí článek?
1 hlasů
Autor je vášnivý programátor a vizionář. Nezná slovo "nelze", nebojí se zkoušet nepoznané a pronikat do nových technologií.
Aktivity (1)

 

 

Komentáře

Avatar
12350
Člen
Avatar
12350:24. července 13:13

No já ti teda nevím.
Krom toho, že máš blbě převod na binárku, tak i ten OR je špatně naznačen ;)
3 -> 0011, 2 -> 0010.
0101 | 0011 = 0111 (5 OR 3 = 7). Je to logický součet, takže 1 OR 1 = 0 (nikoliv 10).
Chybička se vloudila :)

 
Odpovědět 24. července 13:13
Avatar
Odpovídá na 12350
Erik Šťastný:24. července 13:20

0b1 | 0b1 = 0b1 a ne 0b0 ;)

Editováno 24. července 13:21
 
Odpovědět 24. července 13:20
Avatar
David Jančík
Tým ITnetwork
Avatar
David Jančík:24. července 13:40

Připravujeme se tyto a další články, jejichž kvalita není dostačující, nebo jejichž obsah je již zastaralý a nevyplatí se nám je aktualizovat, přesunout mimo hlavní obsah sítě.

Odpovědět 24. července 13:40
Čím více času dostaneš, tím méně ho máš.
Avatar
12350
Člen
Avatar
Odpovídá na Erik Šťastný
12350:26. července 9:18

Hehe pravda, pravda. I já udělal chybu.
Samozřejmě 1 OR 1 = 1. Ať už binárně nebo decimálně.
Teď otázka, jestli to byl překlep, nebo jsem v ten moment vypnul :)

 
Odpovědět 26. července 9:18
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.

Zobrazeno 4 zpráv z 4.