首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何处理PropertySheet的结果?

如何处理PropertySheet的结果?
EN

Stack Overflow用户
提问于 2016-12-28 19:04:33
回答 1查看 77关注 0票数 0

我在互联网上找到了关于如何用PropertySheet在WinAPI中编程的不同例子,但它们并不是完整的。我正在使用的代码如下所示。我有一个带有3个选项卡的PropertySheet,每个标签都有一个对话框。当我单击Tabs时,调用不同的对话框,到目前为止,它是工作的。但是,当我离开PropertySheet按OK按钮时,如何获得每个对话框的Textboxes等中的内容?通常,在DialogProc中使用GetDlgItemText( hDlg、IDC_TEXTBOX1、buf、100)接收WM_COMMAND/IDOK时,我通常会这样做;但是在PropertySheet中,所有对话框只有一个OK按钮,DialogProc中没有收到WM_COMMAND/IDOK。怎么办?

Resource_file:

代码语言:javascript
复制
IDD_DIALOG_1 DIALOGEX 0, 0, 385, 186
    STYLE DS_SETFONT | DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU
    BEGIN
        LTEXT           "param",IDC_STATIC,6,23,39,10
        EDITTEXT        IDC_TEXTBOX1,48,20,237,15
    END

C资料来源:

代码语言:javascript
复制
LRESULT CALLBACK
Dialog1(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
char buf[500];
char* ptr;
int p; // =lParam, rin of edited person
int f;
    switch (message)
    {
        case WM_INITDIALOG:
        {
            SetDlgItemText(hDlg, IDC_TEXTBOX1, "something");
            return 0; 
        }

        case WM_COMMAND:
        {
            switch (LOWORD(wParam))
            {
            case IDOK: // never reached (OK Button belongs to the PropertySheet!)
            }
        }
    }
    return FALSE;
} /* Dialog1 */

INT_PTR DoPropertySheet(HWND hwndOwner, LPARAM p)
{
    PROPSHEETPAGE psp[3];

    PROPSHEETHEADER psh;

    memset(psp,0,sizeof(psp));

    for(int i=0;i<3; i++)
    {
        psp[i].dwSize      = sizeof(PROPSHEETPAGE);
        psp[i].dwFlags = PSP_USETITLE;
        psp[i].hInstance   = hInstance;
        psp[i].lParam      = p;
    }
    psp[0].pszTemplate = MAKEINTRESOURCE(IDD_DIALOG_1);
    psp[0].pfnDlgProc  = (DLGPROC)Dialog1;
    psp[1].pszTemplate = MAKEINTRESOURCE(IDD_DIALOG_2);
    psp[1].pfnDlgProc  = (DLGPROC)Dialog2;
    psp[2].pszTemplate = MAKEINTRESOURCE(IDD_DIALOG_3);
    psp[2].pfnDlgProc  = (DLGPROC)Dialog3;

    psh.dwSize      = sizeof(PROPSHEETHEADER);
    psh.dwFlags = PSH_PROPSHEETPAGE | PSH_NOAPPLYNOW;
    psh.hwndParent  = hwndOwner;
    psh.hInstance   = hInstance;
    psh.pszIcon     = 0;
    psh.nPages      = sizeof(psp) / sizeof(PROPSHEETPAGE);
    psh.nStartPage  = 0;
    psh.ppsp        = (LPCPROPSHEETPAGE) &psp;
    psh.pfnCallback = NULL;

    if (PropertySheet(&psh)) // 0:cancel, otherwise:1
    {
       //get contens of propertySheet here?? how??
    }
    return 0;
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-12-28 20:27:55

当用户按OKApply时,所有页面都会得到应用通知代码。因此,您需要使用WM_NOTIFY代码查找PSN_APPLY

当用户按cancel键时,您得到了重设通知

代码语言:javascript
复制
INT_PTR CALLBACK PPDlgProc(HWND hwnd, UINT umsg, WPARAM wParam, LPARAM lParam)
{
    union {
        LPARAM lp;
        NMHDR* hdr;
        PSHNOTIFY* psn;
    };

    switch (umsg)
    {
    case WM_NOTIFY:
        lp = lParam;
        switch (hdr->code)
        {
        case PSN_APPLY:
            DbgPrint("apply");
            break;
        case PSN_RESET:
            DbgPrint("cancel\n");
            break;
        }
        break;
    }
    return 0;
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41368216

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档