.[ ČeskéHry.cz ].
WndProc :: ColorDialog
Jdi na stránku 1, 2  Další
 
odeslat nové téma   Odpovědět na téma    Obsah fóra České-Hry.cz -> .NET
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ň

PříspěvekZaslal: 10. prosinec 2011, 16:04:10    Předmět: WndProc :: ColorDialog Odpovědět s citátem

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
Zobrazit informace o autorovi Odeslat soukromou zprávu
Yossarian



Založen: 28. 07. 2007
Příspěvky: 274
Bydliště: Šalingrad

PříspěvekZaslal: 10. prosinec 2011, 16:10:27    Předmět: Odpovědět s citátem

nechapu tu tvoji strukturu MDI oken, nicmene, prvni hint co me napadl:

k tomudle nepotrebujes overridovat wndproc, staci ti OnPaint().
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
VODA



Založen: 29. 07. 2007
Příspěvky: 1721
Bydliště: Plzeň

PříspěvekZaslal: 10. prosinec 2011, 16:12:59    Předmět: Odpovědět s citátem

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
Zobrazit informace o autorovi Odeslat soukromou zprávu
VODA



Založen: 29. 07. 2007
Příspěvky: 1721
Bydliště: Plzeň

PříspěvekZaslal: 10. prosinec 2011, 16:22:17    Předmět: Odpovědět s citátem

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
Zobrazit informace o autorovi Odeslat soukromou zprávu
VODA



Založen: 29. 07. 2007
Příspěvky: 1721
Bydliště: Plzeň

PříspěvekZaslal: 10. prosinec 2011, 17:39:09    Předmět: Odpovědět s citátem

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
Zobrazit informace o autorovi Odeslat soukromou zprávu
Ladis



Založen: 18. 09. 2007
Příspěvky: 1533
Bydliště: u Prahy

PříspěvekZaslal: 10. prosinec 2011, 17:50:20    Předmět: Odpovědět s citátem

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 Wink.
_________________
Award-winning game developer
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
VODA



Založen: 29. 07. 2007
Příspěvky: 1721
Bydliště: Plzeň

PříspěvekZaslal: 10. prosinec 2011, 18:10:13    Předmět: Odpovědět s citátem

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 Wink.

Hej, to mě nenapadlo, že by v MDI mohla být společná fronta zpráv...
(Mohl jsi to říci rovnou... Wink )
_________________
Opravdovost se pojí s trýzní...
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Mnemonic



Založen: 28. 07. 2007
Příspěvky: 93

PříspěvekZaslal: 11. prosinec 2011, 10:27:31    Předmět: Odpovědět s citátem

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
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovi WWW stránky
rezna



Založen: 27. 07. 2007
Příspěvky: 2156

PříspěvekZaslal: 11. prosinec 2011, 11:06:38    Předmět: Odpovědět s citátem

OnPaint() funguje, ale je taky treba volat spravne Invalidate() ze Wink
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
VODA



Založen: 29. 07. 2007
Příspěvky: 1721
Bydliště: Plzeň

PříspěvekZaslal: 11. prosinec 2011, 13:10:16    Předmět: Odpovědět s citátem

To je možné. Wink

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
Zobrazit informace o autorovi Odeslat soukromou zprávu
rezna



Založen: 27. 07. 2007
Příspěvky: 2156

PříspěvekZaslal: 11. prosinec 2011, 13:35:33    Předmět: Odpovědět s citátem

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
Zobrazit informace o autorovi Odeslat soukromou zprávu
Mnemonic



Založen: 28. 07. 2007
Příspěvky: 93

PříspěvekZaslal: 11. prosinec 2011, 15:14:31    Předmět: Odpovědět s citátem

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 Smile </offtopic>
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovi WWW stránky
VODA



Založen: 29. 07. 2007
Příspěvky: 1721
Bydliště: Plzeň

PříspěvekZaslal: 11. prosinec 2011, 15:59:18    Předmět: Odpovědět s citátem

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... Wink
_________________
Opravdovost se pojí s trýzní...
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
perry



Založen: 28. 07. 2009
Příspěvky: 879

PříspěvekZaslal: 11. prosinec 2011, 16:02:37    Předmět: Odpovědět s citátem

Mě se třeba ve WinAPI tohle píše lépe než v C# Smile Ale nadávat na Visualko.. tststs
_________________
Perry.cz
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovi WWW stránky
perry



Založen: 28. 07. 2009
Příspěvky: 879

PříspěvekZaslal: 11. prosinec 2011, 16:07:47    Předmět: Odpovědět s citátem

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... Wink


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 Smile
_________________
Perry.cz
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovi WWW stránky
Zobrazit příspěvky z předchozích:   
odeslat nové téma   Odpovědět na téma    Obsah fóra České-Hry.cz -> .NET Časy uváděny v GMT + 1 hodina
Jdi na stránku 1, 2  Další
Strana 1 z 2

 
Přejdi na:  
Nemůžete odesílat nové téma do tohoto fóra
Nemůžete odpovídat na témata v tomto fóru
Nemůžete upravovat své příspěvky v tomto fóru
Nemůžete mazat své příspěvky v tomto fóru
Nemůžete hlasovat v tomto fóru


Powered by phpBB © 2001, 2005 phpBB Group


Vzhled udelal powermac
Styl "vykraden" z phpBB stylu MonkiDream - upraveno by rezna