Como implementar uma classe de folha de propriedade redimensionável que contém uma barra de menus no Visual C++ 6.0

IMPORTANTE: Este artigo foi traduzido por um sistema de tradução automática (também designado por Machine Translation ou MT), não tendo sido portanto traduzido ou revisto por pessoas. A Microsoft possui artigos traduzidos por aplicações (MT) e artigos traduzidos por tradutores profissionais, com o objetivo de oferecer em português a totalidade dos artigos existentes na base de dados de suporte. No entanto, a tradução automática não é sempre perfeita, podendo conter erros de vocabulário, sintaxe ou gramática. A Microsoft não é responsável por incoerências, erros ou prejuízos ocorridos em decorrência da utilização dos artigos MT por parte dos nossos clientes. A Microsoft realiza atualizações freqüentes ao software de tradução automática (MT). Obrigado.

Clique aqui para ver a versão em Inglês deste artigo: 300606
Aviso de Isenção de Responsabilidade sobre Conteúdo do KB Aposentado
Este artigo trata de produtos para os quais a Microsoft não mais oferece suporte. Por esta razão, este artigo é oferecido "como está" e não será mais atualizado.
Sumário
Há vezes quando um aplicativo exigir mais flexibilidade de folhas de propriedades que ele usa de MFC (Microsoft Foundation Classes) pode oferecer. Este artigo demonstra as etapas para implementar uma classe de folha de propriedade redimensionável também contém uma barra de menus.
Mais Informações
As instruções a seguir mostram como adicionar uma nova classe de folha de propriedade para um projeto MFC existente e personalizar a folha de manipulando solicitações de redimensionamento e fornecendo um menu para a folha. Essas etapas demonstram como escrever uma classe base, CMyPropertySheet , que pode ser usado para fornecer essa funcionalidade. Essa nova classe seria uma substituição oferecerão CPropertySheet do MFC e deve fornecer a funcionalidade adicional descrita na seção "Resumo".

  1. Para qualquer projeto MFC com base em Adicionar uma nova folha de propriedades usando a Galeria de componente. Aceite todos os padrões. Para fazer isso, no menu Project , clique em Adicionar ao projeto e, em seguida, clique em componentes e controles . Na caixa de diálogo clique duas vezes na pasta "Componentes" e selecione Folha de propriedades .
  2. Para habilitar bordas redimensionáveis, você deve substituir DoModal() e fornecem uma função de retorno de chamada que irá definir os estilos apropriados para a folha de propriedades. Portanto, você deve fornecer duas funções a seguir (em tanto o arquivo de cabeçalho e o arquivo de origem para a classe CMyPropertySheet.):
    • A função de retorno de chamada de folha de propriedade estática, XmnPropSheetCallback() :
      // This function must be a STATIC member function. //Callback to allow us set the default window styles //    for the property sheetint CALLBACK CMyPropertySheet::XmnPropSheetCallback(HWND hWnd, UINT message, LPARAM lParam){   extern int CALLBACK AfxPropSheetCallback(HWND, UINT message, LPARAM lParam);   // XMN: Call MFC's callback   int nRes = AfxPropSheetCallback(hWnd, message, lParam);   switch (message)   {   case PSCB_PRECREATE:      // Set our own window styles      ((LPDLGTEMPLATE)lParam)->style |= (DS_3DLOOK | DS_SETFONT         | WS_THICKFRAME | WS_SYSMENU | WS_POPUP | WS_VISIBLE | WS_CAPTION);      break;   }   return nRes;} 						
    • A substituição DoModal() :
      // Overriding DoModal() allows us to hook our callback into//    the prop sheet creationint CMyPropertySheet::DoModal() {   // Hook into property sheet creation code   AFX_OLDPROPSHEETHEADER* psh = GetPropSheetHeader();   psh->dwFlags |= PSH_USECALLBACK;   psh->pfnCallback = XmnPropSheetCallback;   return CPropertySheet::DoModal();}						
  3. Neste ponto, você tem uma folha de propriedades que você pode arrastar para redimensionar usando o mouse. Para adicionar um menu, você deve fornecer uma substituição para OnInitDialog() . No menu Exibir , clique em Assistente de classe e selecione o projeto e a classe de folha de propriedade da caixa de diálogo Assistente de classe . Em seguida, selecione a entrada OnInitDialog na lista drop-down mensagens . O fragmento de código a seguir fornece uma substituição para OnInitDialog() :
    BOOL CMyPropertySheet::OnInitDialog() {   BOOL bResult = CPropertySheet::OnInitDialog();       // Add a new menu   CMenu *pMenu = new CMenu; pMenu->LoadMenu(IDR_PS_MENU);   SetMenu(pMenu);   // Adjust propsheet size to account for the new menu   CRect r;  GetWindowRect(&r);   r.bottom += GetSystemMetrics(SM_CYMENU);   MoveWindow(r);   return bResult;}					
  4. Você deve fornecer uma diretiva de redimensionamento. A maneira mais simples para fazer isso é redimensionar o controle de guia incorporado acordo com a solicitação de redimensionamento e mover os botões presentes na planilha. Para fazer isso:

    1. Adicione os seguintes membros de dados à classe CMyPropertySheet :
      protected:   BOOL   m_bNeedInit;   CRect  m_rCrt;   int    m_nMinCX;   int    m_nMinCY;							
    2. Inicializar esses novos membros de dados e defina m_bNeedInit como TRUE no construtor CMyPropertySheet :
      CMyPropertySheet::CMyPropertySheet(CWnd* pWndParent)	 : CPropertySheet(IDS_PROPSHT_CAPTION, pWndParent) 	 	 , m_bNeedInit(TRUE)	 , m_nMinCX(0)	 , m_nMinCY(0){   AddPage(&m_Page1);   AddPage(&m_Page2);}							
    3. Adicione as seguintes linhas para o final do OnInitDialog() :
      BOOL CMyPropertySheet::OnInitDialog() {   // ...   // Init m_nMinCX/Y   m_nMinCX = r.Width();   m_nMinCY = r.Height();   // After this point we allow resize code to kick in   m_bNeedInit = FALSE;   GetClientRect(&m_rCrt);   return bResult;}							
    4. Forneça um manipulador para o evento WM_SIZE. No menu Exibir , clique em Assistente de classe e selecione o projeto e a classe de folha de propriedade da caixa de diálogo Assistente de classe . Em seguida, selecione a entrada WM_SIZE na lista drop-down mensagens . A seguir está a implementação do manipulador de mensagem:
      // Handle WM_SIZE events by resizing the tab control and by //    moving all the buttons on the property sheet.void CMyPropertySheet::OnSize(UINT nType, int cx, int cy) {   CRect r1;    CPropertySheet::OnSize(nType, cx, cy);   if (m_bNeedInit)      return;   CTabCtrl *pTab = GetTabControl();   ASSERT(NULL != pTab && IsWindow(pTab->m_hWnd));       int dx = cx - m_rCrt.Width();   int dy = cy - m_rCrt.Height();   GetClientRect(&m_rCrt);   HDWP hDWP = ::BeginDeferWindowPos(5);   pTab->GetClientRect(&r1);    r1.right += dx; r1.bottom += dy;   ::DeferWindowPos(hDWP, pTab->m_hWnd, NULL,                    0, 0, r1.Width(), r1.Height(),                    SWP_NOACTIVATE|SWP_NOMOVE|SWP_NOZORDER);   // Move all buttons with the lower right sides   for (CWnd *pChild = GetWindow(GW_CHILD);        pChild != NULL;        pChild = pChild->GetWindow(GW_HWNDNEXT))   {      if (pChild->SendMessage(WM_GETDLGCODE) & DLGC_BUTTON)      {         pChild->GetWindowRect(&r1); ScreenToClient(&r1);          r1.top += dy; r1.bottom += dy; r1.left+= dx; r1.right += dx;         ::DeferWindowPos(hDWP, pChild->m_hWnd, NULL,                          r1.left, r1.top, 0, 0,                          SWP_NOACTIVATE|SWP_NOSIZE|SWP_NOZORDER);      }      // Resize everything else...      else      {         pChild->GetClientRect(&r1); 	 r1.right += dx; r1.bottom += dy;	 ::DeferWindowPos(hDWP, pChild->m_hWnd, NULL, 0, 0, r1.Width(), r1.Height(),SWP_NOACTIVATE|SWP_NOMOVE|SWP_NOZORDER);      }   }   ::EndDeferWindowPos(hDWP);}							
    5. Por fim, você deve fornecer um manipulador para a mensagem WM_GETMINMAXINFO. No menu Exibir , clique em Assistente de classe e selecione o projeto e a classe de folha de propriedade da caixa de diálogo Assistente de classe . Em seguida, selecione WM_GETMINMAXINFO na lista drop-down de mensagens . A seguir está a implementação do manipulador WM_GETMINMAXINFO:
      void CMyPropertySheet::OnGetMinMaxInfo(MINMAXINFO FAR* lpMMI) {   CPropertySheet::OnGetMinMaxInfo(lpMMI);   lpMMI->ptMinTrackSize.x = m_nMinCX;   lpMMI->ptMinTrackSize.y = m_nMinCY;}							
Referências
Para obter informações adicionais, clique nos números abaixo para ler os artigos na Base de dados de Conhecimento da Microsoft:
143291Como redimensionar CPropertyPages em tempo de execução
146916Como criar um CPropertySheet sem janela restrita com botões padrão
folha de propriedades, redimensionar, personalizar, setmenu

Aviso: este artigo foi traduzido automaticamente

Propriedades

ID do Artigo: 300606 - Última Revisão: 06/03/2005 15:52:49 - Revisão: 2.0

Microsoft Visual C++ 6.0 Service Pack 5

  • kbmt kbinfo kbhowto KB300606 KbMtpt
Comentários