Закладки PropertySheet закрываются при нажатии - PullRequest
0 голосов
/ 30 января 2011

Я создаю элемент управления PropertySheet с помощью Windows API, и по какой-то причине вкладки закрываются, когда я нажимаю на них.

Например, если я добавляю 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);

Затем создаем таблицу свойств следующим образом:

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 Ответ

4 голосов
/ 01 февраля 2011

Это потому, что у вас должен быть хотя бы 1 элемент управления в шаблоне диалога.

...