Estoy creando una aplicación con WinAPI que consta básicamente de dos partes principales: un panel a la izquierda que siempre se muestra y un área a la derecha que cambia según la pantalla que se muestra. Actualmente, el área estática de la izquierda se está dibujando en la ventana principal; sin embargo, no creo que pueda simplemente dibujar el área correcta en la ventana principal ya que necesita cambiar. Por lo tanto, creo que necesito crear ventanas allí y simplemente controlar lo que se muestra controlando su visibilidad. Leí mucho sobre la Interfaz de documentos múltiples en MSDN, pero no estoy seguro de si eso es lo que estoy buscando. Específicamente, no quiero que las ventanas secundarias actúen como ventanas reales, lo que significa que no quiero que tengan un título o ícono o que se puedan minimizar, cerrar, cambiar de tamaño o mover. Básicamente, quiero que sean solo marcos que contengan controles / geometría D2D. ¿Cuál sería la mejor manera de implementar esto?

0
Juanita Lopez 4 mar. 2021 a las 06:13

1 respuesta

La mejor respuesta

Como dijo Remy, solo necesita volver a registrar una nueva ventana y luego crearla como una subclase en la ventana principal. No es necesario establecer el título y maximizar y minimizar los botones para configurar el estilo, y también puede decidir por sí mismo si debe ocuparse de la función WNDPROC de la subclase.

Aquí hay una muestra (para mostrar la ventana secundaria, configuro su fondo en negro):

#include <Windows.h>
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
LRESULT CALLBACK cldWndProc(HWND, UINT, WPARAM, 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,
        100,
        800,
        600,
        NULL,
        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, TEXT("This program requires Windows NT!"), szAppName, MB_ICONERROR);
    }

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


    while (GetMessageW(&msg, NULL, 0, 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, UINT message, WPARAM wParam, LPARAM lParam)
{
    switch (message)
    {
    case WM_DESTROY:
        PostQuitMessage(0);
        return 0;
    }
    return DefWindowProc(hwnd, message, wParam, lParam);
}

Esto funciona para mi:

enter image description here

0
Song Zhu - MSFT 4 mar. 2021 a las 06:02