0

这似乎是一个微不足道的问题,而且答案没有明显的目的,但我纯粹是出于对知识和好奇心的兴趣。

我正在编写一个 Win32 GUI 应用程序,除了使用 Win32 API 扩展我的编程知识之外没有其他实际目的,我想知道在程序启动和 WM_CREATE 之后我将如何创建控件(特别是文本字段和按钮)已被调用。

我知道使用 UpdateWindow 会向窗口发送 WM_CREATE 消息,但如果我理解正确,这只会更新源中 WM_CREATE 中已经写入的内容?

我所追求的是一个在单击时添加另一个按钮的按钮和一个在单击时添加一个文本字段的按钮。

而且,虽然不是一个控件,但另一个按钮使用 TextOut() 或单击时绘制文本。

在过去的 2 个小时里,我一直在搜索谷歌寻找这个并且没有运气,我也看过UpdateWindow()并且RedrawWindow()没有提供任何真正的帮助。

我不要求你们为我编写任何代码,尽管那会很棒:P 只是一些正确方向的指针和一些指导会很棒

提前致谢, 蒂米

另外,我正在使用带有 VS10 的 C++,请不要使用 .NET 或 MFC,只需纯 C++ :D

编辑:

main.cpp,消息循环:

case WM_CREATE:
hedit = ctrls->createTextArea(100, 50, 100, 20, ghInstance, hWnd, hEdit1);
hedit2 = ctrls->createBtn(200, 50, 100, 20, ghInstance, hWnd, "button", btn1);
return 0;

ctrls 指的是控件类对象,该类中的 createTextArea 和 createBtn 如下所示:

HWND controls::createTextArea(int x, int y, int width, int height, HINSTANCE hInst, HWND parent, int id)
{
return CreateWindowEx(NULL,
            "Edit",
            "",
            WS_CHILD | WS_VISIBLE | ES_PASSWORD | WS_BORDER,
            x, y,
            width,height,
            parent, (HBRUSH)id,
            hInst,
            NULL);
}



HWND controls::createBtn(int x, int y, int width, int height, HINSTANCE hInst, HWND parent, LPCSTR btnText, int id)
{
    return CreateWindowEx(NULL,
            "Button",
            btnText,
            WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON,
            x, y,
            width, height,
            parent, (HBRUSH)id,
            hInst,
            NULL);
}

编辑二:

WM_COMMAND

    case WM_COMMAND:

        if( LOWORD(wParam) == btn1) // btn1 click
        {
            hBtn = CreateWindowEx(NULL,
                "Button",
                "Button2",
                WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON,
                400,50,100,20,
                hWnd, NULL,
                ghInstance,
                NULL);
            ShowWindow(hBtn, SW_SHOW);
            UpdateWindow(hWnd);
        }
            return 0;

中的“btn1”是if( LOWORD(wParam) == btn1)指我单击以尝试制作另一个按钮的 ID,该 ID 由以下通过函数调用的代码有效创建:

CreateWindowEx(NULL,
            "Button",
            btnText,
            WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON,
            x, y,
            width, height,
            parent, (HMENU)id,
            hInst,
            NULL);
4

1 回答 1

2

我知道使用 UpdateWindow 会向窗口发送 WM_CREATE 消息

不,CreateWindow/Ex() 将发送该消息。UpdateWindow 只会强制发送和处理 WM_PAINT 消息。如果您的主窗口不可见,那么您可能忘记调用 ShowWindow()。

使用 Win32 项目模板生成的默认代码作为指导。首先验证它是否有效,然后逐步添加更改。在 64 位操作系统上编写 32 位代码时,请注意吞下的 SEH 异常。Debug + Exceptions,勾选“Win32 Exceptions”的Thrown复选框。

于 2012-06-09T22:29:05.640 回答