如何使用 WinAPI 制作可编辑的文本框?

Posted

技术标签:

【中文标题】如何使用 WinAPI 制作可编辑的文本框?【英文标题】:How to make editable TextBox with WinAPI? 【发布时间】:2013-07-31 14:20:13 【问题描述】:

我刚从 Winforms 切换,一切对我来说看起来都很难。我面临一个接一个的问题。下一个,是……

#ifndef ActivationWindow_h
#define ActivationWindow_h

#include <windows.h>

class ActivationWindow

    static HWND main_wnd;
    static HWND lbl_login_desc;
    static HWND txt_login;

public:
    static void CreateWnd()
    
        MSG msg =  0 ;
        WNDCLASS wc =  0 ; 
        wc.lpfnWndProc = WndProc;
        wc.hInstance = GetModuleHandle(NULL);
        wc.hbrBackground = (HBRUSH)(COLOR_BACKGROUND);
        wc.lpszClassName = "actwnd";

        if(!RegisterClass(&wc))
            return;

        if(!(main_wnd = CreateWindow(wc.lpszClassName, "Program activation", WS_OVERLAPPEDWINDOW | WS_VISIBLE, 0, 0, 640, 480, 0, 0, wc.hInstance, NULL)))
            return;

        lbl_login_desc = CreateWindow("static", "ST_U", WS_CHILD | WS_VISIBLE | WS_TABSTOP, 10, 10, 50, 20, main_wnd, (HMENU)(501), wc.hInstance, NULL);
        SetWindowText(lbl_login_desc, "Login: ");

        txt_login = CreateWindow("edit", "", WS_CHILD | WS_VISIBLE | WS_TABSTOP | ES_LEFT | WS_BORDER, 70, 10, 50, 20, main_wnd, (HMENU)(502), wc.hInstance, NULL);

        while(GetMessage(&msg, NULL, 0, 0) > 0)
            DispatchMessage( &msg );
    

    static LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
    
        switch(message)
        
            case WM_CLOSE:
                PostQuitMessage(0);
                break;

            default:
                return DefWindowProc(hWnd, message, wParam, lParam);
        

        return 0;
      
;

HWND ActivationWindow::main_wnd = NULL;
HWND ActivationWindow::lbl_login_desc = NULL;
HWND ActivationWindow::txt_login = NULL;

#endif ActivationWindow_h

当窗口显示时,我无法在 TextBox 中输入任何字符。怎么做?

另外,如果我将鼠标指针移到那个 TextBox 上,它会变成“I”,如果我将鼠标移到窗口之外,鼠标指针仍然是“I”,而不是箭头。 我该如何解决?

我看到了一些关于此的问题,但那个人告诉他禁用了 DirectInput 8,一切都解决了。我不知道我用的是什么...

【问题讨论】:

【参考方案1】:

您需要在消息循环中调用TranslateMessage,否则不会生成WM_CHAR 消息。

您的光标保持为 I-Beam,因为您没有在窗口类中设置光标。您从中学到的什么参考没有显示将光标设置为LoadCursor(NULL, IDC_ARROW) 并将图标设置为LoadIcon(NULL, IDI_APPLICATION) 的基本窗口类注册?

【讨论】:

我确实说过在哪里......在消息循环中。 while (GetMessage... 部分是消息循环。 DispatchMessage...之前我不得不再问一遍,你从什么资源中学习到没有向你展示这一点? 在我看来,这不是一个好的教程,尽管如果您通读它,即使它确实提到了TranslateMessageWM_CHAR 我明白作者的目的,但该教程教给你很多你将不得不忘掉的东西,所以我看不出有什么好处,真的。值得注意的是,文章在 Visual C++ 生成的文件中抱怨的所有“高级”内容与文章的代码不同,因为您的编辑可能会在没有所有混淆的情况下工作。 Windows API 编程一开始是压倒性的,特别是因为所有特定于 API 的类型看起来都很奇怪,但是一旦你掌握了它,它就不会那么糟糕了。 像 Charles Petzold 的 Programming Windows 5th Edition(注意第 5 次而不是第 6 次,这是 C# 和 Windows 8 的东西,而不是 WinAPI)这样的好教程会向您解释所有样板文件,并引导您了解更高级的东西.如果你愿意掏钱买它,它可以在亚马逊上以 28 美元的价格购买 Kindle 版。

以上是关于如何使用 WinAPI 制作可编辑的文本框?的主要内容,如果未能解决你的问题,请参考以下文章

如何使文本文件“打开方式”我的 Win Api 文本编辑器?

用WinAPI编程的时候,如何让一个编辑框在被点击后···

如何更改静态文本控件(winapi)的字体?

在可编辑网格中,如何使 Ext 组合框在选择项目时立即完成编辑模式?

如何在表单上制作可编辑的组合框

如何在打字过程中使文本框旋转 90(垂直)?