C++ 如何创建没有透明内容的完全透明窗口?
我试过这个:C++ 如何创建没有透明内容的完全透明窗口?,c++,windows,winapi,C++,Windows,Winapi,我试过这个: #include <windows.h> LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) { switch(msg) { case WM_CLOSE: DestroyWindow(hwnd); break; case WM_DESTROY: PostQu
#include <windows.h>
LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
switch(msg)
{
case WM_CLOSE:
DestroyWindow(hwnd);
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
case WM_SIZE:
case WM_MOVE:
case WM_PAINT:
{
PAINTSTRUCT ps;
BeginPaint(hwnd, &ps);
EndPaint(hwnd, &ps);
return 0;
}
case WM_CTLCOLORSTATIC:
{
HDC hdc = (HDC) wParam;
SetBkMode (hdc, TRANSPARENT);
return (LRESULT)(GetStockObject(NULL_BRUSH));
}
default:
return DefWindowProc(hwnd, msg, wParam, lParam);
}
return 0;
}
int main()
{
WNDCLASSEX wc;
MSG Msg;
wc.cbSize = sizeof(WNDCLASSEX);
wc.style = 0;
wc.lpfnWndProc = WndProc;
wc.cbClsExtra = 0;
wc.cbWndExtra = 0;
wc.hInstance = NULL;
wc.hIcon = NULL;
wc.hCursor = NULL;
wc.hbrBackground = (HBRUSH)(GetStockObject(NULL_BRUSH));
wc.lpszMenuName = NULL;
wc.lpszClassName = L"MY CLASS";
wc.hIconSm = NULL;
RegisterClassEx(&wc);
HWND hwnd = CreateWindowEx(0, L"MY CLASS", NULL, WS_VISIBLE, 0, 0, 640, 480, NULL, NULL, NULL, NULL);
HWND child = CreateWindowEx(0, L"STATIC", L"Text", WS_VISIBLE | WS_CHILD , 50, 50, 50, 50, hwnd, NULL, NULL, NULL);
UpdateWindow(hwnd);
while(GetMessage(&Msg, NULL, 0, 0) > 0)
{
TranslateMessage(&Msg);
DispatchMessage(&Msg);
}
return 0;
}
#包括
LRESULT回调WndProc(HWND HWND,UINT msg,WPARAM WPARAM,LPARAM LPARAM)
{
开关(msg)
{
案例WM_结束:
窗口(hwnd);
打破
案例WM_销毁:
PostQuitMessage(0);
打破
案例WM_大小:
案例WM_MOVE:
案例WM_油漆:
{
PAINTSTRUCT-ps;
开始油漆(hwnd和ps);
端漆(hwnd和ps);
返回0;
}
案例WM_CTLORSTATIC:
{
HDC HDC=(HDC)wParam;
SetBkMode(hdc,透明);
返回(LRESULT)(GetStockObject(NULL_));
}
违约:
返回DefWindowProc(hwnd、msg、wParam、lParam);
}
返回0;
}
int main()
{
WNDCLASSEX wc;
味精;
wc.cbSize=sizeof(WNDCLASSEX);
wc.style=0;
wc.lpfnWndProc=WndProc;
wc.cbClsExtra=0;
wc.cbWndExtra=0;
wc.hInstance=NULL;
wc.hIcon=NULL;
wc.hCursor=NULL;
wc.hbrBackground=(HBRUSH)(GetStockObject(NULL_笔刷));
wc.lpszMenuName=NULL;
wc.lpszClassName=L“我的班级”;
wc.hIconSm=NULL;
注册类别(&wc);
HWND HWND=CreateWindowEx(0,L“我的类”,NULL,WS_可见,0,0,640,480,NULL,NULL,NULL,NULL);
HWND child=CreateWindowEx(0,L“静态”,L“文本”,WS|u可见| WS|u child,50,50,50,HWND,NULL,NULL,NULL);
更新窗口(hwnd);
while(GetMessage(&Msg,NULL,0,0)>0)
{
翻译信息(&Msg);
发送消息(&Msg);
}
返回0;
}
它创建了一个看起来透明的窗口,因为它显示的和屏幕上的一样,但是在移动窗口后,主窗口背景保持不变。我想问,问题出在哪里
另外,这只是测试代码,所以,请不要写不适合我问题的建议
谢谢
编辑:我想要这个,因为我将为那些不知道如何做一些事情的用户提供一些帮助。结果应该类似于常规的一些程序视图,带有标记点,什么意思是按此处、何时按此处、之后按此处等等。我认为您的出发点应该是查看分层窗口 这是玩自定义形状和(半透明)窗口最常用的方法 UPD。还有一个用于制作自定义形状窗口的旧API:
int SetWindowRgn( HWND hWnd, HRGN hRgn, BOOL bRedraw );
“透明”在这里是个错误的名字。它不会覆盖原始屏幕,仅此而已。Windows不知道这一点,所以当移动窗口时,它只会移动屏幕上的内容。您必须为每次移动触发重画(请记住,所有底层数据都需要重画,即使是在不同的程序中)。通过创建“内容不透明的完全透明窗口”,您到底想实现什么?如果要在其他窗口中处理鼠标/键盘事件,可以使用。如果您想要真正透明的窗口,请使用或@nevermind我已经做了一个编辑来解释我为什么需要它。在这种情况下,我只需为每个注释创建单独的“工具提示”窗口,并将它们放置在实际应用程序中的控件附近。您可以使用
SetWindowRgn
功能创建自定义形状的窗口(带有信标、箭头等)。如果您希望在静态图像上(而不是在实际应用程序上)添加注释,则可以在内存中位图上创建其他应用程序的屏幕截图,并在窗口内使用注释绘制它(在WM_paint上)