【问题标题】:Is it possible to avoid static or global variables in dialog functions是否可以在对话框函数中避免静态或全局变量
【发布时间】:2011-04-05 19:56:39
【问题描述】:

如果在对话框函数中需要某种状态,那么您似乎需要某种静态变量。例如,GetOpenFileName 的钩子过程在其 WM_INITDIALOG 调用中为对话函数提供了 OPENFILENAME 结构的地址,但在任何后续调用中都没有,并且 OPENFILENAME 结构包含一个用于在对话过程和对话过程之间传递信息的位置 lCustData。 GetOpenFileName 调用者。如果对话框函数需要这些状态中的任何一个,似乎唯一的选择是静态或全局变量。

【问题讨论】:

    标签: windows winapi dialog


    【解决方案1】:

    您可以像this KB 推荐的那样在 WM_INITDIALOG 中使用 SetProp,如果您有自定义控件(模板),则可以使用 SetWindowLongPtr(..,GWLP_USERDATA)

    【讨论】:

    • 我被撕裂了。如果提到可怕的 SetProp API,我可以给你 -1。或 +1 提及正确的方法:SetWindowLongPtr 和 GWLP_USERDATA(或 DWLP_USER)。我会选择 +1 :)
    • GWL_USERDATA 和 GWL_USER 数据是否未被任何 uSoft 软件使用? IE。我可以假设我可以使用它吗?
    • @Mike D:这就是为什么我说自定义控件(在您的模板中),不确定将其设置在对话框本身还是由 MS 创建的控件是一个好主意
    • @Chris Becke:SetProp 是 MS 告诉您使用的,在您未创建的窗口上使用 ?WLP_USER* 有点冒险。 SetProp 唯一“可怕”的事情是你必须记住移除道具,这样你就不会泄漏 ATOM。
    • 所有 shell 对话框、通用和用户控件以及系统对话框都不使用 GWL_USERDATA 或 DWL_USER。微软一直很擅长确保应用程序程序员有一个可靠的地方来存储上下文指针。问题通常仅在尝试子类或超类某些其他用户制作的窗口时发生。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-19
    • 1970-01-01
    • 2016-01-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多