2015-12-29 5 views
1

Я пытаюсь нарисовать синусоидальную волну, используя win32 api. Я сделал это.draw cartesian system using win32 api

hDC = GetDC(hWnd); 

while (TRUE) 
{ 
    while (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)) 
    { 
     DispatchMessage(&msg); 
    } 

    if (msg.message == WM_QUIT) 
     break; 

    wavefunc(hWnd, hDC); 
} 

void wavefunc(HWND hWnd, HDC hDC) 
{ 
    double full = 2 * pi * _freq; 
    static double _x = 0; 
    short int _y = 0; 

    short _y = (short)(sin(_x/_freq)*_amp) + 300; 
    if (_x >= full) 
     _x -= full; 
    SetPixel(hDC, 600, _y, blue); 
    ScrollWindow(hWnd, -1, 0, NULL, NULL); 
    Sleep(_sTime); 
    _x++; 
} 

Теперь я пытаюсь выяснить, как нарисовать декартовую систему. Но без результата.

У меня есть окно, которое прокручивается при каждом значении sin.

Я стараюсь рисовать линии на hdc. Когда прокручивается окно, невозможно остановить hdc, чтобы не прокручивать.

Затем я создаю еще один hDc из окон, но не удастся. Как это сделать? Проблема состоит в том, чтобы иметь прокрутку окна, но с некоторыми исправлениями точки.

+0

Windows выполняет все переводы для вас, предполагая, что ваш экран просмотра настроен правильно (см. [SetViewportExtEx] (https://msdn.microsoft.com/en-us/library/dd145098.aspx) и [SetViewportOrgEx] (https://msdn.microsoft.com/en-us/library/dd145099.aspx)). Это подробно объясняется в [Трансформация пространств координат] (https://msdn.microsoft.com/en-us/library/dd145139.aspx). – IInspectable

+0

Я не думаю, что это то, что я хочу ... Я хочу только нарисовать две фиксированные линии ... – user5692672

+3

Это легкая часть: [MoveToEx] (https://msdn.microsoft.com/en-us/library /dd145069.aspx) и [LineTo] (https://msdn.microsoft.com/en-us/library/dd145029.aspx). Если вы хотите сделать вашу жизнь труднее, чем она должна быть, вычислите отображение координат мира на координаты устройства самостоятельно. Или система сделает это за вас (как упоминалось в моем предыдущем комментарии). – IInspectable

ответ

2

Способ сделать это - все сразу рисовать: очистить окно, нарисовать сетку, а затем нарисовать всю форму волны (а не только следующую точка) по сетке. Чтобы выполнить прокрутку осциллограммы, вы продолжаете перерисовку с другим смещением для формы волны.

Чтобы избежать мерцания, вам, вероятно, понадобится сделать двойную буферизацию.

Типичные программы WinAPI закрашивают окно при обработке команды WM_PAINT. Сообщение WM_PAINT генерируется, когда какое-либо или все окна являются недопустимыми и их необходимо перекрасить. Каждый раз, когда вы прокручиваете окно, вы создаете недопустимый регион, но поскольку вы игнорируете сообщение WM_PAINT, ничего не происходит.

+0

, который работает частично. Из-за очень быстрой скорости изображение Intermittent – user5692672

+1

Вот почему я написал: «Чтобы избежать мерцания, вы, похоже, должны сделать некоторую двойную буферизацию». –

+0

ОК. Я понимаю, что я говорю. очень хороший пункт. – user5692672

2

Вот как я бы анимировать функцию sin():

Создание растрового изображения (размер окна) и нарисовать свои статические части на ней (ось, название, этикетки и т.д.).

Создайте еще одно растровое изображение (высота вашего греха() и ширину вашего окна + ширину периода sin() в вашем масштабе) и нарисуйте на нем sin().

В wavefunc(), получить точное время и рассчитать смещение для вашего растрового изображения.

Используйте функцию BitBlt(), чтобы сначала разбить статическую часть на DC вашего окна, а затем использовать TransparentBlt() для рисования греха, начиная с предварительно вычисленного смещения.

+0

Растровые изображения не поддерживают (альфа) -прозрачность. Blitting растровое изображение синуса над фоном перезапишет фон. – IInspectable

+2

Ну, как насчет функции TransparentBlt: https://msdn.microsoft.com/en-us/library/windows/desktop/dd145141%28v=vs.85%29.aspx? –

 Смежные вопросы

  • Нет связанных вопросов^_^