2016-12-28 4 views
0

Я нахожу разные примеры в Интернете, как программировать PropertySheet в WinAPI, но они не являются полными. Код, который я использую, показан ниже. У меня есть PropertySheet с 3 вкладками, каждый с диалогом. Различные диалоги вызывается, когда я нажимаю вкладки, пока он работает. Однако, когда я оставляю PropertySheet нажатием кнопки OK, как мне получить содержимое в текстовых блоках и т. Д. Каждого диалога? Обычно я использовал это в DialogProc при получении WM_COMMAND/IDOK с использованием: GetDlgItemText (hDlg, IDC_TEXTBOX1, buf, 100); Но в PropertySheet есть только одна кнопка OK для всех диалогов, в команде DialogProc не получено WM_COMMAND/IDOK. Что мне делать?Как обрабатывать результаты из PropertySheet?

Resource_file:

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 Источник:

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; 
} 

ответ

1

, когда пользователь нажимает кнопку OK или Apply все ваши страницы получили PSN_APPLY код уведомления. так что вам нужно искать для WM_NOTIFY с PSN_APPLY кодом

, когда пользователь нажимает кнопку cancel вы получили PSN_RESET уведомление

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; 
} 
Смежные вопросы