728x90
300x250
[MFC] 윈도우 프로그래밍 기초 - 윈도우 객체 생성, 화면 띄우기

 

이번에는 윈도우 객체 생성 및 화면을 띄우는 방법에 대해서 소개하고자 합니다.

 


1. 윈도우 객체 생성

CreateWindow()의 원형 소개

 

 HWND CreateWindow(

       LPCTSTR lpClassName,

       LPCTSTR lpWindowName,

       DWORD dwStyle,

       int x, int y,

       int nWidth, int nHeight,

       HWND hWndParent,

       HMENU hMenu,

       HANDLE hInstance,

       PVOID lpParam);

 

 - lpClassName : 윈도우의 클래스를 지정하는 문자열이다.

 - lpWindowName : 윈도우의 제목 표시줄에 보여줄 문자열이다.

 - dwStyle : 윈도우의 스타일을 지정한다.

 - x, y : 윈도우의 좌표를 지정한다.

 - nWidth, nHeight : 윈도우의 폭과 높이를 장치 단위(픽셀)로 지정한다.

 - hWndParent : 부모 윈도우 또는 소유주 윈도우의 핸들을 지정한다.

 - hMenu : 겹쳐진(Overlapped) 윈도우나 팝업 윈도우의 경우 메뉴의 핸들을 지정한다.

 - hInstance : 윈도우를 생성하는 인스턴스 핸들을 지정한다.

 - lpParam : WM_CREATE 메시지의 인수 IParam으로 전달될 CREATESTRUCT 구조체의 포인터이다.

 

실제 코드 적용 )

 

 

 "이전 글 - http://yyman.tistory.com/entry/MFC-윈도우-프로그래밍-기초-윈도우-클래스-만들기"

  

 (중략)

 

 hWnd = CreateWindow(lpszClass, LPTSTR(_T("태스트")), WS_OVERLAPPEDWINDOW, CW_USEDEFAULT,
  CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL, (HMENU)NULL, hInstance, NULL); 

 


2. 윈도우 객체 화면 띄우기

 

ShowWindow() 원형

 

 BOOL ShowWindow(HWND hWnd, int nCmdShow); 

 

 <nCmdShow 설정 값>

 

 설정 값

설명 

SW_FORCEMINIMIZE 

윈도우 2000 이후에만 쓸 수 있는 Flag.

-> 윈도우를 소유한 스레드(Thread)가 차단(Block)된 상태에서도 윈도우를 최소화시킨다. 

SW_HIDE 

윈도우를 숨긴다. 

SW_MAXIMIZE 

윈도우를 최대화 시킨다. 

 SW_MINIMIZE

윈도우를 최소화 시킨다. 

SW_RESTORE 

최대화나 최소화된 윈도우를 이전 상태로 복구한다. 

SW_SHOW 

윈도우를 활성화시켜서 화면에 띄운다. 

SW_SHOWDEFAULT 

STARTUPINFO 구조체가 지정하는 보기 상태로 만든다. 

SW_SHOWMAXIMIZED 

윈도우를 최대화된 상태로 활성화한다. 

SW_SHOWMINIMIZED 

윈도우를 최소화한 상태로 활성화한다. 

SW_SHOWMININOACTIVE 

윈도우를 최소화 상태로 화면에 띄우며 활성화 상태 그대로 변경되지 않는다.

SW_SHOWNA  

윈도우를 현재 상태로 화면에 띄우며 활성화 상태 그대로 변경되지 않는다.

 SW_SHOWNOACTIVATE

최근 크기와 위치에 윈도우를 띄우며 활성화 상태 그대로 변경되지 않는다. 

SW_SHOWNORMAL 

윈도우를 화면에 띄우며 활성화한다.

만약(If), 윈도우가 최소화되어 있거나 최대화 되어 있다면 윈도우를 원래 크기로 복구한다. 

 

 

 

 

 이전 코드 참고 - http://yyman.tistory.com/entry/MFC-윈도우-프로그래밍-기초-윈도우-클래스-만들기

 

 (중략)

 

 hWnd = CreateWindow(lpszClass, LPTSTR(_T("태스트")), WS_OVERLAPPEDWINDOW, CW_USEDEFAULT,
  CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL, (HMENU)NULL, hInstance, NULL); 

 

 ShowWindow(hWnd, nCmdShow);

 

 

반응형
728x90
300x250
[MFC] 윈도우 프로그래밍 기초 - 윈도우 클래스 만들기

 

WinMain 함수에서 첫 번째 단계가 윈도우 클래스를 만드는 과정입니다.

~RegisterClass( & ...... ) 까지 만드는 과정을 윈도우 클래스를 구현한다고 보시면 됩니다.

 

Winuser.h 파일에 윈도우 클래스 생성을 위한 구조체 구조를 소개하겠습니다.

 


1. WNDCLASS 구조체

 

typedef struct tag WNDCLASS{
     UINT style;

     WNDPROC lpfnWndProc;

     int cbClsExtra;

     int cbWndExtra;

     HINSTANCE hInstance;

     HICON hIcon;

     HCURSOR hCursor;

     HBRUSH hbrBackground;

     LPCSTR lpszMenuName;

     LPCSTR lpszClassName;

 winuser.h의 구조체

 

* 클래스를 생성하는 원리만 이해하면 되므로, 현재의 코드는 암기하시거나 할 필요는 없습니다.

 


2. 구현(Implements)

 

 

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

 

 LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
 

 LPTSTR lpszClass = _T("TestApp");

 int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpszCmdParameter, int nCmdShow){

 

      HWND hWnd;
      MSG Message;

      WNDCLASS WndClass;

      WndClass.cbClsExtra = 0;
      WndClass.cbWndExtra = 0;
      WndClass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
      WndClass.hCursor = LoadCursor(NULL, IDC_ARROW);
      WndClass.hIcon = LoadIcon(NULL, IDI_APPLICATION);
      WndClass.hInstance = hInstance;
      WndClass.lpfnWndProc = (WNDPROC)WndProc;
      WndClass.lpszClassName = lpszClass;
      WndClass.lpszMenuName = NULL;
      WndClass.style = CS_HREDRAW | CS_VREDRAW;

      RegisterClass(&WndClass);

}


LRESULT CALLBACK WndProc(HWND hWnd, UINT iMessage, WPARAM wParam, LPARAM lParam){

 

       // 이 영역은 다음에 언급하겠습니다.

 

}

 

 

반응형
728x90
300x250

[MFC] 윈도우 프로그래밍 기초 - 윈도우 프로그램의 구조

 

윈도우 프로그램은 기본적으로 아래에서 소개되는 구조를 가진다.

표 1-1의 구조를 시작으로 글을 시작하고자 한다.

 


1. 큰 틀에서 바라보기.

 

WinMain( ) 함수와 WndProc( ) 함수로 구성된다.

-> 함수의 이름은 임의로 바꿀 수 없음. (이미 정해져 있는 규칙)

 

                                                                  표 1-1. 구조

 

 WinMain( )
{
       윈도우 클래스 만들기

       윈도우 객체 생성하기

       윈도우 객체 화면에 띄우기

       메시지 루프 돌리기
}

 

WndProc( )
{
       전달된 메시지 처리하기
}

 

WinMain( ) 함수는 프로그램의 윈도우 자체를 생성만 한다.

WndProc( ) 함수는 실제 일어나는 윈도우 메시지를 처리하는 역할을 수행한다.

 

 


2. WinMain() 함수가 하는 일 소개

 

                                                             표2-2. 함수가 하는 일

 

 WinMain( )
{
       윈도우 클래스 만들기 - (RegisterClass( ... )

       윈도우 객체 생성하기 - (CreateWindow( ... )

       윈도우 객체 화면에 띄우기 - (ShowWindow( ... )

       메시지 루프 돌리기 (while(GetMessage( ...... ) ) )
}

 

 


3. WndProc() 함수가 하는 일 소개

 

메시지 처리 함수 : WndProc( )

 

 

 

 

 

메시지 루프로부터 전달받은 윈도우 메시지를 처리한다. (WndProc)

 

 

 

반응형
728x90
300x250

[MFC] 윈도우 프로그래밍 기초 - API와 Hello World.

 

 

1. 용어 학습

* API(Application Programming Interface)란 영어 해석 그래도 응용 프로그램을 만드는 데 필요한 함수들의 집합.

 

* SDK(Software Development Kit)라는 말로도 사용

-> Microsoft에서 SDK 파일 설치를 종종 볼 수 있는 데, 이게 응용 프로그램을 만드는 데 필요한 함수들의 집합을 미리 설치한다는 의미로 
해석해볼 수 있음.

 

MFC(Microsoft Foundation Class)라는 것의 근간은 API에서 되었다고 볼 수 있음.

 

2. 용어 학습

 

C언어나 C++에서 한번이라도 해봤던 Hello World 프로그램을 윈도우 프로그래밍을 통해서 실습.

 

main()
{
       printf("Hello World!");
}

 

// C언어 기준

 

 

실습 프로그램 : Visual Studio 2013

 

1. 먼저, 당연히 Visual Studio 2013을 실행시켜야합니다. 

 

 

파일에서 새로 만들기(N) -> 프로젝트(P)를 클릭합니다.

 

Win32프로젝트 클릭합니다.

이번 실습에선 그냥 Win32Project1으로 이름 지정하겠습니다.

확인을 누릅니다.

 

 

다음을 클릭합니다.

 

 

빈 프로젝트에 체크를 한 후 마침을 클릭합니다.

 

 

 

솔루션 탐색기를 선택하고, 그림과 같이 컨텍스트 메뉴를 통해(오른쪽 버튼을 클릭하여) cpp파일을 생성합니다.

 

추가를 클릭합니다.

 

3. 코드 작성하기

 

#include <Windows.h>

#include <tchar.h>

 

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpcmdline, int nCmdShow){

 

MessageBox(NULL, _T("Hello World"), _T("메시지"), MB_OK);

return 0;

 

}

 

 

 

반응형
728x90
300x250

[MFC] 윈도우 프로그래밍 기초 - 핸들에 대한 이해

 

핸들이란 어떤 대상에 붙여진 레이블(Label)과 같은 것으로, 대상을 식별하는 데 사용한다.

그리고 핸들을 이용하여 특정 대상을 관리할 수도 있다.

 


대상이란,

 

Windows(윈도우), Control(컨트롤)

 

eg) 자동차가 윈도우라고 가정했을 때, 각 자동차에는 핸들 등이 있음.

   -> 이를 가지고 원하는 방향으로 조작가능

 

- 핸들 값은 예외없이 모두 접두어 h로 시작한다.

- 핸들은 정수형이며 32bit 값이다.

- 핸들은 운영체제가 발급하며, 사용자는 할당된 핸들을 쓰기만 하면 된다.

- 같은 종류의 핸들끼리는 절대 중복된 값을 가지지 않는다.

- 핸들은 단순한 구분자이므로 핸들에 어떤 값이 들어가 있는지 알 필요가 없다.

반응형
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

반응형

+ Recent posts