Triko zdarma Triko zdarma
Spouštíme individuální výuku programování! Zaváděcí slevy 799 Kč 499 Kč/60 minut se zkušeným lektorem! Výuka osobně Praha a okolí nebo po Skype celá ČR. O termíny a slevu si pište na [email protected]rk.cz.
Extra 10 % bodů navíc a tričko zdarma při zadání kódu "TRIKO10"

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.7.2018 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.7.2018 13:13
Avatar
Odpovídá na 12350
Erik Šťastný:24.7.2018 13:20

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

Editováno 24.7.2018 13:21
 
Odpovědět 24.7.2018 13:20
Avatar
David Jančík
Tým ITnetwork
Avatar
David Jančík:24.7.2018 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.7.2018 13:40
Zapomeň, že je to nemožné a udělej to ;)
Avatar
12350
Člen
Avatar
Odpovídá na Erik Šťastný
12350:26.7.2018 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.7.2018 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.