간만에 밀린 빨래도 하고 마당 곳곳에서 솟아 올라오기 시작한 풀 뽑기도 하고.

14/4/21 월

'Visual C++/API 프로젝트 따라하기'책에 나온 Visual C++ 6.0 API 예제들 따라하기.

API 프로그래밍 기본 작성 순서:

1. 메뉴에서 [File]-[New] 클릭, 팝업 대화상자에서 [Projects] 탭 선택, [Win32 Application] 선택, Location에 소스가 저장될 폴더 선택, Project name에 파일명을 넣고 [OK] 클릭.
2. Win32 Application-Step 1 of 1 대화상자에서 An Empty Project 선택된 상태에서 [Finish], [OK] 클릭.
3. 워크스페이스에서 [FileView]탭 선택.
4. 파일명 files를 마우스 우클릭, 메뉴 중 [Add Files to Project...]선택, 팝업 대화상자에서 파일이름에 '파일명.rc'를 입력, [OK] 클릭.
5. 파일명 file-Source Files 아래 파일명.rc를 더블클릭. [예] 클릭.
6. 에디트 상자에 나타난 파일명.rc에서 마우스 우클릭, 메뉴 중 [Import...]선택, 팝업 대화상자에서 아이콘으로 사용할 ico 파일을 찾아 선택해 준다.
7. 화면에 선택한 아이콘 모양이 나타나고 워크스페이스에 ResourceView 탭이 새로 생긴다. ResourceView탭을 선택, 파일명 resources 폴더를 더블클릭하면 에디터 화면에 IDI_ICON1이 보인다. IDI_ICON1에서 마우스 우클릭, 메뉴중 [Properties] 선택, 팝업 대화상자 중 ID에 "IDI_ICON"으로 입력, 엔터키.
8. 워크스페이스에서 [FileView]탭 선택.
9. 파일명 files를 마우스 우클릭, 메뉴 중 [Add Files to Project...]선택, 팝업 대화상자에서 파일이름에 '파일명.cpp' 입력, [OK] 클릭.
10. 파일명 file-Source Files 아래 파일명.cpp 더블클릭. [예] 클릭.
11. 소스를 입력할 수 있는 에디트 상자가 나타나는데 이곳에 소스를 입력한다.
12. 모두 작성한 뒤 [Build]-[Excute exa4.exe] 또는 Ctrl-F5로 컴파일, 실행.


윈도우 하나 띄운 뒤 모니터에서 윈도우까지의 거리를 표시하고 엔터키 클릭시 메시지 박스를 띄워 위치 표시하는 예제 캡쳐.
#include "resource.h"
#include <windows.h>
#include <stdio.h>

LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);
//메시지 처리를 위한 콜백함수 선언

int WINAPI WinMain(HINSTANCE hInstance,
                       HINSTANCE hPrevInstance,
                       LPSTR lpCmdLine,
                       int nShowCmd)
{
     HWND hWnd;
     MSG mSg;

     char szTitle[]={"화면 기준 윈도우 4각 꼭지점 위치표시"};
     char szClass[]="Class";

     WNDCLASSEX WndEx;

     WndEx.cbSize=sizeof(WndEx); //구조체 크기
     WndEx.style=NULL; //윈도우의 스타일
     WndEx.lpfnWndProc=WndProc;
	 //메시지 처리할 콜백 함수 지정,
     //즉 WM_PAINT,WM_CREATE,WM_KEYDOWN등의 메시지를 처리할 함수를 지정
     WndEx.cbClsExtra=0; //추가 클래스 지정
     WndEx.cbWndExtra=0; //추가 윈도우 지정
     WndEx.hInstance=hInstance; //인스턴스 핸들 지정
     WndEx.hIcon=LoadIcon(NULL, "IDI_ICON"); //실행파일에 쓰일 아이콘 등록
     WndEx.hCursor=LoadCursor(NULL,IDC_ARROW);
	 //윈도우에 쓰일 커서 지정
     WndEx.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH);
	 //윈도우 배경화면 지정
     WndEx.lpszMenuName=NULL; //메뉴 지정
     WndEx.lpszClassName=szClass; //클래스 지정
     WndEx.hIconSm=LoadIcon(hInstance, "IDI_ICON");
	 //윈도우 캡션에 쓰일 아이콘 지정

     RegisterClassEx(&WndEx);

     hWnd=CreateWindowEx(NULL,
                              szClass,
                              szTitle,
                              WS_OVERLAPPEDWINDOW,
                              CW_USEDEFAULT,
                              CW_USEDEFAULT,
                              320,
                              100,
                              NULL,
                              NULL,
                              hInstance,
                              NULL);

     ShowWindow(hWnd,nShowCmd);
     UpdateWindow(hWnd);

     while(true){
          if(PeekMessage(&mSg,NULL,0,0,PM_NOREMOVE)){
               if(!GetMessage(&mSg,NULL,0,0))
                    break;
               TranslateMessage(&mSg);
               DispatchMessage(&mSg);
          }
     }
     return mSg.wParam;
}

LRESULT CALLBACK WndProc(HWND hWnd,
                              UINT uMsg,
                              WPARAM wParam,
                              LPARAM lParam)
{
     HDC hDC;
     RECT rEct;
     char szText[100];

     switch(uMsg){
     case WM_SIZE:
     case WM_MOVE:
          hDC=GetDC(hWnd);
          GetWindowRect(hWnd,&rEct);
         
          InvalidateRect(hWnd,NULL,true);
          UpdateWindow(hWnd);

          sprintf(szText,"left: %d, top: %d, right: %d, bottom: %d",
                    rEct.left,rEct.top, rEct.right, rEct.bottom);
          TextOut(hDC,5,5,szText,lstrlen(szText));
          return false;

     case WM_KEYDOWN:
          if(LOWORD(wParam)==VK_RETURN)
            {
                 GetWindowRect(hWnd,&rEct);

                 sprintf(szText,"left: %d, top: %d, right: %d, bottom: %d",
                         rEct.left,rEct.top, rEct.right, rEct.bottom);
                 MessageBox(hWnd,szText,"출력",NULL);
          }
          return false;

     case WM_DESTROY:
          PostQuitMessage(0);
          return false;
     }
     return DefWindowProc(hWnd,uMsg,wParam,lParam);
}