Diskuze: Barva okna
V předchozím kvízu, Test znalostí C# .NET online, jsme si ověřili nabyté zkušenosti z kurzu.

Tvůrce

Zobrazeno 48 zpráv z 48.
//= Settings::TRACKING_CODE_B ?> //= Settings::TRACKING_CODE ?>
V předchozím kvízu, Test znalostí C# .NET online, jsme si ověřili nabyté zkušenosti z kurzu.
Máš-li na mysli border - tak si jej nakresli sám...
Dají se nějak vybrat všechny položky v daném formu ?
Třeba když mám otevřený 2 formy, jednom mám třeba 5 buttonů, 8 inputů,
třeba kalendář atd.
a v tom druhým mám jeden button, dá se nějak udělat aby se po zmáčknutí
toho buttonu skrylo vše v prvním formu ?
tzn. abych nemusel dávat
textbox1.visible = false;
textbox2.visible = false;
button1.visible = false;
.
.
.
No, skryly se mi ale nechcou se mi zobrazit
Vychozí stav je false, když je chci ukázat tak mi to nejde
Button Click:
panelx.Visible = !panelx.Visible;
Místo Buttonu by se hodil CheckBox...
Checked Changed:
panelx.Visible = checkBox1.Checked;
Controls ?
Mám
private void button1_Click(object sender, EventArgs e)
{
Form1 form = new Form1();
if (textBox2.Text == "mujtext" && textBox1.Text == "jinytext")
{
form.panel3.Visible = !panel3.Visible;
this.Close();
}
}
Musíš mít:
několikrát
panel1.Controls.Add
a pak
Controls.Add(panel1);
Tvl - aby se ti to vykreslilo ve Formu...
Podívej se do designové části - tam to máš mít...
a co se mi tam mááá
vykreslííííííííííííííííííííííííííííííííít
?
Panel s Controly...
Do panelu si může kontroly napřidávat v designeru. Nemusí mít ani panel, stačí proiterovat kolekci Controls na Formu. Ale opět tu řešíme co si Dan myslí, že chce, a ne to, co potřebuje. Bylo by lepší, kdyby nám řekl co chce udělat.
hele teď ti fakt nerozumím
DO toho panelu jsem si natáhl pár věciček (buttony,inputy atp.), výchozí stav je Visible = false; a chci že když zmáčknu ve 2. formu tlačítko aby se mi v tom 1. nastavilo na visible = true;...
partial class MainForm
{
private System.ComponentModel.IContainer components = null;
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
private void InitializeComponent()
{
this.panel1 = new System.Windows.Forms.Panel();
this.SuspendLayout();
//
// panel1
//
this.panel1.Location = new System.Drawing.Point(0, 0);
this.panel1.Name = "panel1";
this.panel1.Size = new System.Drawing.Size(200, 100);
this.panel1.TabIndex = 0;
...
panel1.Controls.Add // několikrát
public partial class MainForm : Form
{
public MainForm()
{
InitializeComponent();
new Daughter(this).Show();
}
}
public partial class Daughter : Form
{
private MainForm mum = null;
public Daughter(MainForm mainForm)
{
InitializeComponent();
mum = mainForm;
}
private void Button1_Click(object sender, EventArgs e)
{
mum.panel1.Visible = !mum.panel1.Visible;
}
}
Hloupost.
Již jsem psal, že panel nemusí přidávat v kódu a když do něj v designeru natahá kontroly myší, tak to Add samozřejmě vygeneruje IDE za něj včetně všeho co jsi napsal.
Koukám, že se v tom docela ztrácí, tak mu nepiš takovéhle věci. Stačí vše jen naklikat myší a udělat na Formu veřejnou metodu TogglePanel(), tu pak zavolá odkudkoli. Metodu do formu si Neaktivní uživatel snad přidá. Ještě pro jistotu napíšu, že v ní bude něco jako:
panel.Visible = panel.Visible;
Jestli tohle nezafunguje, tak už mu vážně asi nic nepomůže.
Nezafunguje - nemáš tam negaci... Proč je to mé hloupost? Já již dávno nepoužívám autogeneraci - ale pochybuji, že Dan také...
Když mu to nefunguje, tak to prostě nemůže mít přidané,...
Jak poznáš v designu, že se ti to přidalo? V kódu na první pohled...
v designu když s tím panelem kousíček pohneš tak se ti posune vše co v něm je spolu s ním
Dal jsem
public void zobrazVse()
{
panel3.Visible = true;
}
...nejede
public partial class MainForm : Form
{
public MainForm()
{
InitializeComponent(); // zde musíš mít přidání panelu do controls a v něm jeho kontroly
new Daughter(this).Show();
}
}
public partial class Daughter : Form
{
private MainForm mum = null;
public Daughter(MainForm mainForm)
{
InitializeComponent();
mum = mainForm;
}
private void Button1_Click(object sender, EventArgs e)
{
mum.panel1.Visible = !mum.panel1.Visible;
}
}
Je to nesmysl - a ještě nastavuješ jen jednu hodnotu...
panel1.Visible = !panel1.Visible;
Dej tam:
public void PrepniPanel()
{
panel3.visible = !panel3.visible;
}
Tuhle metodu si dej do kódu formuláře. Pak na instanci toho formu (jak na ní voláš třeba Show() zavoláš PrepniPanel() a on zmizí nebo se zobrazí. To je celé.
matesax: Vykřičník jsem zapomněl, designer slouží k designu formu (nečekaně), proto pokud přes něj děláš aplikaci, měl bys ho používat. Jsi přeci pro ten jednoduchý kód, tak mu tu nevnucuj 100 řádků když může kliknout myší v nástroji, který je pro to ještě určený. Je vidět, že jsi nedělal složitější formulářovou aplikaci, ono by tě to přešlo.
No z designeru vyjede tolik zbytečností... Pokud dělám s designerem, nedělám s kódem - tak jsem to nenapsal...
Proč to dávat do metody?
Je to tu již snad 6X - takže opravdu nevím, kde hledat problém...
Dane pošli projekt - třeba přes Uložto...
Jestli máš problémy s přidáním metody do třídy, tak od toho tu jsou
tutoriály. Jinak už fakt nevím
Pošli kód (nejlépe Solution přes Uložto) - jinak na to nikdo nepřijde...
btw. Víš jak si mi radil nabarvit si ten border...no udělal jsem si to
prřes Picture box a na pozadí jsem dal barvu, jenže s oknem se nedá hejbat
(nečekaně ) Jak to
udělat aby to šlo ?
Nedělej to přes PictureBox - nedáváš-li tam obrázek - použij VB graphic -> Toolbox - VisualBasic PowerPacks.
Vyber si prvek, který bude posouvání ovládat a z jeho MouseDown/Click eventu pošli zprávu.
Tedy rozeberu ti to - nejprve si potřebné metody stáhni:
[DllImportAttribute("user32.dll")]
public static extern int SendMessage(IntPtr hWnd, int Msg, int wParam, int lParam);
[DllImportAttribute("user32.dll")]
public static extern bool ReleaseCapture();
Z jejich názvu lze pochopit o co GO - první pošle zprávu - druhá sejme (zachytí) aktuální stav.
Hodnoty "int Msg, int wParam, int lParam" se dozvíš z manuálu. Tedy:
public const int WM_NCLBUTTONDOWN = 0xA1, HT_CAPTION = 0x2;
[DllImportAttribute("user32.dll")]
public static extern int SendMessage(IntPtr hWnd, int Msg, int wParam, int lParam);
[DllImportAttribute("user32.dll")]
public static extern bool ReleaseCapture();
Zbývá již jen zachytit událost a poslat zprávu - tedy vytvoříme si na to metodu se parametrem kdo je spouštěč.
public MoveIsEnabled(IntPtr who)
{
ReleaseCapture();
SendMessage(who, WM_NCLBUTTONDOWN, HT_CAPTION, 0);
}
Tím pošleme spouštěče události a zprávy o akci, která se má vykonat... Celé se to dá krásně dát do objektu:
using System.Runtime.InteropServices;
using System;
public class MoveIsEnabled
{
public const int WM_NCLBUTTONDOWN = 0xA1, HT_CAPTION = 0x2;
[DllImportAttribute("user32.dll")]
public static extern int SendMessage(IntPtr hWnd, int Msg, int wParam, int lParam);
[DllImportAttribute("user32.dll")]
public static extern bool ReleaseCapture();
public MoveIsEnabled(IntPtr who)
{
ReleaseCapture();
SendMessage(who, WM_NCLBUTTONDOWN, HT_CAPTION, 0);
}
}
V místě, kde zachycuješ MouseDown event jen zavoláš tuto metodu s příslušným parametrem:
new MoveIsEnabled(Handle);
Přičemž Handle je vlastnost třídy Form... Něco nejasné?
Nebo hackni paint - to bude vůbec nejjedodušší a nejlehčí...
Zobrazeno 48 zpráv z 48.