PropertySheet标签点击关闭
问题描述:
我正在用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。有谁知道为什么会发生这种情况?
答
这是因为您必须在对话框模板中至少有1个控件。