api 시작한지 3일 되는 학생입니다..
c언어는 그래도 기본은 알지만 api도 c 언어랑 비슷해서 해볼려고 했는데.. 함수랑 이것 저것이 어려워서 어려운 가운데 있습니다..

이번에  입력받아서 그래프 그리는 소스인데..
소스 설명좀 부탁드릴려고 합니다..
일일이 함수 찾아보면서 해볼려고 했지만 잘 안나오는것들도 많아서 이렇게 부탁드립니다.

주석이나 설명 해주셨으면 합니다. 감사합니다.

#include <windows.h>
#include <stdio.h>

LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);
HINSTANCE  g_hInst;
HWND       g_hWnd;
LPSTR      lpszClass="ApiDrawGraph";

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

typedef struct 
{
 POINT  *pData;
 DWORD   dwNum;
}GRAPHDATA;

GRAPHDATA GraphData={NULL, 0};

BOOL ReadDataFile(char *filename, GRAPHDATA *pGData)
{
 FILE  *in;
 int    x, y;

 in=fopen(filename, "r");

 if (in==NULL)
 {
  MessageBox(g_hWnd,"파일 열기 실패!!","에러",MB_OK|MB_ICONERROR);
  return FALSE;
 }
 
 if (pGData)
 {
  if (pGData->pData) free(pGData->pData);
  pGData->dwNum=0;
 }

 while(1)
 {
  if (fscanf(in,"%d%d",&x,&y)==EOF) break;
  pGData->pData=(POINT*)realloc(pGData->pData, sizeof(POINT)*(1+pGData->dwNum));
  if (pGData->pData)
  {
   pGData->pData[pGData->dwNum].x=x;
   pGData->pData[pGData->dwNum].y=y;
   pGData->dwNum++;
  }
 }

 return TRUE;
}

LRESULT CALLBACK WndProc(HWND hWnd, UINT iMessage, WPARAM wParam, LPARAM lParam)
{
 HDC           hdc;
 PAINTSTRUCT   ps;
 HBRUSH        PointBrush, OldBrush;
    int           i;
 DWORD         dwCount;
 POINT         ptOldpoint, ptClPoint;
 DWORD         dwScale=20, dwPointSize=10;

 switch(iMessage)
 {
 case WM_CREATE:
  g_hWnd=hWnd;
        ReadDataFile("data.txt", &GraphData);
  return 0;

 case WM_PAINT:
  hdc=BeginPaint(hWnd,&ps);
  PointBrush=CreateSolidBrush(RGB(255,0,0));

  SetMapMode(hdc,MM_LOENGLISH);
  SetViewportOrgEx(hdc,200,400,NULL);

  MoveToEx(hdc, -2000, 0,NULL);
  LineTo(hdc, 2000, 0);
  MoveToEx(hdc,0,-2000,NULL);
  LineTo(hdc,0,2000);

  for(i=-2000; i <= 2000; i+=dwScale)
  {
   MoveToEx(hdc, i, -5,NULL);
      LineTo(hdc, i, 5);
   MoveToEx(hdc, -5, i,NULL);
      LineTo(hdc, 5, i);
  }

  if (GraphData.pData)
  {
   ptOldpoint.x=ptOldpoint.y=0;
   for(dwCount=0; dwCount < GraphData.dwNum; dwCount++)
   {
    MoveToEx(hdc, ptOldpoint.x*dwScale, ptOldpoint.y*dwScale,NULL);
    LineTo(hdc, GraphData.pData[dwCount].x*dwScale, GraphData.pData[dwCount].y*dwScale);
    ptOldpoint.x=GraphData.pData[dwCount].x;
    ptOldpoint.y=GraphData.pData[dwCount].y;
   }

   OldBrush=(HBRUSH)SelectObject(hdc, PointBrush);

   for(dwCount=0; dwCount < GraphData.dwNum; dwCount++)
   {
    ptClPoint.x=(GraphData.pData[dwCount].x*dwScale)-(dwPointSize/2);
    ptClPoint.y=(GraphData.pData[dwCount].y*dwScale)-(dwPointSize/2);
       Ellipse(hdc,ptClPoint.x,ptClPoint.y,
             ptClPoint.x+dwPointSize,
          ptClPoint.y+dwPointSize);
   }

   SelectObject(hdc, OldBrush);
  }

  DeleteObject(PointBrush);

  EndPaint(hWnd, &ps);
  return 0;

 case WM_DESTROY:
       if (GraphData.pData) free(GraphData.pData);
  PostQuitMessage(0);
  return 0;
 }
   
 return(DefWindowProc(hWnd,iMessage,wParam,lParam));
}