2 votes

Comment mettre à jour les marges de contrôle WC_EDIT lorsqu'il est redimensionné

Ce programme crée le contrôle WC_EDIT à l'intérieur de la fenêtre principale. La fenêtre principale redimensionne le contrôle d'édition chaque fois que la fenêtre elle-même est redimensionnée. J'essaie de définir les marges du contenu du contrôle d'édition en mettant à jour le rectangle de mise en forme du contrôle WC_EDIT à chaque redimensionnement.

La fenêtre principale répond au message WM_SIZE et redimensionne le contrôle d'édition, puis le contrôle d'édition répond à son propre message WM_SIZE et tente de mettre à jour le rectangle de mise en forme en utilisant EM_SETRECT, mais rien ne se passe.

#include 
#include 

LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
LRESULT CALLBACK EditWindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam);

HWND hwnd;
HWND editHwnd;
WNDPROC origEditProc;

int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE, LPSTR pCmdLine, int nCmdShow)
{

    WNDCLASS wc = {};
    wc.lpfnWndProc = WindowProc;
    wc.hInstance = hInstance;
    wc.lpszClassName = "Window Class";

    RegisterClass(&wc);

    hwnd = CreateWindow(
        wc.lpszClassName, 
        "",
        WS_OVERLAPPEDWINDOW,
        CW_USEDEFAULT, 
        CW_USEDEFAULT, 
        CW_USEDEFAULT, 
        CW_USEDEFAULT,
        NULL,
        NULL,
        hInstance,
        NULL
    );

    editHwnd = CreateWindow(
        WC_EDIT,
        "Lorem ipsum",
        WS_CHILD | WS_VISIBLE | WS_VSCROLL | ES_LEFT | ES_MULTILINE | ES_AUTOVSCROLL,
        0,
        0,
        100,
        100,
        hwnd,
        NULL,
        hInstance,
        NULL
    );

    origEditProc = (WNDPROC) GetWindowLongPtr(editHwnd, GWLP_WNDPROC);
    SetWindowLongPtr(editHwnd, GWLP_WNDPROC, (LONG_PTR)EditWindowProc);

    ShowWindow(hwnd, nCmdShow);

    MSG msg = {};
    while (GetMessage(&msg, NULL, 0, 0))
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }

    return 0;
}

LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
    switch (uMsg)
    {
        case WM_DESTROY:
            PostQuitMessage(0);
            return 0;
        return 0;
        case WM_SIZE:
            RECT clientRect;
            GetClientRect(hwnd, &clientRect);
            SetWindowPos(editHwnd, NULL, 0, 0, clientRect.right - clientRect.left, clientRect.bottom - clientRect.top,
                SWP_NOMOVE | SWP_NOZORDER | SWP_NOOWNERZORDER | SWP_NOACTIVATE);
    }
    return DefWindowProc(hwnd, uMsg, wParam, lParam);
}

LRESULT CALLBACK EditWindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
    switch (uMsg)
    {
        case WM_SIZE:
            RECT rect;
            GetClientRect(editHwnd, &rect);
            rect.left += 50;
            rect.top += 50;
            rect.right -= 50;
            rect.bottom -= 50;
            SendMessage(editHwnd, EM_SETRECT, NULL, (LPARAM)&rect);
    }
    return CallWindowProc(origEditProc, hwnd, uMsg, wParam, lParam);
}

1voto

krsi Points 450

La procédure de fenêtre d'origine du contrôle WC_EDIT doit être appelée avant de mettre à jour le rectangle de mise en forme :

LRESULT CALLBACK EditWindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
    LRESULT result = CallWindowProc(origEditProc, hwnd, uMsg, wParam, lParam);
    switch (uMsg)
    {
        case WM_SIZE:
            RECT rect;
            GetClientRect(editHwnd, &rect);
            rect.left += 50;
            rect.top += 50;
            rect.right -= 50;
            rect.bottom -= 50;
            SendMessage(editHwnd, EM_SETRECT, NULL, (LPARAM)&rect);
    }
    return result;
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X