Спасибо. Помогло, но на 100% я пока не удовлетворён. При появлении окна теперь оно как-то странно подёргивается. Такое ощущение, что сначала отображается непрозрачное окно, потом оно скрывается и отображается прозрачное.
Ещё заметил, что если ShowWindow стоит сразу же после CreateWindow, то происходит выше озвученное подёргивание, а если вызвать ShowWindow после всех манипуляций, то окно сначала мигает чёрным цветом.
Вот код:
#include <windows.h>
#define LWA_ALPHA 0x00000002
#define WS_EX_LAYERED 0x00080000
#define WS_EX_COMPOSITED 0x02000000
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
typedef BOOL (WINAPI *PFN) (HWND hWnd, COLORREF crKey, BYTE bAlpha, DWORD dwFlags);
static HMODULE hm;
static PFN pfn;
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow)
{
static char szAppName[] = "HelloWin";
HWND hwnd;
MSG msg;
WNDCLASSEX wndclass;
wndclass.cbSize = sizeof (wndclass);
wndclass.style = NULL;
wndclass.lpfnWndProc = WndProc;
wndclass.cbClsExtra = 0;
wndclass.cbWndExtra = 0;
wndclass.hInstance = hInstance;
wndclass.hIcon = LoadIcon(NULL, IDI_APPLICATION);
wndclass.hCursor = LoadCursor(NULL, IDC_ARROW);
wndclass.hbrBackground = (HBRUSH) GetStockObject(LTGRAY_BRUSH);
wndclass.lpszMenuName = NULL;
wndclass.lpszClassName = szAppName;
wndclass.hIconSm = LoadIcon(NULL, IDI_APPLICATION);
RegisterClassEx(&wndclass);
hwnd = CreateWindowEx(0, szAppName, "The Hello Program", WS_OVERLAPPEDWINDOW | WS_CLIPCHILDREN | WS_CLIPSIBLINGS,
CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,
NULL, NULL, hInstance, NULL);
UpdateWindow(hwnd);
ShowWindow(hwnd, SW_SHOWNORMAL);
hm = GetModuleHandle("USER32.DLL");
pfn = (PFN) GetProcAddress(hm, "SetLayeredWindowAttributes");
LONG wStyle = GetWindowLongPtr(hwnd,GWL_STYLE);
wStyle |= WS_CLIPSIBLINGS | WS_CLIPCHILDREN | WS_EX_COMPOSITED;
SetWindowLongPtr(hwnd,GWL_STYLE, wStyle);
wStyle = GetWindowLongPtr(hwnd,GWL_EXSTYLE);
wStyle |= WS_EX_COMPOSITED;
SetWindowLongPtr(hwnd,GWL_EXSTYLE, wStyle);
SetWindowLongPtr(hwnd, GWL_EXSTYLE, GetWindowLongPtr(hwnd,GWL_EXSTYLE)|WS_EX_LAYERED);
if (pfn)
{
SetWindowLong(hwnd, GWL_EXSTYLE, GetWindowLong(hwnd, GWL_EXSTYLE) | WS_EX_LAYERED);
pfn(hwnd, 0, 200, LWA_ALPHA);
}
// UpdateWindow(hwnd);
// ShowWindow(hwnd, SW_SHOWNORMAL);
while(GetMessage(&msg, NULL, 0, 0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return 1;
}
LRESULT CALLBACK WndProc (HWND hwnd, UINT iMsg, WPARAM wParam, LPARAM lParam)
{
switch (iMsg)
{
case WM_DESTROY:
PostQuitMessage(0);
return 0;
default:
return DefWindowProc( hwnd, iMsg, wParam, lParam );
}
}
---
|