디시인사이드 갤러리

갤러리 이슈박스, 최근방문 갤러리

갤러리 본문 영역

입에횽 늦었지만 올려봄;;

야간편돌이(175.196) 2013.03.13 06:28:17
조회 116 추천 0 댓글 5

코드 죤나 ㅜㅜ 맨 마지막줄에 질문 올려놨으니깐 봐주셍

#include <windows.h>

LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
LRESULT CALLBACK ChildWndProc(HWND hWnd, UINT messa, WPARAM wParam, LPARAM lParam);
HINSTANCE g_hInst;
LPCTSTR lpszClass = "HelloAPI";
LPCTSTR ChildClassName = "ChildWin";

int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpszCmdParam, int nCmdShow)
{
 HWND hWnd;
 MSG Messa;// MSG = 메시지 구조체, (HWND hwnd메시지받을 핸들, UINT messa어떤 종류의 메시지인가,
   //WPARAM wParam 부가 정보1, LPARAM lParam 부가 정보2, DWORD time 메시지 발생 시간,
   //POINT pt 발생시 마우스 위치)
   //메시지 종류에 따라 WPARAM, LPARAM의 의미가 달라짐
 WNDCLASS WndClass;
 g_hInst=hInstance;

 WndClass.cbClsExtra=0;//(1)
 WndClass.cbWndExtra=0;//(2)  (1)과 (2)는 예약영역으로 아주 특수한 목적에 사용되는 여분의 공간, 미사용시 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;   //클래스 이름. 5행의 lpszClass="HelloAPI";
 WndClass.lpszMenuName=NULL;     //메뉴는 코드에서 만드는 것이 아니라 사용하지 않을 경우 NULL값 입력
 WndClass.style=CS_HREDRAW | CS_VREDRAW;  //클래스의 스타일=윈도우의 수직, 수평 크기가 변할 경우 윈도우를 다시 그린다
 RegisterClass(&WndClass);     //클래스 등록!!

 WndClass.lpfnWndProc = ChildWndProc;  //차일드 윈도우 프로시저
 WndClass.lpszClassName = ChildClassName; //차일드 윈도우 클래스 이름(6행의 "ChildWin")
 RegisterClass(&WndClass);     //차일드 윈도우 클래스 등록

 hWnd=CreateWindow(lpszClass,  //lpszClassName윈도우 클래스 이름(HelloAPI)
  "메인 윈도우",   //lpszWindowName윈도우 타이틀
  WS_OVERLAPPEDWINDOW    //dwStyle윈도우 형태(시스템 메뉴, 최대 최소 버튼, 타이틀바, 경계선을 가짐)
  | WS_VISIBLE,
  100, 100,      //x, y좌표(기준점은 모니터의 왼쪽 위 구석, 기준점에서 멀어지는 값)
  750, 600,      //nWidth, nHeight윈도우 폭(Width)과 높이(Height)
  (HWND)NULL,      //hwndParent부모 윈도우 핸들, 없을경우 NULL(이게 부모윈도우라서 NULL값 사용)
  (HMENU)NULL,     //hmenu윈도우가 가지는 메뉴 핸들, 없을경우 NULL
  hInstance,      //hinst객체 핸들, 윈도우를 만드는 주체로 WinMain의 매개변수로 전달된 값 사용
  NULL);       //lpvParam여분의 데이터 CREATESTRUCT라는 구조체의 번지, 특수목적에 사용, 보통은 NULL값 사용

 ShowWindow(hWnd, nCmdShow);// 윈도우 출력(출력할 윈도우 핸들, 출력방법)

 while(GetMessage(&Messa,0,0,0)) {
  TranslateMessage(&Messa);//키보드 메세지 입력, A를 눌렀다가 떼면 A문자가 입력되었다는 메세지를 만드는식의 역할
  DispatchMessage(&Messa);
 }
 return Messa.wParam;
}

#define ID_OK_BTN 2000
#define ID_OK_BTN1 2001
#define ID_OK_BTN2 2002
#define ID_OK_BTN3 2003
#define ID_OK_BTN4 2004
#define ID_OK_BTN5 2005

LRESULT CALLBACK WndProc(HWND hWnd, UINT iMessa, WPARAM wParam, LPARAM lParam)
{
 char text[] = "메인 윈도우 생성ㅋㅋ";

 switch(iMessa)
 {
 case WM_PAINT:
  {
   PAINTSTRUCT ps;
   HDC hdc = BeginPaint(hWnd,&ps);
   TextOut(hdc,100,100,text,strlen(text));
   EndPaint(hWnd,&ps);
   return 0;
  }
 case WM_CREATE:
  { //차일드 윈도우가 만들어진 후 윈도우 핸들값이 저장됨
   HWND hChildWnd = CreateWindow(
   ChildClassName,    //차일드 윈도우 클래스 이름
   "차일드 윈도우",
   WS_OVERLAPPEDWINDOW | WS_CHILD,//차일드 윈도우 형태
   150, 150,
   260, 200,
   hWnd,      //부모 윈도우
   (HMENU)2000,    //차일드 윈도우 ID
   g_hInst,     //객체 핸들
   (LPVOID)NULL);    //여분의 데이터
  //차일드 윈도우가 성공적으로 생성되었는지 윈도우 핸들을 검사
   if(!hChildWnd)  return -1;

   ShowWindow(hChildWnd, SW_SHOW); // 차일드 윈도우를 화면에 보여 줌

   //버튼 윈도우의 핸들이 지정
   hChildWnd = CreateWindow(
    "button",
    "정리요약1",
    WS_CHILD | WS_VISIBLE, //컨트롤은 예외 없이 차일드 윈도우이기 때문에 WS_CHILD 스타일이 필수.
       //WS_VISIBLE 스타일을 주어야 ShowWindow 함수를 호출하지 않아도 컨트롤이 나타나기에
       //위의 두 스타일은 컨트롤의 경우 예외 없이 주어야 한다.
    20,
    400,
    100,
    30,
    hWnd,
    (HMENU) ID_OK_BTN,//56행에서 정의한 #define ID_OK_BTN 2000 참조 (ID_OK_BTN 이라는 글자는 2000이라는 값을 가짐)
    g_hInst,
    (LPVOID) NULL);
 //  if(!hChildWnd) return -1;//버튼이 만들어지지 않으면 종료
 //  return 0;
   
   hChildWnd = CreateWindow(
    "button",
    "정리요약2",
    WS_CHILD | WS_VISIBLE,
    140,
    400,
    100,
    30,
    hWnd,
    (HMENU) ID_OK_BTN1,
    g_hInst,
    (LPVOID) NULL);

   hChildWnd = CreateWindow(
    "button",
    "정리요약3",
    WS_CHILD | WS_VISIBLE,
    260,
    400,
    100,
    30,
    hWnd,
    (HMENU) ID_OK_BTN2,
    g_hInst,
    (LPVOID) NULL);

   hChildWnd = CreateWindow(
    "button",
    "정리요약4",
    WS_CHILD | WS_VISIBLE,
    380,
    400,
    100,
    30,
    hWnd,
    (HMENU) ID_OK_BTN3,
    g_hInst,
    (LPVOID) NULL);

   hChildWnd = CreateWindow(
    "button",
    "정리요약5",
    WS_CHILD | WS_VISIBLE,
    500,
    400,
    100,
    30,
    hWnd,
    (HMENU) ID_OK_BTN4,
    g_hInst,
    (LPVOID) NULL);

   hChildWnd = CreateWindow(
    "button",
    "정리요약6",
    WS_CHILD | WS_VISIBLE,
    620,
    400,
    100,
    30,
    hWnd,
    (HMENU) ID_OK_BTN5,
    g_hInst,
    (LPVOID) NULL);
   if(!hChildWnd) return -1;
   return 0;

  }

 case WM_COMMAND:
  {
   //WM_COMMAND 메시지를 발생시킨 컨트롤의 ID를 검사
   if(LOWORD(wParam) == ID_OK_BTN)
   {//메시지 박스를 띄움
    MessageBox(hWnd, "[정리요약1]\n윈도우 프로그램이란 현재 개인용 컴퓨터에서 동작되는 Windows 운영체제에서\n실행할 수 있는 프로그램으로, 모든 윈도우는 윈도우 클래스로부터 만들어진다.\n윈도우 클래스는 윈도우를 만들기 위한 형틀이며 생성될 윈도우의 여러가지 특징\n을 모아놓은 구조체이다. CreateWindow 함수는 첫 번째 인수 lpszClassName\n으로 전달된 윈도우 클래스로부터 만들고자 하는 윈도우의 특성을 알아내며 윈도\n우 클래스가 지정한 특성대로 윈도우를 만든다.","정리요약1",MB_OK);
   }
   else if(LOWORD(wParam) == ID_OK_BTN1)
   {
    MessageBox(hWnd, "[정리요약2]\n메시지는 시스템이나 응용 프로그램에 의해 생성된다. 키보드나 마우스 등의 사용\n자 입력 시 시스템은 입력에 대해 메시지를 발생시키며 시스템의 상황 변화를 통지\n하기 위해서도 메시지를 발생시킨다. 응용 프로그램도 윈도우 간의 통신을 위해\n메시지를 보내며 특정함수 호출에 의해 간접적으로 메시지가 발생하기도 한다. 이\n처럼 Windows 운영체제는 메시지의 생성과 처리를 무수히 반복하며 실행된다.","정리요약2",MB_OK);
   }
   else if(LOWORD(wParam) == ID_OK_BTN2)
   {
    MessageBox(hWnd, "[정리요약3]\n운영체제는 하나의 시스템 메시지 큐를 관리하며 또한 각 스레드별로 하나씩 메시\n지 큐를 생성한다. 큐(Queue)라는 자료구조는 FIFO의 원칙에 따라 운영되는 자\n료구조이다. 즉, 메시지 큐는 들어온 순서대로 메시지를 쌓아놓는 곳이다. 시스템\n메시지 큐는 시스템 전체에 유일한 메시지 큐이며 모든 큐 메시지는 먼저 이곳에\n저장된다. 시스템은 큐의 메시지를 하나씩 꺼내어 어떤 스레드로 보낼 메시지인지\n판단하여 스레드 메시지 큐로 메시지를 보내고 시스템 메시지 큐에서 메시지를 지\n운다. 그러면 메시지 루프에 의해 이 메시지는 해당 윈도우의 윈도우 프로시저로\n보내져 처리되고 스레드 메시지 큐에서 메시지는 삭제된다.","정리요약3",MB_OK);
   }
   else if(LOWORD(wParam) == ID_OK_BTN3)
   {
    MessageBox(hWnd, "[정리요약4]\nWindows 운영체제는 세 가지 동적 연결 라이브러리(DLL)로 구성되어 있는데 메\n모리를 관리하고 프로그램을 실행시키는 KERNEL, 사용자 인터페이스와 윈도\n우를 관리하는 USER, 화면처리와 그래픽을 담당하는 GDI이다. Windows 운\n영체제 API 함수의 대부분이 이 세 가지 DLL에 의해 제공되고 있다.","정리요약4",MB_OK);
   }
   else if(LOWORD(wParam) == ID_OK_BTN4)
   {
    MessageBox(hWnd, "[정리요약5]\n콜백(Callback) 함수는 응용 프로그램이 제공하며 운영체제가 필요할 때 호출하는\n함수로 "운영체제에 의해 호출되는 프로그램 내부의 함수"라고 할 수 있다.","정리요약5",MB_OK);
   }
   else if(LOWORD(wParam) == ID_OK_BTN5)
   {
    MessageBox(hWnd, "[정리요약6]있는 프로그램 만든다.","정리요약6",MB_OK);
   }

   return 0;
  }

 case WM_DESTROY:
   PostQuitMessage(0);
   return 0;
 }

 return DefWindowProc(hWnd, iMessa, wParam, lParam);
}

LRESULT CALLBACK ChildWndProc(HWND hWnd, UINT messa, WPARAM wParam, LPARAM lParam)
{
 char text[] = "차일드 윈도우 생성ㅋㅋㅋ";
 switch(messa)
 {
 case WM_PAINT:
  {
   PAINTSTRUCT ps;   //페인트 정보 구조체
   HDC hdc = BeginPaint(hWnd, &ps); //DC 핸들 얻어오기
   TextOut(hdc, 10, 10, text, strlen(text)); //문자열 출력 함수
   EndPaint(hWnd, &ps);     //핸들 해제
   return 0;
  }
 }
 return DefWindowProc(hWnd, messa, wParam, lParam);
}

이게 맨 처음 나오는 코딩인데
그 전까지 너무 설명(암기위주로 요구되는)만 해대서 ㅜㅜ


그리고 연습문제로
1. 예제 프로그램에서 버튼을 생성하고 버튼을 클릭했을 때 메시지 박스가 나타나는 기능을 추가하시오.
이거는 위에 있는 예제문제에 이미 포함된 내용 아니야?
프로그램에 버튼 있고 버튼 클릭하면 메시지박스 나오잖아.. 아닌건지 모르겐다

2. 예제 프로그램에서는 WinMain 함수와 윈도우 프로시저 함수로 구성되어 있다.
이것을 Init Application(HINSTANCE hinstance), InitInstance(HINSTANCE hinstance, int nCmdShow) 함수를 추가하여 프로그램 소스를 분리해보시오.
이건데 첫줄은 이해가는데 두번째줄에 뭔소린지 하나도 모르겠음;;

이해 안가는 이유라면 예를들어 winmain함수 설명 때 (HINSTANCE hInstance, .... , .... , ...)
요렇게 써놓고
-hInstance : 프로그램의 인스턴스 핸들
요 설명 하나 써놨는데 프로그램의 인스턴스 핸들이 뭔뎈ㅋㅋㅋ 왜 첫 장부터 c++에 대한 기반지식을 풍부하게 잡고 설명하는건지;
이전에 배운 교과목이래봐야 C프로그래밍, 프로그램설계 입문, 공학설계 입문 요런거 뿐이였는데
그다음줄은 -hPrevInstance : Win32에서는 항상 NULL

너무 막장같은 설명으로 느끼는건 나뿐인가?
앞에 C++에서 핸들이란 단어에 대한 설명같은것도 있긴 한데 앞장부터 차근차근 정독해서 다 보고 하는거야
원래 지금 4장 볼 차례인데 강의만 보다가 하도 답이 안나와서 차근차근 코딩 다 짜보고 하면서 정독하는데
이거 너무 이상해;; 어떻게 배우라는건지 모르겠어
차라리 빨리 다른 책을 구해볼까;; 전공과목은 다 쉽게 느껴졌는데 편입학후 이건 진짜 아니다 싶은데
심지어 어이없는건 방통대 인강에서 "코드를 직접 짜시면 오류가 많이 발생하니깐 제가 만들어놓은 소스를 다운해서 열어서 강의를 들으세요"
이거야 강의 듣고있는데 그냥 교과서 읽어주는수준이고 뭔소린지 몰겐다

추천 비추천

0

고정닉 0

0

댓글 영역

전체 댓글 0
본문 보기

하단 갤러리 리스트 영역

왼쪽 컨텐츠 영역

갤러리 리스트 영역

갤러리 리스트
번호 제목 글쓴이 작성일 조회 추천
설문 끝까지 다 본 걸 후회하게 만든 용두사미 드라마는? 운영자 25/07/07 - -
349664 열심히하면 [1] ㅇㅇ(61.98) 13.03.16 61 0
349663 엌ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ 도미노피자 왤케많이옴ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ [14] dd(1.214) 13.03.16 184 0
349662 피자왔다! [2] (168.126) 13.03.16 77 0
349661 사실 지금 진짜상황 [2] 근성가이(211.237) 13.03.16 128 0
349660 참 잘하는사람은 많은거같다 미크님갤로그로 이동합니다. 13.03.16 57 0
349659 집에 가족 폰 진동 울리거나 문자소리들리시는분들 [2] 야간편돌이(175.116) 13.03.16 72 0
349658 근대 OTP 백이(182.214) 13.03.16 51 0
349657 프통령깨서 친히 제자를 키운다 하셨는데,,, [4] ㅁㄴㅇ(1.245) 13.03.16 105 0
349656 근데 ㅇㅇ 형, 닉네임이.. [7] DART(116.41) 13.03.16 136 0
349655 쿠폰 폰으로 오는거지?? ㅁㄴㅇ(1.245) 13.03.16 56 0
349653 피자옴 ㅋㅋㅋ [3] 근성가이(211.237) 13.03.16 83 0
349652 어쩐지 오늘 피곤하더라.. [2] DART(116.41) 13.03.16 66 0
349651 난 한 3년전쯤 피자를 얻어먹었지 ㅋㅋ [4] 규식이(218.153) 13.03.16 86 0
349650 아직 안보냈죠? [6] ㅇㅇ(211.234) 13.03.16 99 0
349649 나도 피자 먹어본지 진짜 오래됐네 [1] 야간편돌이(175.116) 13.03.16 59 0
349647 이 와중에 airwig [5] (168.126) 13.03.16 125 0
349646 존나 궁금한게 있는데 [5] 백이(182.214) 13.03.16 68 0
349645 메뉴다 불만 없지? [19] ㅇㅇ(119.203) 13.03.16 2203 1
349644 피자를 쏘는 프로세스 [가이드라인] [3] 씹죶(116.33) 13.03.16 142 3
349643 아니 왜 도미노피자는 [2] 규식이(218.153) 13.03.16 69 0
349642 프갤수준이 ㅎㄷㄷ [1] 지리(112.170) 13.03.16 83 0
349640 프통령님 사진이다 프통령거론할때는 꼭 생각하고써라 [8] 근성가이(211.237) 13.03.16 137 7
349639 날려 짜느라 코드는 무성의하다. [13] ㅇㅇ(119.203) 13.03.16 270 0
349638 airwig글이 안보영; [3] 백이(182.214) 13.03.16 125 0
349637 피자 보니깐 생각났는데 ㅋㅋㅋ [4] 야간편돌이(175.116) 13.03.16 64 0
349636 6천원 옥수수피자라도 줘라. ㅇㅇ(211.234) 13.03.16 54 0
349635 여러분들 저도 밤샜어요 [3] 야간편돌이(175.116) 13.03.16 67 0
349634 도미노 머가 맛있냐?? [3] ㅁㄴㅇ(1.245) 13.03.16 78 0
349633 자자 대충 줄은 섰고 어떻게 보내줄까? [22] ㅇㅇ(119.203) 13.03.16 308 0
349630 간단하게 요약 [6] 야간편돌이(175.116) 13.03.16 111 0
349629 여기서 ㅇㅇ 이가 피자 쏘면 프통령 된다 리얼 [4] 씹죶(116.33) 13.03.16 108 0
349628 둘다 수고햇음 백이(182.214) 13.03.16 39 0
349627 공부하는사이에 피자라니 ㅋㅋㅋ [2] 야간편돌이(175.116) 13.03.16 52 0
349625 일찍 일어나는 프갤럼이 피자를 먹는다. [8] dd(1.214) 13.03.16 109 0
349624 아 5분만 5분만하다 아까일어남 [5] 백이(182.214) 13.03.16 65 0
349623 감상 [2] LastCorona갤로그로 이동합니다. 13.03.16 53 0
349622 피자 10판 줄서라~ [14] airwig(39.7) 13.03.16 283 0
349620 airwig 존나 졸렬하다 ㅋㅋㅋㅋㅋㅋ [5] 삐쭊이(211.218) 13.03.16 146 0
349618 프갤은 서로 싸워도 뭔 말인지 모르겠다. [1] ㅇㅇ(115.41) 13.03.16 71 0
349617 어쨋든 피자 30판 [1] ㅇㅇ(223.33) 13.03.16 94 0
349616 왜 글이 안올라옴??? [2] 인간(110.35) 13.03.16 42 0
349615 자기 필드에서 하는거 말고 전혀 다른걸 해 [2] 씹죶(116.33) 13.03.16 70 0
349614 니가 짠거 올려라 [7] ㅇㅇ(110.70) 13.03.16 168 0
349613 지금 둘다 못하고 있는데, 둘다 좀 힘들게라도 할수 잇는 문제로 난이도를 [3] 규식이(218.153) 13.03.16 83 0
349612 솔직히 프갤 역사에서 이정도로 어그로 끈 적은 백준 이후로 첨일듯 [2] dd(1.214) 13.03.16 68 0
349611 앗싸 10분 남았당 히히 dd(1.214) 13.03.16 33 0
349610 누가 이기든 관심없어 그냥 [5] 규식이(218.153) 13.03.16 83 0
349609 꼴랑6천가지고..ㅉㅈ 인증이다 sh(168.244) 13.03.16 102 0
349608 피자먹고싶다 [2] 루비•‿•갤로그로 이동합니다. 13.03.16 60 0
349606 9시까지 30분도 안남았는데 [3] 인간(110.35) 13.03.16 58 0
뉴스 Mnet '보이즈 2 플래닛' 160명 소년들의 성장 레이스에 대해 밝혔다! ‘내일의 스타’가 되려면? 디시트렌드 07.08
갤러리 내부 검색
제목+내용게시물 정렬 옵션

오른쪽 컨텐츠 영역

실시간 베스트

1/8

뉴스

디시미디어

디시이슈

1/2