- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我从 Spy++ 得到以下输出:
<00227> 001F1732 P WM_MOUSEMOVE fwKeys:MK_LBUTTON xPos:-43 yPos:28
<00228> 001F1732 S WM_SIZING fwSide:WMSZ_LEFT lprc:0012F410
<00229> 001F1732 R WM_SIZING fProcessed:False
<00230> 001F1732 S WM_WINDOWPOSCHANGING lpwp:0012F404
<00231> 001F1732 S WM_GETMINMAXINFO lpmmi:0012EEF4
<00232> 001F1732 R WM_GETMINMAXINFO lpmmi:0012EEF4
<00233> 001F1732 R WM_WINDOWPOSCHANGING
<00234> 001F1732 S WM_NCCALCSIZE fCalcValidRects:True lpncsp:0012F3D8
<00235> 001F1732 R WM_NCCALCSIZE fuValidRect:0000 lpncsp:0012F3D8
<00236> 001F1732 S WM_NCPAINT hrgn:00000001
<00237> 001F1732 R WM_NCPAINT
<00238> 001F1732 S WM_ERASEBKGND hdc:09012308
<00239> 001F1732 R WM_ERASEBKGND fErased:True
<00240> 001F1732 S WM_WINDOWPOSCHANGED lpwp:0012F404
<00241> 001F1732 S WM_MOVE xPos:950 yPos:404
<00242> 001F1732 R WM_MOVE
<00243> 001F1732 S WM_SIZE fwSizeType:SIZE_RESTORED nWidth:282 nHeight:79
<00244> 001F1732 R WM_SIZE
<00245> 001F1732 S WM_WINDOWPOSCHANGING lpwp:0012F064
<00246> 001F1732 R WM_WINDOWPOSCHANGING
<00247> 001F1732 S WM_NCCALCSIZE fCalcValidRects:True lpncsp:0012F038
<00248> 001F1732 R WM_NCCALCSIZE fuValidRect:0000 lpncsp:0012F038
<00249> 001F1732 S WM_NCPAINT hrgn:00000001
<00250> 001F1732 R WM_NCPAINT
<00251> 001F1732 S WM_ERASEBKGND hdc:16011DB5
<00252> 001F1732 R WM_ERASEBKGND fErased:True
<00253> 001F1732 S WM_WINDOWPOSCHANGED lpwp:0012F064
<00254> 001F1732 R WM_WINDOWPOSCHANGED
<00255> 001F1732 R WM_WINDOWPOSCHANGED
<00256> 001F1732 S WM_PAINT hdc:00000000
<00257> 001F1732 R WM_PAINT
<00258> 001F1732 P WM_MOUSEMOVE fwKeys:MK_LBUTTON xPos:-9 yPos:28
第 241 至 254 行中的缩进是我添加的,以便更明显地看出这些消息是嵌套的。也就是说,它们是由第 240 行中的 WM_WINDOWPOSCHANGED 消息发送的。
这里是关联的 WndProc(这全部来自 Visual Studio 2005 创建的默认项目,除了标记为显示我添加的代码的地方):
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
int wmId, wmEvent;
PAINTSTRUCT ps;
HDC hdc;
LRESULT lReturnValue = 0; //---added by me
static int lcount = 0; //---added by me
switch (message)
{
//---added by me from here vvvv
case WM_WINDOWPOSCHANGED:
++lcount;
lReturnValue = DefWindowProc(hWnd, message, wParam, lParam);
//--lcount;
return lReturnValue;
case WM_ERASEBKGND:
case WM_NCPAINT:
{
wchar_t a[20];
_itow(lcount, &a[0], 10);
OutputDebugString(a);
OutputDebugString(L"\n");
}
return DefWindowProc(hWnd, message, wParam, lParam);
//---added by me to here ^^^^
case WM_COMMAND:
wmId = LOWORD(wParam);
wmEvent = HIWORD(wParam);
// Parse the menu selections:
switch (wmId)
{
case IDM_ABOUT:
DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, About);
break;
case IDM_EXIT:
DestroyWindow(hWnd);
break;
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
break;
case WM_PAINT:
hdc = BeginPaint(hWnd, &ps);
// TODO: Add any drawing code here...
EndPaint(hWnd, &ps);
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
return 0;
}
如果我运行此命令,VS 输出窗口中将显示以下内容:
0
0
1
1
1
1
2
2
2
2
etc
如果我取消注释
//--lcount;
我得到的行:
0
0
0
0
0
0
0
0
etc
不明白为什么?我希望得到:
0
0
1
1
0
0
1
1
etc
其中 1 代表从 WM_WINDOWPOSCHANGED 内部对 WM_ERASEBKGND 和 WM_NCPAINT 的调用(如 Spy++ 输出所示)。显然我有一些根本性的误解,我无法弄清楚!任何尝试的想法/建议都感激地接受......
如果您同意我对这段代码的预期行为,我也希望您能发表评论。这样我就知道我的看法并没有完全错误。 :)
编辑:我认为 Spy++ 在撒谎!我在 WndProc 顶部添加了一个 OutputDebugString 调用,以输出窗口收到的每条消息的数量,并得到:
[WM_MOUSEMOVE] // not received
WM_SIZING
WM_WINDOWPOSCHANGING
WM_GETMINMAXINFO
WM_NCCALCSIZE
WM_NCPAINT
WM_ERASEBKGND
WM_WINDOWPOSCHANGED
WM_MOVE
WM_SIZE
[WM_WINDOWPOSCHANGING] // not received
WM_NCCALCSIZE
WM_NCPAINT
WM_ERASEBKGND
[WM_WINDOWPOSCHANGED] // not received
WM_PAINT
[WM_MOUSEMOVE] // not received
其中“未收到”行是消息 Spy++ 表示窗口已收到,但它们从未出现在 WndProc 中!此外,如果我在 WndProc 的开头放置一个断点,并在 WM_WINDOWPOSCHANGED 中的 DefWindowProc 调用上放置另一个断点,然后跨过 DefWindowProc 调用,则 WndProc 开头的断点不会触发...这意味着不 msg 作为 WM_WINDOWPOSCHANGED 中 DefWindowProc 调用的结果由 WndProc 接收。除非有人能看到我遗漏的东西,否则 Spy++ 不会准确地显示您的窗口收到的消息,而是显示它们的一些损坏版本,如我上面所示!
最佳答案
您遇到这种情况的原因是因为 DefWindowProc() 将对 WM_WINDOWPOSCHANGED 执行的所有操作都是将 WM_SIZE 和 WM_MOVE 事件添加到消息队列 See msdn here所以这段代码:
++lcount;
lReturnValue = DefWindowProc(hWnd, message, wParam, lParam);
--lcount;
只是增加 lcount,将 WM_SIZE 和 WM_MOVE 消息添加到队列中,然后减少 lcount。在 lcount 上的这两个操作之间不会调用 WM_NCPAINT。
希望有帮助吗?
关于c - 来自默认 WndProc 内部的嵌套调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7786263/
我收到此错误消息: .rvm/gems/ruby-2.5.1/bin/ruby_executable_hooks:24:in `' 我重新安装了 Ruby rvm reinstall ruby-2.5
我开始从事 WPF Ribbon 开发,非常好! 我的问题是找到(免费)基本图标(如文件保存/打开/等,剪切/粘贴/等)。 你有什么建议吗? 最佳答案 你看过Visual Studio Icon Li
我只找到经典的声音ID,但我需要Chord(默认)日历警报。如何播放声音? ks #define systemSoundID 1315 AudioServicesPlaySystemSound (s
在 Magento 中创建货件时,有一个复选框可让您“通过电子邮件发送货件副本”。 默认情况下未选中。有谁知道我需要编辑哪个文件才能默认设置为“选中”? 最佳答案 这是一个app/design/adm
我有一个简单的 IValueConverter,它只使用 TypeConverter 进行转换。但是,在某些情况下,提供的 TypeConverter 会失败。 如果转换器未提供 Binding,我想
我正在阅读教程,默认 Activity 是一个扩展另一个类的类,它所拥有的只是一个覆盖方法。应用程序如何工作,因为它不做任何其他事情?我很困惑! 最佳答案 父类 Activity 为您处理一切。 关于
我刚刚开始研究游戏框架。我正在尝试构建 rest api,并将 postgresql 用于我的数据库连接。这是我第一次同时使用 play 和 postgre。我在 build.sbt 中建立了一个数据
是否可以创建具有以下属性的 python 对象: class Foo: def __default_method__(x): return x f = Foo() f(10) > 10
我是 jQuery 的新手,遇到了一个烦人的问题。我有一些登录字段,当该字段为空时会填充默认文本,然后在单击时删除。 我的问题是,当用户保存了他们的用户名/密码(使用浏览器)时,如果他们返回页面,登录
考虑这个代码片段: void Foo(std::string str1, std::string str2) {} template void Bar() { Foo(Types{}...);
我正在编写一个简单的 C 程序,我应该用缓冲区溢出来攻击它。所以,我不想在编译时使用任何标志。如何消除使用的默认标志? # readelf -p .GCC.command.line stack Str
考虑这个代码片段: void Foo(std::string str1, std::string str2) {} template void Bar() { Foo(Types{}...);
我有以下代码[这是一道面试题]: #include #include using namespace std; class A{ public: A(){ cout co
我想在 Autofac 中为每个匹配的生命周期范围注册创建一个实例,但偶尔需要从全局容器(没有匹配的生命周期范围)请求一个实例。在不存在匹配生命周期范围的情况下,我想给出一个顶级实例而不是抛出异常。
我正在做一个收集单词共现的修改版本,所以我编写了自己的 javascript,我正在跟踪三个对象中的出现。但是,一旦对象变大(约 800 万、300 万和 172000),每 100000 个句子需要
我正在使用 pykalman 模块中的 KalmanFilter,我想知道它如何处理缺失的观察结果。根据文档: In real world systems, it is common to have
我有一个应用了 RenderTransform 的 Canvas ,如下所示: 谁能告诉我这些值是什么意思?我似乎无法找到用于解析这些值的转换器。 最佳答案 如 RenderTransform是 T
我是 Linux 的新手,现在使用 CentOS 6。我在这里使用 MySQL 工作台,每当我尝试添加新连接时,它都会询问我默认的 key 环密码。我真的不知道,这个密码是从哪里设置的,我之前没有设置
我在 Ubuntu 18.04 上工作。我没有定义 GL_GLEXT_PROTOTYPES .我使用 glXGetProcAddress 加载“核心”OpenGL 函数.我的申请链接到 /usr/li
我按照文档中的示例添加了对使用 asio 加载 HTTPS 站点的支持,这意味着我调用 ctx.set_default_verify_paths();使用系统默认路径来查找证书。 然而,我得到:una
我是一名优秀的程序员,十分优秀!