帮助WinAPI包装器

时间:2011-09-05 07:19:16

标签: c++ winapi user-interface wrapper

我一直在制作一个简单的WinAPI包装器,而且我遇到了一个非常大的问题。在代码的某处,Window类的句柄(HWND)设置为NULL,并且需要处理消息。我一直在查看代码一小时,我找不到任何东西。有人可以帮忙吗?

Git repository

我很确定逻辑错误发生在Declarations ... \ Window.hpp和Declarations ... \ Application.hpp中,因为这些是唯一包含被调用代码的文件。

2 个答案:

答案 0 :(得分:2)

让我们从这开始:

namespace WinAPI{
    #include <windows.h>
    #include <commctrl.h>
}

不要那样做。

它可以使用,但可能需要为每个新的SDK版本更新代码,但对于初学者来说绝对不是。

以下是如何在C ++中包含<windows.h>标题:

#undef UNICODE
#define UNICODE
#undef STRICT
#define STRICT
#undef NOMINMAX
#define NOMINMAX

#include <windows.h>
#include <windowsx.h>

将其放在包装器标题中。

将包装器包含在全局命名空间中。

哦,你问的问题,你的HWND值消失的逻辑错误?你不能指望其他人调试你的代码。

干杯&amp;第h。,

答案 1 :(得分:0)

如果您还不熟悉assert(),这可能是了解它的好时机。断言是一个您认为是真实的表达式,并且您希望调试器检查它。在您的情况下,您可以查看更新HWND的所有地点,并撰写assert(newHWNDvalue != NULL);

断言是一种评论形式。与//不同,编译器会编译它们,调试器会对它们进行检查,因此它们不会随着时间的推移而过时。

assert是一个宏,您需要包含<cassert>标头。在发布版本中,断言的表达式未编译,因此没有开销。这意味着您通常可以负担得起非平凡的支票。对于复杂的类,添加private: bool CheckInvariants() const方法可能很有用,因此您可以在其他成员中assert(CheckInvariants());