wookss blog

윈도우API 프로그래밍 [메모장만들기!] 본문

Study/컴퓨터공학

윈도우API 프로그래밍 [메모장만들기!]

wooklab 2013. 5. 14. 00:59
반응형

#include <windows.h>
LRESULT CALLBACK WndProc(HWND hwnd, UINT iMsg,
      WPARAM wParam, LPARAM lParam);
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
       LPTSTR lpszCmdLine, int nCmdShow)
{
 HWND hwnd;
 MSG  msg;
 WNDCLASS WndClass;
 WndClass.style = CS_HREDRAW | CS_VREDRAW;
 WndClass.lpfnWndProc = WndProc;
 WndClass.cbClsExtra = 0;
 WndClass.cbWndExtra = 0;
 WndClass.hInstance = hInstance;
 WndClass.hIcon = LoadIcon(NULL, IDI_APPLICATION);
 WndClass.hCursor = LoadCursor(NULL, IDC_ARROW);
 WndClass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
 WndClass.lpszMenuName = NULL;
 WndClass.lpszClassName = "Window Class Name";
 RegisterClass(&WndClass);
 hwnd = CreateWindow("Window Class Name",
  "20084296 황인욱",
  WS_OVERLAPPEDWINDOW,
  CW_USEDEFAULT,
  CW_USEDEFAULT,
  CW_USEDEFAULT,
  CW_USEDEFAULT,
  NULL,
  NULL,
  hInstance,
  NULL
 );
 ShowWindow(hwnd, nCmdShow);

 UpdateWindow(hwnd);
 while(GetMessage(&msg, NULL, 0, 0))
 {
  TranslateMessage(&msg);
  DispatchMessage(&msg);
 }
 return msg.wParam;
}
///////////////////////////////////기본 윈메인/////////////////////////////////////

 


LRESULT CALLBACK WndProc(HWND hwnd, UINT iMsg,
       WPARAM wParam, LPARAM lParam)
{
 HDC   hdc;
 PAINTSTRUCT ps;          
 static char str[10][99];       // 문자열을 저장할 공간
 static int count, line;        // 문자열(count)와 행(line)을 위한 공간
 static SIZE size;         // 문자의 폭과 높이의 정수 필드가 있는 SIZE구조체, 문자열의 폭과 높이 저장
 int i;

 switch(iMsg)
 {
 case WM_CREATE:
  CreateCaret(hwnd, NULL, 3, 15);     // 폭3픽셀, 높이15픽셀의 Caret 생성
  ShowCaret(hwnd);
  count = 0;          // 변수 초기화
  line = 0;
  break;
              
 case WM_PAINT:
  hdc = BeginPaint(hwnd, &ps);
  for(i=0; i<line+1; i++)
  {
   GetTextExtentPoint(hdc, str[i], strlen(str[i]), &size); //(도화지, 크기를 측정할 문자열, 몇번째 문자까지 크기측정, 문자열의 폭)
   TextOut(hdc, 0, i*20, str[i], strlen(str[i]));  //도화지에 (0, i*20)좌표에 str에 저장된 문자열을 출력
   SetCaretPos(size.cx, i*20);      // 커서 자리 값
  }
  EndPaint(hwnd, &ps);
  break;


 case WM_CHAR:
  if((wParam == VK_BACK)&&(count>0))
  {
   count--;
  } // 백스페이스 사용시 count 감소
  else if(wParam == VK_RETURN)     // Enter키 사용시
  {
   if(line<9)         //10행 까지만 입력 허용
   {
   count = 0;         //엔터키 입력이 들어왔을때 str[line][0]으로 이동, count 초기화
   line++;          // line증가, 줄 내려감
   }
  }
  else
  {
   if(count<98)        // count에 글자를 나열하되 99자 이하로
   {
    str[line][count++] = wParam;   // 해당 line에 count에 차곡차곡 보냄
   }
  }
  str[line][count] = '\0';      // 마지막에 입력 문자가 저장된 곳, 즉\0값으로 입력
  
  InvalidateRgn(hwnd, NULL, TRUE);    // 윈도우 화면을 무효화, 화면의 내용을 삭제, WM_PAINT 함수 이벤트발생 (강제 발생)
  break;
 
 case WM_DESTROY:
  HideCaret(hwnd);
  DestroyCaret();
  PostQuitMessage(0);
  break;
 }
 return(DefWindowProc(hwnd, iMsg, wParam, lParam));
}

 

 

 

----요기까지 소스-----

 

아이고 머리아...

진짜 여태것 배운것중에 제일 머리 아픈것같게 느껴지는 API..

 

이번에는 코드로 메모장을 만들었다..(교수님께서 과제로 내주신 덕분에^^;;)

이제는 저번 코드처럼 보기 좋게 띄어쓰기와 글씨에 색을 넣지 못하겠다.

특히 API는 점점 코드가 길어지기 때문에, 더이상 불가능 하다

 

이코드는

최대 99자까지 쓸수 있고, 10줄까지만 쓸수 있다.

뭐 기능은 별게 없지만

이거 만드는데 너무 복잡하다 T^T

반응형