代码之家  ›  专栏  ›  技术社区  ›  Thomas

在页面处理完属性表的“确定”或“应用”按钮后,如何响应它?

  •  1
  • Thomas  · 技术社区  · 15 年前

    这个 PropertySheet API允许您定义 PropSheetProc 当按下“OK(确定)”或“Apply(应用)”按钮时,它可以(在Windows XP及更高版本上)接收消息。这允许您在单击其中一个按钮时进行处理。

    但是,此处理程序被调用 之前 各个属性页接收 PSN_APPLY 通过各自的对话程序通知。我想做我的处理 之后 这些通知已被处理,最好没有丑陋的黑客。我该怎么做?

    背景: 我将我的配置存储在一个 struct ,每个单独的页面都会修改 结构 当它们被应用时。然后,在写入这些值之后,我希望应用 结构 而不是从每个属性页重新应用所有属性页。

    3 回复  |  直到 14 年前
        1
  •  2
  •   Thomas    15 年前

    我最终使用了 PropSheetProc 回调以捕获属性表的窗口句柄,然后挂接子类窗口过程,如下所示:

    // This is not officially defined, but the whole world uses it.
    #define ID_APPLY_NOW 0x3021
    
    WNDPROC origWinProc;
    
    LRESULT CALLBACK MyWinProc(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam) {
      // Call the original window procedure.
      LRESULT retVal = CallWindowProc(origWinProc, hwndDlg, msg, wParam, lParam);
      // Now, and only now, do our own stuff.
      switch (msg) {
        case WM_COMMAND:
          switch (LOWORD(wParam)) {
            case IDOK:
            case ID_APPLY_NOW:
              applyConfig();
              saveConfig();
              break;
          }
          break;
      }
      // Return the original winproc's result.
      return retVal;
    }
    
    int CALLBACK myPropSheetProc(HWND hwndDlg, UINT msg, LPARAM lParam) {
      switch (msg) {
        case PSCB_INITIALIZED:
          // Override the property sheet's window procedure with our own.
          origWinProc = (WNDPROC)SetWindowLongPtr(hwndDlg, GWLP_WNDPROC, (LONG_PTR)&MyWinProc);
          break;
      }
      return 0;
    }
    

    (是的,我用 switch 陈述,即使只有一个案例需要考虑。我很奇怪。)

        2
  •  0
  •   Goz    15 年前

    难道你不能截获wm_命令的bl_clicked消息来获取idik、idapply和idcancel吗?

    您使用的是MFC吗?还是ATL?

    虽然我想不出时间,但我无法截获BM_点击的画面…

    编辑:hmm从未通过该函数使用属性页…刚刚读了一遍。是否设置了pfncallback函数和psh_usecallback标志?

    每一页也有一个对话过程。你不能截取“确定”、“取消”和“申请”吗?不过,我认为另一个计划似乎更合适。

        3
  •  0
  •   Chris Becke    15 年前

    您不需要从任何对话框处理程序内部应用结构。因此,如果它是一个模态属性表,您可以做一些简单的事情,比如:

    // Display the property sheet.
    PropertySheet(&theSheet);
    // The peroperty sheets PSN_APPLY notification sets this bool to true in the struct.
    if(theStruct.fApply)
      ApplyTheStruct(&theStruct);
    

    或者,我不明白为什么,考虑到“结构”只是收集页面上输入的信息,当用户与页面交互时,您不更改结构。忽略每页 PSN_APPLY 在调用PropsheetProc时发送消息并应用结构。或者如果通知是 PSN_CANCEL .

    推荐文章