首页

在什么情况下才需要调用 LockWindowUpdate ?  

在上一篇文章中,我们了解了 LockWindowUpdate 的工作原理,今天这篇文章我将会讲讲这个函数的用途。 实际上,LockWindowUpdate 的设计初衷可以简化为一个词:拖动。关于这个话题,我先按下不表。 LockWindowUpdate 函数允许应用程序临时性地接管绘制窗口的责任。 当然,为了做到这一点,你必须阻止窗口过程(或其他任何人)进行正常的绘图活动;否则,两段代码(通常绘制...

深入理解 LockWindowUpdate: 该函数的作用  

今天说说被误解的 LockWindowUpdate 。 这是 LockWindowUpdate 系列中的第一篇,我将会讲讲它的作用、用途以及(也许最重要的是)对它的误用。 LockWindowUpdate 的作用非常简单。 当一个窗口被锁定时,所有试图绘制它或其子窗口的尝试都会失败。 窗口管理器不会进行绘制,而是记住应用程序尝试绘制到窗口的哪些部分,当窗口解锁时,这些区域将失效,以便应用程序获得另...

为什么我的对话框创建失败了?菜鸟错误2  

另外一个创建对话框失败的原因来自如下代码,可能这个原因不那么容易看出来。 这里,我们定义了一个列表控件(ListView Control),但是需要注意的是,使用列表控件之前,需要调用 InitCommonControlsEx 来注册它的窗口类。 创建对话框失败的根本原因是:这个对话框上可能有些控件的窗口类没有提前注册。 如果你使用到了以下控件,则一定记得调用 来初始化它们。 > 工具栏(...

为什么我的对话框创建失败了?菜鸟错误1  

对话框中的资源要么被定义为一个整数,要么被定义为一个字符串。 仅仅一个简单的错误将会将其中的一个类型错误的变成另一个类型。我们来看一个例子。 你是否能发现其中的两处 “菜鸟级错误” ? 如果先获取资源文件并发送给预处理器,可能会更容易发现这个问题。 对 DialogBox 的第一次调用将 TEXT(“DLG_OPEN”) 作为资源名称传递。但请注意,没有具有该名称的资源...

如果你找不到东西,请先确保你在正确的地方寻找  

之前我们在几篇文章中描述了如何进行”思想”调试,今天的文章我将不会这样做。 因为下面的编程错误大部分人都会遇到,如果你看一眼下面的代码,你不会发现有什么问题,这仅仅是因为你的的大脑只给你希望看到的,而不是那些真实存在的东西。(有没有一种黑客帝国的感觉?) 您可以长时间盯着看这段代码,而完全忽略了错误的窗口句柄被传递给 GetDlgItem 和 SetWindowLongP...

EnumChildWindows 本身已经是递归的了  

我经常看到一些朋友会编写类似于下面的代码。 上面的这段代码的本意是:通过对窗口树根结点进行操作,然后对每个子窗口进行操作,对窗口树中的所有窗口执行操作。反过来,对子项的操作又以递归方式执行,因此我们最终可以看到树中的每个窗口。 除了如果你真的在一个模糊有趣的窗口树上运行这个函数,你会发现项目被计算了多次。 原因是 EnumChildWindows 函数已经执行递归。 以下是 MSDN 对 Enu...

如何打印富文本控件中的内容?  

出于某种原因,人们确实对打印富文本控件中的内容感到困惑。 我并非打印方面的专家,但是经过对资料的研究的,我也算弄明白了,今天在此记录一下。 解决问题的关键是这个消息:EM_FORMATRANGE。 每次发送这个消息的时候,控件的内容会打印一些,然后消息会返回尚未打印的文本的首个字符的索引,然后可以依据这个索引继续传递给它,并打印下一块文本内容。 剩下的工作就是简单的设置工作和资源的销毁了。 我们...

如何将整个文件内容加载到富文本控件?  

众所周知,富文本控件,Rich Text Control,用来呈现文本内容的一个控件,功能上相对记事本来说更加丰富,但又不及 Word。 但,我们的目标又不是开发另外一个 Word。 我们可以使用 EM_STREAMIN 消息将整个文件加载到富文本控件,此消息接受一个 IStream 的数据源,并一次性地将整个文件的内容加载的控件上。听起来,是不是还不错? 如果你 MSDN 上阅读了关于 EM_S...

为什么不能通过GetProcAddress调用CreateWindow?  

有时候,我看到有些人在折腾这样一个问题: “我想使用 GetProcAddress 来获取 CreateWindow 或者 ExitWindows 的调用地址,但是没有成功。为什么?” 通常,他们当时是在尝试编写平台调用(P/Invoke)相关的代码,因为从底层的角度来看,平台调用是通过 GetProcAddress 来实现的。 问题来了:为什么 GetProcAddres...

不要被各种专业术语吓倒  

有一个东西,是如此奇妙,今天我们需要讲讲。 在不同的函数中,这个东西有着不同的名字,但实际它都是同一个东西。 例如,RegisterWaitForSingleObject 这个 API,它的原型如下: BOOL RegisterWaitForSingleObject( [out] PHANDLE phNewWaitObject, [in] HANDLE hObject, [in] WAITORTI...