powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Использование Panel в DirectX
7 сообщений из 7, страница 1 из 1
Использование Panel в DirectX
    #38101239
Kokon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using Microsoft.DirectX;
using Microsoft.DirectX.Direct3D;
using System.Collections;

namespace WindowsFormsApplication1
{
    
    public partial class Form1 : Form
    {
        private Device device;
       
        public Form1()
        {
            this.SetStyle(ControlStyles.AllPaintingInWmPaint , true);
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {

        }       
        public void InitializeGraphics()
        {           
            PresentParameters pp= new PresentParameters();
            pp.Windowed = true;
            pp.SwapEffect = SwapEffect.Discard;
            pp.EnableAutoDepthStencil = true;
            pp.AutoDepthStencilFormat = DepthFormat.D16;
            pp.DeviceWindow = panel1;
            device = new Device(0, DeviceType.Hardware, panel1.Handle, CreateFlags.SoftwareVertexProcessing, pp);
           device.RenderState.Ambient = Color.Blue;
        }
        protected override void OnPaint(System.Windows.Forms.PaintEventArgs e)
        {
           /* device.Clear(ClearFlags.Target | ClearFlags.ZBuffer, Color.Aquamarine, 1.0f, 0);
            device.BeginScene();

            device.EndScene();

            device.Present();
            this.Invalidate(); */
        }
        private void panel1_Paint(object sender, PaintEventArgs e)
       {
           device.Clear(ClearFlags.Target | ClearFlags.ZBuffer, Color.Aquamarine, 1.0f, 0);
           device.BeginScene();
           
           device.EndScene();

           device.Present();
           panel1.Invalidate();         

       }
    }

    
}



Здравствуйте! Хочу организовать вывод DirectX не на форму, а на панель. Если использовать код в событии OnPaint панели, то она постоянно перерисовывается и при этом происходит постоянное мельтешение цвета, ну и естественно, если рисовать на ней что-нибудь, то ничего не работает. А если использовать код в событии OnPaint формы, то тогда все нормально, но кнопки, которые находятся на форме, сначала выглядят как белые прямоугольники, а принимают нормальный вид, только когда по ним кликнешь. Подскажите пожалуйста как это исправить.
...
Рейтинг: 0 / 0
Использование Panel в DirectX
    #38101331
Пётр Седов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 Kokon:
Kokon
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
        private void panel1_Paint(object sender, PaintEventArgs e)
       {
           device.Clear(ClearFlags.Target | ClearFlags.ZBuffer, Color.Aquamarine, 1.0f, 0);
           device.BeginScene();
           
           device.EndScene();

           device.Present();
           panel1.Invalidate();         

       }



Не знаток C#/WinForms, но, насколько я понимаю, надо убрать этот вызов. Потому что он помечает panel1 как требующую перерисовки, что в скором времени приводит к тому, что вызывается обработчик события panel1.Paint, то есть метод panel1_Paint. И так по кругу, до бесконечности, получается постоянная перерисовка:
KokonЕсли использовать код в событии OnPaint панели, то она постоянно перерисовывается
...
Рейтинг: 0 / 0
Использование Panel в DirectX
    #38101389
Kokon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
private void panel1_Paint(object sender, PaintEventArgs e)
       {
           device.Clear(ClearFlags.Target | ClearFlags.ZBuffer, Color.Aquamarine, 1.0f, 0);
           SetupCamera();

           device.BeginScene();
           device.VertexFormat = CustomVertex.PositionColored.Format;       
           angle += 0.01f;
           device.Transform.World = Matrix.RotationYawPitchRoll(angle / (float)Math.PI, angle / (float)Math.PI * 2.0f, angle / (float)Math.PI / 4.0f) * Matrix.Translation(0, 0, 0);
           Material boxM = new Material();
           boxM.Ambient = Color.White;
           boxM.Diffuse = Color.White;
           device.Material = boxM;
           Mesh ob = Mesh.Box(device, 2.0f, 2.0f, 2.0f);
           ob.DrawSubset(0);

           device.EndScene();
           device.Present();
           //panel1.Invalidate();
       }



Дело в том, что если написать такой код, т.е. когда рисуется какой-нибудь примитив, то если панель не перересовывается примитив один раз нарисуется и все, никаких других действий не будет. Просто если удалить панель и создание примитива сделать при перерисовки самой формы, то проблем нет, но ведь на форме еще и другие детали нужны(кнопочки, менюшки и т.д.), а получается что вся форма будет занята вьюпортом директа. А если "panel1.Invalidate();" не комментировать, как раз мельтешение идет. Я думаю может проблема в настройках девайса или в PresentParameters.
...
Рейтинг: 0 / 0
Использование Panel в DirectX
    #38101412
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
в обработчике Application.Idle рисовать нужно, в сети полно примеров
...
Рейтинг: 0 / 0
Использование Panel в DirectX
    #38101424
Kokon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Изопропилв обработчике Application.Idle рисовать нужно, в сети полно примеров

Попробовал, во вьюпорте в середине вращается куб и с этим обработчиком он делает это очень медленно и прерывисто. Я так понимаю, что событие onPaint в учебниках дано потому что оно работает с большой скоростью, которая обеспечивает гладкое движение(вращение, например). Т.е. нужно найти какое-то средство, которое бы позволяло обновлять сцену с такой же скорость как и onPaint.
...
Рейтинг: 0 / 0
Использование Panel в DirectX
    #38101445
Kokon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Разобрался, сделал через потоки. Вроде хорошо работает.
...
Рейтинг: 0 / 0
Использование Panel в DirectX
    #38101452
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Расчёт угла нельзя делать инкрементом, только от текущих показаний мультимедийного таймера.
...
Рейтинг: 0 / 0
7 сообщений из 7, страница 1 из 1
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Использование Panel в DirectX
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]