Přidat otázku mezi oblíbenéZasílat nové odpovědi e-mailem C# - Kreslení a Refresh

Dobrý večer, pánové,

měl bych dotaz ohledně programování v C#. Dostal jsem za úkol ze školy udělat program, který nakreslí na plochu nějaký obrázek a ten pak bude pomocí kláves(případně buttonů) posouván po ploše. Zadání jsem si trochu rozšířil a tady nastal problém. Vytvořil jsem radio buttony, kterými vyberu téma, které chci vykreslit. Vykreslení se podaří, ale potom, když chci posouvat objekt po ploše, tak Refresh() jenom ukáže prázdnou plochu. Je to tím, že tam mám if, který reaguje na označení toho radio buttonu a ono to potom, když pracuji v jiném prostředí už neví, co tam vlastně bylo. Dále přikládám zdrojový kód:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace WFA_Kopecky
{
    public partial class frmKresleni : Form
    {
        public frmKresleni()
        {
            InitializeComponent();
        }

        int xPosition = 0;
        int yPosition = 0;
        int width = 0;
        int height = 0; 

        private void btnVykreslit_Click(object sender, EventArgs e)
        {
            

            if (rdbVesmir.Checked)
            {
                width = 213;
                height = 161;
                Graphics kp = this.pnlKresliciPlocha.CreateGraphics();
                kp.Clear(SystemColors.Control);
                Font myFont = new System.Drawing.Font("Palatino Linotype", 40, FontStyle.Bold);
                Brush TextBrush = new SolidBrush(Color.Black);
                kp.DrawString("Vesmír", myFont, TextBrush, 310, 5);
                kp.DrawImage(WFA_Kopecky.Properties.Resources.ufo, xPosition, yPosition, width, height);
                
            }

            else
            {
                if (rdbAkvarium.Checked)
                {
                    width = 175;
                    height = 162;
                    Graphics kp = this.pnlKresliciPlocha.CreateGraphics();
                    kp.Clear(SystemColors.Control);
                    Font myFont = new System.Drawing.Font("Palatino Linotype", 40, FontStyle.Bold);
                    Brush TextBrush = new SolidBrush(Color.Black);
                    kp.DrawString("Akvárium", myFont, TextBrush, 310, 5);
                    kp.DrawImage(WFA_Kopecky.Properties.Resources.fish, xPosition, yPosition, width, height);

                }

                else
                {
                    if (rdbOstrov.Checked)
                    {
                        width = 168;
                        height = 106;
                        Graphics kp = this.pnlKresliciPlocha.CreateGraphics();
                        kp.Clear(SystemColors.Control);
                        Font myFont = new System.Drawing.Font("Palatino Linotype", 40, FontStyle.Bold);
                        Brush TextBrush = new SolidBrush(Color.Black);
                        kp.DrawString("Ostrov", myFont, TextBrush, 310, 5);
                        kp.DrawImage(WFA_Kopecky.Properties.Resources.palm, xPosition, yPosition, width, height);

                    }

                    else
                    {
                        MessageBox.Show("Chyba!", "Nebylo vybráno téma kresby!", MessageBoxButtons.OK, MessageBoxIcon.Stop);
                    }
                }
            }


        }

        private void poziceXplus_Click(object sender, EventArgs e)
        {
            xPosition = xPosition + 10;
            Refresh();
        }

Předem děkuji za všechny Vaše reakce.

Předmět Autor Datum
To vykreslování bys měl dělat v události OnPaint panelu, na který to vykresluješ.
Wikan 24.11.2012 19:49
Wikan
To já vím. Ale tam potom nemůžu nijak ovlivnit, co to vykreslí. Tam můžu zadat jen něco, co se prove…
Fisherman 24.11.2012 19:56
Fisherman
Tam můžeš ovlivnit cokoliv a rozhodně se to neprovádí jenom při zapnutí, ale právě při každém překre…
Wikan 24.11.2012 19:57
Wikan
Nevím, jak by měl ten zdroják vypadat... Mohl bys nahodit? private void pnlVesmir_Paint(object sen…
Fisherman 24.11.2012 20:03
Fisherman
Po kliknutí na tlačítko si do nějaké datové struktury zapíšeš, co se má vykreslit. V téhle metodě to…
Wikan 24.11.2012 20:05
Wikan
Už jsem to vyřešil. Trošku jako si mi poradil a trochu jinak.. Ale měl bych otázku... Jak vytvořím…
Fisherman 24.11.2012 21:04
Fisherman
Na takhle obecně položený dotaz se dá jenom těžko odpovědět.
Wikan 24.11.2012 21:10
Wikan
Řekněme, že chci třeba vyhodit message box, když bude neznama = 1,3,5. a chci si předdefinovat Mes…
Fisherman 24.11.2012 21:22
Fisherman
Nejsem si jistý, jestli jsem tě pochopil. Ale pokud jsem tě pochopil dobře, tak by stačilo vytvořit…
Wikan 24.11.2012 21:28
Wikan
No, to slovo jsem chtěl slyšet :D Jak?
Fisherman 24.11.2012 21:37
Fisherman
DialogResult showMessageBox(string text, string caption) { return MessageBox.Show(text, caption, Mes…
Wikan 24.11.2012 21:41
Wikan
Programovat se učím. Loni jsme programovali v konzoli až teď v září jsme přešli na Formulářové aplik…
Fisherman 24.11.2012 21:44
Fisherman
To ale nemá s formulářovými aplikacemi nic společného. Metody jsi musel používat a tvořit vlastní i…
Wikan 24.11.2012 21:46
Wikan
Díky. Ještě bych se zeptal.. Na několika místech jsem hledal, jak to, co dělám tlačítky, dělat šipka…
Fisherman 24.11.2012 21:48
Fisherman
Dovolil bych si malý refresh.
Fisherman 25.11.2012 20:03
Fisherman
Pokud jsi tu událost přiřadil pouze k passwordinput, tak to bude reagovat pouze v tomhle prvku.
Wikan 25.11.2012 20:09
Wikan
to je pouze zkopírované z webu.. když místo passwordinput napíšu název framu, tak to bude fungovat…
Fisherman 25.11.2012 20:29
Fisherman
Na názvu nezáleží, důležité je to přiřadit správné komponentě. Pokud jsi to žádné nepřiřadil, tak už…
Wikan 25.11.2012 20:37
Wikan
Jak to té komponentě přiřadím? Jinak v odkazu jsem teda fakt moc nepobral.. Tam to pro mě byla tak t…
Fisherman 25.11.2012 20:45
Fisherman
Klikneš na komponentu, se kterou chceš pracovat. V okně vlastností (Properties) klikneš na ikonku bl…
Wikan 25.11.2012 20:51
Wikan
V životě jsem ty pojmy neslyšel. Vždycky jsme dělali jen takové jednoduché programy, kde jsme se uči…
Fisherman 25.11.2012 21:49
Fisherman
Aha, tak to by sis měl něco nastudovat o objektovém programování. Protože bez toho se moc nepohneš.
Wikan 25.11.2012 21:52
Wikan
Žeby SSPŠ p.uč Brabcová ? :D Zrovna v tuhle chvíli máme totiž úplně stejné zadání poslední
Smiky 26.11.2012 17:35
Smiky

Nevím, jak by měl ten zdroják vypadat...

Mohl bys nahodit?

private void pnlVesmir_Paint(object sender, PaintEventArgs e)
        {
            Graphics kp = e.Graphics;
            kp.Clear(SystemColors.Control);
            Font myFont = new System.Drawing.Font("Palatino Linotype", 40, FontStyle.Bold);
            Brush TextBrush = new SolidBrush(Color.Black);
            kp.DrawString("Vesmír", myFont, TextBrush, 310, 5);
            kp.DrawImage(WFA_Kopecky2.Properties.Resources.fish, xPosition, yPosition, width, height);
        }

Takhle to kreslím do panelu, ale nevím, jak mám ovlivnit, že po kliknutí na tlačítko, které změní obsah se mi obsah překreslí...

Řekněme, že chci třeba vyhodit message box, když bude neznama = 1,3,5.

a chci si předdefinovat

MessageBox.Show("hadbj", "hdbajsd", MessageBoxButtons.OK, MessageBoxIcon.Warning);

a potom jen vyvolat to, co jsem si už udělal

takže udělám:

switch(neznama)

case 1:

TO CHCI VĚDĚT
break;

case 3:

TO CHCI VĚDĚT
break;

case 5:

TO CHCI VĚDĚT
break;

abych nemusel všude opisovat to MessageBox...

Programovat se učím. Loni jsme programovali v konzoli až teď v září jsme přešli na Formulářové aplikace.

Neexistuje nějaká univerzální metoda? Kam bych mohl napsat nějaký postup, který bych potom vyvolal. Pokud na to koukám správně, tak to, co si mi poslal je vlastně metoda pouze pro vyhození MessageBoxu, tedy nic jiného tam nepůjde..

To ale nemá s formulářovými aplikacemi nic společného. Metody jsi musel používat a tvořit vlastní i v konzoli. A troufám si říct, že pokud to neumíš po roce, tak vlastně neumíš nic.

DialogResult showMB()
{
    return MessageBox.Show("text", "caption", MessageBoxButtons.OK, MessageBoxIcon.Warning);
}

Díky.
Ještě bych se zeptal.. Na několika místech jsem hledal, jak to, co dělám tlačítky, dělat šipkami na klávesnici. Narazil jsem na tohle:

private void passwordinput_KeyDown(object sender, KeyEventArgs e)
            if (e.KeyCode == Keys.Enter)
            {
                tady bych provedl, co chci
            }

když jsem tohle použil, tak program sice chybu nehlásil, ale po zmáčknutí klávesy se nic nedělo...

Jediné, co mi to dělalo, tak to, že jsem přeskakoval mezi tlačítky, které v programu jsou..

Klikneš na komponentu, se kterou chceš pracovat. V okně vlastností (Properties) klikneš na ikonku blesku (Events) a tam provedeš dvojklik v pravé části řádku KeyDown. Tím se ti v kódu vytvoří příslušná metoda.
A k tomu odkazu. Tušíš co je dědičnost, polymorfismus, přetěžování metod atd.?

V životě jsem ty pojmy neslyšel. Vždycky jsme dělali jen takové jednoduché programy, kde jsme se učili takové ty základy, jak udělat něco, co něco spočítá atp. Náhody, teď to kreslení atp.

Pokusím se ty klávesy vyřešit zítra, potom se ozvu, jestli se mi to povedlo rozchodit :) Děkuji.

Zpět do poradny Odpovědět na původní otázku Nahoru