这似乎是一个微不足道的问题,答案没有明确的目的,但我纯粹是出于对知识和好奇心的兴趣。
我正在编写一个没有实际用途的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);
答案 0 :(得分:2)
我知道使用UpdateWindow会向窗口发送WM_CREATE消息
不,CreateWindow / Ex()将发送该消息。 UpdateWindow只会强制调度和处理WM_PAINT消息。如果您的主窗口不可见,那么您可能忘记调用ShowWindow()。
使用Win32 Project模板生成的默认代码作为指导。首先验证它是否有效,然后逐步添加更改。在64位操作系统上编写32位代码时,请注意吞下的SEH异常。 Debug + Exceptions,勾选“Win32 Exceptions”的Thrown复选框。