본문 바로가기
코스웨어/15년 스마트컨트롤러

20151112 - WinAPI 첫시간 일지 엄민웅

by 알 수 없는 사용자 2015. 11. 13.
728x90
반응형

http://www.soen.kr/ 홈페이지 들어가서 예제 다운로드 받기 

제일 첫번째 파일 분석 해보는 시간을 가졌었다.


아래는 주쌤이 수업시간 설명해주신 내용 말해주시는데로 받아 적을 수 있는 한 적은 후 소스코드 주변에 주석 처리해서 설명을 붙였다.

(저급하게 영어 한글로 발음 나는데로 적었놓았다 ;;;ㅋㅋ)


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
#include<windows.h>
 
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); 
// LRESULT  : 롱 int형이라 생각해라
// CALLBACK : 1. 뒤에서 호출한다란 의미 운영체제가 호출한다란 의미 내부적으로 사용한다는 의미가 아니고, 2.함수 호출 방식을 규약함
// HWND : 윈도우 핸들러 아마 인트일끼다 , UINT : 언사인드인트 ㅋㅋ,
//WPARAM : W 워드, 아마 언사인드 인트일끼다 (16bit 당시에 워드가 2바이트 였음요), LPARAM : long 롱 (4바이트)
 
HINSTANCE g_hInst;
//HINSTANCE : 요것도 찾아보면 아마 정수형일 것임
//g_hInst : 글로벌 전역변수란 의미 글로벌 핸들러 인스턴스
 
LPSTR lpszClass = L"First";
//LPSTR : 문자형 포인터 즉 케릭터포인터 ㅋㅋ
//lpszClass  : 롱포인터스트링제로, 널로 끝나는 문자형 포인터. 그러니깐 따옴표 나오잖아 ㅋ
 
int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpszCmdParam, int nCmdShow)
{
// WinMain : 요게 엔트리 포인트이다 일반C로 컴파일 안됨
// APIENTRY : 요게 엔트리포인트다 라는 의미 컴파일 할땐 없어진다. STD콜인지 CDECL콜인지 
// 두번째 인자 안쓴다... 옛날에 남아 있던거라
// lpszCmdParam : 프로그램 인자들 받아들일 수 있게 하는 아이
// nCmdShow : 창을 화면에 보여 줄껀가 안보여 줄껀가 결정
    HWND hWnd;
    MSG Message;
    WNDCLASS WndClass; // WNDCLASS : 이 야이 구조체다 찾아보면 스트럭트 되있다능 아주 중요한 구조체
    g_hInst = hInstance; // 전역변수에 윈메인 첫번째 인자 집어넣고 있다. 다른함수들이 접근 가능하도록 인자를 보여주는것
 
    //다음 구조체에 값 집어 넣기 초기화 시켜주기
    WndClass.cbClsExtra = 0;
    WndClass.cbWndExtra = 0;
    WndClass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH); // 창의 전체 색 WHITE_BRUSH 흰색으로 새팅
    WndClass.hCursor = LoadCursor(NULL, IDC_ARROW); // 마우스 커서 IDC_ARROW 화살
    WndClass.hIcon = LoadIcon(NULL, IDI_APPLICATION); // 프로그램 실행시키면 창 젤 왼쪽 위에 아이콘 모양 IDI_APPLICATION 어플리케이션 모양
    WndClass.hInstance = hInstance; //구조체 안에 첫번째 인자를 넣어줘야 해서 넣어줌
    WndClass.lpfnWndProc = (WNDPROC)WndProc;
    //lpfnWndProc 롱포인터 펑션 함수 주소 넣는자리. 메세지를 받을 함수 이름을 넣어줘야함
    //젤 중요한 게념임 (예화 이야기 해주신게 그림판 뛰우고 창 이동 할때 마우스 포인터가 창 인식)
    //창이 주인공이 아님 창위에 뭐가 있는거임 그아이가 운영체제인거임
    //실행중인 한덩어리를 클레스라고 부른다 
    //모날리스? (창안에 창 뛰웠을때 쫄따구창이 뒤에 큰창이 클릭 되는아이 안되는 아이 구분 하기 위한거)
 
    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);
 
// CW_USEDEFAULT 이거 앞에 2개 창의 시작 좌표, 뒤에 2개 가로크기 새로크기 요렇게 4각형 그릴러면 4개가 필요하다 
// 윈도우에서 원 그릴때  4개가 필요하다함. 반지름 값으로 하는게 아니라 타원 그리기 쉽게 할라꼬
 
 
    ShowWindow(hWnd, nCmdShow);
    //화면에 보일 껀지 안보일 껀지 쎄팅해주는 함수
    //창이 화면에 나타날지 안나타날지 두번째 인자가 결정 안에 값을 false 라고 넣으면 안보임 윈도우 4번째 인자가 결정
 
    while(GetMessage(&Message, 000)) //GetMessage 윈도우가 돌고 있는걸 받는 함수 초고속으로 윈도우가 메세지를 보내고 있음 
    {//&Message 전달된 메세지 뇝두는 곳
        TranslateMessage(&Message); // 키보드 입력 담당, 
        DispatchMessage(&Message); // 윈도우가 처리할게 없는거 쓰래기 정보를 여기 넘김
    } // 겟메세지 창 닫으면 0을 리턴함 와일문 빠져 나옴
// 큐(원형연결리스트)에서 제일 오래된 메세지를 들고 옴
// 원형큐 메세지큐 모양은 원형을 가지고 있다. 큐라는 개념은 first in first out FIFO 구조
 
    return Message.wParam; // 정상 종료인지 비정상 종료인지 판별
    
}
 
LRESULT CALLBACK WndProc(HWND hWnd,UINT iMessage,WPARAM wParam,LPARAM lParam)
{//요게 실제 매인이다 일을 뭐할지를 여기서 결정함
//UINT iMessag : 여기 이벤트 정보 번호가 온다
 
 
    switch(iMessage)
    {
        case WM_DESTROY: 
            PostQuitMessage(0);
            return 0;
            //WM_DESTROY 창을 닫으라는 메세지. 디파인 값이다. 창 닫는 시간 벌기 위해서 메세지 값 전달함
    }
    return (DefWindowProc(hWnd, iMessage, wParam, lParam));
}
 

cs

위 소스 코드는 앞으로 쓸 기본형이기 때문에 오늘 첫시간에만 타이핑 해보고 다음 시간들 부터는 복사해서 사용하자라고 하심


비쥬얼 스튜디오에서 소스코드 붙어넣기해서 창 뜨는거 실습해보려 했으나 포멧후 다시깐 비쥬얼 스트디오가 프로젝트 생성 OK 버튼 자체가 비활성화 되있는

안습적인 오류로 인해 실습해보지 못하였다.   



728x90