Vydělávej až 160.000 Kč měsíčně! Akreditované rekvalifikační kurzy s garancí práce od 0 Kč. Více informací.
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í.

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

 

Předchozí článek
Konvert obrázků smajlíků do RTF , Safe Lock - ISIM
Všechny články v sekci
Programujeme vlastní Instant Messenger ::ISIM::
Přeskočit článek
(nedoporučujeme)
Upravené komponenty: TabControl, TabPage, RTB - ISIM
Článek pro vás napsal David Jančík
Avatar
Uživatelské hodnocení:
1 hlasů
Autor je vášnivý programátor. Nezná slovo "nelze", nebojí se zkoušet nepoznané a pronikat do nových technologií.
Aktivity