Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/139.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何创建没有透明内容的完全透明窗口?_C++_Windows_Winapi - Fatal编程技术网

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上)