Здравствуйте, Pavel Dvorkin, Вы писали:
I>>И это говорит человек, который знает! Винапи
PD>UpdateWindow заставляет немедленно выполниться обработчик WM_PAINT. А пока что там всего лишь один инвалидный прямоугольник шириной в 1 пиксель. После OnPaint он будет зарисован и флаг QS_PAINT в очереди сообщений снят.
...
PD>Последующие InvalidateRect + UpdateWindow аналогичным образом сработают на оставшиеся 3 линии.
PD>Контраргументы есть ?
Конечно. Сделай решение для общего случая — например прямоугольник с заливкой, маркерами, подписями к маркерам и ты поймешь почему такой способ не используется.
Здравствуйте, Ikemefula, Вы писали:
PD>>Контраргументы есть ?
I>Конечно. Сделай решение для общего случая — например прямоугольник с заливкой, маркерами, подписями к маркерам и ты поймешь почему такой способ не используется.
Я спросил про контраргументы насчет моего якобы незнания винапи , то есть как работает InvalidateRect и UpdateWindow. Есть что по этому поводу сказать ?
Здравствуйте, Pavel Dvorkin, Вы писали:
PD>Здравствуйте, samius, Вы писали:
PD>>>Это значит, что у тебя был не GDI. Direct3D по крайней мере тогда работал через DirectDraw. S>>О, наверное в те времена DirectDraw умел работать с 3D и GDI?
PD>HDC в DirectDraw получают иным способом, через directdraw surface
PD>http://programmersforum.ru/showthread.php?p=432552
PD>Ты просто, видимо, не в курсе всего этого.
Ты видимо не в курсе того, что если я делаю вызов DrawString по HDC, полученному у IDirect3DSurface, то работает именно GDI. Ты меня уговариваешь что GDI на самом деле не было и я не в курсе и заместо GDI работал DirectDraw. Если там DirectDraw где и учавствует — то только в процесе лока. GDI он собой никак не заменяет.
Здравствуйте, samius, Вы писали:
S>Ты видимо не в курсе того, что если я делаю вызов DrawString по HDC, полученному у IDirect3DSurface, то работает именно GDI. Ты меня уговариваешь что GDI на самом деле не было и я не в курсе и заместо GDI работал DirectDraw. Если там DirectDraw где и учавствует — то только в процесе лока. GDI он собой никак не заменяет.
Я всего лишь утверждаю, что при работе D3D работа шла через DirectDraw, Использует ли внутри себя DirectDraw GDI или нет и где именно — это другой вопрос. Да, использует.
Здравствуйте, samius, Вы писали:
PD>>Здравствуйте, Ikemefula, Вы писали:
I>>>А если надо будет чтото сложнее пустого прямоугольника рисовать ?
PD>>Речь в задаче ТС шла о резиновом контуре, только.
S>Речь в задаче ТС шла о том что бы убрать флики. R2_NOT резинкой флики полностью не исключить, даже если посылать на отрисовку отдельными гранями.
Флики мы с тобой уже обсудили, а здесь речь идет о другом. Просто Икемефулв решил мне задачу усложнить (что будет если...), ну я ему и ответил, что усложнение не рассматривается.
Здравствуйте, Pavel Dvorkin, Вы писали:
PD>Здравствуйте, samius, Вы писали:
S>>Ты видимо не в курсе того, что если я делаю вызов DrawString по HDC, полученному у IDirect3DSurface, то работает именно GDI. Ты меня уговариваешь что GDI на самом деле не было и я не в курсе и заместо GDI работал DirectDraw. Если там DirectDraw где и учавствует — то только в процесе лока. GDI он собой никак не заменяет.
PD>Я всего лишь утверждаю, что при работе D3D работа шла через DirectDraw, Использует ли внутри себя DirectDraw GDI или нет и где именно — это другой вопрос. Да, использует.
Я не пытаюсь с тобой спорить, использует ли DirectDraw GDI.
До этого ты утверждал что у меня не было GDI. Я настаиваю на том, что если делается вызов GDI, то работает GDI. А DirectDraw может оперировать лишь буферами и пикселформатами, в то время как кистями, шрифтами и т.п. он не владеет. Даже растровую развертку полигона сделать средствами DirectDraw не выйдет.
Здравствуйте, samius, Вы писали:
S>Я не пытаюсь с тобой спорить, использует ли DirectDraw GDI. S>До этого ты утверждал что у меня не было GDI.
Я утверждал, что ты работал через DirectDraw в том, что касается получения HDC. HDC у тебя не от GDI, а от DirectDraw. То есть это иной контекст. Используются ли при работе с ним средства от GDI — я не говорил вообще.
Здравствуйте, Pavel Dvorkin, Вы писали:
PD>Здравствуйте, samius, Вы писали:
S>>Я не пытаюсь с тобой спорить, использует ли DirectDraw GDI. S>>До этого ты утверждал что у меня не было GDI.
PD>Я утверждал, что ты работал через DirectDraw в том, что касается получения HDC. HDC у тебя не от GDI, а от DirectDraw. То есть это иной контекст. Используются ли при работе с ним средства от GDI — я не говорил вообще.
Иной контекст твого утверждения, я полагаю?
Это значит, что у тебя был не GDI. Direct3D по крайней мере тогда работал через DirectDraw.
Здравствуйте, samius, Вы писали:
PD>>Я утверждал, что ты работал через DirectDraw в том, что касается получения HDC. HDC у тебя не от GDI, а от DirectDraw. То есть это иной контекст. Используются ли при работе с ним средства от GDI — я не говорил вообще.
S>Иной контекст твого утверждения, я полагаю? S>
S>Это значит, что у тебя был не GDI. Direct3D по крайней мере тогда работал через DirectDraw.
S>Потому как контекст устройства там именно от GDI.
Что-то я уже вообще не понимаю. Ты согласился вроде, что там через DirectDraw идет ?
Ну вот тебе куски моего кода 10-летней давности
LPDIRECTDRAWSURFACE4 g_pDDSBack = NULL; // DirectDraw back surface
...
// Get a pointer to the back buffer
ddscaps.dwCaps = DDSCAPS_BACKBUFFER;
hRet = g_pDDSPrimary->GetAttachedSurface(&ddscaps, &g_pDDSBack);
...
g_pDDSBack->Blt(NULL, NULL, NULL, DDBLT_COLORFILL | DDBLT_WAIT, &ddbltfx);
...
if (g_pDDSBack->GetDC(&hdc) == DD_OK)
{
SetBkMode(hdc, TRANSPARENT);
HPEN hP = CreatePen(PS_SOLID, 1, RGB(255, 0, 0));
HPEN hPOld = (HPEN) SelectObject(hdc, hP);
// Small windowfor(int i = - 3; i < 4; i++)
for(int j = - 3; j < 4; j++)
{
if(i + DebLineY < 0 || j + DebLineX < 0)
continue;
COLORREF cr = GetPixel(hdc, j + DebLineX, i + DebLineY);
for(int a = 0; a < 8; a++)
for(int b = 0; b < 8; b++)
SetPixel(hdc, 400 + j*9+b, 200 + i*9+a, cr);
Как видишь, для получения этого hdc используется хоть и GetDC, но от LPDIRECTDRAWSURFACE4. Что не мешает потом вызывать SelectObject и SetBkMode
Здравствуйте, Pavel Dvorkin, Вы писали:
PD>Здравствуйте, samius, Вы писали:
PD>>>Я утверждал, что ты работал через DirectDraw в том, что касается получения HDC. HDC у тебя не от GDI, а от DirectDraw. То есть это иной контекст. Используются ли при работе с ним средства от GDI — я не говорил вообще.
S>>Иной контекст твого утверждения, я полагаю? S>>
S>>Это значит, что у тебя был не GDI. Direct3D по крайней мере тогда работал через DirectDraw.
S>>Потому как контекст устройства там именно от GDI.
PD>Что-то я уже вообще не понимаю. Ты согласился вроде, что там через DirectDraw идет ?
Через — это значит что DirectDraw вызывает Lock, заполняет некую структуру GDI, и возвращает HDC. Больше здесь DirectDraw ни за что не отвечает.
PD>Ну вот тебе куски моего кода 10-летней давности PD>
Здравствуйте, samius, Вы писали:
PD>>Как видишь, для получения этого hdc используется хоть и GetDC, но от LPDIRECTDRAWSURFACE4. Что не мешает потом вызывать SelectObject и SetBkMode
S>Не мешает лишь потому что DirectDraw корректно заполнил заголовок. Всю работу SelectObject и SetBkMode делает именно GDI.
А я спорю ? Делает GDI, делает. Я же всего-то сказал, что HDC ты получмшь он DD, и хотя он бесспорно HDC, но относится к поверхности, созданной иными средствами — DirectDraw. И блиттинг там свой —
Здравствуйте, Pavel Dvorkin, Вы писали:
PD>Здравствуйте, samius, Вы писали:
PD>>>Как видишь, для получения этого hdc используется хоть и GetDC, но от LPDIRECTDRAWSURFACE4. Что не мешает потом вызывать SelectObject и SetBkMode
S>>Не мешает лишь потому что DirectDraw корректно заполнил заголовок. Всю работу SelectObject и SetBkMode делает именно GDI.
PD>А я спорю ? Делает GDI, делает.
Я думал что ты споришь с тем, что там работает GDI.
>Я же всего-то сказал, что HDC ты получмшь он DD, и хотя он бесспорно HDC, но относится к поверхности, созданной иными средствами — DirectDraw. И блиттинг там свой —
GDI как раз поровну, чем там делана поверхность, хоть пальцем.
PD> STDMETHOD(Blt)(THIS_ LPRECT,LPDIRECTDRAWSURFACE, LPRECT,DWORD, LPDDBLTFX) PURE;
Логично, что там блиттинг свой
Re[4]: GDI+ быстрый вывод
От:
Аноним
Дата:
15.12.10 13:16
Оценка:
Здравствуйте, samius, Вы писали:
S>Взял форму из стандартного шаблона, внес изменения только в From1.cs (в дизайнере ничего не менял). S>
S>public partial class Form1 : Form
S>{
S> public Form1()
S> {
S> InitializeComponent();
S> Paint += Form1_Paint;
S> SetStyle(ControlStyles.ResizeRedraw, true);
S> //SetStyle(ControlStyles.OptimizedDoubleBuffer, true);
S> }
S> void Form1_Paint(object sender, PaintEventArgs e)
S> {
S> var rect = ClientRectangle;
S> using (var pen = new Pen(Color.Red, 50))
S> e.Graphics.DrawLine(pen, rect.Left, rect.Top, rect.Right, rect.Bottom);
S> }
S>}
S>
S>При запуске в винде с включенной опцией "Рисовать окно при перетаскивании", рисуется красная жирная линия с безбожным фликанием во время ресайза формы. Раскомментирование второй строчки SetStyle флики убирает. S>Первая строчка SetStyle нужна для того что бы организовать автоматическую перерисовку при ресайзе формы.
А если так
public partial class TestForm : System.Windows.Forms.Form
{
Point m_ChooseBegPos;
Point m_LastMouseLocation;
bool m_InChoosing;
public TestForm()
{
InitializeComponent();
Paint += Form1_Paint;
SetStyle(ControlStyles.ResizeRedraw, true);
SetStyle(ControlStyles.OptimizedDoubleBuffer, true);
}
void Form1_Paint(object sender, PaintEventArgs e) //или OnPaint(PaintEventArgs e) с вызовом base.OnPaint в конце
{
if(m_InChoosing)
using (var p = new Pen(Color.Red, 5))
{
Graphics gr = e.Graphics;
gr.DrawLine(p, m_ChooseBegPos, new Point(m_ChooseBegPos.X, m_LastMouseLocation.Y));
gr.DrawLine(p, m_ChooseBegPos, new Point(m_LastMouseLocation.X, m_ChooseBegPos.Y));
gr.DrawLine(p, new Point(m_ChooseBegPos.X, m_LastMouseLocation.Y), m_LastMouseLocation);
gr.DrawLine(p, new Point(m_LastMouseLocation.X, m_ChooseBegPos.Y), m_LastMouseLocation);
}
}
protected override void OnMouseDown(MouseEventArgs e)
{
m_ChooseBegPos = e.Location;
m_InChoosing = true;
base.OnMouseDown(e);
}
protected override void OnMouseUp(MouseEventArgs e)
{
m_InChoosing = false;
Invalidate();
base.OnMouseUp(e);
}
protected override void OnMouseMove(MouseEventArgs e)
{
m_LastMouseLocation = e.Location;
if (m_InChoosing)
{
Invalidate();
}
base.OnMouseMove(e);
}
}
то мерцает ещё особенно если форма на весь экран.
добавил
SetStyle(ControlStyles.AllPaintingInWmPaint, true);
Мерцания прекратились но всё ещё заметно как линии не успевают за курсором. в windows explorerе или любом графическом редакторе так сильно не отстают.
Здравствуйте, samius, Вы писали:
S>Я думал что ты споришь с тем, что там работает GDI.
Да нет... В конце концов где там что в ядре в win32k.sys + драйвер видеокарты — черт разберется.
>>Я же всего-то сказал, что HDC ты получмшь он DD, и хотя он бесспорно HDC, но относится к поверхности, созданной иными средствами — DirectDraw. И блиттинг там свой — S>GDI как раз поровну, чем там делана поверхность, хоть пальцем.
Верно, но свойства у этого HDC иные, недели у созданного через CreateCompatibleDC/GetDC, к примеру.
PD>> STDMETHOD(Blt)(THIS_ LPRECT,LPDIRECTDRAWSURFACE, LPRECT,DWORD, LPDDBLTFX) PURE; S>Логично, что там блиттинг свой
Здравствуйте, Pavel Dvorkin, Вы писали:
I>>Слушай, не смешно. Дохлый комп может швырять битмапы на экран с такой скоростью, что загрузка процессора в этом случае нисколько не растет
PD>Этим не процессор, а скорее всего видеокарта занимается.
В том то и дело. А вот если ты начнешь свои примитивы херачить, то аппаратное ускорение поможет только в GDI32. GDI+ это уже софтверный рендеринг, какие то клочки используют акселерацию от GDI32.
Так что твои мега-алгоритмы рисовавния пустых прямоугольников вполне могут кушать _больше_ процессора, нежели в случае с битмапами.
Здравствуйте, Аноним, Вы писали:
А>Здравствуйте, samius, Вы писали:
S>>Взял форму из стандартного шаблона, внес изменения только в From1.cs (в дизайнере ничего не менял).
S>>При запуске в винде с включенной опцией "Рисовать окно при перетаскивании", рисуется красная жирная линия с безбожным фликанием во время ресайза формы. Раскомментирование второй строчки SetStyle флики убирает. S>>Первая строчка SetStyle нужна для того что бы организовать автоматическую перерисовку при ресайзе формы.
А>А если так
А>
А>public partial class TestForm : System.Windows.Forms.Form
А>
да, так моргает
А>то мерцает ещё особенно если форма на весь экран. А>добавил А>SetStyle(ControlStyles.AllPaintingInWmPaint, true);
А>Мерцания прекратились но всё ещё заметно как линии не успевают за курсором. в windows explorerе или любом графическом редакторе так сильно не отстают.
Открыл Paint, там резиновая R2Not рамка, как Павел советует. И отстает от курсора, но меньше. И моргает.
Открыл Paint.NET, там рамка с затемнением. Не моргает, но отстает от курсора сильнее.
if (g_pDDSBack->GetDC(&hdc) == DD_OK)
{
..
// Small windowfor(int i = - 3; i < 4; i++)
for(int j = - 3; j < 4; j++)
{
if(i + DebLineY < 0 || j + DebLineX < 0)
continue;
COLORREF cr = GetPixel(hdc, j + DebLineX, i + DebLineY);
for(int a = 0; a < 8; a++)
for(int b = 0; b < 8; b++)
SetPixel(hdc, 400 + j*9+b, 200 + i*9+a, cr);
Ну и код, вложенность от 5 и выше и куча констант в коде Ты его один что ли писал ?
Re[6]: GDI+ быстрый вывод
От:
Аноним
Дата:
15.12.10 13:43
Оценка:
Здравствуйте, samius, Вы писали:
S>Открыл Paint, там резиновая R2Not рамка, как Павел советует. И отстает от курсора, но меньше. И моргает. S>Открыл Paint.NET, там рамка с затемнением. Не моргает, но отстает от курсора сильнее.