みなさん、こんにちは。
私の最終的な目標は、アルファを含む PNG ファイルを画面に描画することです。つまり、独自のウィンドウではなく、デスクトップのどこかに描画します。PNG を HBITMAP にロードする部分は動作するようになりました (別の方法でテストしました) が、アルファを含めて描画することができません。
私が聞いた限りでは、これを行う最善の方法は、レイヤード ウィンドウを使用することです。そのため、いくつかの例と小さなチュートリアルをやり直すために多くの作業を行いました。
次のコードは問題なくコンパイルされ、メッセージは表示されません (つまり、showError("#") 関数が呼び出されないことを意味します)。
それでも、画面には何も表示されません:/
長くなってすみません… 誰かが少なくともすぐにそれを見たいと思っています..
LRESULT CALLBACK WndProc(HWND hWindow, UINT msg, WPARAM wParam, LPARAM lParam);
int main(HINSTANCE hInstance)
{
WNDCLASSEX WndClass;
char sClassName[] = "mainClass";
WndClass.cbSize = sizeof(WNDCLASSEX);
WndClass.style = NULL;
WndClass.lpfnWndProc = WndProc;//WndProc;
WndClass.cbClsExtra = 0;
WndClass.cbWndExtra = 0;
WndClass.hInstance = hInstance;
WndClass.hIcon = NULL;
WndClass.hCursor = LoadCursor(NULL, IDC_ARROW);
WndClass.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
WndClass.lpszMenuName = NULL;
WndClass.lpszClassName = sClassName;
WndClass.hIconSm = LoadIcon(NULL, IDI_APPLICATION);
if (RegisterClassEx(&WndClass) == 0) showError("-1");
HWND screen = CreateWindowEx(WS_EX_LAYERED,//WS_EX_LEFT
"mainClass",
"UpdateLayeredWind",
WS_DISABLED | WS_VISIBLE,
200,200,260,260,
NULL /*eventuelly, GM window*/,
NULL,
hInstance,
NULL);
if (screen == NULL) showError("0");
HBITMAP img = LoadImageResource("D://ThreadDraw/ThreadDraw-test/ThreadDraw/test.png");
if (img == NULL) showError("1");
BLENDFUNCTION blend = {0};
blend.AlphaFormat = AC_SRC_ALPHA;
blend.SourceConstantAlpha = 155;
POINT ptPos = {200,300};
SIZE sizeWnd = {260,260};
POINT ptPos2 = {200,300};
ShowWindow(screen, SW_SHOW);
while (1)
{
PAINTSTRUCT ps;
HDC hdc;
BITMAP bitmap;
HDC hdcMem;
HGDIOBJ oldBitmap;
hdc = BeginPaint(screen, &ps);
hdcMem = CreateCompatibleDC(hdc);
oldBitmap = SelectObject(hdcMem, img);
GetObject(img, sizeof(bitmap), &bitmap);
if (SetLayout(hdc,LAYOUT_RTL) == GDI_ERROR)
showError("5");
if (!BitBlt(hdc, 0, 0, 64, 64, hdcMem, 0, 0, SRCCOPY))
showError("4");
if (!UpdateLayeredWindow(screen,hdcMem,&ptPos,&sizeWnd,hdc,&ptPos2,RGB(255,255,255),&blend,ULW_ALPHA))//ULW_OPAQUE))
showError("2");
EndPaint(screen, &ps);
SelectObject(hdcMem, oldBitmap);
DeleteDC(hdcMem);
Sleep(10);
}
return 0;
}
LRESULT CALLBACK WndProc(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lParam)
{
switch(Message)
{
case WM_CLOSE:
DestroyWindow(hwnd);
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
default:
return DefWindowProc(hwnd, Message, wParam, lParam);
}
return 0;
}
ちなみに、UpdateLayeredWindow で ULW_ALPHA の代わりに ULW_OPAQUE を使用すると、適切なサイズの黒いウィンドウが表示されるので、問題は PAINTSTRUKT または BitBlt 関数に関連する最小限のものでなければならないと思います..それでも、変更せずに多くの方法を試しました.
誰かが助けてくれることを願っています。事前にどうもありがとうございました!