gpt4 book ai didi

c++ - 没有对话框的编辑控件上的 SHAutoComplete

转载 作者:太空狗 更新时间:2023-10-29 20:44:56 24 4
gpt4 key购买 nike

我在使用函数 SHAutoComplete 时遇到问题。当我在父窗口不是对话框的编辑框上使用它时,它根本无法正常工作。

自动完成功能似乎工作正常,但根据在编辑框中键入的内容呈现可能的候选人的下拉列表非常困惑。基本上只显示下拉框的边框。边框被渲染得足够宽以适合可能的建议,但建议本身从未被绘制。连下拉列表的背景色都不对。就好像它从未被绘制过一样,并保持着原始父窗口的颜色。

如果建议的数量足够大,所以下拉菜单需要一个滚动条,滚动条也不会正确呈现 - 箭头不会被绘制。

在这两种情况下,无论有没有滚动条,下拉列表都不接受鼠标输入,即我无法点击项目。如果我在显示下拉菜单时按下键盘上的“向下”键,它会按预期工作。在第二次或第三次按下后,项目终于开始出现。但是滚动条仍然没有正确呈现。

如果我没有注册自己的 Windows 类,而是简单地使用带有 ::DialogBoxParam() 的对话框,那么一切都会按预期进行。自动完成功能完全没有问题。

这是我正在做的。此代码将注册一个窗口类、创建主窗口、创建一个编辑框,然后对其调用 SHAutoComplete。它必须与 Shlwapi.lib

链接
// this code must be linked with Shlwapi.lib

#include <Windows.h>
#include <Shlwapi.h>


// name of the class that will be created for the main window
static const char WindowClassName[] = "SHAutoCompleteDoesNotWorkWithoutADialogWindowClassName";


// the main window procedure
static LRESULT CALLBACK WindowProc(
HWND hwnd,
UINT uMsg,
WPARAM wParam,
LPARAM lParam)
{
switch(uMsg)
{
case WM_CREATE:
{
HWND hwndEdit = ::CreateWindowEx(
0,
"EDIT",
0,
WS_CHILD | WS_VISIBLE,
10,
10,
300,
25,
hwnd,
NULL,
NULL,
0);

::SHAutoComplete(hwndEdit, SHACF_DEFAULT);

return 0;
}

case WM_DESTROY:
::PostQuitMessage(1);
return 0;

default:
return ::DefWindowProc(hwnd, uMsg, wParam, lParam);
}
}


// the app entry point
int CALLBACK WinMain(
HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)
{
::CoInitialize(NULL);

WNDCLASSEX wcex = {0};
wcex.cbSize = sizeof(wcex);
wcex.style = CS_OWNDC | CS_HREDRAW | CS_VREDRAW ;
wcex.lpfnWndProc = WindowProc;
wcex.hInstance = hInstance;
wcex.lpszClassName = WindowClassName;
wcex.hbrBackground = (HBRUSH)(COLOR_BTNFACE+1);

ATOM atom = ::RegisterClassEx(&wcex);

HWND hwnd = ::CreateWindowEx(
0,
MAKEINTATOM(atom),
"SHAutoComplete Test",
WS_OVERLAPPEDWINDOW | WS_VISIBLE | WS_CLIPCHILDREN | WS_CLIPSIBLINGS,
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,
NULL,
NULL,
hInstance,
NULL);

MSG msg;
while(::GetMessage(&msg, hwnd, 0, 0) > 0)
{
::TranslateMessage(&msg);
::DispatchMessage(&msg);
}

::UnregisterClass((LPCTSTR)atom, NULL);

::CoUninitialize();

return 0;
}

该代码产生以下内容:

  1. 需要滚动条时的下拉 http://www.abload.de/img/shautocomplete_2i1sk4.jpg

  2. 按几次“向下”键后的下拉菜单。请注意滚动条仍然没有正确呈现。 http://www.abload.de/img/shautocomplete_3efsgw.jpg

现在,当我切换到对话框时,效果非常好。在下面的代码中,IDD_DIALOG1 只是一个由 IDE 自动创建的空对话框资源。

这是rc文件的相关部分

IDD_DIALOG1 DIALOGEX 0, 0, 316, 185
STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | WS_SYSMENU
CAPTION "Dialog"
FONT 8, "MS Shell Dlg", 400, 0, 0x1
BEGIN
END

下面是使用它的代码

// this code must be linked with Shlwapi.lib

#include <windows.h>
#include <Shlwapi.h>

#include "Resource.h"


BOOL CALLBACK DialogProc(
HWND hwnd,
UINT uMsg,
WPARAM wParam,
LPARAM lParam)
{

switch(uMsg)
{
case WM_INITDIALOG:
{
HWND hwndEdit = ::CreateWindowEx(
0,
"EDIT",
0,
WS_VISIBLE | WS_CHILD,
0,
0,
300,
20,
hwnd,
NULL,
NULL,
0);

::SHAutoComplete(hwndEdit, SHACF_DEFAULT);

return 1;
}


case WM_CLOSE:
::EndDialog(hwnd, 0);
return 1;


default:
return 0;
}
}



int WINAPI WinMain(
HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nShowCmd)
{
::CoInitialize(NULL);

::DialogBoxParam(
NULL,
MAKEINTRESOURCE(IDD_DIALOG1),
NULL,
DialogProc,
0);

::CoUninitialize();

return 0;
}

你能指出我哪里错了吗?在我看来,除了主窗口的创建和销毁之外,两者之间似乎没有任何区别。我是否遗漏了 SHAutoComplete 文档中声明它只能用于对话框内的编辑框的内容?

最佳答案

您正在使用过滤消息循环,因此不会处理下拉列表的任何消息。将 NULL 作为第二个参数传递给 GetMessage

关于c++ - 没有对话框的编辑控件上的 SHAutoComplete,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11925256/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com