Zobrazit předchozí téma :: Zobrazit následující téma |
Autor |
Zpráva |
VODA
Založen: 29. 07. 2007 Příspěvky: 1721 Bydliště: Plzeň
|
Zaslal: 10. prosinec 2011, 16:04:10 Předmět: WndProc :: ColorDialog |
|
|
Zdravím, snažím se dokončit projekt do školy, ale s další novou fíčurou přestávají fungovat ty starší, vždy se mi to podařilo vyřešit s malou pomocí pana Googla, ale teď jsem, v koncích.
Zkrátka, mám několik MDI oken, jedno z nich je pro render scény, druhé pro výběr štětce.
Aby se mi to pěkně renderovalo, tak jsem overridnul WndProc a odchytávám WM_PAINT, při kterém volám vykreslovací metodu.
Jenže když si v jiném MDI vyvolám ColorDialog, tak se nezobrazí, zablokují se ostatní okna, nelze nic dělat, protože k tomu ColorDialogu se dostat nemohu, ale renderovací okno se stále překresluje...
Zkoušel jsem po dobu výběru barvy vypínat rendering, ale vždycky lze vybrat barvu jen na poprvé a pak se renderovací okno přestane překreslovat navždy...
Pro ukázku, takhle vypadá WndProc:
kód: |
protected override void WndProc(ref Message m)
{
switch (m.Msg)
{
case Windows.WM_PAINT:
render();
break;
default:
base.WndProc(ref m); break;
}
} |
No a kód na změnu barvičky:
kód: |
private void button1_Click(object sender, EventArgs e)
{
if (renderWindow != null)
{
if (dlgColor.ShowDialog() == System.Windows.Forms.DialogResult.OK)
{
renderWindow.setBrushColor(dlgColor.Color);
button1.BackColor = dlgColor.Color;
}
}
} |
Asi dostatečně dobře nerozumím tomu Microsoftímu zmetku...
Díky za rady. _________________ Opravdovost se pojí s trýzní... |
|
Návrat nahoru |
|
|
Yossarian
Založen: 28. 07. 2007 Příspěvky: 274 Bydliště: Šalingrad
|
Zaslal: 10. prosinec 2011, 16:10:27 Předmět: |
|
|
nechapu tu tvoji strukturu MDI oken, nicmene, prvni hint co me napadl:
k tomudle nepotrebujes overridovat wndproc, staci ti OnPaint(). |
|
Návrat nahoru |
|
|
VODA
Založen: 29. 07. 2007 Příspěvky: 1721 Bydliště: Plzeň
|
Zaslal: 10. prosinec 2011, 16:12:59 Předmět: |
|
|
Jsem to řekl úplně špatně, mám jen jedno MDI, a to obsahuje okýnka pro rendering a výběr štětce...
Sorry za matení veřejnosti... _________________ Opravdovost se pojí s trýzní... |
|
Návrat nahoru |
|
|
VODA
Založen: 29. 07. 2007 Příspěvky: 1721 Bydliště: Plzeň
|
Zaslal: 10. prosinec 2011, 16:22:17 Předmět: |
|
|
Zkusil jsem OnPaint a okno se překresluje jen tehdy, pokud přes něj jezdím jiným oknem, narozdíl od WndProc, kdy se to renderuje furt...
EDIT: Možná bych měl zmínit, že renderuji to okno přes OpenGL... _________________ Opravdovost se pojí s trýzní... |
|
Návrat nahoru |
|
|
VODA
Založen: 29. 07. 2007 Příspěvky: 1721 Bydliště: Plzeň
|
Zaslal: 10. prosinec 2011, 17:39:09 Předmět: |
|
|
Nakonec jsem se vykašlal na WndProc a na vše ostatní a udělal jsem sice to nejhorší, co jsem udělat mohl, ale jediné fungující...timer, 10 ms tikání a render na událost, je to editor, takže těch 10ms je zatím ok. _________________ Opravdovost se pojí s trýzní... |
|
Návrat nahoru |
|
|
Ladis
Založen: 18. 09. 2007 Příspěvky: 1536 Bydliště: u Prahy
|
Zaslal: 10. prosinec 2011, 17:50:20 Předmět: |
|
|
Jestli všechny okna jdou přes jednu smyčku zpráv, tak bys asi u chytání WM_PAINT měl testovat, pro které okno je. Jinak řešení timerem také schvaluju . _________________ Award-winning game developer |
|
Návrat nahoru |
|
|
VODA
Založen: 29. 07. 2007 Příspěvky: 1721 Bydliště: Plzeň
|
Zaslal: 10. prosinec 2011, 18:10:13 Předmět: |
|
|
Ladis napsal: |
Jestli všechny okna jdou přes jednu smyčku zpráv, tak bys asi u chytání WM_PAINT měl testovat, pro které okno je. Jinak řešení timerem také schvaluju . |
Hej, to mě nenapadlo, že by v MDI mohla být společná fronta zpráv...
(Mohl jsi to říci rovnou... ) _________________ Opravdovost se pojí s trýzní... |
|
Návrat nahoru |
|
|
Mnemonic
Založen: 28. 07. 2007 Příspěvky: 93
|
Zaslal: 11. prosinec 2011, 10:27:31 Předmět: |
|
|
Já už teda v .NETu moc nedělám, ale IMO lepší než timer je použít událost Application.Idle. Musí se teda použít trocha interopu, aby se zjistilo, jestli je ve frontě nějaká událost.
Takhle jsem to měl udělaný:
kód: |
Application.Idle += new EventHandler(OnAppIdle);
|
kód: |
//////////////////////////////////////////////////////////////////////////
private void OnAppIdle(object sender, EventArgs e)
{
if (IsFormActive && !SuspendedRendering)
{
while (AppStillIdle) PaintFrame(null);
}
}
//////////////////////////////////////////////////////////////////////////
private bool AppStillIdle
{
get
{
NativeMethods.PeekMsg msg;
return !NativeMethods.PeekMessage(out msg, IntPtr.Zero, 0, 0, 0);
}
}
|
|
|
Návrat nahoru |
|
|
rezna
Založen: 27. 07. 2007 Příspěvky: 2156
|
Zaslal: 11. prosinec 2011, 11:06:38 Předmět: |
|
|
OnPaint() funguje, ale je taky treba volat spravne Invalidate() ze |
|
Návrat nahoru |
|
|
VODA
Založen: 29. 07. 2007 Příspěvky: 1721 Bydliště: Plzeň
|
Zaslal: 11. prosinec 2011, 13:10:16 Předmět: |
|
|
To je možné.
Ani nevíte, jak moc mě jebe něco programovat v C# (resp. ve Visual Studiu)... je tu toho sice spoustu napsaného, dělat okénka a komponenty lze také docela slušně a rychle... ale kdyby šel z okna vyhazovat software (nerad bych zničil notebook), tak už jsem to dávno udělal... _________________ Opravdovost se pojí s trýzní... |
|
Návrat nahoru |
|
|
rezna
Založen: 27. 07. 2007 Příspěvky: 2156
|
Zaslal: 11. prosinec 2011, 13:35:33 Předmět: |
|
|
mno sorry - ale tohle bys musel resit i prgani v cistem WinAPI - stejne pokud nezavolas Invalidate() tak se zase nebude v urcitych situacich volat WM_PAINT ...
tady je to akorat zabalene do metod - tzn. misto chytani zpravy WM_PAINT ohandlujes OnPaint() - uvnitr je to porad stejne ... |
|
Návrat nahoru |
|
|
Mnemonic
Založen: 28. 07. 2007 Příspěvky: 93
|
Zaslal: 11. prosinec 2011, 15:14:31 Předmět: |
|
|
rezna: Myslím, že když ho takhle irituje C#, při prgání v čitým WinAPI už by dávno spáchal rituální sebevraždu </offtopic> |
|
Návrat nahoru |
|
|
VODA
Založen: 29. 07. 2007 Příspěvky: 1721 Bydliště: Plzeň
|
Zaslal: 11. prosinec 2011, 15:59:18 Předmět: |
|
|
Proto se věnuji tvorbě her, protože k tomu žádné WinApi, C# a Win<jakákoliv jiná srajda> nepotřebuji...
A když už, tak abych to neviděl... _________________ Opravdovost se pojí s trýzní... |
|
Návrat nahoru |
|
|
perry
Založen: 28. 07. 2009 Příspěvky: 879
|
Zaslal: 11. prosinec 2011, 16:02:37 Předmět: |
|
|
Mě se třeba ve WinAPI tohle píše lépe než v C# Ale nadávat na Visualko.. tststs _________________ Perry.cz |
|
Návrat nahoru |
|
|
perry
Založen: 28. 07. 2009 Příspěvky: 879
|
Zaslal: 11. prosinec 2011, 16:07:47 Předmět: |
|
|
VODA napsal: |
Proto se věnuji tvorbě her, protože k tomu žádné WinApi, C# a Win<jakákoliv jiná srajda> nepotřebuji...
A když už, tak abych to neviděl... |
No na obsluhu klávesnice se to dá používat... je pravda že píšu pod DX, tam je to jaksi s woknama dost provázané v tomhle směru (DirectInput je nepoužitelný kšunt).. OpenGl to asi má nějak řešené po svém _________________ Perry.cz |
|
Návrat nahoru |
|
|
|