Development and My Projects

събота, 10 ноември 2007 г.

Don't Flicker! Double Buffer!

Здравейте!

Днес се сблъсках с един отвратителен проблем при Windows Forms, познат на повечето хора писали в тази среда :). Даже може и вие да сте го срещали вече, ако сте забелязали понякога Windows Task Manager започва да примигва когато посочете процес. Точно това ще се опитаме да разрешим при нашите апликации, защото е доста неприятно и отблъскващо.

За момента единственото решение, което ми хрумна е използването на Double Buffer!
При него се създават два буфера единият чете, докато другият пише, при което да се надяваме ще успее да реши проблема с досадното премигване...
Значи проблемът се проявява най-силно когато използваме GDI++ на C#.Net и реших примерът който ще покажа да използва точно тези технологии.

Първото нещо което трябва да направим е да включим Double Buffer-а, това правим по следният начин:дддд
this.SetStyle(
ControlStyles.UserPaint |
ControlStyles.AllPaintingInWmPaint |
ControlStyles.OptimizedDoubleBuffer, true);
Следният код трябва да поставите в конструктора на основният клас.

и другото което е трябва да предифинираме функцията OnPaint:

protected override void OnPaint(PaintEventArgs e)
{
// тук е кодът, които
// ще използваме за чертане
}
Кодът на програмата може да изтеглите от тук , а тук е и самият изпълним файл.
П.П. програмата е написана от Gil Schmidt.

Статията още не е довършена!

четвъртък, 25 октомври 2007 г.

Clock

Добър ден!
Вчера ми хрумна една идея за едно проектче - .Net Часовник :)

И обмислих го и настина ми се стори един интересен проект, най-вече за начинаещи програмисти.

И идеята ми беше следната
  • Enable на double buffering - по този начин увеличаваме броят на буферите от един на два което ще раче, че докато единият буфер чете, другият може да пише и обратното(препоръчвам тази техника на всички, тъй като по този начин се предотвратяват повечето BufferOverflows проблеми :)
  • Използвайки едни от невероятните възможности на Windows Forms да кача background картинка - самият часовник(без стрелките 160x160)
  • Ползвам Timer, за да може всяка секунда да преизчертавам формата - използвам функцията Invalidate, тя от своя страна кара формата да се преизчертае -> вика се функцията OnPaint и ние използваме точно нея, за да положим стрелките не подходящото място :)
Сега колкото до матекатиката в проекта тя се свежда до това да изчислим точно къде да поставим стрелките.
Картинката която използвам за background
е със ширина 160(x) и дължина 160(y), следователно центърът и е на 80x80.
От тук можем да си направим извода, че трябва да поставим центъра на изчертаването точно в тази позиция. Така и тъй като за часовник използваме кръг, градусите са му - 360.
И започваме сметките за всяко едно от трите: секунда, минута, час
  1. Секунда: 1min = 60s (за едно завъртане) и сега трябва да опраделим колко трябва да е "стъпката" на всеки Tick, така че да може да обиколи целият кръг, без да изоставя или напредва. И затова трябва да изчилим "стъпката" - 360 / 60 = 6.0, също така към формулата трябва да предвидим че започваме да въртим от X оста, при което нашата по-горна формула няма да работи - затова изваждане 90 и по този начин въртим от Y оста - Секунда * 6.0 - 90.
  2. Минута: същото като по-горе.
  3. Час: при часа нещата малко се усложняват - един ден = 24 часа, но нашият часовник е проектиран така че има само 12 показващи се часа -> ще го изчислим за 1/2 ден -> 12 часа. 360 / 12 = стъпка 30.0 и оттук формулата Час * 30.0 - 90(защото като по горе пак въртим от X оста)
Надявам се да съм бил полезен с урока и естествено е лицензиран под GPL така че можете да свалите и използвате изпълнимият файл и сорс кода на "воля" :)
Download - Изпълнимият файл се намира в bin\Release и забележете, че няма да работи без clock.bmp, така че ако искате да разархивирате програмата тя трябва да върви с clock.bmp!
(Изображението също се намира в същата директория)
Успех! :)

MPPlayer


Това е най-новият ми проект.
Написан на C#.Net той представлява mp3 player.
За да може да го използвате трябва да имате winmm.dll(всички Windows-и я имат ;)



Главната идея в него е използването на делегати и евенти(с цел постигане на по-голямо бързодействие).

Лицензирал съм го под GPL, което ще рече че вие не само може да изтелгите и ползвате изпълнимият файл , но също така ще можете да изтеглите и целият сорс код.

За повече информация посетете страницата на проекта -> http://mpplayer.elserviz.com/
И можете спокойно да ме уведомите, ако искате да се включите, имате идея или просто сте забелязали някоя неточност в програмата: nick@elserviz.com или 3ks7r1m37s@gmail.com

Новият ми блог!

Здравейте, на всички посетили новият ми туко ще публикуван блог!