.NET: Helloworld usando o Managed Direct3D Mobile
Há dias estou estudando o Direct3D versão Mobile e Managed para dispositivos que suportam o .NET Compact Framework 2.0.
Hoje consegui escrever um Hello World e definir uma estrutura básica para renderizar o que for preciso. Veja o que foi feito abaixo.
Inicialização do Device
1 private void InitializeGraphics() 2 { 3 try 4 { 5 PresentParameters presentParams = new 6 PresentParameters(); 7 presentParams.Windowed = true; 8 presentParams.SwapEffect = 9 SwapEffect.Discard; 10 11 _device = new Device(0, 12 DeviceType.Default, 13 this, 14 CreateFlags.None, 15 presentParams); 16 17 _device.DeviceReset += 18 new EventHandler(OnResetDevice); 19 20 OnResetDevice(_device, null); 21 } 22 catch (Exception ex) 23 { 24 MessageBox.Show("Erro na inicialização: " + 25 ex.Message); 26 } 27 }
Este método será chamado no Main e inicializa a variável privada _device, portanto não esqueça de declará-la.
OnResetDevice (por enquanto inutilizado)
private void OnResetDevice(object sender, EventArgs e) { // }
Override do evento OnPaint
1 protected override void OnPaint(PaintEventArgs e) 2 { 3 Render(); 4 5 Invalidate(); 6 }
Sempre que for preciso redesenhar os elementos da interface, o próprio dispositivo chamará o método OnPaint. Portanto, é ele que deve ser sobrescrito para desenvolver a aplicação. Neste caso, o método Render() (veja o item abaixo) é que fará o desenho de tudo o que for preciso e o Invalidate(), do próprio framework, fará com que a janela seja redesenhada futuramente.
Método responsável por desenhar os objetos - Render()
1 private void Render() 2 { 3 _device.Clear(ClearFlags.Target, 4 Color.Red, 5 1.0f, 6 0); 7 8 _device.BeginScene(); 9 10 // Desenha alguma coisa... 11 12 _device.EndScene(); 13 _device.Present(); 14 }
Este é “o cara”. Ele é que fará o desenho de tudo o que for preciso na aplicação. Vale a pena lembrar que tudo o que deve ser desenhado deve estar entre o BeginScene() e o EndScene().
Método Main()
1 static void Main() 2 { 3 Form1 form = new Form1(); 4 5 form.InitializeGraphics(); 6 7 try 8 { 9 Application.Run(form); 10 } 11 catch (Exception ex) 12 { 13 MessageBox.Show("Erro ao iniciar a app: " + 14 ex.Message); 15 } 16 }
É aqui que a vida começa.
Workaround (leia-se: gambiarra)
Se você fizer tudo o que está escrito acima, ao rodar a aplicação, o dispositivo ficará piscando, como se estivesse redesenhando tudo a todo momento (e está). Para corrigir isso, faça o seguinte:
1 private void OnResetDevice(object sender, EventArgs e) 2 { 3 // 4 }
Resultado final
O resultado apresentado será este:

Ps: para tirar screenshots do emulador rodando, pressione Alt+PrintScreen (o Alt pode variar conforme a configuração da Host Key que pode ser acessada no emulador através do menu File / Configure / General / Host Key).




Olá… não vi a diferença no metodo onResetDevice, se puder mostrar aonde é agradeço…
Obrigado,
Paulo.