CreateWindow“编辑”键入的字符“不可见”?

2023-12-19

在研究了所有我能找到的正确语法之后CreateWindow("Edit")打电话,我不得不认输:当我运行程序时,我在编辑框中得到的只是“隐形字符”。当我打字时,光标向右移动,但我输入的字符却看不到。只有当我用鼠标选择框内容时,我才能看到文本。但一旦松开鼠标,我就什么也看不见了。

以下是导致编辑控件中“文本不显示”的完整代码:

#include <windows.h>

#define FILE_MENU_NEW 1
#define FILE_MENU_OPEN 2
#define FILE_MENU_QUIT 3
#define CHANGE_TITLE 4

LRESULT CALLBACK WindowProc(HWND, UINT, WPARAM, LPARAM);
void AddMenus(HWND);
void AddControls(HWND);     
HMENU hMenu;
HWND hEdit;

int WINAPI wWinMain(_In_ HINSTANCE hInstance, _In_opt_ HINSTANCE hPrevInstance, _In_ LPWSTR lpCmdLine, _In_ int nShowCmd)
{
    WNDCLASS wc = {0}; // Assign 0 to all its elements initialy
    wc.hbrBackground = (HBRUSH)COLOR_WINDOW;
    wc.hCursor = LoadCursor(NULL, IDC_ARROW);
    wc.hInstance = hInstance;
    wc.lpszClassName = L"myWindowClass";
    wc.lpfnWndProc = WindowProc; // this is a pointer to a function

    if(!RegisterClass(&wc))
        return -1;

    HWND hwnd = CreateWindowEx(
        WS_EX_CLIENTEDGE,                               
        L"myWindowClass",                           
        L"Learn to Program Windows - Roger Breton",     
        WS_OVERLAPPEDWINDOW | WS_VISIBLE ,              
        100, 100, 800, 600,
        NULL,       
        NULL,       
        hInstance, 
        NULL        
    );

    if (hwnd == NULL)
    {
        return 0;
    }

    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_COMMAND:
        switch(wParam)
        {
        case FILE_MENU_QUIT:
            DestroyWindow(hWnd);    
            break;

        case FILE_MENU_NEW:
            MessageBeep(MB_ICONINFORMATION);
            break;

        case CHANGE_TITLE:
            wchar_t text[100];
            GetWindowTextW(hEdit, text, 100);   
            SetWindowTextW(hWnd, text);
            break;
        }

    case WM_CREATE:             
        AddMenus(hWnd);
        AddControls(hWnd);
        break;

    case WM_DESTROY:                
        PostQuitMessage(0);
        return 0;

    case WM_PAINT:
    {
        PAINTSTRUCT ps;
        HDC hdc = BeginPaint(hWnd, &ps);
        FillRect(hdc, &ps.rcPaint, (HBRUSH)(COLOR_WINDOW));
        EndPaint(hWnd, &ps);
    }

    return 0;
    }

    return DefWindowProc(hWnd, uMsg, wParam, lParam);
}

void AddMenus(HWND hWnd)    
{
    hMenu = CreateMenu(); 
    HMENU hFileMenu = CreateMenu();
    HMENU hSubMenu = CreateMenu(); 
    AppendMenu(hSubMenu, MF_STRING, NULL, L"Sub-Menu");
    AppendMenu(hFileMenu, MF_STRING, FILE_MENU_NEW, L"New");
    AppendMenu(hFileMenu, MF_POPUP, (UINT_PTR)hSubMenu, L"Sub-menu ");
    AppendMenu(hFileMenu, MF_SEPARATOR, NULL, NULL);
    AppendMenu(hFileMenu, MF_STRING, FILE_MENU_QUIT, L"Quit");
    AppendMenu(hMenu, MF_POPUP, (UINT_PTR)hFileMenu, L"File");
    AppendMenu(hMenu, MF_STRING, NULL, L"Aide");
    SetMenu(hWnd, hMenu);    
}

void AddControls(HWND hWnd) 
{
    CreateWindowW(L"Static", L"Enter text here:", WS_VISIBLE | WS_CHILD | WS_BORDER | SS_CENTER , 200, 100, 150, 50, hWnd, NULL, NULL, NULL);
        hEdit = CreateWindowW(L"Edit", NULL, WS_VISIBLE | WS_CHILD | WS_BORDER , 200, 152, 100, 50, hWnd, NULL, NULL, NULL);
    CreateWindowW(L"Button", L"Changez title", WS_VISIBLE | WS_CHILD, 200, 204, 150, 50, hWnd, (HMENU)CHANGE_TITLE, NULL, NULL); 
}

我多次尝试重新创建源文件,但无济于事。


你有一个失踪的break;声明在你的末尾case WM_COMMAND:堵塞。就目前情况而言,您的代码将“落入”case WM_CREATE:处理后的代码any WM_COMMAND.

补充一下break;语句似乎可以修复您的代码(当我测试它时):

LRESULT CALLBACK WindowProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
    switch (uMsg)     {
        case WM_COMMAND:
            switch (wParam)         {
                case FILE_MENU_QUIT:
                    DestroyWindow(hWnd);
                    break;
                case FILE_MENU_NEW:
                    MessageBeep(MB_ICONINFORMATION);
                    break;
                case CHANGE_TITLE:
                    wchar_t text[100];
                    GetWindowTextW(hEdit, text, 100);
                    SetWindowTextW(hWnd, text);
                    break;
            }
            break; // ** You missed this line! **
        case WM_CREATE:
            AddMenus(hWnd);
            AddControls(hWnd);
            break;
//...

如果启用所有编译器警告,则可以发现此类错误:MSVC 中的静态代码分析会给出以下消息:

警告 C26819:开关标签之间未注释的失败(es.78)。

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

CreateWindow“编辑”键入的字符“不可见”? 的相关文章

  • 如何使用 C++ 禁用另一个进程中窗口上的关闭按钮?

    我需要从另一个进程禁用窗口上的关闭按钮 我有它的句柄hWnd我尝试这样做 DWORD dwCStyle GetClassLongPtr hWnd GCL STYLE SetClassLongPtr hWnd GCL STYLE dwCSty
  • 如何让 Win32 使用 Windows XP 样式字体

    我正在使用纯 C 和 WinAPI 编写 Win32 应用程序 不允许使用 MFC 或 C 为了让控件使用适当的样式进行绘制 我使用了清单 如相应的 MSDN 文章中所述 一切都很好 当我更改系统样式时 我的应用程序也会更改样式 但使用的字
  • 如何查明 .exe 是否正在 C++ 中运行?

    给定进程名称 例如 程序 exe C 标准库没有这样的支持 您需要一个操作系统 API 来执行此操作 如果这是 Windows 那么您将使用 CreateToolhelp32Snapshot 然后使用 Process32First 和 Pr
  • 提取证书中主题属性的所有值

    我目前正在使用CertGetNameString http msdn microsoft com en us library windows desktop aa376086 28v vs 85 29 aspx提取每个主题属性的值 如下所示
  • 设置窗口像素的正确(且无闪烁)方法?

    我正在努力找出在 WM PAINT 期间将纯 RGBA 值数组转储到 Win32 窗口的客户区的正确方法 我有以下代码 但它看起来已经很复杂 我什至还没有完成 case WM ERASEBKGND return 1 case WM PAIN
  • 如何验证文件名称在 Windows 中是否有效?

    是否有一个 Windows API 函数可以将字符串值传递给该函数 该函数将返回一个指示文件名是否有效的值 我需要验证文件名是否有效 并且我正在寻找一种简单的方法来完成此操作 而无需重新发明轮子 我正在直接使用 C 但针对的是 Win32
  • “printf”在 Windows 非控制台应用程序中写入何处?

    如果我选择创建 Windows 非控制台应用程序 并实施printf cout在代码中 在哪里printf cout写 它是否写到stdout缓冲 如果是 有什么办法可以读取它stdout并将其打印到某个文本文件或执行MessageBox与
  • 使用 Visual C++ 在桌面上绘图

    我正在编写一个 opencv 应用程序 使用 Visual Studio VC 控制台应用程序使用激光束进行绘图 我想在桌面上画线 我知道绘图功能在 GDI32 dll 中可用 但对如何将 GDI32 dll 与我的 vc 代码集成感到困惑
  • C++/Win32 在虚拟内存中创建文件

    如何在虚拟内存中创建文件以及可以在其上使用普通文件函数 如 CreateFile WriteFile 等 吗 我正在尝试实现一个缓冲文件编写器类 但问题是管理需要动态常量重新分配的缓冲区 你可以使用管道 它们也被操作系统视为 文件 您可以将
  • WinForms:如何确定窗口是否不再活动(没有子窗口具有焦点)?

    我的应用程序使用多个窗口 我想隐藏一个特定窗口 以防应用程序失去焦点 当活动窗口不是应用程序窗口时 source https stackoverflow com questions 466354 how can i tell if a wi
  • 如何一步步遍历目录树?

    我发现了很多关于遍历目录树的示例 但我需要一些不同的东西 我需要一个带有某种方法的类 每次调用都会从目录返回一个文件 并逐渐遍历目录树 请问我该怎么做 我正在使用函数 FindFirstFile FindNextFile 和 FindClo
  • 将对话框项分组到单个“组”(Visual Studio)

    我想创建一个对话框窗口来更改应用程序的设置 下面是 Adob e Reader 的屏幕截图 使用 Spy 后 我猜想 在右侧 所有控件 按钮 组合框 等 都属于 GroupBox 对于左侧TreeView控件中的每个类别 都有一个相应的Gr
  • WndProc调用机制(WinAPI)

    我试图了解 Windows 应用程序是如何工作的 有一个WndProc函数 其中发生消息处理 LRESULT CALLBACK WndProc HWND hwnd UINT msg WPARAM wParam LPARAM lParam s
  • 原始 PDO 将 IOCTL 发送到上层过滤器驱动程序 (kbfiltr/moufiltr) 以启用/禁用设备

    我对驱动程序开发非常陌生 并尝试编写一个简单的过滤驱动程序来启用或禁用键盘或鼠标设备 如果我能让它工作 我想在插入鼠标时使用它来禁用笔记本电脑上的触摸板 我意识到可能已经有软件可以做到这一点 但我对设备驱动程序非常感兴趣并且想要自己学习如何
  • 验证 EXE 上的 Authenticode 签名 - C++,无需 CAPICOM

    我正在为安装程序 DLL 编写一个函数 以验证系统上已安装的 EXE 文件的 Authenticode 签名 该函数需要 A 验证签名是否有效 B 验证签名者是我们的组织 因为这是在安装程序中 并且因为它需要在较旧的 Win2k 安装上运行
  • 查找给定城市的 UTC 偏移量

    在 Windows 上的 C 中 给定一个城市 比如伦敦 纽约 悉尼或新加坡等 我如何找到每个城市的 UTC 偏移量 即该函数应该能够接受城市名称并返回 UTC 偏移量当前的情况 即考虑夏令时 任何想法如何使用 win32 API 来完成此
  • 如何在 Rust winapi 编程中使用 COM VARIANT?

    我正在尝试转换C COM 代码 https technet microsoft com pt br aa382113 v vs 71 for TaskSchedulerRust 并坚持VARIANT的论证ITaskService Conne
  • 如何从系统属性获取Windows操作系统环境变量

    我遇到一个关于系统属性环境变量的奇怪问题 如你所知 我们可以打开Computer gt Property gt Advanced System Settings gt Advanced gt System Environment Varia
  • 如何从 Java 访问 Windows 设备管理器中的信息?

    我有一个串行 USB 设备 并且其中多个设备可以连接到计算机 我需要查询和检索设备连接到的 COM 端口列表 在 Windows 设备管理器中 您可以获得当前连接的设备的 COM 端口 友好名称 该列表是动态的 从注册表中读取不工作 htt
  • 按扩展名过滤搜索文件返回太多结果

    我正在开发一个 C 控制台应用程序 它必须管理 Windows 操作系统上的文件 我需要获取具有特定扩展名的文件名 列表 我找到了很多解决方案 最建议的是以下一种 HANDLE hFind WIN32 FIND DATA data hFin

随机推荐