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);
}
その追加したプロパティシートのページを開くまで、WM_INITDIALOGとか飛んでこなかった…って記憶がありますが。
開いてみても呼ばれないんですか?
なるほど。
プロパティページの場合、一度表示されたりアクティブにならないとこれらの関数が呼ばれないみたいです。
これで解決すると思います。ありがとうございました。