运行时的win32控件

时间:2012-06-09 21:53:03

标签: c++ winapi runtime

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

我正在编写一个没有实际用途的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;

if( LOWORD(wParam) == btn1)中的'btn1'指的是我点击试图制作另一个按钮的ID,该按钮是通过以下代码通过函数有效创建的:

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

1 个答案:

答案 0 :(得分:2)

  

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

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

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