CLOSE SEARCH
POSTS TAGGED WITH: MFC

MFC에서 Accelerator (단축키) 편집 후 적용이 되지 않을 경우 (MFC Feature Pack Accelerator issue)

원인 : MFC Feature Pack  설계상의 문제


해결책 1.

레지스트리편집기에서 해당 프로그램의 레지스트리를 삭제한 후 재실행하면  적용되지 않던 단축키가 적용된다.


해결책 2.

MFC 프레임워크에서 기본적으로 제공하는 사용자 지정 메뉴에서 키보드 설정을 초기화 한다.


참고 URL : http://connect.microsoft.com/VisualStudio/feedback/details/540924/mfc-feature-pack-accelerator-issue

CString 클래스 사용시 힙 손상 오류가 발생할 경우


CString::GetBuffer() 함수를 통해 CString 객체에 문자열을 할당하고자 할 경우

CString 객체의 버퍼 크기가 복사하려는 문자열 버퍼의 크기보다 작으면 메모리 오류가 발생한다.

이런 경우에는 GetBufferSetLength() 함수를 이용해서

CString 객체의 포인터를 얻어오기 전에 충분한 크기의 버퍼를 확보해야 한다.

LOGFONT.lfHeight <-> int 상호 변환

int IntToLogFontHeight(int nVal)

{
HDC hdc = ::GetDC(::GetDesktopWindow());
int yPixelPerInch = ::GetDeviceCaps(hdc, LOGPIXELSY);
::ReleaseDC(::GetDesktopWindow(), hdc);
int ret = -1 * (nVal * yPixelPerInch / 72);
return ret;
}
int LogFontHeightToInt(int nVal)
{
HDC hdc = ::GetDC(::GetDesktopWindow());
int yPixelPerInch = ::GetDeviceCaps(hdc, LOGPIXELSY);
::ReleaseDC(::GetDesktopWindow(), hdc);
int ret = int(abs(nVal * 72.0 / yPixelPerInch) + 0.5);
return ret;
}


“0xC015000F: 활성화를 해제하고 있는 활성화 컨텍스트는 가장 최근에 활성화한 컨텍스트가 아닙니다.” 오류가 발생할 경우


MFC로 작성한 프로그램에서 위와 같은 오류가 나오는 경우

XXXApp::InitInstance() 함수 내부에 CWinAppEx::InitInstance(); 코드 다음에 아래의 코드를 추가해준다.

 

afxAmbientActCtx = FALSE;

 

그래도 해결이 되지 않는다면 사용중인 DLL 내부에서 NULL 포인터에 접근하는 코드가 없는지 확인해 보아야한다.

 

[MFC] Using Workerthread

[sourcecode language=”cpp”]

CWinThread* pThread = ::AfxBeginThread(ThreadFunc, &param);

UINT ThreadFunc(LPVOID pParam)

{

return 0;

}

//스레드 종료 후 특정 작업 처리

if ( ::WaitForSingleObject(pThread->m_hThread, INFINITE))

{

// … 처리해야 할 작업들 …

}

//지정한 시간 후 스레드 처리

DWORD dwCode = ::WaitForSingleObject(pThread->m_hThread, 7000);

if (dwCode == WAIT_OBJECT_0)

{

// … 스레드 종료 후 수행할 작업들…

}

else if (dwCode == WAIT_TIMEOUT

{

// … 7000ms 후 스레드가 종료되지 않을 경우 에러처리 작업 …

}

//스레드 실행 여부 확인

if ( ::WaitForSingleObject(pThread->m_hThread, 0) == WAIT_TIMEOUT )

{

// … 스레드 실행 중 …

}

else

{

/// … 스레드 실행 중이 아님 …

}

[/sourcecode]

CMFCPropertyGridFontProperty class has no SetColor() method

CMFCPropertyGridFontProperty 클래스를 쓰다보니 GetColor() 는 있는데 SetColor()가 없다. m_Color 멤버도 protected 멤버라서 직접 접근할 수 없다.

그냥 쿨하게 서브클래싱해서 SetColor()를 하나 만들어 주자!


CFontProperty::CFontProperty(const CString& strName, LOGFONT& lf, DWORD dwFontDialogFlags, LPCTSTR lpszDescr, DWORD_PTR dwData, COLORREF color)
:CMFCPropertyGridFontProperty(strName, lf, dwFontDialogFlags, lpszDescr, dwData, color)
{
}
CFontProperty::~CFontProperty()
{
}
void CFontProperty::SetColor(COLORREF col)
{
m_Color = col;
}


크리에이티브 커먼즈 라이선스
이 저작물은 크리에이티브 커먼즈 저작자표시-비영리-변경금지 2.0 대한민국 라이선스에 따라 이용할 수 있습니다.