Показать полную графическую версию : создание BRUSH в С++ WinAPI
Vlad Drakula
11-06-2006, 18:48
обнаружил следующую проблему:
если в цикле присваивать переменной цикла значение которое получено с помощью макроса "color" то в приложении обязательно случается глюк... и причем именно из за этого...
из-за чего такое происходит???
dmitryst
12-06-2006, 14:27
Vlad Drakula Может, орфографию поправить? ;)
Vlad Drakula
12-06-2006, 14:35
dmitryst
а вы аответ знаете на мой вопрос?
dmitryst
12-06-2006, 14:40
Vlad Drakula Вообще-то, я и вопрос не совсем понял :tease: . Кто есть "color", как вы получаете от него какое-то значение? И для чего именно так?
Vlad Drakula
12-06-2006, 14:56
dmitryst
вот такой код:
HBRUSH brush = CreateSolidBrush(RGB(0, 0, 0));
Ты не забываешь, потом ненужные кисти удалить?
dmitryst
12-06-2006, 17:48
ivank А, точно! Хотя, они ж вроде, сами должны destructe?
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/wceui40/html/cerefcreatesolidbrush.asp
When you no longer need the brush, call the DeleteObject function to delete it.
Vlad Drakula
13-06-2006, 15:40
ivank
а вот нам не один из преподов не разу не сказал что его еще и удалять нужно...
dmitryst
13-06-2006, 16:31
Vlad Drakula а вот нам не один из преподов не разу не сказал что его еще и удалять нужно... :laugh: Серьёзно? А я это еще в какой-то древней книжке по С читал, но почему-то помню, что в С++ кисти удаляются при создании новой кисти автоматически. И что, помогло? Работает?
Vlad Drakula
13-06-2006, 16:43
dmitryst
Серьёзно?
да!
А я это еще в какой-то древней книжке по С читал, но почему-то помню, что в С++ кисти удаляются при создании новой кисти автоматически. И что, помогло? Работает?
теоретически наверное быть этого не может... т.к. скорее всего там выделяется память, а удалить ее можно только если получить значение этой переменной, а в функцию она не передается, значит и очистить память не возможно!
dmitryst
13-06-2006, 17:13
Vlad Drakula Не зря в PERL придумали "сборку мусора" :), убирать за ленивыми программистами :). В итоге, у вас заработало как надо?
Vlad Drakula
13-06-2006, 17:46
dmitryst
В итоге, у вас заработало как надо?
да, я просто теперь из все инициализирую пи загрузке приложения...
Не зря в PERL придумали "сборку мусора" , убирать за ленивыми программистами .
по моему это ввели замного до появления этого языка... и не только в нем... ктомуже есть компромис между скоростью и требования к уровню програмиста...
dmitryst
13-06-2006, 18:09
Vlad Drakula Про "мусор" - это к удобству работы. Но, конечно, правильнее - выделить память под ресурс, создать ресурс, удалить ресурс и освободить память. Ручками. Ну да ладно, главное - заработало, с чем и поздравляю. :)
Тов. программеры, не путайте библиотеки высокого уровня с WinAPI. Первые всё за собой чистят, и делают правильно, вторые - быстро. Лично я сторонник чистки мусора в деструкторе (I LOVE C++). Кисти автоматически удаляются в VCL но не WinAPI. Пример:
// всегда будет работать правильно
class TBrush
{
HBRUSH fhandle;
TBrush(const TBrush&);
public:
TBrush(int color=0) : fhandle(CreateSolidBrush(color))
{
}
~TBrush()
{
DeleteObject(fhandle);
}
void operator=(int color)
{
DeleteObject(fhandle);
fhandle = CreateSolidBrush(color);
}
}
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.