c++ - winapi:去除装饰

标签 c++ winapi setwindowlong getwindowlong

这看起来像是重复的,但请先听我说。这更多是在调试方面。 我正在尝试使用 here 方法删除窗口的边框.

哪些事情会使这些功能不起作用?使用 ShowWindow(Handle, SW_HIDE) 隐藏窗口也不起作用。我已经制作了自己的具有许多功能的 Window 类,所以我不想在此处粘贴我的整个代码。

这是我的窗口初始化函数:

HRESULT SampleWindow::InitializeSimple(SampleWindow* win)
{
    HRESULT         hr;
    HWND            hWnd;
    SampleWindow*   sampleWin;

    sampleWin = new SampleWindow();

    aMWindowProps->Center();
    hWnd = CreateWindowEx(
        NULL,
        aMWindowProps->aWindowClass,
        aMWindowProps->aWindowTitle,
        WS_OVERLAPPEDWINDOW,
        aMWindowProps->aRealLeft,
        aMWindowProps->aRealTop,
        aMWindowProps->GetRelativePosWidth(),
        aMWindowProps->GetRelativePosHeight(),
        HWND_DESKTOP,
        NULL,
        *aMWindowProps->aHInstance,
        sampleWin);

    aMWindowProps->aHwnd = &hWnd;

    hr = hWnd ? S_OK : E_FAIL;

    win->aHwnd = &hWnd;
    //ShowWindow(hWnd, SW_SHOWNORMAL);

    return hr;
}
如您所见,

WindowProps 包含有关正在创建的窗口的各种信息。 我的类中还有一个指向窗口处理程序的 HWND 指针变量。

以下是我在 main 上尝试过的一些操作,其中 sw2 是指向我的窗口类的指针:

    ShowWindow(*sw2->aHwnd, SW_SHOW);
    //ShowWindow(*sw2->aHwnd, nCmdShow);
    LONG lStyle = GetWindowLong(*sw2->aHwnd, GWL_STYLE);
    lStyle &= WS_POPUP;
    //lStyle &= ~(WS_CAPTION | WS_THICKFRAME | WS_MINIMIZE | WS_MAXIMIZE | WS_SYSMENU);
    SetWindowLong(*sw2->aHwnd, GWL_STYLE, lStyle);
    //ShowWindow(*sw2->aHwnd, SW_MINIMIZE);
    //ShowWindow(*sw2->aHwnd, SW_HIDE);
    //ShowWindow(*sw2->aHwnd, SW_HIDE);
    //SetWindowLong(*sw2->aHwnd, GWL_STYLE, GetWindowLong(*sw2->aHwnd, GWL_STYLE) && ~ WS_BORDER && ~ WS_SIZEBOX && ~ WS_DLGFRAME);
    SetWindowPos(*sw2->aHwnd, HWND_TOP, sw2->aMWindowProps->aRealLeft, sw2->aMWindowProps->aRealTop, sw2->aMWindowProps->aRealWidth, sw2->aMWindowProps->aRealHeight, SWP_FRAMECHANGED);
    //LONG lExStyle = GetWindowLong(*sw2->aHwnd, GWL_EXSTYLE);
    //lExStyle &= ~(WS_EX_DLGMODALFRAME | WS_EX_CLIENTEDGE | WS_EX_STATICEDGE);
    //SetWindowLong(*sw2->aHwnd, GWL_EXSTYLE, lExStyle);
    //SetWindowPos(*sw2->aHwnd, NULL, 0, 0, 0, 0, SWP_FRAMECHANGED | SWP_NOMOVE | SWP_NOSIZE | SWP_NOZORDER | SWP_NOOWNERZORDER);

我只是想要一些关于在何处调试我的代码的建议。我知道这些功能是有效的,因为我已经在一个更简单的窗口项目(来自 Microsoft 的示例项目)上对其进行了测试。

最佳答案

正如 Jonathan Potter 在他的评论中已经指出的那样,您的错误是:

aMWindowProps->aHwnd = &hWnd;

hr = hWnd ? S_OK : E_FAIL;

win->aHwnd = &hWnd;

其中 HWND hWnd 仅在当前方法的范围内有效。我猜你在类里面将 aHwnd 定义为:

HWND *aHwnd;

这至少是不必要的。您似乎将 HANDLE(HWND 不是别的)误认为是一种实例/对象本身。它不是,它更像是一个指针或引用。你总是可以安全地写:

HWND myAttribute=hWnd;

只要在同一个进程中使用即可。 (窗口句柄甚至跨进程边界有效,但不要告诉任何人)。

事实上我不知道在什么情况下您会保留指向句柄的指针而不是句柄本身。

注意,我明确写了句柄,因为 HWND 是一种标准窗口句柄。

关于c++ - winapi:去除装饰,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19558427/

相关文章:

c++ - AVX2 冲突检测的回退实现

c - Hook Windows 登录/注销事件

c++ - C2440 无法从 'void (_cdecl*)(int)' 转换为 'void(_cdecl&)(int)

c++ - boost::bind protected 成员和上下文

c++ - 为 tic-tac-toe 实现 minimax 算法

c# - 有没有办法让我的应用程序将其图标推送到其他应用程序?

python-3.x - 从窗口获取文本(记事本)

winapi - 删除窗口边框?

c# - 如何在 32 位平台上调用 GetWindowLongPtr 和 SetWindowLongPtr?

windows - 检测/ Hook 其他外部进程的窗口移动/拖动