我开始学习 WinAPI 的基础知识(嗯,正如我开始的那样,这是大学老师的作业)。锻炼。您需要通过将“&”运算符替换为“==”来使下面的条件起作用。
// Функция обработки сообщений
...
...
case WM_LBUTTONDBLCLK: {
if (GetWindowLong(hWnd, GWL_STYLE) & WS_POPUP) {...}
从作者对我的问题的回答中,我意识到 GetWindowLong 函数返回一个 32 位字,其中的位是标志。当使用“==”运算符而不是“&”时,需要处理GetWindowLong以便只保留我需要的位,这是什么意思?如何执行此操作(如果设置了标志:WS_POPUPWINDOW | WS_CAPTION | WS_MINIMIZEBOX | WS_MAXIMIZEBOX | WS_THICKFRAME | WS_VISIBLE | WS_SYSMENU)?预先感谢您抽出时间。澄清。代码本身是可以工作的,但是用“==”替换“&”运算符的任务是老师开的一个玩笑,需要完成。
当您使用 GWL_STYLE 参数调用 GetWindowLong 函数时,您将得到结果 - 一个 32 位字,其位是指示窗口创建时使用的样式的标志。如果在创建它 (CreateWindow) 时指定了 WS_POPUP 标志 (0x800000000L),则最高有效位将被设置为结果。
为了测试该位,使用按位 AND 应用适当的掩码。
在这种特殊情况下(仅适用于此标志),您可以检查该数字是否为负数。
你可以右移并检查结果是否为-1
这是因为有符号数经过算术移位,其中符号位填充空闲空间,如果存在 WS_POPUP 标志,则结果将是
0xFFFFFFFF==-1但这一切都是在处理 GetWindowLong 结果(与 AND 一样),如果不进行处理,就无法比较相等性,因为其中设置了多个标志。除非您确切地知道整套标志,因为您自己创建了窗口......
最好给出准确的作业,我担心你可能会歪曲它。