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.
To vykreslování bys měl dělat v události OnPaint panelu, na který to vykresluješ.
To já vím. Ale tam potom nemůžu nijak ovlivnit, co to vykreslí. Tam můžu zadat jen něco, co se provede hned po zapnutí programu.. Já právě chci vybrat ze 3 možností, co se na plochu vykreslí. Kdybych to udělal jednoduše, tak je to bez problému.
Tam můžeš ovlivnit cokoliv a rozhodně se to neprovádí jenom při zapnutí, ale právě při každém překreslení.
Nevím, jak by měl ten zdroják vypadat...
Mohl bys nahodit?
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í...
Po kliknutí na tlačítko si do nějaké datové struktury zapíšeš, co se má vykreslit. V téhle metodě to pak vykreslíš.
Už jsem to vyřešil. Trošku jako si mi poradil a trochu jinak..
Ale měl bych otázku... Jak vytvořím něco, co potom jen někde vyvolám?
Díky moc za radu.
Na takhle obecně položený dotaz se dá jenom těžko odpovědět.
Ř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...
Nejsem si jistý, jestli jsem tě pochopil. Ale pokud jsem tě pochopil dobře, tak by stačilo vytvořit jednoduchou jednořádkovou metodu.
No, to slovo jsem chtěl slyšet :D Jak?
Ale pokud tohle nevíš, tak ti chybí naprosté základy.
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.
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:
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..
Dovolil bych si malý refresh.
Pokud jsi tu událost přiřadil pouze k passwordinput, tak to bude reagovat pouze v tomhle prvku.
to je pouze zkopírované z webu..
když místo passwordinput napíšu název framu, tak to bude fungovat pro celé okno?
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ž to vůbec nemůže fungovat.
A možná bude ještě potřeba přetížit metodu IsInputKey.
http://msdn.microsoft.com/en-us/library/system.win dows.forms.control.isinputkey.aspx
Jak to té komponentě přiřadím? Jinak v odkazu jsem teda fakt moc nepobral.. Tam to pro mě byla tak trochu španělská vesnice...
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.
Aha, tak to by sis měl něco nastudovat o objektovém programování. Protože bez toho se moc nepohneš.
Žeby SSPŠ p.uč Brabcová ? :D Zrovna v tuhle chvíli máme totiž úplně stejné zadání