Форум: Форум C++Разное
Новые темы: 00
MySQL 5. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель MySQL 5. Авторы: Кузнецов М.В., Симдянов И.В. PHP на примерах (2 издание). Авторы: Кузнецов М.В., Симдянов И.В. MySQL на примерах. Авторы: Кузнецов М.В., Симдянов И.В. Программирование. Ступени успешной карьеры. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум C++

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Разбираемся в Win API приложении. Необъяснимый глюк.
 
 автор: alex19921992   (08.02.2007 в 12:05)   письмо автору
4.4 Кб
 
 

Вот написал прогу. Вроде работает, но через раз. Помогите пожалуйста.
Суть: кинотеатр. При запуске выводит зал. Мышью отмечаем нужные места, щелкаем на серый прямоугольник и они покупаются - становятся красными. Однако если долго щелкать по залу, то он начнет рисовать белые квадраты вместо зеленых и при масштабировании окна, вообще зарисовывать его заголовок. Почему-то если отметить 61 место, то будет нормально, зато на 62-е начнет глючить. В чем фишка??? Помогите!

  Ответить  
 
 автор: cheops   (08.02.2007 в 14:26)   письмо автору
 
   для: alex19921992   (08.02.2007 в 12:05)
 

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

PS Проверил в C++ Builder - тоже самое, т.е. дело не в среде программирования, пока даже не представляю в чём дело, возможно зря используется NULL во втором параметре функции
InvalidateRect(hwnd,NULL,TRUE)

  Ответить  
 
 автор: alex19921992   (08.02.2007 в 15:03)   письмо автору
 
   для: cheops   (08.02.2007 в 14:26)
 

Оно и без NULL не работало... NULL по идее обозначает, что перерисовывается весь экран. Там просто если вообще убрать кусок кода, отвечающий за серую кнопку, только оставить

if(<Проверка мыши на нахождение в области серого прямоугольника>)
{
MessageBeep(0);//кстати, не знаете ли, как другие звуки делать?
}

то все равно глючить будет. Интересно, почему? Сначала вроде все нормально идет, потом - фигня.

  Ответить  
 
 автор: alex19921992   (08.02.2007 в 15:23)   письмо автору
 
   для: cheops   (08.02.2007 в 14:26)
 

Мне кажется, я понял, где ошибка, но не понял какая и не понял, почему.
Я решил написать прогу заново и причем очень часто тестировал. Так вот у нас ошибка при вызове функции myrectangle, причем даже если написать со статическим РЕКТ-ом:

void myrectangle(HDC hdc,int x1,int y1,int x2,int y2,COLORREF rgb)
{
HBRUSH hbrush;
hbrush=CreateSolidBrush(rgb);
RECT rect;
rect.left=  x1;
rect.bottom=y1;
rect.right= x2;
rect.top=   y2;
FillRect(hdc,&rect,hbrush);
}

то все равно не будет работать. И как с этим бороться, ума не приложу!

  Ответить  
 
 автор: alex19921992   (08.02.2007 в 16:05)   письмо автору
 
   для: alex19921992   (08.02.2007 в 15:23)
 

АААААААААААААААААААААААААа....................... я вроде понял! Если много раз вызывать createsolidbrush, то будет глючить. Надо типа так:

HBRUSH redbrush=CreateSolidBrush(RGB(200,0,0));
HBRUSH cyanbrush=CreateSolidBrush(RGB(0,200,200));

И не менять в процессе программы эти кисти - тока юзать.
Вот так оно работает!

ЗЫ: черте что в этом си плюсплюсе((((

  Ответить  
 
 автор: cheops   (08.02.2007 в 16:41)   письмо автору
 
   для: alex19921992   (08.02.2007 в 16:05)
 

А ну да, у вас просто лимит кистей исчерпывается, кисть лучше в WinMain определить один раз...

  Ответить  
 
 автор: alex19921992   (08.02.2007 в 18:41)   письмо автору
 
   для: cheops   (08.02.2007 в 16:41)
 

А.... по-понятней можно???

  Ответить  
 
 автор: Фитч   (08.02.2007 в 19:05)   письмо автору
 
   для: alex19921992   (08.02.2007 в 18:41)
 

Звиняюсь за офтоп)
Был вопрос про MessageBeep
Если ей вместо 0 передать одно из следующих значений:

MB_ICONASTERISK
MB_ICONEXCLAMATION
MB_ICONHAND
MB_ICONQUESTION
MB_OK

то она проиграет звуки, установленные для MessageBox'ов с соответствующими стилями.

Еще можно юзать

BOOL Beep(DWORD dwFreq, DWORD dwDuration)

Она воспроизводит звук частоты dwFreq герц в течение dwDuration миллисекунд

  Ответить  
 
 автор: cheops   (08.02.2007 в 22:28)   письмо автору
 
   для: alex19921992   (08.02.2007 в 18:41)
 

>А.... по-понятней можно???
Дело в том, что под объекты GDI (перья, кисти, шрифты, области, растровые изображения, палитры) выделяется память, которую нужно удалять при помощи функции DeleteObject(). Если этого не делать, операционная система выделит определённо количество объектов и больше не будет ничего выдавать, пока старые объекты не будут удалены. Обычно большое количество кистей (читай цветов) не требуется - выделите несколько в главной функции WinMain() и используйте их на протяжении всей программы. Даже можно не удалять - по завершению программы, в оперативную систему будет возвращена вся оперативная память, которая использовалась программой... правда если программа выполняется долго, это может приводить к утечкам памяти, т.е. программа резервирует память под объекты, а обратно не отдаёт (особенно не приятна утечка в программа выполняющихся долгое время без перезагрузки, например в серверах).

  Ответить  
 
 автор: alex19921992   (09.02.2007 в 05:42)   письмо автору
 
   для: cheops   (08.02.2007 в 22:28)
 

А вот вы не знаете, как проигрывать стандартные виндоус звуки, кроме тех, которые проигрывает MessageBeep?

  Ответить  
 
 автор: cheops   (09.02.2007 в 13:45)   письмо автору
 
   для: alex19921992   (09.02.2007 в 05:42)
 

В MessageBeep() передавайте соответствующие параметры
MB_ICONASTERISK
MB_ICONEXCLAMATION
MB_ICONHAND
MB_ICONQUESTION
MB_OK

Откопайте winuser.h - в нём этих параметров будет побольше, но они не все звуки производят...

PS Под новые вопросы, лучше заводить новые темы, а то потом ссылаться на тему очень сложно.

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования