프로그램/api&mfc2012. 4. 3. 19:26

                                                                                                                                                                    


1. 윈도우 창을 띄우기 전에

                                                                                                                                                                        


윈도우 창을 띄우기에 앞서, 우선 윈도우창을 띄우려면 무엇이 필요할지 잠시 생각해보겠습니다.


일단 우리의 직감에 의해 (나만 그런가요) 창을 띄우려면 몆가지 수치들을 우리가 설정해줘야 한다는 것을 느끼실겁니다


예를 들면 띄울 창의 크기, 창의 제목 등등 부터 시작해서 종료버튼, 확대버튼, 최소화버튼, 스크롤 가능 여부 등등


여러가지를 설정해줘야 그에 맞는 창이 뜬다고 볼 수 있겠죠


다짜고짜 컴퓨터에게 창 띄워! 라고 하면 뭔지 모를테니까요




                                                                                                                                                                        

2. 프로젝트 만들기

                                                                                                                                                                        


그렇다면 API는 어떤 프로젝트를 만들어야 할까요? C에서는 단순히 콘솔에서 놀 것이기 때문에 Win32 콘솔 어플리케이션으로 했는데


우리가 생각하고 있는건 윈도우 창이라는거죠. 그렇다면 어떤 프로젝트를 만드느냐.... 하면


새 프로젝트를 누르시고 Win32 프로젝트 를 선택해 주세요. 그리고 소스 파일에 .cpp 파일을 하나 추가해주시고


헤더파일은 <Windows.h> 파일을 인클루드 해주세요. 그럼 이제 준비는 끝납니다.













                            
                                                                                                                                            


3. 윈도우 창 띄우기

                                                                                                                                                                        


그럼 이제 직접 윈도우 창을 띄워보도록 하겠습니다.


일단 소스을보세요 어차피 우리가 다룰 부분은 아주 약간이니까요



 

 #include <Windows.h>


LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);
HINSTANCE g_hInst;
LPTSTR lpszClass=TEXT("First");

int APIENTRY WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance
          ,LPSTR lpszCmdParam,int nCmdShow)
{
    HWND hWnd;
    MSG Message;
    WNDCLASS WndClass;
    g_hInst=hInstance;

    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);

    hWnd=CreateWindow(lpszClass,lpszClass,WS_OVERLAPPEDWINDOW,
          CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,
          NULL,(HMENU)NULL,hInstance,NULL);
    ShowWindow(hWnd,nCmdShow);

    while(GetMessage(&Message,0,0,0)) {
        TranslateMessage(&Message);
        DispatchMessage(&Message);
    }
    return Message.wParam;
}

LRESULT CALLBACK WndProc(HWND hWnd,UINT iMessage,WPARAM wParam,LPARAM lParam)
{
    switch(iMessage) {
    case WM_DESTROY:
        PostQuitMessage(0);
        return 0;
    }
    return(DefWindowProc(hWnd,iMessage,wParam,lParam));
}

이대로 입력해주시면 아마 정상적으로 잘 돌아갈겁니다.


실행, 즉 F5 버튼을 눌러주시면 갑자기 창 하나가 뙇! 하고 뜰텐데요 그렇다면 성공!!




그럼 이제 소스를 하나씩 분석해 보겠습니다.




                            
                                                                                                                                            


4. 소스 분석하기

                                                                                                                                                                        


일단 호출 규약은 간단하니 그냥 보여드리겠습니다


#define CALLBACK __stdcall

#define WINAPI __stdcall
#define WINAPIV __cdecl
#define APIENTRY WINAPI
#define APIPRIVATE __stdcall
#define PASCAL __stdcall


이렇게 정의되어 있으니 그렇게 알고 시작해 보겠습니다.


그럼 이제 소스를 분석해 볼까요?


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


우리의 코드는 크게 2개의 함수로 나뉘어져 있는데요 이것은 아래에 있는 WndProc 함수를 미리 선언해준겁니다


그리고 HWND, UINT (UNIT 아닙니다), WPARAM, LPARAM이 인수로 들어간다는 것 정도네요


참고로 API에서는 main이 아니라 WinMain에서 프로그램이 시작하니 이점 참고하세요





HINSTANCE g_hInst;
LPTSTR lpszClass=TEXT("First");


전역 변수를 섢언한겁니다. 특이 두번째 변수는 창의 이름이라는 것을 바로 눈치 챌 수 있죠


저 First라는 문구를 다른걸로 바꾸면 창의 제목이 바뀌게 된답니다.





int APIENTRY WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance
          ,LPSTR lpszCmdParam,int nCmdShow)


이것이 바로 C에서의 main 함수 역할을 하는 녀석입니다.


인수들을 하나하나 파헤쳐 보겠습니다





HINSTANCE hInstance


프로그램의 인스턴트 핸들을 받아오는 녀석입니다.





HINSTANCE hPrevInstance


바로 앞에 실행된 현재 프로그램의 인스턴스 핸들로 없을 경우는 NULL이 됩니다. 참고로 WIN32에서는 항상 NULL이라네요


호환성을 위해 존재하는 녀석이라니까 크게 신경쓰지 않겠습니다





LPSTR lpszCmdParam


명령행으로 입력된 프로그램 인수 즉, 도스의 argv인수에 해당합니다.


"아! main 함수의 인수이던 argv가 WinMain에선 저렇게 되는구나!" 라고 알면 되겠습니다





int nCmdShow


마지막으로 반가운 int형을 하고 있는 이녀석은 바로 프로그램이 실행될 형태입니다.


최소화나 보통모양 등이 전달됩니다.





HWND hWnd;


MSG Message;


WNDCLASS WndClass;


g_hInst=hInstance;


메세지 처리나 윈도우 클래스 등등은 나중에 설명할 것이고


4번째를 보시면 아까 받은 핸들 값을 전역 변수로 선언했던 g_hInst 에 대입해주고 있네요

 

Posted by wrnly
프로그램/api&mfc2012. 3. 2. 19:11

C/C++를 이용하여 윈도우에서 콘솔 화면이 아닌  GUI(Graphic User Interface)  형태의 프로그램을 제작하는 방법은 여러 가지가 있는데 몇 가지만 소개하면 다음과 같습니다.


  • 윈도우 API(Application Programming Interfaces) 이용
  • VC++ 의 MFC(Microsoft Foundation Class Library) 이용
  • QT 이용
  • wxWidgets 이용
  • FLTK(Fast Light Toolkit)  이용

윈도우 API 를 이용하는 방법은 C/C++ 로 윈도우 프로그램을 개발하는 가장 기초적인 방법으로 컴파일러의 종류에 상관없이 윈도우 프로그램을 만들 수 있는 방법입니다. 가장 강력한 방법이지만 개발에 드는 시간과 노력이 많이 소요됩니다.

마이트로소프트에서 윈도우 API 를 C++의 클래스로 캡슐화하여 만든 MFC 라이브러리는 VC++ 의 개발 환경과 잘 통합되어 있어서 윈도우 API 만을 사용하는 방법보다 쉽게 윈도우 프로그램을 개발할 수 있습니다.

나머지 3 개는 크로스플랫폼(cross-platform)을 지원하는 툴킷을 이용하는 방법으로, 윈도우 뿐만 아니라 리눅스에서도 컴파일만 하면 같은 프로그램을 만들 수 있는 방법입니다.

개인적으로 이러한 방법으로 윈도우 프로그램을 작성하는 것보다, 최근에 나온 C#, Delphi, C++빌더, Visual Basic 등을 이용하여 개발하는 것이 생산성 면에서 좋다고 생각합니다.

본 강좌는 윈도우 프로그램의 동작 원리를 이해하는데 중점을 두어 윈도우 API 를 이용한 방법을 소개하고자 합니다. C 언어을 이용하여 윈도우 프로그램을 만들 수 있는 유일한 방법이기도 합니다.

 

Posted by wrnly
프로그램/api&mfc2012. 2. 26. 10:35
1. Win 32 API 란 무엇인가 ?

☞ API 란 Application Programming Interface 의 약자이며 우리말로 풀이한다면

“운영체제가 응용 프로그램을 위해 제공하는 함수의 집합”이라고 정의할 수 있다.

윈도우즈에서는 “윈도우즈 API”라고 한다.

그렇다면 왜 Win32 API 인가 ?

API 도 윈도우즈 버전에 따라 여러 가지 종류가 있다.

16비트 운영체제인 윈도우즈 3.1에서 제공하는 API 를 Win16 API 라고 하며, 32 비트 운영체제인 윈도우즈 95/98 과 NT 에서

제공하는 API 를 Win32 API 라고 한다.

2. Win 32 API 프로그래밍의 절차에 대해 알아보자.

Step 1 : 델파이 [File] 메뉴의 [New Application] 을 선택하여 새 어플리케이션을 생성시킨다.

Step 2 : [Project] 메뉴의 [View Source] 항목을 선택한다. 그러면, Project1 이라는 탭을 가진 소스코드창이 뜬다.

Step 3 : 다음과 같은 코드들이 보일 것이다.

program Project1;

uses
  Forms,
  Unit1 in 'Unit1.pas' {Form1};

{$R *.RES}

begin
  Application.Initialize;
  Application.CreateForm(TForm1, Form1);
  Application.Run;
end.


Step 4 : 위 코드를 모두 지우고, 다음과 같은 코드를 복사하여 붙여넣기 해보자.

program myAppName;

uses
  Windows,
  Messages;

function Wndproc(wnd : HWND ; imessage : UINT ;
        wParam : WPARAM ; lParam : LPARAM) : LRESULT; stdcall;
begin
case imessage of
WM_DESTROY:
begin
PostQuitMessage(0);
Result := 0;
end
else
Result := DefWindowProc(wnd, imessage, wParam, lParam);
end;
end;

////////////////////////////////////////////////////////

var
        lpszclass : LPSTR ;
        Wnd : HWND ;
z : WNDCLASS ;
        iMessage : MSG;
begin
        lpszclass := 'LKY';
        with z do
        begin
        cbClsExtra := 0;
        cbWndExtra := 0;
        hbrBackground := GetStockObject(WHITE_BRUSH);
         hCursor := LoadCursor(HInstance, IDC_ARROW);
         hIcon := LoadIcon(HInstance, IDI_APPLICATION);
        hInstance := HInstance;
                lpfnWndProc := @WndProc;
                lpszClassName := lpszclass;
               lpszMenuName := nil;
        style := CS_HREDRAW or CS_VREDRAW;
        end;
RegisterClass(z);
Wnd := CreateWindow(lpszClass, lpszClass, WS_OVERLAPPEDWINDOW,
100, 50, 800, 600, 0, 0, hInstance, nil);

        ShowWindow( Wnd, SW_SHOWNORMAL );

        while GetMessage(iMessage,0,0,0) do
        begin
                TranslateMessage(iMessage);
                DispatchMessage(iMessage);
        end;

end.


Step 5 : F9 키를 눌러 실행을 하면, 기본적인 윈도우 창(Form)이 뜰것이다.

        이것이 기본적인 Win 32 API 프로그램의 틀이며, 여기서 코드를 적절한 위치에 추가/수정을 하면 되는 것이다.

Step 6 : Win 32 API 프로그래밍을 할 경우, Unit을 이용한 코드리스트는 필요가 없게 된다.

        따라서, Unit1 파일은 저장하지말고 Project1 파일만 저장하도록 한다

첨부파일;

델파이 6.0 퍼스널 버전 다운로드

 

http://download.borlandforum.com/delphi/Delphi6Personal/Delphi6PersonalEdition.exe

 

 

Serial Number: 68jr-c7f5j-ebcfy 
Auth Key: ry9-jrg 

무료판이니 다운로드 하세요..


Posted by wrnly
프로그램/api&mfc2012. 1. 16. 22:35
API는 Application Programming Interface의 약자입니다. 프로그램 작성을 위한 함수, 구조체, 타입 등의 집합체를 API라고 하며 여러 종류의 API가 있습니다. 이 사이트에서 다루는 API는 정확하게 32비트 윈도우즈 API입니다.
API는 윈도우즈 프로그래밍의 가장 기본이라 할 수 있습니다. 저수준이라 어렵지만 강력하고도 작은 프로그램을 만들기 위해 아직도 많이 사용되고 있습니다. API가 중요한 가장 큰 이유는 운영체제를 이해하기 위해 반드시 공부해야 할 과목이라는 점입니다. MFC나 델파이, 비주얼 베이직 등의 고급 언어로 프로그램을 쉽게 쉽게 짤 수도 있지만 근본이 되는 API를 모르고서는 아무리 고급 툴을 사용하더라도 좋은 프로그램을 작성하기는 어렵습니다. API 자체가 개발툴로서 훌륭한 것은 아니지만 윈도우즈 프로그래밍의 기초가 되는 것만은 분명합니다. API를 통해 운영체제의 동작 방식을 이해하면 프로그래머로서 진정한 자유를 누릴 수 있습니다
Posted by wrnly
프로그램/api&mfc2011. 9. 20. 20:07


    [ html.zip ] HTML Document by Doxygen  

    [ src.zip  ] Source code (cpp, h)

     

     

    GDI+를 사용하였고, 간단하게 Doxygen 작업을 해 두었습니다.

     

    갖다 쓰는 데에는 문제가 없을 겁니다.

     

     

    Doxygen 주석에만 달려있는 원저작권자 명칭을 수정하지 않는 선에서는 수정 및 재배포 모두 허용하며,

     

    상업적인 Application 개발을 위한 이용 역시 모두 당신에게 맡깁니다.

     

    그러나 버그로 인한 피해는 내 책임이 아닙니다.

     

     

    각 도형들은 클래스화 되어있으며, 이를 제어하는 Master class가 하나 있습니다.

     

    구동은 MFC나 WINAPI Application 공히 윈도우 메시지 프로시져에 몇 가지 추가만 해주면 됩니다.

     

    UniCode 프로젝트로 생성되어 있으며, Multibyte는 테스트해보지 않았습니다.

     

     

    과제나 텀프로젝트 제출용으로 가져가시는 학생분들에게도 역시 라이센스는 오픈 되어 있습니다.

     

    다만 C++의 클래스 상속 및 다형성에 관련된 문제나 GDI+ 내용들, STL에 관련된 내용까지 다 들어가 있으므로

     

    일반적인 커리큘럼에서 잘 다루지 않는 것들이 있기에 여러분이 이해하고 쓰는데는 무리가 있을 가능성이 높지만

     

    가져다 쓸 수 있다는 전제하에서라면야 능력이 되면 쓰시면 됩니다.

     

    단, 친절한 설명이나 코멘트 따위는 바라지도 마시길.

Posted by wrnly
프로그램/api&mfc2011. 9. 19. 12:42

간단한 win32api 코드 입니다.

 

저기서  winmain 이 하는 일과

 

wndproc 가 하는일

 

dialogproc 가 하는일에 대해서

 

winmain이 하는일은 특별히 대단한 것이 없고, 보통 일반적인 윈도 플밍에서 봤을때 무한루프를 돌면서 이벤트가 발생했을때 메시지큐에 쌓여있는 메시지를 읽어서 운영체제에게 어떤 메시지를 처리해달라고 메시지를 넘겨주는 역활을하며, 종료메시지가 발생하면 무한루프를 빠져나가면서 프로그램을 종료하게 됩니다.
wndproc 가 하는 일은 winmain에서 운영체제에 메시지를 넘겨주면 그 메시지가 해당 윈도우에 대한 메시지라면 운영체제는 wndproc에다가 그 메시지를 보내서 처리하라고 시킵니다. 그러면 wndproc에서 넘겨받은 이벤트에 대해 처리해주게 됩니다.
dialogproc 같은 경우는 제가 안써봐서 정확히는 모르지만, 아마도 wndproc에서 하는일과 동일한 작업을 할 수 있을 것입니다. 다만 그 대상이 윈도우창이 아닌 dialog 라는 것이 차이점일 것입니다.

Posted by wrnly