Here is a simple code for convert Fl_RGB_Image to HBITMAP.
HBITMAP GetHBMPfromFlRGBImg( const Fl_RGB_Image* src ) { if ( src == NULL ) return NULL; if ( src->d() != 4 ) /// Accepts only for RGBA 4 depth. return NULL; BITMAPINFOHEADER bmih = {0}; bmih.biSize = sizeof(BITMAPINFOHEADER); bmih.biWidth = src->w(); bmih.biHeight = -(src->h()); bmih.biPlanes = 1; bmih.biBitCount = 32; bmih.biCompression = BI_RGB ; bmih.biXPelsPerMeter = 10; bmih.biYPelsPerMeter = 10; BITMAPINFO dbmi = {0}; dbmi.bmiHeader = bmih; dbmi.bmiColors->rgbBlue = 0; dbmi.bmiColors->rgbGreen = 0; dbmi.bmiColors->rgbRed = 0; dbmi.bmiColors->rgbReserved = 0; unsigned psz = src->w() * src->h(); const uchar* refbuff = (const uchar*)src->data()[0]; uchar* pixels = new uchar[ psz * 4 ]; if ( pixels == NULL ) return NULL; // need to convert RGBA to BGRA for( unsigned cnt=0; cnt<psz; cnt++ ) { pixels[ cnt * 4 + 0 ] = refbuff[ cnt * 4 + 2 ]; pixels[ cnt * 4 + 1 ] = refbuff[ cnt * 4 + 1 ]; pixels[ cnt * 4 + 2 ] = refbuff[ cnt * 4 + 0 ]; pixels[ cnt * 4 + 3 ] = refbuff[ cnt * 4 + 3 ]; } HDC hdc = GetDC(NULL); HBITMAP hbmp = CreateDIBitmap(hdc, &bmih, CBM_INIT, pixels, &dbmi, DIB_RGB_COLORS); delete[] pixels; return hbmp; }
It should be help to convert Fl_RGB_Image ( must have depth 4 for RGBA ) to HBITMAP. And it works for changing Fl_Window to Layered window easily like this.
Fl_Window* winTest = NULL; const char* strSplash[] = { "Code by Raphael Kim, (C)2018, Copyright\n", "Programming FLTK is funny !\n", "Thank you." }; int main (int argc, char ** argv) { Fl_RGB_Image* imgBg = new Fl_PNG_Image( "testbg.png" ); if ( imgBg == NULL ) return 0; int img_w = imgBg->w(); int img_h = imgBg->h(); winTest = new Fl_Window( img_w, img_h, "Splash Test" ); if ( winTest != NULL ) { winTest->color( 0 ); winTest->end(); winTest->show(); // Make window layered splash for Windows32. HWND hWnd = fl_xid( winTest ); HDC hDC = GetDC( hWnd ); POINT ptPos = {0,0}; SIZE sizeWnd = { winTest->w(), winTest->h() }; SetWindowLong( hWnd, GWL_EXSTYLE, GetWindowLong(hWnd, GWL_EXSTYLE) | WS_EX_LAYERED); HDC hdcMem = CreateCompatibleDC( hDC ); HBITMAP hbmp = GetHBMPfromFlRGBImg( imgBg ); fl_begin_offscreen( hbmp ); imgBg->draw( 0, 0 ); fl_font( FL_HELVETICA_ITALIC, 18 ); fl_color( 0xFFFFFFFF ); int tput_x = imgBg->w() / 10; int tput_y = imgBg->h() / 2; for( int cnt=0; cnt<3; cnt++ ) { fl_draw( strSplash[cnt], tput_x, tput_y ); tput_y += 20; } fl_end_offscreen(); HGDIOBJ oldBitmap = SelectObject(hdcMem, hbmp); BLENDFUNCTION blend = {0}; blend.BlendOp = AC_SRC_OVER; blend.SourceConstantAlpha = 255; blend.AlphaFormat = AC_SRC_ALPHA; UpdateLayeredWindow( hWnd, NULL, &ptPos, &sizeWnd, hdcMem, &ptPos, 0, /// RGB(255,255,255), &blend, ULW_ALPHA ); RedrawWindow( hWnd, NULL, NULL, RDW_ERASE | RDW_INVALIDATE | RDW_FRAME | RDW_ALLCHILDREN ); SelectObject( hdcMem, oldBitmap ); DeleteObject( hbmp ); } return Fl::run(); }
And it may runs as this.