【问题标题】:PropertySheet Application and Usage Win32PropertySheet 应用和使用 Win32
【发布时间】:2014-05-05 03:47:50
【问题描述】:

我正在尝试在我的 Win32 DialogBox 应用程序中使用属性表,以便我可以先获取用户输入,将其应用于我的类,然后使用该用户输入的规范运行程序。

属性页看起来不错,但我不确定我是否弄错了。

无论如何,我正在尝试实施它,但遇到了一些麻烦。我阅读了文档,但仍然没有得到。

我已经设法使属性页(其中 2 个)第一页有一个编辑框和几个组合框,其中包括确定、取消和禁用的应用按钮。我想做的是..

A.当我将 int 添加到编辑框时启用应用按钮

B.弄清楚如何将这些数据放入变量中。

我知道它是如何与我的 DialogBox 窗口一起工作的。对于我放入的所有 IDC_ 内容,我都有 WM_Command。但是属性页,我不知道它的IDC是什么,也不知道如何调用我放入的EDIT框和列表框。或者如何让它识别它们已被用于启用应用按钮。

这是我的属性页设置方法

void propertyPages(HINSTANCE hInstance){

    memset(m_psp, 0, sizeof(m_psp));
    memset(&m_PropSheet, 0, sizeof(m_PropSheet));

    m_psp[0].dwSize = sizeof(PROPSHEETPAGE);
    m_psp[0].dwFlags = PSH_WIZARD;
    m_psp[0].hInstance = hInstance;
    m_psp[0].pszTemplate = (LPCWSTR) IDD_PROPPAGE_LARGE;
    m_psp[0].pszTitle = L"Champ 1 Scenario";

    m_psp[1].dwSize = sizeof(PROPSHEETPAGE);
    m_psp[1].dwFlags = PSP_USETITLE;
    m_psp[1].hInstance = hInstance;
    m_psp[1].pszTemplate = (LPCWSTR) IDD_PROPPAGE_LARGE1;
    m_psp[1].pszTitle = L"Champ 2 Scenario";

    m_PropSheet.dwSize = sizeof(PROPSHEETHEADER);
    m_PropSheet.dwFlags = PSH_PROPSHEETPAGE;
    m_PropSheet.hInstance = hInstance;
    m_PropSheet.pszCaption = L"Champion Level/Runes/Masteries";
    m_PropSheet.nPages = 2;
    m_PropSheet.nStartPage = 0;
    m_PropSheet.ppsp = (LPCPROPSHEETPAGE) m_psp;
    //SendMessage(GetParent(hDlg), PSM_CHANGED, IDD_PROPPAGE_LARGE, 0);
    //PropSheet_Changed(PROPSHEETPAGE,IDD_PROPPAGE_LARGE);
    PropertySheet(&m_PropSheet);
}

我先在

中调用
INT WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
    LPSTR lpCmdLine, int nCmdShow)
{

有任何提示、技巧、指示或建议吗?也许是在主应用程序启动之前获取用户数据的最佳方式?我发现由用户设置值很棘手。

【问题讨论】:

    标签: c++ visual-studio winapi properties


    【解决方案1】:

    您可以使用pfnDlgProc 成员为页面设置对话过程:

    m_psp[0].dwSize = sizeof(PROPSHEETPAGE);
    m_psp[0].dwFlags = PSH_WIZARD;
    m_psp[0].hInstance = hInstance;
    m_psp[0].pszTemplate = (LPCWSTR) IDD_PROPPAGE_LARGE;
    m_psp[0].pszTitle = L"Champ 1 Scenario";
    m_psp[0].pfnDlgProc = MyDialogProc;
    

    MyDialogProc 只是一个普通的对话过程。

    要设置应用按钮的状态,请使用PropSheet_Changed/PropSheet_UnChanged 宏。

    【讨论】:

    • 这是我很难理解的。那是一个新的 MyDialogProc 还是只有一个 DialogProc?我实际上只是尝试使用 Same DialogProc 进行调用,它只是将属性窗口与我的主应用程序窗口融合在一起。所以我认为这不是正确的方法。你能告诉我你使用 MyDialogProc 的意思吗?我也是一起使用 PropSheet_Changed/PropSheet_UnChanged 还是只使用一个而不是另一个。感谢您的回复。
    • 每个页面都有一个单独的对话过程。使用对话过程,您可以检测页面何时发生变化。例如,如果用户在编辑控件中输入一些文本,您可以发送 PropSheet_Changed 宏来启用应用按钮。如果他们随后删除控件中的文本,您可以使用 PropSheet_UnChanged 禁用应用按钮。有关工作示例,请参阅github.com/derceg/explorerplusplus/blob/master/Explorer%2B%2B/…
    【解决方案2】:

    您需要为每个页面创建一个diagloproc:

    LRESULT CALLBACK IntPage1DlgProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) {
        UNREFERENCED_PARAMETER(wParam);
    
        BOOL myCondition = 0;
        LPNMHDR lpnm;
        switch (uMsg) {
        case WM_INITDIALOG:
            break;
        case WM_NOTIFY:
            lpnm = (LPNMHDR)lParam;
            switch (lpnm->code) {
            case PSN_SETACTIVE:
    
                if (myCondition) {
                    PropSheet_SetWizButtons(GetParent(hwndDlg), PSWIZB_BACK | PSWIZB_NEXT);
                }
                else {
                    PropSheet_SetWizButtons(GetParent(hwndDlg), PSWIZB_BACK);
                }
    
                break;
    
            case PSN_WIZFINISH:
                break;
    
            case PSN_WIZBACK:
                break;
    
            case PSN_RESET:
                break;
    
            default:
                break;
            }
            break;
        }
        return 0;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-06-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-04
      • 2013-10-19
      • 1970-01-01
      相关资源
      最近更新 更多