레이블이 MFC인 게시물을 표시합니다. 모든 게시물 표시
레이블이 MFC인 게시물을 표시합니다. 모든 게시물 표시

2010년 3월 9일 화요일

Visual Studio 2008 프로젝트 만들때 해줘야 하는일

Visual Studio 2008로 새 프로젝트를 만들고 빌드를 하면 아래의 에러가 뜬다.

 

"MSVCR90.dll을 찾을 수 없음."

 

메뉴-프로젝트-속성-구성속성-링커-입력-특정라이브러리무시에

 

MSVCRT.lib

 

을 입력한다.

 

디버그 모드만 해주고 릴리즈에서는 안해도 된다.

 

2009년 11월 1일 일요일

리스트 컨트롤 초기화

<고정 윈도우 일때> (m_listStudy는 CListCtrl이고 Report형식이다.)

 

CRect rect;
m_listStudy.GetClientRect(rect);

m_listStudy.SetExtendedStyle(LVS_EX_FULLROWSELECT | LVS_EX_GRIDLINES );

 

char title[4][16] = {"Monday", "Tuesday", "Wednesday", "Thursday"};

double percent[4] = {25, 25, 25, 25};

int sum = 0, size, i = 0;

for(i=0;i<3;i++){
   size = int(percent[i] / 100. * rect.Width());
   m_listStudy.InsertColumn(i, title[i], LVCFMT_CENTER, size);
   sum += size;
}
m_listStudy.InsertColumn(i, title[i], LVCFMT_CENTER, rect.Width() -  sum);

2009년 10월 29일 목요일

다국어 버전을 위한 대화상자 템플릿 설정

한국어 OS에서 만든 대화상자는 영어 OS에서 완전히 망가져 보인다.

이를 해결하기 위한 방법중 템플릿을 이용한 방법이 있다.

 

1. 리소스에디터에서 대화상자의 Language 속성을 "기본 언어 처리"로 변경한다.

 

2. 아래 코드를 추가한다.

   #include <afxpriv.h>

 

3. 대화상자에 DoModal() 함수를 오버라이드하고 아래와 같이 추가한다.

    붉은색 부분은 클래스 이름을 써주고 파란색부분에는 폰트 이름과 사이즈를 넣어준다.

 

INT_PTR CDlgSplash::DoModal()
{
   CDialogTemplate dlt;
   int nResult;

   if(!dlt.Load(MAKEINTRESOURCE(CDlgSplash::IDD)))
      return -1;

   dlt.SetFont(theApp.m_Reg.GetFontFace(), (WORD) theApp.m_Reg.GetFontSize());

   LPSTR pdata = (LPSTR)GlobalLock(dlt.m_hTemplate);

   m_lpszTemplateName = NULL;
   InitModalIndirect(pdata);

   nResult = CDialog::DoModal();

   GlobalUnlock(dlt.m_hTemplate);

   return nResult;
}

2009년 10월 28일 수요일

인스턴스 중복 방지

App의 InitInstance에 아래의 코드를 추가한다. Mutext를 이용한 방법이다.

App에 고유한 이름을 정해주어야 한다.

 

HANDLE prevInstance = NULL;
DWORD dwLastError = 0;
prevInstance = CreateMutex(NULL, FALSE, "BROADSTORAGE");
if(prevInstance == NULL){
   AfxMessageBox ("Can't create Mutex!");
   return FALSE;
}
dwLastError = GetLastError ();
if(dwLastError == ERROR_ALREADY_EXISTS){
   if(prevInstance != NULL){      
      CloseHandle (prevInstance);
      prevInstance = NULL;

      HWND hWnd = ::FindWindow("BroadStorage", NULL);
      if(hWnd != NULL)
         ::ShowWindow(hWnd, SW_RESTORE);
   }
  return FALSE;

}

클래스 이름 바꾸기

<대화상자 기반>

 

아래는 클래스 이름을 "BroadStorage"로 변경하는 예이다. 대화상자는 클래스 이름이 모두 #32770이다.

 

1. 리소스 파일을 텍스트 편집기로 연다.

2. 메인 대화상자에 아래와 같이 CLASS 항목을 추가한다.

IDD_BROADSTORAGE_DIALOG DIALOGEX 0, 0, 235, 230
STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
EXSTYLE WS_EX_APPWINDOW | WS_EX_NOACTIVATE
CAPTION "Broad Storage Server"
CLASS "BroadStorage"
FONT 8, "MS Shell Dlg", 0, 0, 0x1

...
END

3. App의 InitInstance()의 맨 윗부분에 아래 코드를 추가한다.

WNDCLASS wndClass;
::ZeroMemory(&wndClass, sizeof(WNDCLASS));
::GetClassInfo(AfxGetInstanceHandle(), _T("#32770"), &wndClass);
wndClass.lpszClassName = _T("BroadStorage");
AfxRegisterClass(&wndClass);

<프레임 윈도우 기반>

 

1. App의 InitInstance의 맨 윗부분에 아래 코드를 추가하여 어플리케이션이 클래스를 등록하기전에 먼저 선수를 친다.

   WNDCLASS wc;
   memset(&wc, 0, sizeof(wc));
   wc.style          = CS_DBLCLKS | CS_HREDRAW | CS_VREDRAW;
   wc.lpfnWndProc    = AfxWndProc;
   wc.hInstance      = m_hInstance;
   wc.hIcon          = LoadIcon(IDR_MAINFRAME);
   wc.hCursor        = LoadCursor(IDC_ARROW);
   wc.hbrBackground  = (HBRUSH)(COLOR_WINDOW+1);
   wc.lpszMenuName   = NULL;
   wc.lpszClassName  = "BroadStorage";
   AfxRegisterClass(&wc);

2. CMainFrame의 PreCreateWindow에 아래 코드를 추가한다.

 

        cs.lpszClass = "BroadStorage";