Winapi — C ++ рисовать изображения на растровое изображение и сохранять

// фон не стесняйтесь пропускать

Я создаю анимированные часы для фона рабочего стола Windows. Обычно я создаю изображение bmp с кодом, используя предварительно нарисованные изображения (числа часов), затем сохраняю изображение bmp и устанавливаю фон рабочего стола для этого изображения. Я пытался использовать c # и .Net, но для установки фона рабочего стола мне нужно вызвать функцию WinApi (SystemParametersInfo). Вызов этой функции из c # занимает почти секунду. Слишком долго для анимации.

Так что теперь я хочу сделать то же самое, за исключением C ++, я надеюсь, что вызов SystemParametersInfo будет быстрее из неуправляемого кода. РЕДАКТИРОВАТЬ: я использовал c # для создания bmp и c ++ для установки фона рабочего стола, и это быстрее

//вопрос

Я создал консольный проект Win32 с использованием Visual Studio 2012, и мне удалось встроить предварительно нарисованные изображения в качестве ресурсов. Теперь мне нужно объединить изображения в одно растровое изображение и сохранить его на жестком диске. Прошло четыре года с тех пор, как я последний раз программировал на c ++, поэтому я понятия не имею, как нарисовать изображение и сохранить его.

Код, который я нашел при поиске, должен рисовать на экране, чего я явно не хочу делать.

Итак, как создать растровое изображение, нарисовать на нем изображение ресурса (также растровое изображение) и сохранить все это в c ++?

Спасибо за любую помощь.

2

Решение

Этот вопрос больше о Windows API, чем о C ++.
Если вы хотите использовать Windows API, обратитесь к GDI +:

http://msdn.microsoft.com/en-us/library/windows/desktop/ms533798.aspx

.NET Framework поддерживает GDI +, поэтому классы могут быть вам знакомы только в C ++, а не в C # с ручным управлением памятью и т. Д.

Есть также некоторые другие библиотеки, которые могут манипулировать изображениями. Лично мне нравится GD, библиотека манипулирования изображениями в стиле C с привязкой ко многим языкам.

https://bitbucket.org/libgd/gd-libgd/downloads

Однако, как и всегда с открытым исходным кодом, вам придется создать его самостоятельно с учетом зависимостей. Так что, вероятно, GDI + самый лучший.

0

Другие решения

Как оказалось, код Win32 (c ++) быстро меняет фон рабочего стола (до 20 мс на i5 3,2 ГГц), тогда как для управляемого кода C # требуется от 500 до 3000 мс. Тем не менее, неуправляемый код C ++ тянет изображение вечно (от 300 до 1500 мс). Так что я сделал две программы, которые работают вместе. Управляемая программа C # создает изображение (до 20 мс) и затем сохраняет его. Неуправляемый c ++ устанавливает сохраненное изображение в качестве фона рабочего стола.

C #
static void Main (строка [] args)
{
// позиции изображений, где рассчитываются вручную и жестко закодированы
// первая позиция изображения
// X: 532
// Y: 335
Bitmap TheImage = new Bitmap (1366, 768);

        Graphics G = Graphics.FromImage(TheImage);

DateTime DTNow = DateTime.Now;
while (true)
{
//get the time
DTNow = DateTime.Now;
//draw the canvas
G.DrawImage(Resources.canvas, 0, 0,1366,768);

//draw the first image of the hour
G.DrawImage(GetImage(DTNow.Hour,0),532,330,174,217);
//draw the second image of the hour
G.DrawImage(GetImage(DTNow.Hour, 1), 711, 330, 174, 217);
//draw the colon
if (DTNow.Second % 2 == 0) G.DrawImage(Resources.aColon, 890, 365,57,147);
//draw the first digit of the minute
G.DrawImage(GetImage(DTNow.Minute, 0), 952, 330, 174, 217);
//draw the second digit of the minute
G.DrawImage(GetImage(DTNow.Minute, 1), 1131, 330, 174, 217);
//save the file
try
{
File.Delete("C:\\background.bmp");

TheImage.Save("C:\\background.bmp", ImageFormat.Bmp);
}
catch
{
}
//calculate sleep time and sleep until next second

DTNow = DateTime.Now.AddSeconds(1);
DateTime NextSecond = new DateTime(DTNow.Year,DTNow.Month,DTNow.Day, DTNow.Hour,DTNow.Minute, DTNow.Second,500);
DTNow = DateTime.Now;
System.Threading.Thread.Sleep((int)NextSecond.Subtract(DTNow).TotalMilliseconds);

}

}
static Bitmap GetImage(int Number, int Index)
{
string NS = Number.ToString();
if (NS.Length < 2) NS = "0" + NS;
char[] digits = NS.ToCharArray();

switch (digits[Index])
{
case '1': { return Resources.a1; }
case '2': { return Resources.a2; }
case '3': { return Resources.a3; }
case '4': { return Resources.a4; }
case '5': { return Resources.a5; }
case '6': { return Resources.a6;}
case '7': { return Resources.a7;}
case '8': { return Resources.a8;}
case '9': { return Resources.a9; }
default: { return Resources.a0; }
}
}
}

C ++
int WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, char *, int nShowCmd)
{
в то время как (истинно) {
SystemParametersInfo (SPI_SETDESKWALLPAPER, 0, L «C: \ background.bmp», SPIF_UPDATEINIFILE);
int MS = (int) (((длинный) этаж ((длинные) часы () / (длинные) CLOCKS_PER_SEC) * 1000 л + 1000 л) — ((длинные) часы ()));

if(MS<=1000 && MS>0){
std::this_thread::sleep_for(std::chrono::milliseconds(MS));
}
else
{

}

}
return 0;

}

0

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector