Графика для Windows средствами DirectDraw


Функция DrawScene()



Функция DrawScene() отвечает за подготовку нового кадра во вторичном буфере, обновление курсора и переключение страниц. Функция DrawScene()

выполняется в основном потоке, поэтому она должна синхронизировать доступ к первичной поверхности и очереди событий мыши с потоком ввода. Функция DrawScene() приведена в листинге7.4.

Листинг 7.4. Функция DrawScene()


void CursorWin::DrawScene() { //------ Проверить клавишу ESCAPE ------- static char key[256]; keyboard->GetDeviceState( sizeof(key), &key ); if ( key[DIK_ESCAPE] & 0x80 ) PostMessage( WM_CLOSE );

//------ Обычные задачи ------ ClearSurface( backsurf, 0 );

BltSurface( backsurf, dm_surf, 539, 0 );

static coil_idx; BltSurface( backsurf, coil[coil_idx], coilx, coily ); coil_idx=(coil_idx+1)%coil_frames;

//------ Начало синхронизированной секции ------ critsection.Lock();

//------ Сохранить область вторичного буфера под курсором RECT src; src.left=curx; src.top=cury; src.right=curx+cursor_width; src.bottom=cury+cursor_height; cursor_under->BltFast( 0, 0, backsurf, &src, DDBLTFAST_WAIT );

//------ Нарисовать курсор во вторичном буфере backsurf->BltFast( curx, cury, cursor, 0, DDBLTFAST_SRCCOLORKEY | DDBLTFAST_WAIT );

primsurf->Flip( 0, DDFLIP_WAIT ); while (primsurf->GetFlipStatus(DDGFS_ISFLIPDONE)!=DD_OK) // ничего не делать (ждать, пока закончится // переключение страниц)

int x, y; BOOL newclick=FALSE; int count=mouseclickqueue.GetCount(); while (count--) { MouseClickData mc=mouseclickqueue.RemoveTail(); if (mc.button==0) { x=mc.x; y=mc.y; newclick=TRUE; } }

critsection.Unlock(); //------ Конец синхронизированной секции -------

//------ Сделать паузу в соответствии с выбранной задержкой ---- if ( delay_value[dm_index]!=0) Sleep( delay_value[dm_index] );

//------ Обновить меню задержки -------- if (newclick) { int max_index=sizeof(delay_value)/sizeof(int)-1; int menux=screen_width-dm_width+dm_margin; int menuw=dm_width-dm_margin*2; if (x>=menux && x<=menux+menuw) { int index=(y-dm_header)/dm_entrysize; if (index>=0 && index<=max_index && index!=dm_index) { dm_index=index; UpdateDelaySurface(); } } } }

<


Начало  Назад  Вперед



Книжный магазин