반응형


// 선언
afx_msg LRESULT OnPropertyChanged(WPARAM wparam, LPARAM lparam);

// 메시지 맵
BEGIN_MESSAGE_MAP(Page1, PropertyPageBase)
ON_REGISTERED_MESSAGE(AFX_WM_PROPERTY_CHANGED, OnPropertyChanged)
END_MESSAGE_MAP()

// Property 추가
CMFCPropertyGridProperty* pProp1 = new CMFCPropertyGridProperty(strTitle, (_variant_t)bVal, strDesc);
assert(pProp1 );
if(pProp1  == 0) return false;
pProp1->SetData(100); // 메시지 구분을 위해 사용한다.
m_wndPropList.AddProperty(pProp1);

// 메시지 처리
LRESULT Page1::OnPropertyChanged(WPARAM wparam, LPARAM lparam)
{
CMFCPropertyGridProperty *pProp = (CMFCPropertyGridProperty*)lparam;
if (!pProp) return 0;

switch(pProp->GetData())
{
case 100:
// 메시지 처리
break;
}
}

////////////////////////////////////////////////////////////////////////////////////////////
// Boolean 속성
////////////////////////////////////////////////////////////////////////////////////////////
// 생성
CMFCPropertyGridProperty* pBooleanProp1 = new CMFCPropertyGridProperty(strTitle, (_variant_t)true or false, strDesc);
pBooleanProp1->SetData(dwID);
m_wndPropList.AddProperty(pBooleanProp1);
// 속성 지정
CMFCPropertyGridProperty* pBooleanProp1 = m_wndPropList.FindItemByData(dwID);
pBooleanProp1->SetValue((_variant_t)true or false);
// 속성 가져오기
COleVariant rVariant = pProperty->GetValue();
VARIANT v = rVariant.Detach();
VARTYPE vt = v.vt;
assert(vt == VT_BOOL);
#pragma warning(disable:4800)
bool bVal = (bool)v.boolVal;
#pragma warning(default:4800)

////////////////////////////////////////////////////////////////////////////////////////////
// Dropdown Combobox
////////////////////////////////////////////////////////////////////////////////////////////
// 생성 : 초기값이 옵션에 없어도 초기값으로 출력됨, 이 경우 초기값은 추가되지 않고 콤보박스에서 선택안됨
CMFCPropertyGridProperty* pDropdownCombo1
= new CMFCPropertyGridProperty(_T("타이틀"), _T("초기값"), _T("설명"));
pDropdownCombo1->AddOption(_T("옵션1"));
pDropdownCombo1->AddOption(_T("옵션2"));
pDropdownCombo1->AllowEdit(FALSE);
pDropdownCombo1->SetData(dwID);
m_wndPropList.AddProperty(pDropdownCombo1);
// 속성 지정
CMFCPropertyGridProperty* pDropdownCombo1 = m_wndPropList.FindItemByData(dwID);
pDropdownCombo1->SetValue(_T("옵션2"));
// 속성 가져오기
USES_CONVERSION;
COleVariant rVariant = pProperty->GetValue();
VARIANT v = rVariant.Detach();
VARTYPE vt = v.vt;
assert(vt == VT_BSTR);
CString strW = OLE2W(v.bstrVal);

////////////////////////////////////////////////////////////////////////////////////////////
// Integer
////////////////////////////////////////////////////////////////////////////////////////////
// 생성 : 초기값 또는 속성 지정시에 int 또는 long int형을 혼용하지 말고 한 가지로 통일해서 써야 한다.
// 다른 데이터형에 대한 경우에도 물론 혼용은 하지 않는다.
// 기본값이 아닌 값에 대해 bold로 표시하고 싶은 경우는 long int형을 써야 한다.
// 다만 Spinner 속성을 지정하는 경우에는 아무때나 int를 써도 무방하다.
CMFCPropertyGridProperty* pIntegerProp1 = new CMFCPropertyGridProperty(strTitle, (_variant_t)(long int)nVal, strDesc);
pIntegerProp1->AllowEdit(TRUE); // or FALSE
pIntegerProp1->SetData(dwID);
pIntegerProp1->EnableSpinControl(TRUE, -10, 10);
m_wndPropList.AddProperty(pIntegerProp1);
// 속성 지정
CMFCPropertyGridProperty* pIntegerProp1 = m_wndPropList.FindItemByData(dwID);
pIntegerProp1->SetValue((_variant_t)(long int)nVal);
// 속성 가져오기
COleVariant rVariant = pProperty->GetValue();
VARIANT v = rVariant.Detach();
VARTYPE vt = v.vt;
assert(vt == VT_I4);
#pragma warning(disable:4800)
int nVal = (int)v.intVal;
#pragma warning(default:4800)

////////////////////////////////////////////////////////////////////////////////////////////
// Float
////////////////////////////////////////////////////////////////////////////////////////////
// 생성
CMFCPropertyGridProperty* pFloatProp1 = new CMFCPropertyGridProperty(strTitle, (_variant_t)fVal, strDesc);
pFloatProp1->AllowEdit(TRUE); // or FALSE
pFloatProp1->SetData(dwID);
m_wndPropList.AddProperty(pFloatProp1);
// 속성 지정
CMFCPropertyGridProperty* pFloatProp1 = m_wndPropList.FindItemByData(dwID);
pFloatProp1->SetValue((_variant_t)fVal);
// 속성 가져오기
COleVariant rVariant = pProperty->GetValue();
VARIANT v = rVariant.Detach();
VARTYPE vt = v.vt;
assert(vt == VT_R4);
#pragma warning(disable:4800)
float fVal = (float)v.fltVal;
#pragma warning(default:4800)

///////////////////////////////////////////////////////////////////////////////////////////////////
// Text Edit
///////////////////////////////////////////////////////////////////////////////////////////////////
// 생성
CMFCPropertyGridProperty* pStringProp1 = new CMFCPropertyGridProperty(strTitle, (_variant_t)strVal, strDesc);
pStringProp1->AllowEdit(TRUE); // or FALSE
pStringProp1->SetData(dwID);
m_wndPropList.AddProperty(pStringProp1);
// 속성 지정
CMFCPropertyGridProperty* pStringProp1 = m_wndPropList.FindItemByData(dwID);
pStringProp1->SetValue((_variant_t) strVal);
// 속성 가져오기
USES_CONVERSION;
COleVariant rVariant = pProperty->GetValue();
VARIANT v = rVariant.Detach();
VARTYPE vt = v.vt;
assert(vt == VT_BSTR);
CString strW = OLE2W(v.bstrVal);

////////////////////////////////////////////////////////////////////////////////////////////
// Font : 속성 변경시 메시지가 여러 번 온다.
////////////////////////////////////////////////////////////////////////////////////////////
// 생성
CMFCPropertyGridFontProperty* pFont1
= new CMFCPropertyGridFontProperty(strTitle, LOGFONT, CF_EFFECTS | CF_SCREENFONTS, strDesc);
pFont1->SetData(dwID);
LOGFONT* pFont = pFont1->GetLogFont();
COLORREF hColor = pFont1->GetColor();
memcpy(pFontOut, pFont, sizeof(LOGFONT)); // 폰트속성 저장(땜빵해주기)
*pColorOut = hColor; // 폰트색상 저장(땜빵해주기)
m_wndPropList.AddProperty(pFont1);
// 속성 지정
CMFCPropertyGridFontProperty* pFontProp1 = (CMFCPropertyGridFontProperty*)m_wndPropList.FindItemByData(dwID);
LOGFONT* pFont = pFontProp1->GetLogFont();
lstrcpy(pFont->lfFaceName, strW); // 속성 지정(API를 통하지 않고 직접 수정한다)
m_wndPropList.UpdateData(FALSE); // 속성 업데이트
*pColorOut = pFontProp1->GetColor(); // 폰트속성 저장(땜빵해주기)
memcpy(pFontOut, pFont, sizeof(LOGFONT)); // 폰트색상 저장(땜빵해주기)
// 속성 가져오기
USES_CONVERSION;
LPLOGFONT pFont1;
COLORREF FontColor1;
COleVariant rVariant = pFontProperty->GetValue();
VARIANT v = rVariant.Detach();
VARTYPE vt = v.vt;
assert(vt == VT_BSTR);
LOGFONT* pFont1 = pFontProperty->GetLogFont();
COLORREF hColor = pFontProperty->GetColor();
if(hColor != *pColorOut || (memcmp(pFontOut, pFont1, sizeof(LOGFONT)) != 0))
{
// 이벤트 처리(이전에 저장해둔 값들과 틀린 경우)
}

////////////////////////////////////////////////////////////////////////////////////////////
// Color
////////////////////////////////////////////////////////////////////////////////////////////
// 생성
CMFCPropertyGridColorProperty* pColor1 = new CMFCPropertyGridColorProperty(strTitle, hColor, NULL, strDesc);
pColor1->SetData(dwID);
pColor1->EnableOtherButton(_T("기타...")); // "기타..." 버튼을 활성화 시킴
pColor1->AllowEdit(TRUE);
m_wndPropList.AddProperty(pColor1);
// 속성 지정
CMFCPropertyGridColorProperty* pColorProp1 = (CMFCPropertyGridColorProperty*)m_wndPropList.FindItemByData(dwID);
pColorProp1->SetColor(hColor);
// 속성 가져오기
COleVariant rVariant = pProperty->GetValue();
VARIANT v = rVariant.Detach();
VARTYPE vt = v.vt;
assert(vt == VT_I4);
COLORREF hColor = pProperty->GetColor();

////////////////////////////////////////////////////////////////////////////////////////////
// File Select, Folder Select : 처음 메시지가 두 번 오는 경우가 허다하다. 두 번째 부터는 제대로 오는 듯 하다.
////////////////////////////////////////////////////////////////////////////////////////////
// 생성
// File select
CMFCPropertyGridFileProperty* pFileSelect1
= new CMFCPropertyGridFileProperty(strTitle, TRUE, _T(""), 0, 0, strFilter, strDesc);
// Folder select
//CMFCPropertyGridFileProperty* pFileSelect1 = new CMFCPropertyGridFileProperty(strTitle, strInitialFolder);
pFileSelect1->SetData(dwID);
USES_CONVERSION;
wchar_t wbuf[1024];
COleVariant rVariant = pFileSelect1->GetValue();
VARIANT v = rVariant.Detach();
VARTYPE vt = v.vt;
assert(vt == VT_BSTR);
swprintf_s(wbuf, L"%s", OLE2W(v.bstrVal));
CStringW strW = wbuf; // Font 의 경우처럼 미리 저장해 놓는다.
m_wndPropList.AddProperty(pFileSelect1);
// 속성 지정
CMFCPropertyGridFileProperty* pFile1 = (CMFCPropertyGridFileProperty*)m_wndPropList.FindItemByData(dwID);
pFile1->SetValue((_variant_t)strFile);
CStringW strW = strFile; // 속성을 따로 저장
// 속성 가져오기
USES_CONVERSION;
wchar_t wbuf[1024];
COleVariant rVariant = pProperty->GetValue();
VARIANT v = rVariant.Detach();
VARTYPE vt = v.vt;
assert(vt == VT_BSTR);
swprintf_s(wbuf, L"%s", OLE2W(v.bstrVal));
CString strFile1 = wbuf;
if(strW != strFile1)
{
// 이벤트 처리(이전에 저장해둔 값들과 틀린 경우)
strW = wbuf;
}


폰트, 파일 관련 프로퍼티 변경시, 한 번의 이벤트에 메시지가 여러 번 온다.
패치 안되나...

반응형

+ Recent posts