GDI мерцает при анимации растрового изображения

Я пытаюсь удалить мерцание из моей растровой анимации в GDI. Это радужная анимация. Анимация выполняется плавно, но растровые кнопки мерцают.

Я попробовал InvalidateRect(), но мерцание все равно происходит. Вот мой урезанный код. ImageData — это значение пикселя моего статического растрового изображения радуги. Я анимирую его, перемещая все элементы в их следующее положение.

#include <Windows.h>
#include <iostream>
#include <deque>
#include <vector>

HDC hdcMem;
HBITMAP hbmMem;
HANDLE hOld;
PAINTSTRUCT ps;
HDC hdc;
HBITMAP Membitmap;

int WIDTH = 350;
int HEIGHT = 500;

std::deque<int> imageData =
    {0xFB017D, 0xFB0278, 0xFB017D, 0xFC0280, 0xFB027A, 0xFB027A, 0xFB017C, 0xFA0175, 0xFC026E, 0xFC026C, 0xFC036B, 0xFC0266,
     0xFC0263, 0xFC015E, 0xFC025B, 0xFB015A, 0xFB0351, 0xFB0351, 0xFC014E, 0xFC024C, 0xFC0249, 0xFC0146, 0xFC0242, 0xFC0241, 0xFD0237, 0xFD0237, 0xFD0237, 0xFD0235, 0xFD0132, 0xFD022D, 0xFD0329, 0xFC0226, 0xFC0228, 0xFC0323, 0xFC021D, 0xFC0319, 0xFE0219, 0xFD0116, 0xFD0213, 0xFC020E, 0xFC020C, 0xFC030B, 0xFB0206, 0xFB0304, 0xFB0303, 0xF90403, 0xF90304, 0xF90306, 0xFD0002, 0xFE0606, 0xFB0905, 0xF90C04, 0xFC1005, 0xFD1104, 0xFB1404, 0xFC1906, 0xF81A03, 0xFB2004, 0xFB2203, 0xFA2402, 0xFA2805, 0xF82A05, 0xF82D04, 0xFB3204, 0xFB3705, 0xF93A06, 0xFA3D06, 0xFC3F05, 0xFF4105, 0xFE4203, 0xFC4604, 0xFB4A06, 0xFB5106, 0xFC5207, 0xFB5406, 0xFC5707, 0xFB5904, 0xFB5B03, 0xFC5D02, 0xFC5E03, 0xFC6303, 0xFB6504, 0xFC6804, 0xFB6E04, 0xFC7205, 0xFC7605, 0xFC7905, 0xFD7A04, 0xF97B02, 0xFC7E03, 0xFB8102, 0xFB8402, 0xFC8A05, 0xFC8C04, 0xFA8F03, 0xFD9204, 0xFB9703, 0xFC9804, 0xFC9A03, 0xFC9D03, 0xFBA103, 0xFCA603, 0xFDAA06, 0xFEAD06, 0xFBAE06, 0xFDB306, 0xFDB805, 0xFCBC05, 0xFBBD06, 0xFAC005, 0xFCC304, 0xFEC502, 0xFACC05, 0xFBCD05, 0xFBD007, 0xFDD305, 0xFAD403, 0xFAD703, 0xF9DA03, 0xFBDC05, 0xFDE104, 0xFAE202, 0xF8E703, 0xFBED06, 0xFDEF06, 0xFCEE05, 0xFAF005, 0xFAF307, 0xFAF503, 0xF8F603, 0xF7F605, 0xF2F504, 0xF0F505, 0xEDF605, 0xECF703, 0xEBF904, 0xE6FC06, 0xE1F903, 0xDDF904, 0xDCFC05, 0xD7FB05, 0xD4FC06, 0xD3FB05, 0xCEF801, 0xCEF703, 0xCCF803, 0xC8FA05, 0xC2FA03, 0xBEFA04, 0xBAFA05, 0xB6FB04, 0xB3F902, 0xB4FA04, 0xB3F903, 0xB0FA03, 0xADFB05, 0xAAFC06,
     0xA2FA05, 0x9EF904, 0x9CFB07, 0x98FA05, 0x94F802, 0x92F703, 0x8FF903, 0x8DFB06, 0x89FB06, 0x84FA04, 0x82FA03, 0x83FB06, 0x7DF905, 0x77F905, 0x77FA06, 0x77FA08, 0x73F906, 0x6EFA03, 0x6AFB02, 0x6AFA04, 0x68F802, 0x68FA04, 0x63F904, 0x5DF703, 0x58F804, 0x56FA05, 0x52FA04, 0x53F903, 0x4DF903, 0x4AFA04, 0x47F905, 0x47F905, 0x45F806, 0x3FF902, 0x3BF901, 0x3BFC05, 0x36FA02, 0x32F803, 0x2EF804, 0x2CF906, 0x27F904, 0x27F904, 0x26FA05, 0x1FFB03, 0x1CFB04, 0x18FA03, 0x14FA04, 0x10FA05, 0x0CFA04, 0x0CFA04, 0x0BFB04, 0x04F904, 0x04F904, 0x04F904, 0x04F904, 0x04F904, 0x04F904, 0x04F904, 0x04F904, 0x03FA0B, 0x03FA0B, 0x03FA0D, 0x04FA0F, 0x04FA13, 0x03FA15, 0x04FA19, 0x04FA1B, 0x02F922, 0x03FA23, 0x03FA27, 0x03F92A, 0x04F92F, 0x05FA33, 0x04FA37, 0x04F939, 0x05F93F, 0x06FA42, 0x05FA43, 0x05FA47, 0x04FB4B, 0x04FA4F, 0x04FA51, 0x05FA54, 0x04FA57, 0x04FA57, 0x04FA5B, 0x03FB5D, 0x03FA61, 0x03FA65, 0x04FA67, 0x04FA69, 0x04F96D, 0x04F96E, 0x04F970, 0x04F976, 0x04F97A, 0x05F980, 0x04F982, 0x04F984, 0x05F988, 0x07FB8A, 0x05FB8E, 0x03FA8F, 0x03FA92, 0x04FB93, 0x06FB96, 0x06FB96, 0x05FA9B, 0x05FA9F, 0x03FAA1, 0x04FAA5, 0x04F9A9, 0x04FBAC, 0x04FBAC, 0x04FBAC, 0x04FBB5, 0x04FBB7, 0x04FAB9, 0x04FABB, 0x04F8C2, 0x05F9C5, 0x03F9C6, 0x03F9C8, 0x04F9CE, 0x02F7CC, 0x05F7CF, 0x06F7D4, 0x03F6D8, 0x04F8DE, 0x05F8E4, 0x02F7E5, 0x03F8E7, 0x03F8E7, 0x03F8E9, 0x03F7ED, 0x04F7F1, 0x04F6F7, 0x04F6FA, 0x03F4FB, 0x05F1FF, 0x02EEFC, 0x05EEFD, 0x04E9FC, 0x05E8FB, 0x06E7FD,
     0x04E1FB, 0x05E2FC, 0x06DDF9, 0x02D6FE, 0x01D5FA, 0x04D6F7, 0x04D1FE, 0x05CEF8, 0x06CBF6, 0x03C4FD, 0x05C2FC, 0x02BEFB, 0x03BCFC, 0x05BBFD, 0x04B5FB, 0x03B1FA, 0x04B0FC, 0x04AEFC, 0x02ABFC, 0x04ABFC, 0x03AAFB, 0x03A7FC, 0x04A4FC, 0x049FFC, 0x059BFC, 0x0498FC, 0x0592FE, 0x028FFB, 0x038BFB, 0x0389FC, 0x0586FD, 0x0482FB, 0x057FFC, 0x057FFE, 0x057CFE, 0x0277FB, 0x0474FC, 0x0671FD, 0x056BFC, 0x0468FC, 0x0468FE, 0x0466FF, 0x0361FE, 0x035BFB, 0x0659FD, 0x0354FB, 0x0354FD, 0x0654FE, 0x034FFA, 0x064EFA, 0x054AFD, 0x0446FC, 0x0343FC, 0x0442F9, 0x053FF8, 0x043BF7, 0x0338FA, 0x0536FF, 0x0734FF, 0x0530FB, 0x042DFB, 0x0528FC, 0x0223FA, 0x0521FE, 0x0720FF, 0x051DFD, 0x0517FD, 0x0415FB, 0x0412FB, 0x030FFB, 0x040DFC, 0x0509FE, 0x0406FB, 0x0203FB, 0x0201FC, 0x0402FD, 0x0601FD, 0x0600FE, 0x0302FD, 0x0402FD, 0x0801FC, 0x0B02FD, 0x0E02FA, 0x1502FC, 0x1A01FD, 0x1C01FC, 0x1C02FB, 0x2003FD, 0x2303FC, 0x2601FC, 0x2A01FB, 0x2B02FC, 0x2C02FC, 0x3001FD, 0x3201FB, 0x3801FC, 0x3A02FB, 0x3E03FD, 0x4202F9, 0x4601FC, 0x4A02FC, 0x4D02FD, 0x4D02FB, 0x4E02FA, 0x5202F7, 0x5501F7, 0x5B00FB, 0x5E02FB, 0x6303FB, 0x6502FB, 0x6701FA, 0x6802FB, 0x6B02FC, 0x6A01FC, 0x6C02FC, 0x7002FB, 0x7502FD, 0x7B02FD, 0x8002FC, 0x8401FC, 0x8602FD, 0x8902FE, 0x8D02FD, 0x8D02FD, 0x8F03FC, 0x9102FC, 0x9402FB, 0x9801FC, 0x9B02FB, 0x9E03FD, 0xA302FD, 0xA500FA, 0xAC03FE, 0xAC02FB, 0xAE01FB, 0xB203FC, 0xB500FB, 0xBC02FD, 0xBD00FC, 0xC001FE, 0xC403FE, 0xC502FC, 0xC602FA, 0xCA02FB, 0xCD02FA,
     0xCD02FA, 0xD402FB, 0xD702FC, 0xD902FD, 0xDD02FC, 0xE102FB, 0xE402FC, 0xE802FB, 0xEC01FC, 0xED00FC, 0xF202F9, 0xF601FE, 0xF602F7, 0xF600FF, 0xF703F8, 0xFA02F9, 0xFD02F0, 0xFD02F0, 0xFD02F0, 0xFC01EE, 0xFC01EF, 0xFD03DF, 0xFC02E0, 0xFC02E0, 0xFC02DE, 0xFD03D9, 0xFC02D8, 0xFB03CD, 0xFD02CE, 0xFD02CD, 0xFD03C7, 0xFD01C6, 0xFC02BC, 0xFC02BE, 0xFB01BA, 0xFB02B4, 0xFD02B3, 0xFD02B3, 0xFC01B2, 0xFC02AE, 0xFC02AC, 0xFC01A8, 0xFC02A4, 0xFC02A1, 0xFC039F, 0xFC039F, 0xFB029E, 0xFC0298, 0xFB0294, 0xFC018F, 0xFC018E, 0xFB0278, 0xFB0083, 0xFB017C, 0xFC0377, 0xFB0081, 0xFB017C, 0xFB0373, 0xFA007B, 0xFC026E, 0xFC026C, 0xFC036B, 0xFC0266, 0xFC0263, 0xFC015E, 0xFC025B, 0xFB015A, 0xFB0351, 0xFB0351, 0xFC014E, 0xFC024C, 0xFC0249, 0xFC0146, 0xFC0242, 0xFC0241, 0xFD0237, 0xFD0237, 0xFD0237, 0xFD0235, 0xFD0132, 0xFD022D, 0xFD0329, 0xFC0226, 0xFC0228, 0xFC0323, 0xFC021D, 0xFC0319, 0xFE0219, 0xFD0116, 0xFD0213, 0xFC020E, 0xFC020C, 0xFC030B, 0xFB0206, 0xFB0304, 0xFB0303, 0xF90403, 0xF90304, 0xF90306, 0xFD0002, 0xFE0606, 0xFB0905, 0xF90C04, 0xFC1005, 0xFD1104, 0xFB1404, 0xFC1906, 0xFB1A04, 0xFD2005, 0xFC2304, 0xFB2503, 0xFA2805, 0xFA2C07, 0xFA2F06, 0xFE3507, 0xF93503, 0xF93704, 0xF83B04, 0xFB3E04, 0xFD4104, 0xFB4202, 0xFB4503, 0xFA4905, 0xF64C01, 0xF84E03, 0xF85103, 0xF95404, 0xFA5803, 0xFB5B03, 0xFD5E03, 0xFD5F04, 0xFC6303, 0xFB6504, 0xFC6804, 0xFB6E04, 0xFC7205, 0xFC7605, 0xFC7905, 0xFC7903, 0xFA7C03, 0xFD7F04, 0xFC8203, 0xFB8402, 0xFB8904, 0xFC8C04,
     0xF98E02, 0xFC9103, 0xFB9703, 0xFC9804, 0xFC9A03, 0xFC9D03, 0xFBA103, 0xFCA603, 0xFCA905, 0xFDAC05, 0xFBAE06, 0xFDB306, 0xFDB805, 0xFCBC05, 0xFBBD06, 0xFBBF05, 0xFCC304, 0xFEC502, 0xF8CA03, 0xFACC04, 0xFBD007, 0xFCD204, 0xFAD403, 0xFBD804, 0xFADB04, 0xFCDD06, 0xFDE104, 0xFAE202, 0xF8E703, 0xFBED06, 0xFDEF06, 0xFBED04, 0xF9EF04, 0xF9F206, 0xFAF503, 0xF8F603, 0xF7F605, 0xF2F504, 0xF0F505, 0xEDF605, 0xECF703, 0xEAF803, 0xE5FB05, 0xE0F802, 0xDDF904, 0xDBFB04, 0xD6FA04, 0xD3FB05, 0xD2FA04, 0xCEF801, 0xCFF804, 0xCDF904, 0xC7F904, 0xC1F902, 0xBDF903, 0xBAFA05, 0xB6FB04, 0xB5FA03, 0xB4FA04, 0xB2FA03, 0xAFF902, 0xACFA04, 0xA9FB05, 0xA1F904, 0x9EF904, 0x9BFA06, 0x98FA05, 0x94F802, 0x92F703, 0x8FF903, 0x8DFB06, 0x89FB06, 0x84FA04, 0x84FA04, 0x82FA05, 0x7CF804, 0x77F905, 0x76F905, 0x76F907, 0x73F906, 0x6DF902, 0x6AFB02, 0x6AFA04, 0x68F802, 0x67F903, 0x63F904, 0x5CF602, 0x58F804, 0x56FA05, 0x52FA04, 0x54FA04, 0x4DF903, 0x4AFA04, 0x47F905, 0x46F804, 0x43F906, 0x40FA03, 0x3CFA02, 0x3BFC05, 0x36FA02, 0x32F803, 0x2EF804, 0x2CF906, 0x27F904, 0x27F904, 0x25F904, 0x1FFB03, 0x1CFB04, 0x18FA03, 0x14FA04, 0x10FA05, 0x0CFA04, 0x0CFA04, 0x0BFB04, 0x04F904, 0x04F904, 0x04F904, 0x04F904, 0x04F904, 0x04F904, 0x04F904, 0x04F904, 0x03FA0B, 0x03FA0B, 0x03FA0D, 0x04FA0F, 0x04FA13, 0x03FA15, 0x04FA19, 0x04FA1B, 0x02F922, 0x03FA23, 0x03FA27, 0x03F92A, 0x04F92F, 0x05FA33, 0x04FA37, 0x04F939, 0x05F93F, 0x06FA42, 0x05FA43, 0x05FA47, 0x04FB4B, 0x04FA4F, 0x04FA51,
     0x05FA54, 0x04FB55, 0x04FA57, 0x04FA59, 0x03FB5D, 0x03FA61, 0x03FA65, 0x04FA69, 0x04FA6B, 0x04F970, 0x04F96D, 0x04F779, 0x04FA73, 0x04F783, 0x05F97D, 0x04F889, 0x04F886, 0x04F887, 0x06FA89, 0x05FB8E, 0x03FA8F, 0x03FA92, 0x04FB93, 0x06FB96, 0x05FA95, 0x05FA9B, 0x05FA9D, 0x03FAA1, 0x04FAA5, 0x04F9A9, 0x04FBAC, 0x04FBAC, 0x04FBAD, 0x04FBB5, 0x04FBB7, 0x04FABB, 0x04FBB7, 0x04F8C5, 0x05F9C3, 0x03F9C6, 0x03F9C8, 0x04F9CE, 0x02F7CC, 0x05F7CF, 0x06F7D4, 0x03F6D8, 0x04F8DE, 0x05F8E4, 0x02F7E5, 0x03F8E7, 0x03F8E7, 0x03F8E9, 0x03F7ED, 0x04F7F1, 0x04F6F7, 0x04F6FA, 0x03F4FB, 0x05F1FE, 0x02EEFB, 0x05EEFD, 0x04E9FC, 0x05E8FB, 0x06E7FD, 0x04E1FB, 0x05E2FC, 0x06DDF9, 0x02D6FE, 0x02D6FB, 0x05D7F8, 0x04D1FE, 0x05CEF8, 0x06CBF6, 0x03C4FD, 0x05C2FC, 0x02BEFB, 0x03BCFC, 0x05BBFD, 0x04B5FB, 0x03B1FA, 0x04B0FC, 0x04AEFC, 0x02ABFC, 0x04ABFC, 0x03AAFB, 0x03A7FC, 0x03A3FB, 0x049FFC, 0x049AFB, 0x0498FC, 0x0592FE, 0x028FFB, 0x038BFB, 0x0389FC, 0x0586FD, 0x0482FB, 0x047EFB, 0x047EFD, 0x057CFE, 0x0277FB, 0x0474FC, 0x0671FD, 0x056BFC, 0x0468FC, 0x0468FE, 0x0466FF, 0x0361FE, 0x035BFB, 0x0659FD, 0x0354FB, 0x0354FD, 0x0654FE, 0x034FFA, 0x064EFA, 0x054AFD, 0x0446FC, 0x0343FC, 0x0442F9, 0x043EF7, 0x043BF7, 0x0338FA, 0x0536FD, 0x0633FE, 0x042FFA, 0x042DFB, 0x0528FC, 0x0223FA, 0x0420FD, 0x061FFF, 0x041CFC, 0x0517FD, 0x0415FB, 0x0412FB, 0x0410FC, 0x040DFC, 0x0509FE, 0x0507FC, 0x0203FB, 0x0201FC, 0x0402FD, 0x0601FD, 0x0600FE, 0x0302FD, 0x0402FD, 0x0801FC, 0x0B02FD,
     0x0E02FA, 0x1502FC, 0x1A01FD, 0x1C01FC, 0x1C02FB, 0x2003FD, 0x2303FC, 0x2601FC, 0x2A01FB, 0x2B02FC, 0x2C02FC, 0x3001FD, 0x3201FB, 0x3801FC, 0x3A02FB, 0x3E03FD, 0x4201FB, 0x4601FC, 0x4A02FC, 0x4D02FD, 0x4D02FB, 0x4E02FA, 0x5202F7, 0x5501F7, 0x5B00FB, 0x5E02FB, 0x6303FB, 0x6502FB, 0x6701FA, 0x6802FB, 0x6B02FC, 0x6A01FC, 0x6C02FC, 0x7002FB, 0x7502FD, 0x7B02FD, 0x8002FC, 0x8401FC, 0x8602FD, 0x8902FE, 0x8D02FD, 0x8D02FD, 0x8F03FC, 0x9102FC, 0x9402FB, 0x9801FC, 0x9B02FB, 0x9E03FD, 0xA302FD, 0xA500FA, 0xAC03FE, 0xAC02FB, 0xAE01FB, 0xB203FC, 0xB500FB, 0xBC02FD, 0xBD00FC, 0xC001FE, 0xC403FE, 0xC502FC, 0xC602FA, 0xCA02FB, 0xCD02FA, 0xCD02FA, 0xD402FB, 0xD702FC, 0xD902FD, 0xDD02FC, 0xE102FB, 0xE402FC, 0xE802FB, 0xEC01FC, 0xED00FC, 0xF202F9, 0xF601FE, 0xF603F5, 0xF601FF, 0xF704F6, 0xFA02F9, 0xFD02F0, 0xFD02ED, 0xFD01F4, 0xFC00F3, 0xFC04DF, 0xFD00F1, 0xFC03DB, 0xFC03DB, 0xFC01E2, 0xFD02DD, 0xFC03CF, 0xFB01D5, 0xFD02CB, 0xFD03C9, 0xFD02CE, 0xFD03BD, 0xFC01C0, 0xFC02BE, 0xFB01BA, 0xFB02B4, 0xFD02B3, 0xFD02B3, 0xFC01B2, 0xFC02AE, 0xFC02AC, 0xFC01A9, 0xFC01A6, 0xFC02A1, 0xFC039F, 0xFC039F, 0xFB029C, 0xFC0298, 0xFB0294, 0xFC018F, 0xFC018E};

void CycleColors()
{
    int lastElement = imageData.back(); // Save the last element
    imageData.pop_back();               // Remove the last element
    imageData.push_front(lastElement);  // Insert the last element at the front
}

void rainbow(HDC hdc, int x, int y, int IMAGE_WIDTH)
{
    BITMAPINFOHEADER bmih = {0};
    bmih.biSize = sizeof(BITMAPINFOHEADER);
    bmih.biWidth = IMAGE_WIDTH;
    bmih.biHeight = -1;
    bmih.biPlanes = 1;
    bmih.biBitCount = 32;
    bmih.biCompression = BI_RGB;
    bmih.biSizeImage = 0;
    bmih.biXPelsPerMeter = 15;
    bmih.biYPelsPerMeter = 5;

    BITMAPINFO dbmi = {0};
    dbmi.bmiHeader = bmih;

    std::vector<int> imageDataVector(imageData.begin(), imageData.end());

    StretchDIBits(hdc, x, y, IMAGE_WIDTH, 1,
                  0, 0, IMAGE_WIDTH, 1,
                  reinterpret_cast<const void *>(imageDataVector.data()), &dbmi, 0, SRCCOPY);
}

// main function
LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lparam);
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow)
{
    TCHAR appname[] = TEXT("Template");
    WNDCLASS wndclass;
    MSG msg;
    HWND hwnd;

    wndclass.cbClsExtra = 0;
    wndclass.cbWndExtra = 0;
    wndclass.hbrBackground = NULL;
    wndclass.hCursor = LoadCursor(NULL, IDC_ARROW);
    wndclass.hIcon = LoadIcon(NULL, IDI_APPLICATION);
    wndclass.hInstance = hInstance;
    wndclass.lpfnWndProc = WndProc;
    wndclass.lpszClassName = appname;
    wndclass.lpszMenuName = NULL;
    wndclass.style = CS_HREDRAW | CS_VREDRAW;

    // check this window class is registered or not
    if (!RegisterClass(&wndclass))
    {
        MessageBox(NULL, TEXT("Window class is not registered"), TEXT("Error...."), MB_ICONERROR);
        return 0;
    }

    hwnd = CreateWindow(appname,  // window name
                        appname,  // window text
                        WS_POPUP, // set POPUP window style for no border & controls
                        100,      // window position x
                        100,      // window position y
                        WIDTH,    // width
                        HEIGHT,   // height
                        NULL,
                        NULL,
                        hInstance,
                        NULL);

    // show & update created window
    SetTimer(hwnd, 1, 1, NULL); // Set a timer to trigger every 100ms
    ShowWindow(hwnd, SW_SHOWNORMAL);

    // get message from queue
    while (GetMessage(&msg, NULL, 0, 0))
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }

    return msg.wParam;
}

// WndProc function
LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{

    HINSTANCE hIns;
    HWND exit_button, title;
    static int X, Y;
    LRESULT move = NULL;
    RECT rc;

    switch (message)
    {

    case WM_CREATE:
    {
        exit_button = CreateWindow(TEXT("BUTTON"), NULL, WS_CHILD | WS_VISIBLE | BS_BITMAP,
                                   250, 440, 76, 30, hwnd, (HMENU)100, hIns, 0);
        HBITMAP exitImg = (HBITMAP)LoadImageA(GetModuleHandleA(nullptr), (LPCSTR) "C:\\Users\\admin\\Documents\\test\\Resource\\Bitmap_112.bmp", IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE);

        title = CreateWindow(TEXT("STATIC"), TEXT("Hello"), WS_CHILD | WS_VISIBLE, 120, 150, 120, 20, hwnd, 0, hIns, 0);
        SendMessageW(exit_button, BM_SETIMAGE, IMAGE_BITMAP, (LPARAM)exitImg);
        // SendMessageW(gen_button, BM_SETIMAGE, IMAGE_BITMAP, (LPARAM)genImg);
    }

    break;

    case WM_PAINT:
    {
        PAINTSTRUCT ps;
        GetClientRect(hwnd, &rc);
        hdc = BeginPaint(hwnd, &ps);
        hdcMem = CreateCompatibleDC(hdc);
        Membitmap = CreateCompatibleBitmap(hdc, rc.right - rc.left, rc.bottom - rc.top);
        SelectObject(hdcMem, Membitmap);

        rainbow(hdcMem, 0, 50, 300);
        BitBlt(hdc, 0, 0, rc.right - rc.left, rc.bottom - rc.top,
        hdcMem, 0, 0, SRCCOPY);
        DeleteObject(Membitmap);
        DeleteDC(hdcMem);        
        EndPaint(hwnd, &ps);
        break;
    }

    case WM_TIMER:
        CycleColors();
        InvalidateRect(hwnd, NULL, FALSE);
        return 0;
        break;

    case WM_COMMAND:

        switch (wParam)
        {
        case 100:
            PostQuitMessage(EXIT_SUCCESS);
            return 0;
        }

        break;

        // size
    case WM_SIZE:
        X = LOWORD(lParam);
        Y = HIWORD(lParam);
        break;

        // move window
    case WM_NCHITTEST:
        RECT rc;
        POINT pt;

        GetCursorPos(&pt);

        GetWindowRect(hwnd, &rc);
        rc.bottom = rc.bottom - 466;

        // if cursor position is within top layered drawn rectangle then
        // set move to HTCAPTION for moving the window from its client
        if (pt.x <= rc.right && pt.x >= rc.left && pt.y <= rc.bottom && pt.y >= rc.top)
        {
            move = DefWindowProc(hwnd, message, wParam, lParam);
            if (move == HTCLIENT)
            {
                move = HTCAPTION;
            }
        }

        return move;

        break;

    case WM_DESTROY:
        PostQuitMessage(EXIT_SUCCESS);
        return 0;
    }

    return DefWindowProc(hwnd, message, wParam, lParam);
}

Используйте два растровых изображения (и два DC): один, который вы рисуете, и другой, который отображается. Как только вы закончите рисовать в первом случае, скопируйте растровое изображение на дисплей DC.

Some programmer dude 29.04.2024 20:46

@Someprogrammerdude, вам не нужны 2 растровых изображения, в этом примере достаточно 1. Нарисуйте радугу на растровом изображении в памяти, а обработчик WM_TIMER обновит это растровое изображение и сделает окно недействительным. Затем в обработчике WM_PAINT нарисуйте текущее растровое изображение как есть на Paint HDC. Сообщение WM_PAINT может (и, вероятно, будет) появляться несколько раз между сообщениями WM_TIMER, поэтому растровое изображение в памяти необходимо сохранять между сообщениями.

Remy Lebeau 29.04.2024 21:08

Кроме того, ваша фоновая кисть черная, поэтому система заполнит окно черным цветом, прежде чем вы начнете рисовать. Используйте нулевую кисть или обработайте сообщение WM_ERASEBKGND.

Raymond Chen 30.04.2024 01:24

@RemyLebeau Я создал растровое изображение в памяти, но оно еще больше заикается. Я обновил код.

Sjskwk Eikskaw 30.04.2024 02:35

Рассмотрите возможность включения WS_CLIPCHILDREN в стили родительского окна.

Adrian McCarthy 30.04.2024 07:04
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
5
62
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Сделайте вот так:

void rainbow(HDC hdc, int x, int y, int IMAGE_WIDTH)
{
    BITMAPINFOHEADER bmih = {0};
    bmih.biSize = sizeof(BITMAPINFOHEADER);
    bmih.biWidth = IMAGE_WIDTH;
    bmih.biHeight = -1;
    bmih.biPlanes = 1;
    bmih.biBitCount = 32;
    bmih.biCompression = BI_RGB;
    bmih.biSizeImage = 0;
    bmih.biXPelsPerMeter = 15;
    bmih.biYPelsPerMeter = 5;

    BITMAPINFO dbmi = {0};
    dbmi.bmiHeader = bmih;

    std::vector<int> imageDataVector(imageData.begin(), imageData.end());

    HDC hmemdc = CreateCompatibleDC(hdc) ;
    HBITMAP hbmpmem = CreateCompatibleBitmap(hdc, bmih.biWidth, 1) ;
    SelectObject(hmemdc, (HGDIOBJ) hbmpmem) ;

    StretchDIBits(hmemdc, x, y, IMAGE_WIDTH, 1,
                  0, 0, IMAGE_WIDTH, 1,
                  reinterpret_cast<const void *>(imageDataVector.data()), &dbmi, 0, SRCCOPY);

    BitBlt(hdc, 0, 0, IMAGE_WIDTH, 1, hmemdc, 0, 0, SRCCOPY);
    DeleteObject((HGDIOBJ)hbmpmem);
    DeleteDC(hmemdc);
}

не отображает радугу

Sjskwk Eikskaw 30.04.2024 02:48

Можете ли вы поделиться всем кодом, я использую mingw (gcc 13).

Sjskwk Eikskaw 30.04.2024 04:55
ссылка
User8472 30.04.2024 05:05

спасибо, я потратил часы, исправляя это.

Sjskwk Eikskaw 30.04.2024 05:17

Другие вопросы по теме