Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Копирование на DC (WinApi), Тормоза... 
:(
    Опции темы
Guest_Vsevols
Дата 9.4.2003, 00:03 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Народ, Посмотрите плз, кто знает, чего я не так делаю...
Пишу прогу на WinAPI с графическим выводом в DC клиентского окна (сначала всё рисуется на совместимом с ним),
весь вывод работает вполне быстро, но:
Когда я решил добавить возможность выделения мышкой (растягивающийся за мышой прямоугольник), сам процесс
следования прямоугольника за мышью дико тормозит:

Код

void UpdateWnd(PAINTSTRUCT *ps)
{
HDC hDC,hCompDC;//контекст окна,совместимый контекст

RECT Rect;//Клиентская область
HBITMAP hCompBitmap,hOldBitmap;//рабочий битмап отрисовки, замещённый битмап

GetClientRect(m_hWnd,&Rect);
hDC=ps->hdc;

hCompDC=CreateCompatibleDC(hDC);
hCompBitmap=CreateCompatibleBitmap(hDC,Rect.right,Rect.bottom);
hOldBitmap=(HBITMAP)SelectObject(hCompDC,hCompBitmap);

PatBlt(hCompDC,0,0,Rect.right,Rect.bottom,PATCOPY);
//Белю битмап

...
 //вся прорисовка на hCompDC

 if(m_pMouseSel) ///RECT* - проверка, есть ли выделение
{
 HDC hSelRectDC;
 HBITMAP hSelRectBmp,hOldSelRectBmp;
 hSelRectDC=CreateCompatibleDC(hCompDC);//Создаю контекст совместимый совместимому
 hSelRectBmp=CreateCompatibleBitmap(hCompDC,Rect.right,Rect.bottom);
 
 hOldSelRectBmp=(HBITMAP)SelectObject(hSelRectDC,hSelRectBmp);

 PatBlt(hSelRectDC,0,0,Rect.right,Rect.bottom,PATCOPY);

 hBrush=CreateSolidBrush(RGB(240,245,205));
 hOldBrush=(HBRUSH)SelectObject(hSelRectDC,hBrush);

 hPen=CreatePen(NULL,3,RGB(128,128,64));
 hOldPen=(HPEN)SelectObject(hSelRectDC,hPen);

 Rectangle(hSelRectDC,m_pMouseSel->left,
  m_pMouseSel->top,m_pMouseSel->right,m_pMouseSel->bottom);
 //Отрисовал сам прямоугольник

 BitBlt(hCompDC,0,0,Rect.right,Rect.bottom,hSelRectDC,0,0,SRCAND);
 //Копирование со сложением цветов (проверено, с SRCCOPY тоже тормозит)

 SelectObject(hSelRectDC,hOldBrush);
 DeleteObject(hBrush);
 SelectObject(hSelRectDC,hOldPen);
 DeleteObject(hPen);

 SelectObject(hSelRectDC,hOldSelRectBmp);
 DeleteObject(hSelRectBmp);
 DeleteDC(hSelRectDC);
}

BitBlt(hDC,0,0,Rect.right,Rect.bottom,hCompDC,0,0,SRCCOPY);
//Скопировал всё в окно

SelectObject(hCompDC,hOldBitmap);
DeleteObject(hCompBitmap);
DeleteDC(hCompDC);
}


При уменьшении окна тормоза прекращаются, но вот чего я понять совсем не могу - тормоза почему - то исчезают
и в том случае, если размер окна приближается к развёрнутому!
confused.gif
  Вверх
-=Baa=-
Дата 9.4.2003, 08:30 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











мдя... а зачем создавать КАЖДЫЙ раз новый битман и ДС? пусть создавется при старте проги... и рисуй там соко влезет...
  Вверх
Unregistered
Дата 9.4.2003, 18:48 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Спасибо, замечание справедливое... Если создавать всё это дело только один раз в начале передвижения мыши с нажатой кнопкой, работать будет намного быстрее, но как объяснить то,что нормально работает и так, если увеличить размер окна?
  Вверх
-=Baa=-
Дата 10.4.2003, 08:13 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Увеличить или сделать на весь экран?
  Вверх
neutrino
Дата 10.4.2003, 08:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Gothic soul
****


Профиль
Группа: Модератор
Сообщений: 3041
Регистрация: 25.3.2002
Где: Верхняя Галилея, Кармиэль

Репутация: 1
Всего: 62



Baa, да что у тебя с куками то!?


--------------------
The truth comes from within ...

Покойся с миром, Vit 
PM MAIL WWW ICQ Skype GTalk   Вверх
-=Baa=-
Дата 10.4.2003, 13:26 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











neutrino, просто беда sad.gif не знаю, кады решится sad.gif
  Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0630 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.