Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/160.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++ 调整大小时如何更新WC_编辑控件边距_C++_Winapi - Fatal编程技术网

C++ 调整大小时如何更新WC_编辑控件边距

C++ 调整大小时如何更新WC_编辑控件边距,c++,winapi,C++,Winapi,此程序在主窗口内创建WC\u EDIT控件。只要调整窗口本身的大小,主窗口就会调整编辑控件的大小。我试图通过在调整控件大小时更新WC\u edit控件的格式化矩形来设置编辑控件内容的边距 主窗口响应WM_SIZE消息并调整编辑控件的大小,然后编辑控件响应其自己的WM_SIZE消息并尝试使用EM_SETRECT更新格式化矩形,但什么也没发生 #include <windows.h> #include <commctrl.h> LRESULT CALLBACK Window

此程序在主窗口内创建
WC\u EDIT
控件。只要调整窗口本身的大小,主窗口就会调整编辑控件的大小。我试图通过在调整控件大小时更新
WC\u edit
控件的格式化矩形来设置编辑控件内容的边距

主窗口响应
WM_SIZE
消息并调整编辑控件的大小,然后编辑控件响应其自己的
WM_SIZE
消息并尝试使用
EM_SETRECT
更新格式化矩形,但什么也没发生

#include <windows.h>
#include <commctrl.h>

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);
}
#包括
#包括
LRESULT回调WindowProc(HWND-HWND、UINT-uMsg、WPARAM-WPARAM、LPARAM-LPARAM);
LRESULT回调EditWindowProc(HWND HWND、UINT uMsg、WPARAM WPARAM、LPARAM LPARAM);
HWND-HWND;
HWND编辑HWND;
WNDPROC origEditProc;
int APIENTRY WinMain(HINSTANCE HINSTANCE、HINSTANCE、LPSTR pCmdLine、int nCmdShow)
{
WNDCLASS wc={};
wc.lpfnWndProc=WindowProc;
wc.hInstance=hInstance;
wc.lpszClassName=“窗口类”;
注册类(&wc);
hwnd=CreateWindow(
wc.lpszClassName,
"",
WS_重叠窗口,
CW_使用默认值,
CW_使用默认值,
CW_使用默认值,
CW_使用默认值,
无效的
无效的
hInstance,
无效的
);
editHwnd=CreateWindow(
WC_编辑,
“公共知识”,
WS|u CHILD | WS|u VISIBLE | WS|u VSCROLL | ES|u LEFT | ES|u MULTILINE | ES|u AUTOVSCROLL,
0,
0,
100,
100,
hwnd,
无效的
hInstance,
无效的
);
origEditProc=(WNDPROC)GetWindowLongPtr(editHwnd,GWLP_WNDPROC);
SetWindowLongPtr(editHwnd,GWLP_WNDPROC,(LONG_PTR)EditWindowProc);
显示窗口(hwnd、nCmdShow);
MSG={};
while(GetMessage(&msg,NULL,0,0))
{
翻译信息(&msg);
发送消息(&msg);
}
返回0;
}
LRESULT回调WindowProc(HWND HWND、UINT uMsg、WPARAM WPARAM、LPARAM LPARAM)
{
开关(uMsg)
{
案例WM_销毁:
PostQuitMessage(0);
返回0;
返回0;
案例WM_大小:
直肠系膜;
GetClientRect(hwnd和clientRect);
SetWindowPos(editHwnd,NULL,0,0,clientRect.right-clientRect.left,clientRect.bottom-clientRect.top,
SWP|u NOMOVE | SWP|u NOZORDER | SWP|u NOOWNERZORDER | SWP|u NOACTIVATE);
}
返回DefWindowProc(hwnd、uMsg、wParam、lParam);
}
LRESULT回调EditWindowProc(HWND HWND、UINT uMsg、WPARAM WPARAM、LPARAM LPARAM)
{
开关(uMsg)
{
案例WM_大小:
RECT-RECT;
GetClientRect(editHwnd和rect);
矩形左+=50;
rect.top+=50;
右直-=50;
矩形底部-=50;
SendMessage(editHwnd、EM_SETRECT、NULL、(LPARAM)和rect);
}
返回CallWindowProc(origEditProc、hwnd、uMsg、wParam、lParam);
}

更新格式化矩形之前,应调用
WC\u EDIT
控件的原始窗口过程:

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;
}

您正在调整的矩形应通过
EM\u GETRECT
获得。调用原始窗口过程后,是否应该修改格式化rect?这就解决了问题。在更新格式化矩形之前,应该调用原始窗口过程。@krsi您应该这样回答。在旁注中,我建议使用
SetWindowSubclass
而不是
SetWindowLongPtr