2011-01-30 203 views
0

我正在用Windows API製作一個PropertySheet控件,並且由於某些原因,標籤在我點擊它們時會關閉。PropertySheet標籤點擊關閉

舉例來說,如果我添加4個選項卡:

然後,如果我點擊以外的任何活動一個這些選項卡(在這種情況下,什麼也沒有發生),就變成了:

如果我點擊非活動選項卡,它會消失,只剩下一個選項卡。

我創建的標籤,用在內存中的對話框模板,這樣創建:

static const char initText[] = "Tab"; 

pagetemplate = (DLGTEMPLATE*)new char[sizeof(DLGTEMPLATE) + sizeof(initText) * 2]; 

pagetemplate->style = WS_POPUP | DS_3DLOOK | WS_BORDER | WS_SYSMENU | WS_CAPTION | DS_CENTER; 
pagetemplate->cdit = 0; // 0 controls 
pagetemplate->cx = PROP_SM_CXDLG; 
pagetemplate->cy = PROP_SM_CYDLG; 

LPWORD lpword = (LPWORD)(pagetemplate + 1); 
*lpword++ = 0; // no menu 
*lpword++ = 0; // predefined dialog box class (by default) 

MultiByteToWideChar(CP_ACP, NULL, initText, -1, (LPWSTR)lpword, sizeof(initText) * 2); 

然後創建的PropertySheet是這樣的:

PROPSHEETHEADER PSH;

SecureZeroMemory(&psh, sizeof(PROPSHEETHEADER)); 

psh.dwSize = sizeof(PROPSHEETHEADER); 
psh.dwFlags = PSH_MODELESS | PSH_PROPSHEETPAGE | PSH_USECALLBACK; 
psh.pszCaption = "Window"; 
psh.nPages = 1; 
psh.nStartPage = 0; 

PROPSHEETPAGE pages[1]; 

SecureZeroMemory(pages, sizeof(PROPSHEETPAGE)); 

pages[0].dwSize = sizeof(PROPSHEETPAGE); 
pages[0].dwFlags = PSP_DLGINDIRECT; 
pages[0].pResource = CGTabWindow::pagetemplate; 
pages[0].pfnDlgProc = DialogProc; 
pages[0].lParam = (LPARAM)this; 

psh.ppsp = (PROPSHEETPAGE*)&pages; 

propsheet = PropertySheet(&psh); 

並添加四頁是這樣的:

PROPSHEETPAGE page; 

SecureZeroMemory(&page, sizeof(PROPSHEETPAGE)); 

page.dwSize = sizeof(PROPSHEETPAGE); 
page.dwFlags = PSP_DLGINDIRECT; 
page.pResource = CGTabWindow::pagetemplate; 
page.pfnDlgProc = DialogProc; 
page.lParam = (LPARAM)this; 

HPROPSHEETPAGE hpage = CreatePropertySheetPage(&page); 

SendMessage((HWND)propsheet, PSM_ADDPAGE, NULL, (LPARAM)hpage); 

最後,這裏是我的DialogProc:

BOOL CALLBACK DialogProc(HWND hDlg, UINT iMsg, WPARAM wParam, LPARAM lParam) 
{ 
cout << "hey" << endl; 

    switch (iMsg) 
    { 
      case WM_INITDIALOG : 
       return TRUE ; 


    case WM_COMMAND: 
       switch (LOWORD (wParam)) 
     { 
    case ID_EDIT : 
     return TRUE; 
    case ID_HELP : 
     return TRUE; 
       case IDOK : 
         EndDialog (hDlg, 0) ; 
       return TRUE ; 
     } 

       break ; 
    } 
    return FALSE; 
} 

但由於某些原因, 「哎」 永遠不會顯示。另外,發送帶有索引的PSM_INDEXTOHWND總是返回NULL。有誰知道爲什麼會發生這種情況?

回答

4

這是因爲您必須在對話框模板中至少有1個控件。