CPropertyPageでDoDataExchangeとOnInitDialogが呼び出されない

解決


abc  2013-05-21 00:41:41  No: 73689  IP: 192.*.*.*

CPropertyPageから派生したクラスをCPropertySheetにAddPageするような処理を書いているのですが、2ページ目に追加したプロパティページのDoDataExchangeとOnInitDialogが呼び出されません。1ページ目に追加したプロパティページは正常に動作します。以下の様なソースです。


IMPLEMENT_DYNAMIC(CWipeAttributeDetailPage2, CPropertyPage)

CWipeAttributeDetailPage2::CWipeAttributeDetailPage2(CWnd* pParent)
  : CPropertyPage(CWipeAttributeDetailPage2::IDD)
  , enable_bright(FALSE)
  , enable_contrast(FALSE)
  , enable_blur(FALSE)
  , flip_vertical(FALSE)
  , flip_horizontal(FALSE)
  , flip_hv(FALSE)
  , enable_negaposi(FALSE)
  , enable_sepia(FALSE)
{

}

CWipeAttributeDetailPage2::~CWipeAttributeDetailPage2()
{
}

void CWipeAttributeDetailPage2::DoDataExchange(CDataExchange* pDX)
{
  CPropertyPage::DoDataExchange(pDX);
  DDX_Control(pDX, IDC_SLIDER_BRIGHTNESS, slider_bright);
  DDX_Control(pDX, IDC_SLIDER_CONT, slider_contrast);
  DDX_Control(pDX, IDC_SLIDER_BLUR_INTENSITY, slider_blur);
  DDX_Check(pDX, IDC_CHECK_USE_BRIGHT, enable_bright );
  DDX_Check(pDX, IDC_CHECK_USE_CONT, enable_contrast );
  DDX_Check(pDX, IDC_CHECK_USE_BLUR, enable_blur );
  DDX_Check(pDX, IDC_CHECK_VFLIP, flip_vertical );
  DDX_Check(pDX, IDC_CHECK_HFLIP, flip_horizontal );
  DDX_Check(pDX, IDC_CHECK_HVFLIP, flip_hv );
  DDX_Check(pDX, IDC_CHECK_NEGAPOSI, enable_negaposi );
  DDX_Check(pDX, IDC_CHECK_SEPIA, enable_sepia );
}


BEGIN_MESSAGE_MAP(CWipeAttributeDetailPage2, CPropertyPage)
  ON_BN_CLICKED(IDC_CHECK_USE_BRIGHT, &CWipeAttributeDetailPage2::OnBnClickedCheckUseBright)
  ON_BN_CLICKED(IDC_CHECK_USE_CONT, &CWipeAttributeDetailPage2::OnBnClickedCheckUseCont)
  ON_BN_CLICKED(IDC_CHECK_USE_BLUR, &CWipeAttributeDetailPage2::OnBnClickedCheckUseBlur)
  ON_BN_CLICKED(IDC_CHECK_VFLIP, &CWipeAttributeDetailPage2::OnBnClickedCheckVflip)
  ON_BN_CLICKED(IDC_CHECK_HFLIP, &CWipeAttributeDetailPage2::OnBnClickedCheckHflip)
  ON_BN_CLICKED(IDC_CHECK_HVFLIP, &CWipeAttributeDetailPage2::OnBnClickedCheckHvflip)
  ON_BN_CLICKED(IDC_CHECK_NEGAPOSI, &CWipeAttributeDetailPage2::OnBnClickedCheckNegaposi)
  ON_BN_CLICKED(IDC_CHECK_SEPIA, &CWipeAttributeDetailPage2::OnBnClickedCheckSepia)

  //ON_WM_CREATE()
  ON_WM_HSCROLL()
END_MESSAGE_MAP()

BOOL CWipeAttributeDetailPage2::OnInitDialog()
{
  CPropertyPage::OnInitDialog();

  slider_bright.SetRange(0,1001);
  slider_contrast.SetRange(0,1001);
  slider_blur.SetRange(0,1001);

  slider_bright.SetPos(501);
  slider_contrast.SetPos(1001);
  slider_blur.SetPos(501);

  UpdateData(FALSE);
  return TRUE;
}

afx_msg int CWipeAttributeDetailPage2::OnCreate(
  LPCREATESTRUCT lpCreateStruct
  )
{
  //CDialog::OnCreate( lpCreateStruct );

  return 0;
}

afx_msg void CWipeAttributeDetailPage2::OnHScroll(
  UINT nSBCode
  , UINT nPos
  , CScrollBar* pScrollBar
  )
{
  CPropertyPage::OnHScroll(nSBCode, nPos, pScrollBar);

  CSliderCtrl *slider(NULL);
  if( *pScrollBar == slider_bright ){
    slider = &slider_bright;
  }else if( *pScrollBar == slider_contrast ){
    slider = &slider_contrast;
  }
  else if( *pScrollBar == slider_blur ){
    slider = &slider_blur;
  }

  int page = slider->GetPageSize();
  double range = (double)slider->GetRangeMax() - (double)slider->GetRangeMin();
  int max(0), min(0);
  slider->GetRange( min, max );
  double v(0.0);

  switch(nSBCode){
  case SB_THUMBPOSITION:
  case SB_THUMBTRACK:
    v = (double)(nPos) / range - 0.5f;
    v = 0.5f + v;
    break;
  case SB_PAGELEFT:
    v = (double)(nPos-page) / range - 0.5f;
    v = 0.5f + v;
    break;
  case SB_PAGERIGHT:
    v = (double)(nPos-page) / range - 0.5f;
    v = 0.5f + v;
    break;
  default:
    break;
  }

  if( *pScrollBar == slider_bright ){
    wipe->brightness = v;
  }else if( *pScrollBar == slider_contrast ){
    wipe->contrast = v;
  }
  else if( *pScrollBar == slider_blur ){
    wipe->blur_intensity = (int)(v * 100.0);
  }

  UpdateData(FALSE);

  view->NotifyRender();
}

// CWipeAttributeDetailPage2 message handlers

void CWipeAttributeDetailPage2::ReflectWipeAttributes( 
  const boost::shared_ptr<Wipe> &_wipe 
  )
{
  if( _wipe.get() )
    wipe = _wipe;
  if( ! wipe )
    return;

  // todo
  enable_bright = static_cast<BOOL>(wipe->use_brightness);
  enable_contrast = static_cast<BOOL>(wipe->use_contrast);
  enable_blur = static_cast<BOOL>(wipe->use_blur);
  flip_vertical = static_cast<BOOL>(wipe->flip_vertical);
  flip_horizontal = static_cast<BOOL>(wipe->flip_horizontal);
  flip_hv = static_cast<BOOL>(wipe->flip_hv);
  enable_negaposi = static_cast<BOOL>(wipe->use_negaposi);
  enable_sepia = static_cast<BOOL>(wipe->use_sepia);

  int pos = (int)(wipe->brightness * 1001.0);
  slider_bright.SetPos(pos);

  pos = (int)(wipe->contrast * 1001.0);
  slider_contrast.SetPos(pos);

  pos = (int)(wipe->blur_intensity * 1001.0);
  slider_contrast.SetPos(pos);

  UpdateData(FALSE);

}


void CWipeAttributeDetailPage2::OnBnClickedCheckUseBright()
{
  UpdateData();

  wipe->use_brightness = static_cast<bool>(this->enable_bright);
}


void CWipeAttributeDetailPage2::OnBnClickedCheckUseCont()
{
  UpdateData();

  wipe->use_contrast = static_cast<bool>(this->enable_contrast);
}


void CWipeAttributeDetailPage2::OnBnClickedCheckUseBlur()
{
  UpdateData();

  wipe->use_blur = static_cast<bool>(this->enable_blur);
}


void CWipeAttributeDetailPage2::OnBnClickedCheckVflip()
{
  UpdateData();

  wipe->flip_vertical = static_cast<bool>(this->flip_vertical);
}


void CWipeAttributeDetailPage2::OnBnClickedCheckHflip()
{
  UpdateData();

  wipe->flip_horizontal = static_cast<bool>(this->flip_horizontal);
}


void CWipeAttributeDetailPage2::OnBnClickedCheckHvflip()
{
  UpdateData();

  wipe->flip_hv = static_cast<bool>(this->flip_hv);
}


void CWipeAttributeDetailPage2::OnBnClickedCheckNegaposi()
{
  UpdateData();

  wipe->use_negaposi = static_cast<bool>(this->enable_negaposi);
}


void CWipeAttributeDetailPage2::OnBnClickedCheckSepia()
{
  UpdateData();

  wipe->use_sepia = static_cast<bool>(this->enable_sepia);
}

編集 削除
瀬戸っぷ  2013-05-21 08:36:10  No: 73690  IP: 192.*.*.*

その追加したプロパティシートのページを開くまで、WM_INITDIALOGとか飛んでこなかった…って記憶がありますが。
開いてみても呼ばれないんですか?

編集 削除
abc  2013-05-21 13:30:27  No: 73691  IP: 192.*.*.*

なるほど。
プロパティページの場合、一度表示されたりアクティブにならないとこれらの関数が呼ばれないみたいです。
これで解決すると思います。ありがとうございました。

編集 削除