如何使用 Win32 API 将 EDIT 控件放入自定义弹出窗口中?

2024-03-20

我正在尝试将 EDIT 控件添加到用作自定义组合框式控件的下拉列表的窗口。最初这个下拉窗口是作为子窗口实现的(WS_CHILD)桌面窗口,类似于真正的组合框使用的“ComboLbox”窗口。这工作得很好,但是当编辑窗口放入这样的下拉窗口时,它似乎只是拒绝接受焦点。 IE。例如,它已启用并对鼠标右键单击做出反应,但单击它或调用SetFocus()失败(后者将最后一个错误设置为ERROR_INVALID_PARAMETER).

正因为如此,也因为许多示例(包括 Raymond Chen 的示例)中实现自定义弹出窗口的方式假菜单样本 https://blogs.msdn.microsoft.com/oldnewthing/20040820-00/?p=38103,我已经更改了下拉菜单的实现以使用WS_POPUP,以主应用程序窗口为所有者。当显示弹出窗口时,这有一个已知的问题,即从所有者窗口窃取激活,但是可以通过返回来解决这个问题MA_NOACTIVATE from WM_MOUSEACTIVATE弹出窗口的处理程序,它最初确实工作得很好,即当弹出窗口显示时,所有者窗口保持激活状态。但是,一旦我单击弹出窗口中的 EDIT 控件,它就会从其默认窗口过程中调用,SetFocus()将焦点设置为其自身,这会停用父窗口。

我的问题是如何防止这种情况发生?我知道这是可以做到的,因为 WinForms工具条管理器 https://referencesource.microsoft.com/#System.Windows.Forms/winforms/Managed/System/WinForms/ToolStripManager.cs设法允许在下拉列表中编辑文本而无需停用父窗口,并且它还使用WS_POPUP弹出窗口的样式。但它是如何做到的呢?


评论中提出了解决方案“通过处理来防止主机窗口明显处于非活动状态WM_NCACTIVATE"这应该如下例所示工作。

当菜单窗口打开时,主窗口(HostProc) 会收到WM_NCACTIVATE信息。主人会寻找"menuclass",如果找到菜单类则主机将返回DefWindowProc(hwnd, WM_NCACTIVATE, TRUE, lparam);以防止主机窗口的标题栏被绘制为非活动状态。

你还需要处理WM_NCACTIVATE在假菜单窗口中。当菜单窗口失去焦点时,WM_NCACTIVATE被接收者MenuProc,此时菜单可以自行关闭。

#include <windows.h>

const wchar_t* menuclass = L"menuclass";

LRESULT CALLBACK MenuProc(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam)
{
    switch(msg)
    {
    case WM_CREATE:
        CreateWindow(L"Edit", NULL, WS_CHILD | WS_VISIBLE | WS_BORDER, 10, 10, 160, 30,
            hwnd, NULL, NULL, NULL);
        break;

    case WM_NCACTIVATE:
    {
        if(!wparam)
        {
            //close the menu if its losing focus
            PostMessage(hwnd, WM_CLOSE, 0, 0);

            //tell parent to paint inactive, if user clicked on a different program
            POINT pt;
            GetCursorPos(&pt);
            HWND hit = WindowFromPoint(pt);
            HWND hparent = GetParent(hwnd);
            if(hit != hparent && !IsChild(hparent, hit))
                DefWindowProc(hparent, WM_NCACTIVATE, FALSE, 0);
        }
        break;
    }

    case WM_LBUTTONDOWN:
        PostMessage(hwnd, WM_CLOSE, 0, 0);
        break;
    //also handles other mouse/key messages associated with a menu...
    }

    return DefWindowProc(hwnd, msg, wparam, lparam);
}

LRESULT CALLBACK HostProc(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam)
{
    switch(msg)
    {
    case WM_NCACTIVATE:
        //paint the window as active when custom menu starts
        if(!wparam && FindWindow(menuclass, NULL))
            return DefWindowProc(hwnd, WM_NCACTIVATE, TRUE, lparam);
        break;
    case WM_RBUTTONUP:
    {
        //show the custom menu
        POINT pt;
        GetCursorPos(&pt);
        CreateWindow(menuclass, NULL, WS_VISIBLE | WS_POPUP | WS_BORDER,
            pt.x, pt.y, 200, 400, hwnd, 0, 0, 0);
        return 0;
    }
    case WM_DESTROY: 
        PostQuitMessage(0);
        return 0;
    }

    return DefWindowProc(hwnd, msg, wparam, lparam);
}

int WINAPI wWinMain(HINSTANCE hInstance, HINSTANCE, LPTSTR, int)
{
    WNDCLASSEX wcex = { sizeof(WNDCLASSEX) };
    wcex.hInstance = hInstance;
    wcex.hCursor = LoadCursor(NULL, IDC_ARROW);
    wcex.lpfnWndProc = HostProc;
    wcex.lpszClassName = L"hostwnd";
    RegisterClassEx(&wcex);

    wcex.lpfnWndProc = MenuProc;
    wcex.lpszClassName = menuclass;
    RegisterClassEx(&wcex);

    CreateWindow(L"hostwnd", L"Right click for menu ...", 
        WS_VISIBLE | WS_OVERLAPPEDWINDOW, 0, 0, 600, 400, 0, 0, hInstance, 0);

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

    return (int)msg.wParam;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使用 Win32 API 将 EDIT 控件放入自定义弹出窗口中? 的相关文章

  • 如何在win32上安装OpenCV 2.0

    我需要在 Win32 上安装 OpenCV 我目前没有安装它 我下载了 OpenCV 2 0 0a win32 exe 并运行它 我现在到底该怎么办 没有 lib之类的东西 我找到了一些使用 cmake 构建版本的说明 http openc
  • Windows XP 风格:为什么我们在静态文本小部件上得到深灰色背景?

    我们正在使用 C 和 Win32 编写 Windows 桌面应用程序 我们的对话框具有 Windows XP 风格 的丑陋外观 静态文本的背景是灰色的 如果对话框背景也是灰色 这不是问题 但在背景为白色的选项卡控件内 文本的灰色背景非常明显
  • C++ win32设置光标位置

    我知道要使用哪个功能 但我无法让它正常工作 我用了SetCursorPos 唯一的问题是它将光标设置为屏幕坐标而不是窗口坐标 我也尝试过ScreenToClient 但它并没有起作用 这是我的代码 pt x 113 pt y 280 Scr
  • 读取进程的进程内存不会返回所有内容

    我正在尝试扫描第三方应用程序的内存 我已经查到地址了 现在是在0x0643FB78 问题是 从那以后我就再也爬不上去LPMODULEENTRY32 gt modBaseAddr is 0x00400000 and LPMODULEENTRY
  • 如何在没有io的情况下在windows上创建特定大小的文件?

    Windows 上是否有与 posix fallocate 等效的函数 具体来说 我正在寻找一种方法来立即 无需执行大量 IO 创建特定大小的文件 我不关心内容 我尝试过 chsize s 它确实分配了文件 但需要很长时间 如果我右键单击文
  • 隐藏错误报告窗口

    我有以下问题 我的 ASP Net 应用程序接收简单控制台程序的 C 源代码 使用 cl exe 命令行 VC 编译器 对其进行编译 并使用 System Diagnostics Process 运行它 ASP Net应用程序运行在PC上
  • 从 GetLastError() 函数返回的错误代码中获取文本

    我需要获取从 GetLastError 函数获得的错误代码的文本 我看到了一些示例 但我想要一个获取代码并返回字符串的函数 谢谢大家 我猜你想要这样的东西 DWORD dwLastError GetLastError TCHAR lpBuf
  • :: 右侧的非法标记

    我有以下模板声明 template
  • Windows.Automation 中的旧版 IAccessible

    如何使用C 获取AutomationElement的LegacyIAccessible State和其他LegacyIAccessibles 就像工具中的 Inspect exe 一样 The LegacyIAccessible是新的 并且
  • 如何用C语言测量时间?

    我想知道某个代码块执行了多长时间 大约 像这样的事情 startStopwatch do some calculations stopStopwatch printf lf timeMesuredInSeconds How 您可以使用clo
  • win32 内容已更改,但除非移动窗口,否则不会显示更新

    我的 win32 GUI 内容每秒都会更改 但除非手动移动窗口 否则不会显示更新 我尝试每秒弹出一个消息框来触发窗口刷新 它成功了 因此 这证明我的内容确实发生了变化 但窗口没有更新 我希望刷新窗口而不是每次都弹出消息框 有没有这样的窗口功
  • 从剪贴板获取文本后将一个字符串插入另一个字符串所需的建议

    简介及相关信息 我有一个edit control只需要接受带符号的十进制数 类似于 12 35 我决定通过以下方式实现这一点subclassing The WM CHAR处理程序似乎运行良好 我需要处理其他几条消息以完全保护用户免于输入无效
  • 绘制自定义 Windows 控件时出现问题

    我正在尝试使用 Windows 中的 uxTheme 库绘制自己的自定义控件 但我无法弄清楚为什么我的控件看起来不像常规 Windows 控件 据说 使用我正在使用的相同主题 上图显示了标准的 Windows ComboBox 顶部 和使用
  • 如何通过API退出Win32应用程序?

    我有一个使用 Win32 API 编写的 C Win32 应用程序 我希望强制它在其中一个函数中退出 有没有类似的东西Exit or Destroy or Abort 类似的东西会终止它吗 哎呀呀呀呀呀呀 不要做任何这些事情 exit 和
  • ListView 多选行为?

    Comtl32 dll v6 0中的ListView进行多项选择 使用Shift键时 如下 x表示选择 00xxxx xxxxxx xxxx00 早期版本的 ListView 的做法如下 00xx00 00xx00 00xx00 有没有办法
  • VirtualAlloc 对齐方式与分配大小一致吗?

    当使用VirtualAlloc用于分配和提交具有页面边界的两倍大小的虚拟内存区域的 API 例如 void address VirtualAlloc 0 0x10000 MEM COMMIT PAGE READWRITE Get 64KB
  • 监控进程的网络使用情况?

    C 或 C C Win32 中有没有一种方法可以监视某个进程的网络使用情况 显然没有您构建的应用程序 我想只监视 1 个进程大约一个小时左右 然后返回仅该进程 例如 Limewire 使用的字节 是否可以 我知道 Windows 上的 ne
  • 调整大小时在窗口中绘图留下未绘制的边框

    我遇到的问题看似微不足道 但我找不到解决的方法 这里是 我有一个窗口 里面有一些图形 为了简单起见 我们假设它是一个实心绿色矩形 填充了窗口的整个客户区域 我希望每次窗口改变大小时都重新绘制这个矩形并填充整个窗口 我最初做的就是这样的 我已
  • 以编程方式更改任务栏图标(Win32,C++)[重复]

    这个问题在这里已经有答案了 我有一个 C win32 程序 我想在运行时编辑任务栏图标以显示有关该程序的警报等 但是我对 win32 api 不太有经验 而且我找不到任何东西在线的 我发现的最接近的是http www windows tec
  • 是否可以通过 C#.NET 编写 Win32 .dll 文件?

    是否可以通过 C NET 编写 Win32 dll 文件 如果是的话 我在哪里可以找到一些教程 如果不是 那么您对编写 Win32 DLL 有什么建议 Thanks 对的 这是可能的 事实上有一个工具可以做到这一点 它在 Rainmeter

随机推荐

  • 如何获得 TreeNodes 的 TreeView 行为,当您检查一个 TreeNodes 时,它会检查其所有子 TreeNodes?

    这与大多数应用程序的行为方式相同 我认为 TreeView 默认情况下是这样工作的 有没有办法做到这一点 或者我是否必须获取已检查的 TreeNode 的所有子节点并自己检查它们 这是winform 你需要自己做 但另一方面这并不难 pri
  • 块范围内没有链接?

    块中声明的所有变量是否都 无链接 例如 1 如果我声明一个静态变量 void foo static int i 它有内部联系还是没有联系 如果没有链接 那为什么要使其静态呢 2 如果我使用 extern 会发生什么 global scope
  • 检测迭代器是否会被消耗

    是否有一种统一的方法来知道迭代是否会消耗可迭代对象 假设你有一个特定的函数crunch它要求一个可迭代对象作为参数 并多次使用它 就像是 def crunch vals for v in vals chomp v for v in vals
  • 便携式 JPA 批量/批量插入

    我刚刚开始使用其他人编写的一个功能 该功能似乎效率稍低 但我对 JPA 的了解并不足以找到非 Hibernate 特定的可移植解决方案 简而言之 在循环中调用的 Dao 方法插入每个新实体会执行 entityManager merge ob
  • 删除具有多个 ul 的特定列表样式[重复]

    这个问题在这里已经有答案了 举个例子 我有两个列表 1st ul li TEST 1 li li TEST 2 li li TEST 3 li li TEST 4 li li TEST 5 li li TEST 6 li li TEST 7
  • Pytorch 数据加载器:错误的文件描述符和 EOF > 0

    问题描述 在使用由自定义数据集制作的 Pytorch 数据加载器进行神经网络训练期间 我遇到了奇怪的行为 数据加载器设置为workers 4 pin memory False 大多数时候 训练都顺利完成 有时 训练会随机停止 并出现以下错误
  • RMarkdown 无法编织:找不到 html_dependency

    我正在尝试使用创建一个 html 文件RMarkdown 使用 RStudio 中的示例 Rmd 当我点击Knit 我收到以下消息 错误 找不到 html dependency 的路径 执行已停止 我尝试卸载并重新安装 R 和 RStudi
  • 如何向AudioQueue提供音频缓冲区来播放音频?

    在我的应用程序中 我正在接收需要播放的线性 PCM 格式的音频数据 我正在关注 iOS SpeakHere 示例 但是我不知道应该如何以及在哪里提供缓冲区AudioQueue 谁能给我提供一个在 iOS 中播放音频缓冲区的工作示例Audio
  • 为什么在调试模式下 List<>.OrderBy LINQ 比 IComparable+List<>.Sort 更快?

    我感兴趣的是使用 LINQ 对类进行排序更快 还是通过实现 IComparable 接口和 List Sort 更快 当 LINQ 代码更快时 我感到非常惊讶 为了进行测试 我创建了一个非常简单的类 使用不太恰当的名称 TestSort 实
  • 如何以编程方式获取 Camera RAW 元数据信息 Android

    我有一个应用程序 它以编程方式设置相机的硬件参数 然而 据我所知 并且观察到 并非所有芯片组都支持所有参数 例如 Nexus 4 高通 具有清晰度和清晰度最大参数 而 Galaxy Note II 3g 则没有 因此 当我设置清晰度参数时
  • 在 C++ 中模拟 CLOS :before、:after 和 :around

    CLOS 有一个简洁的 before after 和 around 方法概念 before 方法在主要方法之前调用 after 方法在主要方法之后调用 around 方法是围绕 before primary after 序列调用的 befo
  • 计算 R 数据帧列中变量值的唯一组合[重复]

    这个问题在这里已经有答案了 我想计算每个组中出现的变量的唯一组合 例如 df lt data frame id c 1 1 1 2 2 2 3 3 4 4 4 5 6 6 7 7 7 status c a b c a b c b c b c
  • 翻转图标并反向旋转

    里面有一个图标真棒字体集 http fortawesome github io Font Awesome 我想要水平翻转 然后朝该方向旋转 这与常规旋转效果相反 有很多种方法可以做到每一种 但据我所知没有一种方法可以同时做到这两点 因为效果
  • 如果子查询在 MySQL 中返回多于 1 行,如何将 JSON 放入列数据中

    我想使用与我用于选择用户的相同查询来选择用户组合 这是我想要的例子 用户表 UID NAME USERNAME EMAIL PASSWORD STATUS 1 Manoj manoj email protected cdn cgi l em
  • 确定表中偶数/奇数行的更好方法

    假设您有一个包含以下示例代码的网页 tr class even td something1 td td somthing1 1 td tr tr class odd td something2 td td b something2 1 b
  • 错误消息“无法构建模块‘Foundation’”

    我搜索了这个问题 但找不到太多帮助 Error 无法构建模块 Foundation import
  • 如何获取 iOS 中任意线程的正确帧指针?

    获取帧指针的方法 在 iPhone 5s 设备 Xcode 7 上运行的演示应用程序上 我尝试获取frame pointer of an 随意的线程使用thread get state http web mit edu darwin src
  • 设计师如何创建 Line 小部件?

    在 Qt Designer 中 您可以拖动 Line 小部件 这将在您的布局中创建一条线 但我检查了文档和标题 我没有找到 Line 标题 小部件 它是什么 在 Qt 5 7 中 Qt Designer 为水平线生成的代码 可以使用 For
  • 在外部项目上使用 find_package()

    我有一个名为的外部项目messages 我正在使用ExternalProject Add 来获取和构建项目 如果我使用find package messages REQUIRED 在顶层 CMakeLists txt 中cmake 失败是因
  • 如何使用 Win32 API 将 EDIT 控件放入自定义弹出窗口中?

    我正在尝试将 EDIT 控件添加到用作自定义组合框式控件的下拉列表的窗口 最初这个下拉窗口是作为子窗口实现的 WS CHILD 桌面窗口 类似于真正的组合框使用的 ComboLbox 窗口 这工作得很好 但是当编辑窗口放入这样的下拉窗口时