向 WinAPI 应用程序添加多个 Windows

问题描述

我正在使用 WinAPI 构建一个应用程序,该应用程序基本上由两个主要部分组成:始终显示的左侧面板和右侧的区域,该区域根据显示的屏幕而变化。目前,左侧的静态区域正在被绘制到主窗口上;但是,因为我不相信我可以简单地将正确的区域绘制到主窗口上,因为它需要更改。因此,我相信我需要在那里创建窗口,并通过控制其可见性来控制显示内容。我在 MSDN 中阅读了很多关于多文档界面的内容,但我不确定这是否是我要找的。具体来说,我不希望子窗口表现得像真正的窗口,这意味着我不希望它们有标题或图标,也不希望它们能够被最小化、关闭、调整大小或移动。基本上,我希望它们只是包含控件/D2D 几何图形的框架。实现这一目标的最佳方式是什么?

解决方法

正如Remy所说,您只需要重新注册一个新窗口,然后在主窗口中将其创建为子类即可。设置样式时不需要设置标题和最大化最小化按钮,也可以自行决定是否需要处理子类的WNDPROC函数。

这是一个示例(为了显示子窗口,我将其背景设置为黑色。):

#include <Windows.h>
LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);
LRESULT CALLBACK cldWndProc(HWND,LPARAM);

int WINAPI WinMain(_In_  HINSTANCE hInstance,_In_opt_ HINSTANCE hPrevInstance,_In_  LPSTR szCmdLine,_In_  int iCmdShow)
{
    static TCHAR szAppName[] = TEXT("hello windows");
    static TCHAR cldwndName[] = TEXT("test app");
    HWND hwnd;
    MSG msg;
    WNDCLASS wndclass;
    wndclass.style = CS_HREDRAW | CS_VREDRAW;
    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(WHITE_BRUSH);
    wndclass.lpszMenuName = NULL;
    wndclass.lpszClassName = szAppName;
    if (!RegisterClass(&wndclass))
    {
        MessageBox(NULL,TEXT("This program requires Windows NT!"),szAppName,MB_ICONERROR);
    }

    hwnd = CreateWindow(szAppName,TEXT("the hello program"),WS_OVERLAPPEDWINDOW,100,800,600,NULL,hInstance,NULL);
    ShowWindow(hwnd,iCmdShow);
    UpdateWindow(hwnd);

    WNDCLASS cldclass;
    cldclass.style = CS_HREDRAW | CS_VREDRAW;
    cldclass.lpfnWndProc = cldWndProc;
    cldclass.cbClsExtra = 0;
    cldclass.cbWndExtra = 0;
    cldclass.hInstance = hInstance;
    cldclass.hIcon = LoadIcon(NULL,IDI_APPLICATION);
    cldclass.hCursor = LoadCursor(NULL,IDC_ARROW);
    cldclass.hbrBackground = (HBRUSH)GetStockObject(BLACK_BRUSH);
    cldclass.lpszMenuName = NULL;
    cldclass.lpszClassName = cldwndName;
    if (!RegisterClass(&cldclass))
    {
        MessageBox(NULL,MB_ICONERROR);
    }

    HWND hwnd1 = CreateWindow(cldwndName,WS_CHILD|WS_VISIBLE,400,200,300,hwnd,NULL);
    ShowWindow(hwnd1,iCmdShow);
    UpdateWindow(hwnd1);


    while (GetMessageW(&msg,0))
    {
        TranslateMessage(&msg);
        DispatchMessageW(&msg);
    }
    return msg.wParam;
}

LRESULT CALLBACK WndProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam)
{
    switch (message)
    {
    case WM_DESTROY:
        PostQuitMessage(0);
        return 0;
    }
    return DefWindowProc(hwnd,message,wParam,lParam);
}

LRESULT CALLBACK cldWndProc(HWND hwnd,lParam);
}

它对我有用:

enter image description here