c++ winapi:将 WM_SETTEXT 之后的滚动条移动到旧位置

问题描述 投票:0回答:1

我也有这样的情况。我有两个多行编辑框。第一个不可编辑,第二个可以。我捕获 EN_UPDATE 消息,当出现时,我将更新的文本从第二个窗口发送到第一个窗口。所以两个窗口都有相同的文本。另外,如果滚动一个,则第二个也会滚动(镜像行为)。

问题是,如果我在从第二个窗口发送新文本后更新第一个窗口中的文本,则滚动条会在开始时移动。如果我使用 SetScrollPos 则设置滚动条,但文本不会移动到正确的位置。我看到第一行文本,我想在更新文本之前查看位置。这怎么可能?

更新

我希望在像这样向第一个窗口发送消息之后,在用新文本替换旧文本时不要将窗口移动到文本的起始位置。因为我有例如第一个窗口在中间滚动,并且在替换文本后,第一个窗口被移动到新文本的第一行,但我想保留在旧位置,因为我只更新第二个窗口中文本中的字母,而不是我将此更改发送到firstWindow。但我重新发送了所有文字。

 SendMessage(firstWindow, WM_SETTEXT, 0, (LPARAM) buffer);

我创建了这样的多行文本框:

firstWindow = CreateWindowEx(
            0, TEXT("EDIT"),   // predefined class
            NULL,         // no window title
            WS_CHILD | WS_VISIBLE | WS_VSCROLL | WS_BORDER |
            ES_READONLY | ES_LEFT | ES_MULTILINE | ES_AUTOVSCROLL,
            TEXTBOX_START_X, TEXTBOX_START_Y, TEXTBOX_WIDTH, TEXTBOX_HEIGHT,
            hWnd,         // parent window
            (HMENU) ID_TEXTBOX,   // edit control ID
            (HINSTANCE) GetWindowLong(hWnd, GWL_HINSTANCE),
            NULL
        );
        savedWndProcTablet = (WNDPROC) SetWindowLongPtr(tabletWindowUtils.textboxHwnd, GWL_WNDPROC, (LONG_PTR) &textBoxProc);

更新2

我试试这个:

char *buffer = new char[2];
buffer = "a\0";
DWORD l,r;
SendMessage(secondWindow, EM_GETSEL,(WPARAM)&l,(LPARAM)&r);
SendMessage(firstWindow, EM_REPLACESEL, 0, (LPARAM)buffer);
SendMessage(firstWindow, EM_SETSEL,l,r);

所以我在第一个窗口中有一些文本,第二个窗口中的位置在哪里,我在这个位置添加新字母。但这将一个字母添加到正确的位置,但它没有添加任何一个字母,但仍然添加了aaaaaaaaaaaaaaaa。为什么这样做?

我只能使用纯c++和winapi。

谢谢。

c++ user-interface winapi childwindow
1个回答
-1
投票

原始答案被否决,甚至没有评论。我想这应该很可怕......

© www.soinside.com 2019 - 2024. All rights reserved.