728x90
300x250

[MFC] 윈도우 프로그래밍 기초 - 타입 재정의

 

 

 자료형 

 의미 

 BYTE 

 unsigned char형 

 WORD 

 unsigned short형 

 DWORD 

 unsigned long형 

 LONG 

 long형과 같음 

 LPSTR 

 char*형과 같음 

 BOOL 

 정수형이며, TRUE 혹은 FALSE을 갖는다. 

 

기타)

HINSTANCE의 경우, 정수형이지만 핸들의 의미를 가짐.

 

실행의 다양한 예)

#include <tchar.h>

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, char* lpcmdLine, int nCmdshow)
{

 

}

 

#include <tchar.h>

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpcmdLine, int nCmdshow)
{

 

}

 

#include <Windows.h>
#include <tchar.h>

int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpcmdLine, int nCmdshow)
{

 

 


저 부분은 저런 구조로 사용할 수 있구나 이정도만 봐두시면 됩니다.

이전 글에서 WinMain()의 타입 재정의의 형태를 표현해놓은 겁니다.

앞 전의 글과 http://yyman.tistory.com/481, ([MFC] 윈도우 프로그래밍 기초 - WinMain() 함수)랑 같이 이어서 진행되는 부분입니다.

반응형
728x90
300x250

[MFC] 윈도우 프로그래밍 기초 - WinMain() 함수

 

C언어, C++ 시절의 도스 프로그램의 시작점은 main()함수이다.

윈도우 프로그램의 시작점은 WinMain() 함수에서 시작된다.

 

Figure 1) WinMain() 함수의 원형

 

 int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)

{

 

 

 

인수 

설명 

hInstance 

현재 실행되고 있는 프로그램의 핸들 

hPrevInstance 

바로 앞에 실행된 프로그램의 인스턴스 핸들, 통상 NULL값을 준다. 

lpCmdLine 

명령행 인자. Main() 함수의 argv에 해당 

nCmdShow 

윈도우를 보여주는 형태의 플레그 

 

 

반응형
728x90
300x250

[MFC] 윈도우 프로그래밍 기초 - 강좌 소개

 

이 강의는 아마도 제 생각엔 지금 2015년 기준에서 최신의 Visual Studio 2013 기반 C++ MFC 글이 될 수 있을 거 같습니다.

 


1. 제작 배경

 

주인장이 참으로 친절하게 일일이 Visual Studio 2008 책부터 구글링까지 다 동원해가면서 제작하고 있습니다.

나름대로 생각해보고 또 생각해서 다양한 정보들을 여러 참조해서 지구상에서 제일 쉬운 MFC 글을 만들어 보고 싶어서 기획했습니다. 

 


2. 흐름은

 

1. Win32 프로그래밍의 이해 (원리만)

-> 우리는 직접 노가다 하면서 Win32 프로그래밍은 하지 않습니다.

     MFC라는 게 Win32 프로그래밍을 기반으로 하고 있기에 잠시 체험(Experience)용으로? 만들었다고 생각하시면 됩니다.

2. MFC 개념 이해

    -> MFC 계층도 소개

    -> 몇개 이론 및 실습

3. 메시지 출력

4. 기본 컨트롤 익숙해지기

5. 필수 대화상자 몇개 다뤄보기.

6. 공통 컨트롤

7. 그리기 도구(GDI)

8. 라이브러리 작성법

-> 동적(Dynamic), 정적(Static) 둘 다 실습

9. 멀티스레드

10. 프로세스 통신(IPC)

 

이 정도까지 강좌를 만들어볼 계획입니다.

 

그러나 시간적인 한계도 있을 수 있기에 몇 가지는 생략될 수도 있습니다.

 


3. 실습 환경은?


Visual Studio 2013 Update 4 기준으로 작성했습니다.

 


4. MFC와 Windows API의 차이

 

번호

항목명

설명(Description)

1

MFC

 

MFC(Microsoft Foundation Class)는 Win32를 통해 C++ 개체 지향 래퍼를 제공하여 네이티브 데스크톱 응용 프로그램을 신속하게 개발할 수 있습니다. ATL(액티브 템플릿 라이브러리)은 COM 개발을 간단하게 하는 래퍼 라이브러리이며 ActiveX 컨트롤을 만드는 데 광범위하게 사용됩니다.

Visual Studio Community Edition 이상을 사용하여 MFC 또는 ATL 프로그램을 만들 수 있습니다.

Express 버전은 MFC 또는 ATL을 지원하지 않습니다.

Visual Studio 2015에서 Visual C++는 선택적 구성 요소이며 MFC와 ATL 구성 요소는 Visual C++ 아래의 선택적 하위 구성 요소입니다.

Visual Studio를 처음 설치할 때 이러한 구성 요소를 선택하지 않으면 처음으로 MFC 또는 ATL 프로젝트를 만들거나 열려고 할 때 설치하라는 메시지가 표시됩니다. 

Windows API


비공식 WinAPI 인 Windows API는 Microsoft Windows 운영 체제에서 사용할 수있는 Microsoft의 핵심 API (Application Programming Interface) 집합입니다.

이름 Windows API는 일반적으로 자체 이름(예: Win32 API)으로 참조되는 여러 가지 다른 플랫폼 구현을 집합 적으로 나타냅니다. 버전 섹션을 참조하십시오.

거의 모든 Windows 프로그램은 Windows API와 상호 작용합니다.
Windows NT 계열의 운영 체제에서는 Windows 시작 프로세스 초기에 시작된 프로그램과 같이 작은 숫자가
기본 API를 사용합니다.

개발자 지원은 소프트웨어 개발 키트 인 Microsoft Windows SDK의 형태로 제공되며 Windows API 및 관련 Windows 인터페이스를 기반으로 소프트웨어를 작성하는 데 필요한 설명서와 도구를 제공합니다.

Windows API (Win32)는 주로 프로그래밍 언어 C에 초점을두고 있습니다.
C#의 노출 된 함수와 데이터 구조는 최신 버전의 문서에서 해당 언어로 기술되어 있습니다.

그러나 API는 호출 및 콜백에 대한 규정 된 호출 규칙과 함께 (잘 정의 된) 저수준 데이터 구조를
처리 할 수있는 모든 프로그래밍 언어 컴파일러 또는 어셈블러에서 사용할 수 있습니다.
마찬가지로, API 함수의 내부 구현은 역사적으로 여러 언어로 개발되었습니다.

C는 객체 지향 프로그래밍 언어가 아니지만 Windows API와 Windows는 역사적으로 객체 지향으로

설명되었습니다.

 

MFC (Microsoft Foundation Class Library), VCL (Visual Component Library), GDI + 등이 객체지향 구조를
보다 명확하게 만드는 객체 지향 언어에 대한 많은 래퍼 클래스 및 확장 (Microsoft 및 기타)
.
예를 들어 Windows 8은 Windows API와 WinRT API를 제공합니다.이 API는 C++로 구현되며 디자인에 의해

객체지향적입니다

 

가장 정확한 정보는 아래의 링크에 접속하면 API 기능에 대해서 자세히 찾아볼 수 있습니다.

1. https://docs.microsoft.com/ko-kr/windows/desktop/apiindex/windows-api-list

 

MFC에 대한 정보입니다. 아래의 링크에 접속하면 자세히 찾아볼 수 있습니다.

https://msdn.microsoft.com/ko-kr/library/65dtx4a4.aspx

 


6. 참고자료(Reference)

 

1. MFC 개념, 마이크로소프트, https://msdn.microsoft.com/ko-kr/library/kkcb3t0w.aspx

2. Windows API Index, , 마이크로소프트, https://docs.microsoft.com/ko-kr/windows/desktop/apiindex/windows-api-list

3. Windows API Index, , 마이크로소프트, https://msdn.microsoft.com/ko-kr/library/65dtx4a4.aspx

4. MFC 데스크톱 응용 프로그램, 마이크로소프트, https://msdn.microsoft.com/ko-kr/library/d06h2x6e.aspx

반응형
728x90
300x250

[C, C++] double의 비교

 

float, double의 경우, 비교 자체가 소수 점이라는 것이 있어서 어렵습니다.

단순 비교를 해버리면 안되는 게 1.xxxxxxxx 의 경우, 1로 절삭 처리됩니다.

컴파일러가 멍청해서 그런 것도 있지만, 소수 점은 Science에선 중요한 거지만, 단순한 명령을 처리하는 컴퓨터 입장에선 엄밀한 것과 정확성을 보장해주는 자료형이 더 좋은 것입니다.

 

예를 들면, 스위치 On, Off와 같이 1, 0이 컴퓨터 입장에선 더 직관적이고 엄밀한 자료가 될 수 있습니다.

 

float, double형의 경우, IEEE 754 규약에 의해 부동소수점의 원칙을 기반으로 한 별도의 코딩을 통해 비교를 처리해야 합니다.

 


아래의 코드는 구글에 근무하는 brucedawson씨가 소개한 개념을 바탕으로 Ulps기반의 Double형 비교를 위한 코드를 DevMachine님이 개발한 코드입니다.

 

int CompareDoubleAbsoulteAndUlps(double x,
                                 double y,
                                 double absTolerance = (1.0e-8),
                                 int ulpsTolerance = 4)
{
    double diff = x - y;
    if (fabs(diff) <= absTolerance)
        return 0;

    __int64 nx = *((__int64*)&x);
    __int64 ny = *((__int64*)&y);

    if ((nx & 0x8000000000000000) != (ny & 0x8000000000000000))
        return (diff > 0) ? 1 : -1;

    __int64 ulpsDiff = nx - ny;
    if ((ulpsDiff >= 0 ? ulpsDiff : -ulpsDiff) <= ulpsTolerance)
        return 0;

    return (diff > 0) ? 1 : -1;
}

 


1. 참고자료(Reference)

  

1. Comparing floating point numbers - Bruce Dawson

2. Comparing Floating Point Numbers, 2012 Edition 

3. http://devmachine.blog.me/220119534107

 

정확히 이해하려면, 여기에 설명하는 것보단 IEEE 754의 부동소수점에 대해 공부해보시는 게 훨씬 빠를 거 같다는 생각을 해봅니다.

저는 참고 인용 문구를 통해 코드 배포 목적으로 이 글을 정리하고자 합니다.

 

반응형
728x90
300x250

[C, C++] Header와 템플릿의 명시적 특수화

 

C, C++에서 Template라는 개념은 <int>, <string>, <char> 등의 다양한 자료형의 함수를 두 번 생산하지 않고, 재사용을 한다는 장점을 통해, 개발 인력의 최소화로 긍정적인 부분을 보여준다고 할 수 있습니다.

이러한 Template는

 

#include < iostream >

 

using namespace std;

 

template <typename T>

class dd{


}

 

int main(){

 

 

이같은 꼴로 사용할 수 있습니다.

 

이러한 템플릿에서 명시적 특수화에 대해 잠시 소개하려고 합니다.

Explicit Specialization은 전체 특수화를 기본 특징으로 갖는 언어를 말합니다.

 

어려운 개념은 아닌데, 잘못 사용하면, 어려워지는 개념이 이 부분이 아닐까 싶습니다.

 

 template <typename T> class Invalid { 
 }; 

InVaild<double> x1;    // Invalid<double> 인스턴스화 시킴

template<> 
class Invalid<double>; // 에러: Invalid<double> 이미 인스턴스화 됨

 

위험하게 구성된 코드입니다. 흔히들 작업하다보면, 이와 같은 쓰레기 코드를 만들 수 있는데, 참조수준의 문제로 시스템에 중대한 오류를 발생시킬 수 있습니다.

 

기본적인 원칙을 구하고 사용하자.

 

template <typename T>

 class Invalid { 

       void aa(); 
 }; 

(정의)

 

template <typename T>

void Invalid<T>::aa()
{

}

(선언)

 

 

이의 경우, void 형의 aa() 함수를 선언하고 정의한 예시입니다.

기본적인 이의 구조는 당연한 Template를 생성하는 기본 원칙입니다.

 

template <typename T>

 class Invalid { 

       void aa(T data); 
 }; 

(정의)

 

template <typename T>

void Invalid<T>::aa(T data)
{

}

(선언)

 

template <>

void Invalid<char>::aa(char data)
{

}

(명시적 특수화)

 

 

T보다 특수화가 앞서 선언될 수 없다는 점을 명확히 할 필요가 있습니다.

아래는 가능한 사례를 몇 개 소개해드리고자 합니다.

 

template <typename T, typename D>

 class Invalid { 

       void aa(T data1, D data2); 
 }; 

(정의)

 

template <typename T, typename D>

void Invalid<T>::aa(T data1, D data2)
{

}

(선언)

 

template <char, int>

void Invalid<char, int>::aa(char data1, int data2)
{

}

(명시적 특수화)

 

 

이의 경우에는 명시적 특수화에서 오류가 날 수밖에 없습니다.

template <char, int>라고 쓴 부분은 template 함수를 생성하는 자료형이 와야 맞는데 General Data Type이 오기 때문에 오류가 날 수밖에 없습니다.

 

#include <iostream>
template <typename T, typename D>
class test{
public:
 void aa(T data1, D data2);
};
template <typename T, typename D>
void test<T, D>::aa(T data1, D data2){
 std::cout << "T, D";
 std::cout << std::endl;
 std::cout << data1 << "," << data2;
 std::cout << std::endl;
}
template <>
void test<char, int>::aa(char data1, int data2)
{
 std::cout << "T, D";
 std::cout << std::endl;
 std::cout << data1 << "," << data2;
 std::cout << std::endl;
}
int main(){
 test<double, int> aaaa;
 aaaa.aa(1.22, 1);
 test<char, int> bbbb;
 bbbb.aa('a', 1);
}

 

출력

T, D
1.22,1
T, D
a,1

 

 


1. 추천 사이트


1. https://wikidocs.net/488

 

반응형
728x90
300x250

[C++] String 함수 - 문자열 비교 방법

 

std::string의 문자열 비교 방법입니다.

 

string a = "abb";

string b = "bbb";

 

if( aaa < bbb ) 

 

이렇게 처리하지 못하는 이유는 string이라는 class 덩어리로 만든 char* 의 집합이기 때문입니다. string은 std::string의 Element로서 Vector의 기능을 동일하게 수행합니다.

 

비교의 경우는 3가지로 정의할 수 있습니다.

 

1. a < b

2. a == 0

3. a > 0

 

앞서 선언한 string a의 string Vector의 Method에서 compare라는 기능을 이용하여 비교를 수행할 수 있습니다.

 

string a = "aaa";

string b = "bbb";

 

if ( a.compare(b) < 0 )         1) aaa < bbb를 의미

 

if ( a.compare(b) == 0 )        2) aaa == bbb를 의미

 

if ( a.compare(b) > 0 )         3) aaa > bbb를 의미

 

 


1. 참고자료(Reference)


1. http://devmae.tistory.com/317, Accessed by 2014-10-01

2. http://soen.kr/lecture/ccpp/cpp3/31-1-5.htm, Accessed by 2014-10-01

 

반응형
728x90
300x250

[C, C++] 멀티플렛폼 구현 - 원리

 

윈도우에서도 동작가능하고 리눅스에도 동작가능한 멀티플렛폼 코드를 작성해야할 일이 생깁니다.
이럴 땐 아래의 내용을 참고하시면 됩니다.

 

#ifdef WIN32 // Windows Platform

 

#else          // Linux (Unix) Platform

 

#endif

 

위의 형태로서 선언하면 Multi Platform을 제어할 수 있습니다.

 

예를 들어 Delay(int)의 경우, Linux에서 지원하고, Windows에서는 Sleep을 지원합니다.

(단, Windows.h에서 지원)

 

이의 경우를 예를 들어서

#ifdef WIN32

#include <windows.h>

#else

#include <unistd.h>

#endif

 

이처럼 구현할 수 있습니다.

 

int System(const string)의 경우,

반환 자체를 System()함수가 하기 때문에 TRUE, FALSE로서 해당 운영체제가 지원하는 명령어가 올바른지 확인할 수 있습니다.

 

이를 응용해서

윈도우 환경에서 지원하는 CLS를 리눅스에서도 가능한지 판별할 수 있습니다.

 

if(System("cls"))

// 참

else

// 거짓

 


1. 맺는말

 

실제 멀티플랫폼을 수작업으로 구현하기 위해서는 무척 많은 태스팅을 수행해야 합니다.

 

반응형
728x90
300x250

[C++] 문자열 입력 받기 - string

 

#include <iostream>

#include <string>

 

using namespace std;

 

void main()
{
     string d;

     std::getline(cin, d);

 

이와 같이 string 자료형의 데이터를 입력받을 수 있습니다.

std::getline을 이용하여 자료를 입력하는 방법에 대해 간략하게 소개를 마치겠습니다.

반응형

+ Recent posts