最終的な目的は、透明度を使用するウィンドウにスプラッシュ画面を表示することですが、それは今のところ止まっていません。GDIを使用したWindowsのスプラッシュ画面
透明なウィンドウを作成するには、まずスプラッシュ画面とテキストをGDI +を使用してオフスクリーンバッファに合成しようとしています。
現在、私はバッファを合成し、 'WM_PAINT'メッセージに応答してそれを表示しようとしています。これは現時点では機能していません。私が見るのは黒い窓だけです。私はGDI +でのレンダーターゲットを設定し、その後
(私はまっすぐ進むGDIブリットを使用して画面を描画しようとしている)、それらをレンダリングに関して何かを誤解してきた想像
はとにかく、ここではこれまでのコードです:長い記事のため
---8<-----------------------
//Paint message snippit
case WM_PAINT:
{
BITMAP bm;
PAINTSTRUCT ps;
HDC hdc = BeginPaint(vg->m_hwnd, &ps); //get the HWNDs DC
HDC hdcMem = vg->m_gdi_dc->GetHDC(); //get the HDC from our offscreen GDI+ object
unsigned int width = vg->m_gdip_offscreen_bm->GetWidth(); //width and height seem fine at this point
unsigned int height = vg->m_gdip_offscreen_bm->GetHeight();
BitBlt(hdc, 0, 0, width, height, hdcMem, 0, 0, SRCCOPY); //this blits a black rectangle
DWORD last_error = GetLastError(); //this was '0'
vg->m_gdi_dc->ReleaseHDC(hdcMem);
EndPaint(vg->m_hwnd, &ps); //end paint
return 1;
}
---8<-----------------------
私の謝罪:
//my window initialisation code
void MyWindow::create_hwnd(HINSTANCE instance, const SIZE &dim)
{
DWORD ex_style = WS_EX_LAYERED ; //eventually I'll be making use of this layerd flag
m_hwnd = CreateWindowEx(
ex_style,
szFloatingWindowClass ,
L"",
WS_POPUP ,
0,
0,
dim.cx,
dim.cy,
null,
null,
instance,
null);
m_display_dc = GetDC(NULL);
//This was sanity check test code - just loading a standard HBITMAP and displaying it in WM_PAINT. It worked fine
//HANDLE handle= LoadImage(NULL , L"c:\\test_image2.bmp", IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE);
m_gdip_offscreen_bm = new Gdiplus::Bitmap(dim.cx, dim.cy);
m_gdi_dc = Gdiplus::Graphics::FromImage(m_gdip_offscreen_bm);//new Gdiplus::Graphics(m_splash_dc);//window_dc ;m_splash_dc
//this draws the conents of my splash screen - this works if I create a GDI+ context for the window, rather than for an offscreen bitmap.
//For all I know, it might actually be working but when I try to display the contents on screen, it shows a black image
draw_all();
//this is just to show that drawing something simple on the offscreen bit map seems to have no effect
Gdiplus::Pen pen(Gdiplus::Color(255, 0, 0, 255));
m_gdi_dc->DrawLine(&pen, 0,0,100,100);
DWORD last_error = GetLastError(); //returns '0' at this stage
}
そしてここでWM_PAINTメッセージを処理snipitです。誰かが、私がGDI +(またはGDIその点で)を使ってオフスクリーンバッファに書き込む方法に関してかなり理解していないことを知っていますか?それを画面に表示しますか?
ありがとうございます。
私は、画面の別のGDI +コンテキストを作成し、それを使って合成したものをペイントするとうまくいきますが、私がGDI-メソッドを使用しようとしていた理由は、 UpdateLayeredWindow 'を呼び出します。GDIを使ってGDI +イメージをどのようにblitするかについての私の質問は、まだまだ立っています。 – Luther
ウィンドウにWS_EX_LAYEREDスタイルがこのように追加されている場合、WM_PAINTメッセージは送信されないため、このコードは機能しません。これにより、ウィンドウは、UpdateLayeredWindowが更新するウィンドウのオフスクリーンビットマップのコピーのみをblitします。 –
チップChrisに感謝します。今のところ階層化フラグをオフにしていますが、まだアルファブレンドされた画像を描画するのに問題があります。私は現在、アルファブレンディングされた画像をレンダリングするための代替のfpr BitBltと思われる 'AlphaBlend'を使用しようとしています。今のところサイコロはありませんが、GetLastErrorを 'ERROR_INVALID_PARAMETER'に設定するだけですが、詳しいことはしません。私はWin32とGDIの友人になることはありません。彼らはちょうどいい遊びません!アルファブレンドは簡単ではありません。 – Luther