반응형

안녕하세요. 애드소프트 입니다.

 

이전 포스팅을 해보셨다면 약간 생소한 데이터 형을 많이 보셨을 것입니다.

LPCTSTR, LPTSTR와 같이 비슷하지만 다른 데이터형들이 많이 존재하는데 이렇게 나눠진 이유가 있습니다.

눈으로 봐서는 어떤 데이터형인지 잘 알 수 없는 형들이 존재합니다.

 

#ifdef UNICODE
 typedef LPCWSTR LPCTSTR; 
#else
 typedef LPCSTR LPCTSTR;
#endif

선언을 따라가 보면 LPCWSTR 이나 LPCSTR을 애칭을 만들어 주는것을 볼 수 있습니다.

이는 MBCS(멀티 바이트 문자 집합)이라고 하여 DBCS(더블 바이트 문자 집합)라고도 합니다. 이는 1또는 2바이트로 구성되며, 2바이트 보다 큰 문자 집합은 지원되지 않습니다.

 

현재 Windows는 유니코드를 표준으로 사용되고 있습니다.

 

유니코드는 16비트문자 인코딩입니다. 모든 언어에 대해 충분 한 인코딩을 제공 합니다. 모든 ASCII 문자는 유니코드에 확장 문자로 포함됩니다.

 

본론으로 돌아가서 LPCWSTR와 LPCSTR의 차이는 유니코드와 멀티바이트의 차이로 볼 수 있습니다.

LPCWSTR을 따라가보면 다음과 같이 선언되어 있습니다.

typedef const wchar_t* LPCWSTR;

LPCSTR을 따라가보면 다음과 같이 선언되어 있습니다.

typedef const char* LPCSTR;

위와 같이 같은 LPCTSTR 이라도 MBCS를 호환으로 생성했냐에 따라 유니코드 또는 멀티바이트로 동적으로 선언되어 사용됩니다. 두가지는 혼용될 수 없습니다만 Convert 함수를 통해 변환 사용은 가능합니다.

 

MFC에서 많이 사용되는 데이터 형에 대해 알아보겠습니다.

 

BOOL - Boolean 값을 나타내는 정수 값습니다. 0 또는 1 값을 사용하지만 선언은 int 형으로 선언됩니다.

BSTR - 32비트 character 마지막에 NULL로 끝나는 포인터 값을 의미합니다. 

BYTE - 부호없는 8비트 값을 의미 합니다. 네트워크 프로토콜의 단일 octet에 해당하는 8비트 부호없는 값입니다.

LONG - 부호없는 32비트 정수값입니다.

DWORD - 부호없는 32비트 정수이며, MFC에서 상당히 많이 사용하는 데이터형 입니다.

LPARAM - 윈도우 프로시져에서 사용되는 데이터형 중 하나입니다.

WPARAM - LPARAM과 동일합니다.

LPVOID - 32비트 void 포인터입니다.

LRESULT - 윈도우 프로시져나 볼백 할수가 리턴하는 32비트 값입니다.

UINT - 부호없는 32비트 int형입니다.

WNDPROC - 윈도우 프로시저 함수를 포인트하는 32비트 포인트 값입니다.

WORD - 16비트 unsigned int 값입니다.

POSITION - MFC에서 위치를 나타낼때 쓰는 포인터 값입니다.

LPCRECT -  RECT 구조체의 포인트 값입니다.

 

다음 정도의 데이터 형들이 MFC에서 많이 사용됩니다.

다른 데이터형도 많이 쓰이지만 윈도우에 있는 데이터형만 추려보았습니다.

 

포스팅을 이만 마치도록 하겠습니다.

 

감사합니다.

반응형
반응형

안녕하세요. 애드소프트 입니다.

 

오늘은 MFC를 이용해 리스트를 생성 후 목록을 표시할 수 있는 간단한 프로그램을 작성해 볼까 합니다.

List Box 컨트롤을 추가 하여 전체 화면으로 늘렸습니다.

List Box만을 추가하고 실행해 보았습니다.

제목이 없네요. 제목 추가는 다음과 같이 하시면 됩니다.

// CHelloWorldApp 초기화

BOOL CHelloWorldApp::InitInstance()
{
	// 애플리케이션 매니페스트가 ComCtl32.dll 버전 6 이상을 사용하여 비주얼 스타일을
	// 사용하도록 지정하는 경우, Windows XP 상에서 반드시 InitCommonControlsEx()가 필요합니다. 
	// InitCommonControlsEx()를 사용하지 않으면 창을 만들 수 없습니다.
	INITCOMMONCONTROLSEX InitCtrls;
	InitCtrls.dwSize = sizeof(InitCtrls);
	// 응용 프로그램에서 사용할 모든 공용 컨트롤 클래스를 포함하도록
	// 이 항목을 설정하십시오.
	InitCtrls.dwICC = ICC_WIN95_CLASSES;
	InitCommonControlsEx(&InitCtrls);

	CWinAppEx::InitInstance();


	// OLE 라이브러리를 초기화합니다.
	if (!AfxOleInit())
	{
		AfxMessageBox(IDP_OLE_INIT_FAILED);
		return FALSE;
	}

	AfxEnableControlContainer();

	EnableTaskbarInteraction(FALSE);

	// RichEdit 컨트롤을 사용하려면 AfxInitRichEdit2()가 있어야 합니다.
	// AfxInitRichEdit2();

	// 표준 초기화
	// 이들 기능을 사용하지 않고 최종 실행 파일의 크기를 줄이려면
	// 아래에서 필요 없는 특정 초기화
	// 루틴을 제거해야 합니다.
	// 해당 설정이 저장된 레지스트리 키를 변경하십시오.
	// TODO: 이 문자열을 회사 또는 조직의 이름과 같은
	// 적절한 내용으로 수정해야 합니다.
	SetRegistryKey(_T("로컬 애플리케이션 마법사에서 생성된 애플리케이션"));
	LoadStdProfileSettings(4);  // MRU를 포함하여 표준 INI 파일 옵션을 로드합니다.


	InitContextMenuManager();

	InitKeyboardManager();

	InitTooltipManager();
	CMFCToolTipInfo ttParams;
	ttParams.m_bVislManagerTheme = TRUE;
	theApp.GetTooltipManager()->SetTooltipParams(AFX_TOOLTIP_TYPE_ALL,
		RUNTIME_CLASS(CMFCToolTipCtrl), &ttParams);

	// 애플리케이션의 문서 템플릿을 등록합니다.  문서 템플릿은
	//  문서, 프레임 창 및 뷰 사이의 연결 역할을 합니다.
	CSingleDocTemplate* pDocTemplate;
	pDocTemplate = new CSingleDocTemplate(
		IDR_MAINFRAME,
		RUNTIME_CLASS(CHelloWorldDoc),
		RUNTIME_CLASS(CMainFrame),       // 주 SDI 프레임 창입니다.
		RUNTIME_CLASS(CHelloWorldView));
	if (!pDocTemplate)
		return FALSE;
	AddDocTemplate(pDocTemplate);


	// 표준 셸 명령, DDE, 파일 열기에 대한 명령줄을 구문 분석합니다.
	CCommandLineInfo cmdInfo;
	ParseCommandLine(cmdInfo);



	// 명령줄에 지정된 명령을 디스패치합니다.
	// 응용 프로그램이 /RegServer, /Register, /Unregserver 또는 /Unregister로 시작된 경우 FALSE를 반환합니다.
	if (!ProcessShellCommand(cmdInfo))
		return FALSE;

	// 창 하나만 초기화되었으므로 이를 표시하고 업데이트합니다.
	m_pMainWnd->ShowWindow(SW_SHOW);
	m_pMainWnd->UpdateWindow();

	// 타이틀 수정
	m_pMainWnd->SetWindowTextW(L"Hello World");

	return TRUE;
}

 

InitInstance 함수에서  m_pMainWnd->SetWindowTextW() 함수를 통해 수정가능합니다.

유니코드 베이스라 L 메크로를 사용하여 유니코드로 변경하였습니다.

 

컬럼을 추가하기 위해서 속성 창에서 다음 항목을 변경하였습니다.

 

위 에서 추가한 리스트 박스에 데이터를 추가하기 위해 컨트롤을 추가해 보겠습니다.

리소스 뷰에서 리스트 박스를 선택 후 마우스 오른쪽 버튼을 누른 후 변수 추가를 선택합니다.

 

변수 추가시 다음 컨트롤변수가 추가 된 것을 확인 할 수 있습니다.

해더파일

class CHelloWorldView : public CFormView
{
protected: // serialization에서만 만들어집니다.
	CHelloWorldView() noexcept;
	DECLARE_DYNCREATE(CHelloWorldView)

public:
#ifdef AFX_DESIGN_TIME
	enum{ IDD = IDD_HELLOWORLD_FORM };
#endif

...

// 생성된 메시지 맵 함수
protected:
	afx_msg void OnFilePrintPreview();
	afx_msg void OnRButtonUp(UINT nFlags, CPoint point);
	afx_msg void OnContextMenu(CWnd* pWnd, CPoint point);
	DECLARE_MESSAGE_MAP()
public:
	CListBox mCtrlListBoxSample;
};

#ifndef _DEBUG  // HelloWorldView.cpp의 디버그 버전
inline CHelloWorldDoc* CHelloWorldView::GetDocument() const
   { return reinterpret_cast<CHelloWorldDoc*>(m_pDocument); }
#endif

 

Cpp 파일

void CHelloWorldView::DoDataExchange(CDataExchange* pDX)
{
	CFormView::DoDataExchange(pDX);
	DDX_Control(pDX, IDC_LIST_SAMPLE, mCtrlListBoxSample);
}

 

클레스 마법사를 실행합니다.

단축키는 CTRL + SHIFT + X 입니다

클레스 이름을 CHellowWorldView를 선택하고 메시지 탭을 선택합니다.

가상 함수 탭에서 OnInitializeUpdate 함수를 선택하시고 코드 편집을 누릅니다.

 

해당 함수에 다음 코드를 추가 합니다.

void CHelloWorldView::OnInitialUpdate()
{
	CFormView::OnInitialUpdate();
	GetParentFrame()->RecalcLayout();
	ResizeParentToFit();


	mCtrlListBoxSample.SetColumnWidth(500);
}

 

다시 알게된 사실이지만 MFC의 CListBox는 컬럼 추가가 쉽지 않습니다.

어떻게든 추가해서 설명드리고 싶었지만 MSDN에서 공부를 하다보니 CListView 라는 클래스를 제공합니다.

 

 

리스트 박스에 내용을 추가하기 위해서는 다음과 같이 AddString 함수를 이용하시면 됩니다.

 

void CHelloWorldView::OnInitialUpdate()
{
	CFormView::OnInitialUpdate();
	GetParentFrame()->RecalcLayout();
	ResizeParentToFit();


	mCtrlListBoxSample.SetColumnWidth(100);

	mCtrlListBoxSample.AddString(L"테스트 리스트 1");
	mCtrlListBoxSample.AddString(L"테스트 리스트 2");
	mCtrlListBoxSample.AddString(L"테스트 리스트 3");
	mCtrlListBoxSample.AddString(L"테스트 리스트 4");
	mCtrlListBoxSample.AddString(L"테스트 리스트 5");
	mCtrlListBoxSample.AddString(L"테스트 리스트 6");
	mCtrlListBoxSample.AddString(L"테스트 리스트 7");
}

 

 

다른 함수들은 다음 MSDN을 활용해 추가해 보세요.

 

docs.microsoft.com/ko-kr/cpp/mfc/reference/clistbox-class?view=msvc-160

 

CListBox 클래스

MFC CListBox 클래스 및 해당 멤버 함수에 대 한 설명입니다.

docs.microsoft.com

 

다음 포스팅에서 CListView를 다뤄 볼까 합니다.

컬럼 추가 및 사용법을 알아보도록 할께요.

 

읽어 주셔서 감사합니다.

반응형
반응형

안녕하세요. 애드소프트 입니다.

 

오랜기간 윈도우 프로그램을 개발해보지 못해서 바뀐게 있는지 확인하고 공부해 보고자

데이크톱용 개발을 해 볼까해서 프로젝트를 만들고 있는데 MFC항목이 보이지 않습니다. ㅎㅎ

SDK를 설치 해야하는건지 설치할때 빼먹었나봐요.

그래서 찾다보니 Windows 데이크톱 마법사라고 있어 궁금함을 참지 못하고 사용해보면서 기록을 남겨볼까 합니다.

 

프로젝트를 생성하기 위해 다은 Windows 데이크톱 마법사를 선택하니 다음과 같은 화면이 보입니다.

데스크톱 어플리케이션을 만들어 볼까 했으니 선택하고 확인을 눌러볼께요.

MFC해더가 여기에서 추가 가능하도록 바뀌었나봅니다.

데스크톱 어플리케이션을 선택하니 MFC가 비활성화 되는것을 보니 SDK를 따로 설치해야할 듯 합니다.

아니면 MFC 프로젝트로 생성되는것일지 모르겠습니다.

빈프로젝트는 말그대로 빈프로젝트 일거라 생각이 됩니다.

미리 컴파일된 헤더는 Visual Studio 2017 이하의 버전에서 MFC를 사용할 경우 stdafx.h 해드파일을 include 하여 사용했던 기억이 납니다.

여기에 포함되는 내용은 vector, map 등 std::를 붙여쓰는 함수들이 었던것으로 생각합니다.

미리 컴파일된 해더만 선택해서 만들어 보았습니다.

 

프로젝트가 생성된 코드를 보니 stdafx.h 파일이 pch.h파일로 바뀐듯합니다.

솔루션 탐색기과 해더 파일을 보니 MFC 프로젝트가 자동으로 생성되는것을 보니 MFC라는 이름이 바뀐것으로 생각되네요.

 

 

예전엔 stdafx.h 포함되었던 내용이 framework.h 파일로 변경된 것 같습니다.

리소스도 같단히 확인해 본 후 실행해 보도록 하겠습니다.

기본적으로 만들어 지는 내용을 확인해 볼까 합니다.

Accelerator는 단축키 정보인듯 합니다.

나머지는 이름과 같이 생성되는것 같습니다.

메뉴와 다른 항목들도 눌러봤는데 별건 없습니다.

 

Dialog의 IDD_ABOUTBOX를 눌러봤는데 생각보다 무거워졌나봅니다.

열리는데 상당한 시간이 소요되었습니다.

MFC의 문법은 많이 변하지 않았습니다.

 

오랜만에 보니 윈도우창 디자인을 어디에 구성했는지 기억이 안납니다 ㅎㅎ

실행해보니 화면은 구성되지 않은채 실행되는것을 보니 따로 추가해야할 것으로 생각됩니다.

 

공부를 조금한 후 다음 포스팅에서 화면 추가 방법을 다뤄보겠습니다.

(다음 포스팅에서 폼뷰를 넣기 위해 여러 좌절 후 프로젝트를 다시 생성했습니다. ㅎㅎ)

 

Windows 데트크톱 마법사는 무엇일까에 대한 답은 MFC의 변경된 이름인듯 합니다.

 

MFC에서 변경된 것인줄 알았는데 다음 포스팅을 작성하면서

알게되었는데 이 프로젝트는 WinAPI 프로젝트 입니다. ㅠ.ㅠ

 

감사합니다.

 

반응형

+ Recent posts