自定义win32窗口的消息无法监测,窗口注册类不能被注销。

    win32自定义窗口无法监测到message,记住create窗口的线程要和该窗口消息循环监测在同一个线程,消息循环监测类似这种结构:

while (m_threadHandleFlag && (gm = ::GetMessage(&msg, NULL, 0, 0)) != 0 && gm != -1)
{
if (m_videoWnd  && !m_videoWnd->PreTranslateMessage(&msg))
{
::TranslateMessage(&msg);
::DispatchMessage(&msg);
}
 

    如果create和消息循环不再同一个线程,也可以,你可以做线程之间消息的转发!消息还是可以跨线程传递的,不过这个很复杂,既然事情能简单为什么不简单地做呢。

    在做win32自定义窗口的过成中遇到了另外一个小问题,因为自定义窗口是依靠纯win32 API创建的,所以要自己注册窗口类,这样窗口才能正常地显示出来并可识别,但是在该窗口关闭后需要UnRegisterClass,不然下次使用RegisterClassEx注册同样名字的窗口的时候将会失败,你可以换名字,但是如果不反注册掉之前注册过的窗口类,该窗口类所占的一些内存资源,将不会被释放,这是不明智的,不过在反注册该窗口类的时候,该窗口类必须没有窗口实例在运行,若有,反注册该窗口类将会失败!

在C++中,使用Windows API而非标准库直接创建Win32窗口需要包含头文件`windows.h`,这个头文件包含了所有必要的函数声明和宏。以下是基本步骤: 1. **包含头文件**: ```cpp #include <windows.h> ``` 2. **定义窗口(Window Class)**: 使用`WNDCLASS`结构体来定义一个新的窗口。这通常在程序启动前进行注册: ```cpp WNDCLASS wc; wc.lpfnWndProc = DefWindowProc; // 窗口过程默认处理 wc.hInstance = GetModuleHandle(NULL); // 获取当前模块实例 wc.lpszClassName = "YourWindowClass"; // 窗口名 RegisterClass(&wc); ``` 3. **创建窗口句柄**: 调用`CreateWindow()`函数创建实际的窗口,传递窗名、窗口样式、尺寸等信息: ```cpp HWND hWnd = CreateWindow(wc.lpszClassName, "Your Window Title", WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, 640, 480, NULL, NULL, wc.hInstance, NULL); ``` 4. **消息循环**: 为了响应用户操作并更新窗口,你需要一个消息循环,通常使用` GetMessage()`和`DispatchMessage()`函数: ```cpp MSG msg; while (GetMessage(&msg, NULL, 0, 0)) { TranslateMessage(&msg); DispatchMessage(&msg); } ``` 5. **清理**: 程序结束时别忘了注销窗口: ```cpp UnregisterClass(wc.lpszClassName, wc.hInstance); ``` 注意,这是一个基础示例,实际应用可能涉及更多的细节,比如错误检查、事件处理等。另外,微软从Visual Studio 2015开始推荐使用现代UI(Modern UI)技术,如`CreateWindowEx()`和`CreateUserControl()`,而不是传统的Win32 API。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值