- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我在使用函数 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;
}
该代码产生以下内容:
需要滚动条时的下拉 http://www.abload.de/img/shautocomplete_2i1sk4.jpg
按几次“向下”键后的下拉菜单。请注意滚动条仍然没有正确呈现。 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/
我正在使用带有 SHACF_FILESYSTEM 选项的 SHAutoComplete。问题是,相对于当前工作目录的文件不会自动完成。没有关于相对路径的建议——例如,工作目录包含 settings.t
我在使用函数 SHAutoComplete 时遇到问题。当我在父窗口不是对话框的编辑框上使用它时,它根本无法正常工作。 自动完成功能似乎工作正常,但根据在编辑框中键入的内容呈现可能的候选人的下拉列表非
我正在使用SHAutoComplete() Shell 轻量级实用函数中的函数库,为模式对话框中的编辑字段启用路径自动完成。 按下 Esc 键时,对话框应关闭,但前提是自动完成未处于事件状态。 如何检
我是一名优秀的程序员,十分优秀!