Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/155.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何强制win32控件始终验证整个客户端区域,即使使用部分矩形调用“Invalidate”_C++_Winapi - Fatal编程技术网

C++ 如何强制win32控件始终验证整个客户端区域,即使使用部分矩形调用“Invalidate”

C++ 如何强制win32控件始终验证整个客户端区域,即使使用部分矩形调用“Invalidate”,c++,winapi,C++,Winapi,我有自己版本的编辑控件,它基于原始的win32控件,我将编辑的windows过程子类化,以执行某些操作,但是绘图是由原始的WM_PAINT完成的。 因此,假设有什么东西使我的控件的矩形无效,但是传递的矩形比客户端区域小,因此只有部分控件被重新绘制/验证。我无法控制来自操作系统的无效调用。我需要有一种方法来强制重新绘制整个控件,即使在请求部分验证时也是如此。 到目前为止,我已经尝试过: 听WM_NCPAINT。wParam是区域的句柄。我修改了区域以包括整个客户端区域 听WM_NCPAINT。如果

我有自己版本的编辑控件,它基于原始的win32控件,我将编辑的windows过程子类化,以执行某些操作,但是绘图是由原始的WM_PAINT完成的。 因此,假设有什么东西使我的控件的矩形无效,但是传递的矩形比客户端区域小,因此只有部分控件被重新绘制/验证。我无法控制来自操作系统的无效调用。我需要有一种方法来强制重新绘制整个控件,即使在请求部分验证时也是如此。 到目前为止,我已经尝试过:

听WM_NCPAINT。wParam是区域的句柄。我修改了区域以包括整个客户端区域

听WM_NCPAINT。如果wParam!=1这只是要验证的窗口的一部分。 1号根本不起作用。第二个是不可靠的,调用无效函数可能会也可能不会导致某种无限循环,但它起了作用


还有什么我可以试试的吗?谢谢

这是一个XY问题,您不能自定义绘制编辑控件。它犯下了严重的罪行,它不使用WM_颜料画自己。早在20世纪80年代末,为了在386sux上正常工作,它就必须这么做。无法可靠地执行此操作。在转发到原始窗口过程之前,对WM_PAINT消息进行子类化并使整个客户端rect无效。当原始窗口过程调用BeginPaint时,它将被告知绘制整个窗口。请注意,首先你的设计非常狡猾-你能更全面地解释一下你的场景吗?对Hans说:我不是想定制控件,事实上我希望它是本地绘制的,我所需要的只是在请求部分无效时以某种方式模拟完全重画。雷蒙德:这是我在解决方案2中在wm_ncpaint中已经尝试过的,但我担心这可能会导致问题。这个设置听起来可能很不可靠,因为我遗漏了一些不相关的细节。我回复WM_CTLCOLOREDIT消息以提供自定义背景,它工作得非常好,直到我关闭Aero。在非aero模式下,当另一个窗口移动到该控件上时,操作系统会使该控件部分无效。如果背景是图案或其他非均匀的,我似乎记得::SetWindowOrgEx可用于“诱骗”GDI从另一个位置“启动”图案。