2016-12-28 67 views
0

我在互聯網上找到了如何在WinAPI中編寫PropertySheet的不同示例,但它們並不完整。 我使用的代碼如下所示。我有一個帶有3個選項卡的PropertySheet,每個選項卡都帶有一個對話框。 不同的對話框被調用,當我點擊標籤時,到目前爲止它正在工作。 但是,當我按下「確定」按鈕離開PropertySheet時,如何獲取每個對話框的文本框等內容? 正常情況下,我曾經在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

當用戶按下OKApply所有網頁得到PSN_APPLY通知代碼。所以你需要尋找WM_NOTIFYPSN_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; 
}