« PREV : 1 : 2 : 3 : 4 : NEXT »
C 컴파일시 아래 오류 메세지를 확인하실수 있습니다.

Duplicate symbol warning

이 오류의 원인은 변수를 선언후 정의가 된 변수를 다시 정의하여, 중복되었다고 나타나는 오류 입니다.

보통 이런 상황인것이지요.


int global; //이는 임시 정의만 한상태입니다.
int global = 1; //이제 정의를 한 상태가된것이죠, global은 1!

extern int global  // global을 선언하였습니다.
extern int global = 0; // 여기서 다시 global은 0이라고 재정의했내요.

또다른 예
int i; // 임시정의
ini i=0; // 정의
extern int i; // 선언
extern int i=0; // 정의

위와 같이 2번 정의를 하여 발생하는 경고 메세지 입니다.

전역 변수에서 초기 정의를 하여서 발생하는 문제일 가능성이 큽니다.
전역변수에서는 임시 정의만 하시고, include 하여 사용하시는게 증복 심볼 에러를 막을수 있습니다.
저작자 표시 비영리

'프로그래밍 > C/C++' 카테고리의 다른 글

Duplicate symbol warning시 확인해야 하는 부분  (0) 2010/04/01
시스템 정보 GetVersionEx  (0) 2009/08/14
시스템 정보 GetComputerName  (0) 2009/08/14
시스템 정보 GetSystemInfo  (0) 2009/08/14
메타파일 CreateEnhMetaFile  (0) 2009/08/14
입력문 MOUSE  (0) 2009/08/14
Write your message and submit

시스템 정보 GetVersionEx

Posted 2009/08/14 16:42

#include <windows.h>

LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);                                          

HINSTANCE g_hInst;      

LPCTSTR IpszClass=TEXT("MessageBox");

 

int APIENTRY WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance, LPSTR IpszCmdParam,int nCmdShow)   

 

{                                                                                                                                                                                                                                                                        

 

           HWND hWnd;

           MSG Message;

 

           WNDCLASS WndClass;

           g_hInst=hInstance;

 

           WndClass.cbClsExtra=0;

           WndClass.cbWndExtra=0;

           WndClass.hbrBackground=(HBRUSH)GetStockObject(LTGRAY_BRUSH);

           WndClass.hCursor=LoadCursor(NULL,IDC_NO);

           WndClass.hIcon=LoadIcon(NULL,IDI_QUESTION);

           WndClass.hInstance=hInstance;

           WndClass.lpfnWndProc=WndProc;

           WndClass.lpszClassName=IpszClass;

           WndClass.lpszMenuName=NULL;

           WndClass.style=CS_HREDRAW|CS_VREDRAW;

           RegisterClass(&WndClass);

 

           hWnd=CreateWindow(IpszClass,TEXT("My First Program"),WS_OVERLAPPEDWINDOW,300,100,CW_USEDEFAULT,CW_USEDEFAULT,NULL,(HMENU)NULL,hInstance,NULL);

           ShowWindow(hWnd,nCmdShow);

 

                     while (GetMessage(&Message,NULL,0,0)){

                                TranslateMessage(&Message);

                     DispatchMessage(&Message);

 

           }

           return (int)Message.wParam;       

}

LRESULT CALLBACK WndProc(HWND hWnd,UINT iMessage,WPARAM wParam,LPARAM lParam)

{

           HDC hdc;

           PAINTSTRUCT ps;

           OSVERSIONINFO osv;

           TCHAR str[255];

           TCHAR Plat[255];

 

           switch (iMessage) {

                     case WM_PAINT:

                                hdc=BeginPaint(hWnd,&ps);

                                osv.dwOSVersionInfoSize=sizeof(OSVERSIONINFO);

                                GetVersionEx(&osv);

                                wsprintf(str,"운영체제 버전 = %d.%d, 빌더 넘버=%d", osv.dwMajorVersion, osv.dwMinorVersion, osv.dwBuildNumber);

                                TextOut(hdc,50,50,str,lstrlen(str));

                                switch (osv,dwPlatformld) {

                     case VER_PLATFORM_WIN32s:

                                lstrcpy(Plat,"윈도우즈 3.1 Win32s");

                                break;

                     case VER_PLATFORM_WIN32_WINDOWS:

                                lstrcpy(Plat,"윈도우즈 95/98");

                                break;

                     case VER_PLATFORM_WIN32_NT:

                                lstrcpy(Plat,"윈도우즈 NT,2000");

                                break;

                                }

                                wsprintf(str,"플랫폼=%s, 서비스팩=%s",Plat,osv.szCSDVersion);

                                TextOut(hdc,50,70,str,lstrlen(str));

                                EndPaint(hWnd, &ps);

                                return 0;

                     case WM_DESTROY:

                                PostQuitMessage(0);

                                return 0;

           }

           return(DefWindowProc(hWnd,iMessage,wParam,lParam));

}

BOOL GetVersionEx(LPOSVERSIONINFO lpVersionInfo);

 

조사된 버전 정보를 OSVERSIONINFO(EX)라는 구조체에 리턴하라는 구조체 인데, 함수호출전에sizeof(OSVERSIONINFO)값을 대입해 두면 이전 구조체 멤버만 조사하고 EX구조체의 크기를 대입해 두면 확장된 구조체의 모든 정보를 조사하게 됩니다.

 

이 구조체의 많은 선언된 값중 dwPlatformId는 운영체제의 계열을 나타내는 값으로 다음 3가지 값을 같습니다. ( 더 증가 했을 수도 있어요)

 

VER_PLATFORM_WIN32S 윈도우 3.1에서 실행되는 Win32s

VER_PLATFORM_WIN32_WINDOWS 윈도우 95/98

VER_PLATFORM_WIN32_NT 윈도우 NT/2000


저작자 표시 비영리

'프로그래밍 > C/C++' 카테고리의 다른 글

Duplicate symbol warning시 확인해야 하는 부분  (0) 2010/04/01
시스템 정보 GetVersionEx  (0) 2009/08/14
시스템 정보 GetComputerName  (0) 2009/08/14
시스템 정보 GetSystemInfo  (0) 2009/08/14
메타파일 CreateEnhMetaFile  (0) 2009/08/14
입력문 MOUSE  (0) 2009/08/14
Write your message and submit

시스템 정보 GetComputerName

Posted 2009/08/14 15:40

#include <windows.h>

LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);                                          

HINSTANCE g_hInst;      

LPCTSTR IpszClass=TEXT("MessageBox");

 

int APIENTRY WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance, LPSTR IpszCmdParam,int nCmdShow)   

 

{                                                                                                                                                                                                                                                                        

 

           HWND hWnd;

           MSG Message;

 

           WNDCLASS WndClass;

           g_hInst=hInstance;

 

           WndClass.cbClsExtra=0;

           WndClass.cbWndExtra=0;

           WndClass.hbrBackground=(HBRUSH)GetStockObject(LTGRAY_BRUSH);

           WndClass.hCursor=LoadCursor(NULL,IDC_NO);

           WndClass.hIcon=LoadIcon(NULL,IDI_QUESTION);

           WndClass.hInstance=hInstance;

           WndClass.lpfnWndProc=WndProc;

           WndClass.lpszClassName=IpszClass;

           WndClass.lpszMenuName=NULL;

           WndClass.style=CS_HREDRAW|CS_VREDRAW;

           RegisterClass(&WndClass);

 

           hWnd=CreateWindow(IpszClass,TEXT("My First Program"),WS_OVERLAPPEDWINDOW,300,100,CW_USEDEFAULT,CW_USEDEFAULT,NULL,(HMENU)NULL,hInstance,NULL);

           ShowWindow(hWnd,nCmdShow);

 

                     while (GetMessage(&Message,NULL,0,0)){

                                TranslateMessage(&Message);

                     DispatchMessage(&Message);

 

           }

           return (int)Message.wParam;       

}

LRESULT CALLBACK WndProc(HWND hWnd,UINT iMessage,WPARAM wParam,LPARAM lParam)

{

           TCHAR szComName[255];

           TCHAR szUserName[255];

           TCHAR str[255];

           DWORD len;

           HDC hdc;

           PAINTSTRUCT ps;

 

           switch (iMessage){

                     case WM_PAINT:

                                hdc=BeginPaint(hWnd, &ps);

                                len=255;

                                GetComputerName(szComName,&len);

                                len=255;

                                GetUserName(szUserName,&len);

                                wsprintf(str,"컴퓨터 이름=%s, 사용자 이름=%s",szComName,szUserName);

                                TextOut(hdc,50,50,str,lstrlen(str));

                                EndPaint(hWnd,&ps);

                                return 0;

                     case WM_DESTROY:

                                PostQuitMessage(0);

                                return 0;

           }

           return(DefWindowProc(hWnd,iMessage,wParam,lParam));

}

 

 

VOID GetComputerName(LPTSTR lpBuffer, LPDWORD lpnSize);
int GetUserName(LPTSTR lpBuffer);


두함수 모두 이름을 리턴 받기 위한 버퍼의 주소를 첫번째 인수로 넘겨주고 두 번째 인수에서 이 버퍼의 길이를 담을 정수형 변수를 넘겨주는 방식

버퍼의 길이를 예제와 같이 255로 충분히 잡아줘서 원칙적으로 NULL값을 전달하여 필요한 길이를 조사후 메모리를 할당하는 2번 호출하는 번거로움을 줄이도록 하자

 

저작자 표시 비영리

'프로그래밍 > C/C++' 카테고리의 다른 글

Duplicate symbol warning시 확인해야 하는 부분  (0) 2010/04/01
시스템 정보 GetVersionEx  (0) 2009/08/14
시스템 정보 GetComputerName  (0) 2009/08/14
시스템 정보 GetSystemInfo  (0) 2009/08/14
메타파일 CreateEnhMetaFile  (0) 2009/08/14
입력문 MOUSE  (0) 2009/08/14
Write your message and submit

시스템 정보 GetSystemInfo

Posted 2009/08/14 15:39

#include <windows.h>

LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);                                          

HINSTANCE g_hInst;      

LPCTSTR IpszClass=TEXT("MessageBox");

 

int APIENTRY WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance, LPSTR IpszCmdParam,int nCmdShow)   

 

{                                                                                                                                                                                                                                                                        

 

           HWND hWnd;

           MSG Message;

 

           WNDCLASS WndClass;

           g_hInst=hInstance;

 

           WndClass.cbClsExtra=0;

           WndClass.cbWndExtra=0;

           WndClass.hbrBackground=(HBRUSH)GetStockObject(LTGRAY_BRUSH);

           WndClass.hCursor=LoadCursor(NULL,IDC_NO);

           WndClass.hIcon=LoadIcon(NULL,IDI_QUESTION);

           WndClass.hInstance=hInstance;

           WndClass.lpfnWndProc=WndProc;

           WndClass.lpszClassName=IpszClass;

           WndClass.lpszMenuName=NULL;

           WndClass.style=CS_HREDRAW|CS_VREDRAW;

           RegisterClass(&WndClass);

 

           hWnd=CreateWindow(IpszClass,TEXT("My First Program"),WS_OVERLAPPEDWINDOW,300,100,CW_USEDEFAULT,CW_USEDEFAULT,NULL,(HMENU)NULL,hInstance,NULL);

           ShowWindow(hWnd,nCmdShow);

 

                     while (GetMessage(&Message,NULL,0,0)){

                                TranslateMessage(&Message);

                     DispatchMessage(&Message);

 

           }

           return (int)Message.wParam;       

}

LRESULT CALLBACK WndProc(HWND hWnd,UINT iMessage,WPARAM wParam,LPARAM lParam)

{

           HDC hdc;

           PAINTSTRUCT ps;

           SYSTEM_INFO si;

           TCHAR str[128];

           TCHAR Arch[100], Level[100];

           TCHAR KeyType[100];

           static int arFunc[]={0,10,12,10,12,10,24,7,8,9,10,11,12};

 

           switch (iMessage) {

                     case WM_PAINT:

                                hdc=BeginPaint(hWnd, &ps);

                                GetSystemInfo(&si);

                                wsprintf(str, "프로세서의 개수는 %d개 입니다", si.dwNumberOfProcessors);

                                TextOut(hdc,10,10,str,lstrlen(str));

                                switch (si.wProcessorArchitecture) {

                     case PROCESSOR_ARCHITECTURE_INTEL:lstrcpy(Arch, "Intel");break;

                     case PROCESSOR_ARCHITECTURE_MIPS:lstrcpy(Arch, "MIPS");break;

                     case PROCESSOR_ARCHITECTURE_ALPHA:lstrcpy(Arch, "Alpha");break;

                     case PROCESSOR_ARCHITECTURE_PPC:lstrcpy(Arch, "Power PC");break;

                     case PROCESSOR_ARCHITECTURE_UNKNOWN:lstrcpy(Arch, "알수없음");break;

                                }

                                switch (si.wProcessorLevel){

                     case 3:lstrcpy(Level,"80386");break;

                     case 4:lstrcpy(Level,"80386");break;

                     case 5:lstrcpy(Level,"Pentium");break;

                     case 6:lstrcpy(Level,"Pentium Pro or Pentium II");break;

                     default:lstrcpy(Level,"기타");break;

                                }

                                wsprintf(str, "CPU 종류는 %s이며 레벨은 %s, 리비전은 %x입니다.", Arch, Level, si.wProcessorRevision);

                                TextOut(hdc,10,30,str,lstrlen(str));

 

                                switch (GetKeyboardType(0)) {

                     case 1:lstrcpy(KeyType,"IBM PC/XT or compatible(83 key)");break;

                     case 2:lstrcpy(KeyType,"Olivetti ICO(102 key)");break;

                     case 3:lstrcpy(KeyType,"IBM PC/AT (84 key)");break;

                     case 4:lstrcpy(KeyType,"IBM enhanced(101 or 102 key)");break;

                     case 5:lstrcpy(KeyType,"Nokia 1050");break;

                     case 6:lstrcpy(KeyType,"Nokia 9140");break;

                     case 7:lstrcpy(KeyType,"일본 키보드");break;

                     default:lstrcpy(KeyType,"기타 키보드");break;

                                }

                                wsprintf(str,"키보드 타입은 %s이며 서브 타입은 %d, 펑션키는 %d개입니다.",KeyType, GetKeyboardType(1), arFunc[GetKeyboardType(2)]);

                                TextOut(hdc,10,50,str,lstrlen(str));

                                EndPaint(hWnd,&ps);

                                return 0;

                     case WM_DESTROY:

                                PostQuitMessage(0);

                                return 0;

           }

           return(DefWindowProc(hWnd,iMessage,wParam,lParam));

}

 

VOID GetSystemInfo(LPSYSTEM_INFO lpSystemInfo);

이 함수는 시스템의 구성 정보를 조사하여 인수로 전달된 구조체에 채워 리턴하는 출력용 구조체 이다.

int GetKeyboardType(int nTypeFlag);

nTypeFlag에 0을 주면 키보드 종류를 1을 주면 서브타입을 2를 주면 펑션키의 개수를 조사함

저작자 표시 비영리

'프로그래밍 > C/C++' 카테고리의 다른 글

시스템 정보 GetVersionEx  (0) 2009/08/14
시스템 정보 GetComputerName  (0) 2009/08/14
시스템 정보 GetSystemInfo  (0) 2009/08/14
메타파일 CreateEnhMetaFile  (0) 2009/08/14
입력문 MOUSE  (0) 2009/08/14
입력문 WM_KEYDOWN  (0) 2009/08/14
Write your message and submit

메타파일 CreateEnhMetaFile

Posted 2009/08/14 15:38

LRESULT CALLBACK WndProc(HWND hWnd,UINT iMessage,WPARAM wParam,LPARAM IParam)

{

           HDC hdc;

           HDC hdcMeta;

           HENHMETAFILE hMFile;

           RECT rt;

           switch (iMessage){

                     case WM_LBUTTONDOWN:

                                hdc=GetDC(hWnd);

                                hdcMeta=CreateEnhMetaFile(hdc,"TestEnh.emf",NULL,"My Program\0Test Enh Meta File\0");

                                Ellipse(hdcMeta,10,10,100,100);

                                Rectangle(hdcMeta,5,105,105,120);

                                hMFile=CloseEnhMetaFile(hdcMeta);

                                DeleteEnhMetaFile(hMFile);

                                ReleaseDC(hWnd,hdc);

                                MessageBox(hWnd,"Meta File Created","Meta",MB_OK);

                                return 0;

                     case WM_RBUTTONDOWN:

                                hdc=GetDC(hWnd);

                                hMFile=GetEnhMetaFile("TestEnh.emf");

                                if(hMFile == NULL) {

                                          MessageBox(hWnd,"File Not Found","Meta",MB_OK);

                                }else{

                                          rt.left=LOWORD(lParam);

                                          rt.right=rt.left+100;

                                          rt.top=HIWORD(lParam);

                                          rt.bottom=rt.top+100;

                                          PlayEnhMetaFile(hdc,hMFile,&rt);

                                }

                                DeleteEnhMetaFile(hMFile);

                                ReleaseDC(hWnd,hdc);

                                return 0;

                     case WM_DESTROY:

                                PostQuitMessage(0);

                                return 0;

           }

                     return(DefWindowProc(hWnd,iMessage,wParam,IParam));

}


HDC CreateEnhMetaFile(HDC hdcRef, LPCTSTR lpFilename, CONST RECT *lpRect, LPCTSTR lpDescription);

hdcRef
메타 DC를 만들 때 참조하는 DC로 해상도와 사용 단위를 참고해 메타 DC를 만드는데 NULL로 지정하면 사용중인 디스플레이의 DC를 참조하게 된다

lpFileName
만들어질 메타 파일 이름

lpRect
메타 파일 크기지정 (0,01mm단위) NULL로 지정하면 GDI는 그림 전체를 포함한 크기를 계산하여 사용

lpDescription
메타파일에 설명을 문자열로 기입할수 있음, NULL지정가능

저작자 표시 비영리

'프로그래밍 > C/C++' 카테고리의 다른 글

시스템 정보 GetComputerName  (0) 2009/08/14
시스템 정보 GetSystemInfo  (0) 2009/08/14
메타파일 CreateEnhMetaFile  (0) 2009/08/14
입력문 MOUSE  (0) 2009/08/14
입력문 WM_KEYDOWN  (0) 2009/08/14
화면 재생성 InvalidateRect  (0) 2009/08/14
Write your message and submit

입력문 MOUSE

Posted 2009/08/14 15:36


#include <windows.h> //기본적인 데이터 타입, 함수 원형, 매크로 상수 등을 정의하며 그외 윈도우즈 프로그래밍에 필요한 보조 헤더 파일을 포함

 

LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM); //사용자와 시스템이 보내오는 메세지를 처리하는 아주 중요한 일을 하는 WInMain외 나머지 하나 시작점

                                                    //CALLBACK 메크로는 _stdcall로 정의됨

HINSTANCE g_hInst;    //HINSTANCE에 전역변수 g_hInst지정

LPCTSTR IpszClass=TEXT("MessageBox"); //IpszClass라는 전역 문자열 정의

 

int APIENTRY WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance, LPSTR IpszCmdParam,int nCmdShow)    

    //프로그램의 시작점인 엔트리 포인트(Entry Point)

    //hInstance 프로그램의 인스턴스 핸들

    //hPrevInstance 바로 앞에 실행된 현재 프로그램의 인스턴스 핸들

    //IpszCmdParam 명령행으로 입력된 프로그램 인수

    //nCmdShow 프로그램이 실행될 형태이며 최소화, 보통 모양

{                                                                                                    

 

    HWND hWnd;

    MSG Message; //어떤 종류의 메시지인가를 나타냄

    //tagMSG

    // hwnd : 메시지를 받을 윈도우 핸들

    // message : 어떤 종류의 메세지 인지 나타내는 값

    // wParam : 전달된 메시지에 대한 부가적인 정보를 가짐

    // IParam : 전달된 메시지에 대한 보가적 정보를 가짐

    // time : 메시지 발생 시간

    // pt : 메시지가 발생할시 마우스 위치

    WNDCLASS WndClass; // 클래스 종류 지정

    g_hInst=hInstance;

 

    WndClass.cbClsExtra=0; //예약 영역

    WndClass.cbWndExtra=0; //예약 영역+

    WndClass.hbrBackground=(HBRUSH)GetStockObject(LTGRAY_BRUSH); //배경 색상지정

    WndClass.hCursor=LoadCursor(NULL,IDC_NO); //사용할 마우스 커서 지정

    WndClass.hIcon=LoadIcon(NULL,IDI_QUESTION); //사용할 아이콘 지정

    WndClass.hInstance=hInstance; //등록하는 프로그램 번호 hInstance 값을 그대로 대임함

    WndClass.lpfnWndProc=WndProc; //윈도우의 메시지 처리 함수 지정

    WndClass.lpszClassName=IpszClass; //윈도우 클래스의 이름을 문자열로 지정, 여기서 지정한 이름 이 CreateWindow함수에 전달됨

    WndClass.lpszMenuName=NULL; //사용할 메뉴를 지정, 메뉴는 프로그램 코드에서 실행중에 만드는 것이 아니라 리소스 에디터에 의해 별도로 만들어짐

    WndClass.style=CS_HREDRAW|CS_VREDRAW; //윈도위우의 스타일 지정

    RegisterClass(&WndClass); //WNDCLASS 구조체의 번지를 전달

 

    hWnd=CreateWindow(IpszClass,TEXT("My First Program"),WS_OVERLAPPEDWINDOW,300,100,CW_USEDEFAULT,CW_USEDEFAULT,NULL,(HMENU)NULL,hInstance,NULL);

    ShowWindow(hWnd,nCmdShow);

    // IpszClassName 생성하고자 하는 윈도우의 클래스를 지정하는 문자열

    // IpszWindowsName 윈도우 타이틀바에 나타날 문자열

    // dwStyle 만들고자 하는 윈도우의 형태를 지정하는 인수

    // X, Y, nWidth, nHeight 윈도우의 크기와 위치를 지정하며 픽셀 단위를 사용함

    // hWndParent 부모 윈도우가 있을 경우 부모 윈도우의 핸들을 지정

    // hmenu 윈도우에서 사용할 메뉴의 핸들을 지정

    // hinst 프로그램의 핸들을 지정 WinMain의 인수로 전달된 hInstance를 대입

    // IpvParam CREATESTRUCT라는 구조체의 번지이며 여러개의 윈도우를 만들때 각 윈도우에 고유의 파라미터를 전달하는 특수한 목적에 사용

    // BOOL ShowWindow(hWnd, nCmdShow); hWnd 인수는 화면으로 출력하고자 하는 윈도우의 핸들이며 CreateWindow 함수가 리턴한 핸들을 그대로 넘기면됨,

    // nCmdShow는 윈도우를 화면에 출력하는 방법을 지정하며 다음 매크로를 상수들이 정의되어 있음

    // SW_HIDE 윈도움 숨김

    // SW_MINIMIZE 윈도우를 최소화

    // SW_RESTORE 윈도우를 활성화

    // SW_SHOW 윈도우를 활성화하여 보여줌

    // SW_SHOWNORMAL 윈도우를 활성화하여 보여줌

        while (GetMessage(&Message,NULL,0,0)){ //메시지 큐에서 메시지를 읽어들임, 메시지 큐는 시스템이나 사용자로 부터 발생하는 메시지가 임시 저장하는 영역

        TranslateMessage(&Message); //키보드의 입력 메세지를 가공하여 프로그램에서 쉽게 쓸 수 있도록 함

        DispatchMessage(&Message); //메시지 큐에서 꺼낸 메시지를 윈도우의 메시지 처리 함수로 전달

    // 메세지 루프

    }

    return (int)Message.wParam;    // 메세지 루프가 종료 될때 Message.wParam을 리턴하고 종료됨

}

 

LRESULT CALLBACK WndProc(HWND hWnd,UINT iMessage,WPARAM wParam,LPARAM IParam)

{

    HDC hdc;

    PAINTSTRUCT ps;

    static int x;

    static int y;

    static BOOL bNowDraw=FALSE;

    

    switch (iMessage){

        case WM_LBUTTONDOWN:    //좌측 버튼이 눌려졌을 때

            x=LOWORD(IParam);    // 마우스 x좌표의 위치 기억

            y=HIWORD(IParam);    // 마우스 y좌표의 위치 기억

            bNowDraw=TRUE;    //그리기가 됨

            return 0;

        case WM_MOUSEMOVE:    //마우스가 움직일 때

            if(bNowDraw==TRUE) {    //만약 그리는 중이면 아래 내용 실행

                hdc=GetDC(hWnd);    //DC 핸들을 발급 받음

                MoveToEx(hdc,x,y,NULL);    //LineTO 위치까지 선을 긋기위한 시작점

                x=LOWORD(IParam);    // 마우스 x좌표의 새위치 기억

                y=HIWORD(IParam);    // 마우스 y좌표의 새위치 기억

                LineTo(hdc,x,y);    //해당 좌표로 이동

                ReleaseDC(hWnd,hdc);

            }

            return 0;

        case WM_LBUTTONUP:    //좌측 버튼이 올라왔을 때

            bNowDraw=FALSE;    //그리기를 않함

            return 0;

        case WM_DESTROY:

            PostQuitMessage(0);

            return 0;

    }

        return(DefWindowProc(hWnd,iMessage,wParam,IParam)); //WndProc에서 처리하지 않은 나머지 메시지에 관한 처리

}

더블 클릭으로 마우스로 그린 그림을 지우기
*주의
더블클릭 이벤트를 미리 윈도우 스타일에 지정해 주어야 사용 가능하다.

#include <windows.h> //기본적인 데이터 타입, 함수 원형, 매크로 상수 등을 정의하며 그외 윈도우즈 프로그래밍에 필요한 보조 헤더 파일을 포함

 

LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM); //사용자와 시스템이 보내오는 메세지를 처리하는 아주 중요한 일을 하는 WInMain외 나머지 하나 시작점

                                                    //CALLBACK 메크로는 _stdcall로 정의됨

HINSTANCE g_hInst;    //HINSTANCE에 전역변수 g_hInst지정

LPCTSTR IpszClass=TEXT("MessageBox"); //IpszClass라는 전역 문자열 정의

 

int APIENTRY WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance, LPSTR IpszCmdParam,int nCmdShow)    

    //프로그램의 시작점인 엔트리 포인트(Entry Point)

    //hInstance 프로그램의 인스턴스 핸들

    //hPrevInstance 바로 앞에 실행된 현재 프로그램의 인스턴스 핸들

    //IpszCmdParam 명령행으로 입력된 프로그램 인수

    //nCmdShow 프로그램이 실행될 형태이며 최소화, 보통 모양

{                                                                                                    

 

    HWND hWnd;

    MSG Message; //어떤 종류의 메시지인가를 나타냄

    //tagMSG

    // hwnd : 메시지를 받을 윈도우 핸들

    // message : 어떤 종류의 메세지 인지 나타내는 값

    // wParam : 전달된 메시지에 대한 부가적인 정보를 가짐

    // IParam : 전달된 메시지에 대한 보가적 정보를 가짐

    // time : 메시지 발생 시간

    // pt : 메시지가 발생할시 마우스 위치

    WNDCLASS WndClass; // 클래스 종류 지정

    g_hInst=hInstance;

 

    WndClass.cbClsExtra=0; //예약 영역

    WndClass.cbWndExtra=0; //예약 영역+

    WndClass.hbrBackground=(HBRUSH)GetStockObject(LTGRAY_BRUSH); //배경 색상지정

    WndClass.hCursor=LoadCursor(NULL,IDC_NO); //사용할 마우스 커서 지정

    WndClass.hIcon=LoadIcon(NULL,IDI_QUESTION); //사용할 아이콘 지정

    WndClass.hInstance=hInstance; //등록하는 프로그램 번호 hInstance 값을 그대로 대임함

    WndClass.lpfnWndProc=WndProc; //윈도우의 메시지 처리 함수 지정

    WndClass.lpszClassName=IpszClass; //윈도우 클래스의 이름을 문자열로 지정, 여기서 지정한 이름 이 CreateWindow함수에 전달됨

    WndClass.lpszMenuName=NULL; //사용할 메뉴를 지정, 메뉴는 프로그램 코드에서 실행중에 만드는 것이 아니라 리소스 에디터에 의해 별도로 만들어짐

    WndClass.style=CS_HREDRAW|CS_VREDRAW|CS_DBLCLKS; //윈도우의 스타일 지정, 더블클릭 이벤트를 사용하겠다는 정의를 미리 해주어야 한다.

    RegisterClass(&WndClass); //WNDCLASS 구조체의 번지를 전달

 

    hWnd=CreateWindow(IpszClass,TEXT("My First Program"),WS_OVERLAPPEDWINDOW,300,100,CW_USEDEFAULT,CW_USEDEFAULT,NULL,(HMENU)NULL,hInstance,NULL);

    ShowWindow(hWnd,nCmdShow);

    // IpszClassName 생성하고자 하는 윈도우의 클래스를 지정하는 문자열

    // IpszWindowsName 윈도우 타이틀바에 나타날 문자열

    // dwStyle 만들고자 하는 윈도우의 형태를 지정하는 인수

    // X, Y, nWidth, nHeight 윈도우의 크기와 위치를 지정하며 픽셀 단위를 사용함

    // hWndParent 부모 윈도우가 있을 경우 부모 윈도우의 핸들을 지정

    // hmenu 윈도우에서 사용할 메뉴의 핸들을 지정

    // hinst 프로그램의 핸들을 지정 WinMain의 인수로 전달된 hInstance를 대입

    // IpvParam CREATESTRUCT라는 구조체의 번지이며 여러개의 윈도우를 만들때 각 윈도우에 고유의 파라미터를 전달하는 특수한 목적에 사용

    // BOOL ShowWindow(hWnd, nCmdShow); hWnd 인수는 화면으로 출력하고자 하는 윈도우의 핸들이며 CreateWindow 함수가 리턴한 핸들을 그대로 넘기면됨,

    // nCmdShow는 윈도우를 화면에 출력하는 방법을 지정하며 다음 매크로를 상수들이 정의되어 있음

    // SW_HIDE 윈도움 숨김

    // SW_MINIMIZE 윈도우를 최소화

    // SW_RESTORE 윈도우를 활성화

    // SW_SHOW 윈도우를 활성화하여 보여줌

    // SW_SHOWNORMAL 윈도우를 활성화하여 보여줌

        while (GetMessage(&Message,NULL,0,0)){ //메시지 큐에서 메시지를 읽어들임, 메시지 큐는 시스템이나 사용자로 부터 발생하는 메시지가 임시 저장하는 영역

        TranslateMessage(&Message); //키보드의 입력 메세지를 가공하여 프로그램에서 쉽게 쓸 수 있도록 함

        DispatchMessage(&Message); //메시지 큐에서 꺼낸 메시지를 윈도우의 메시지 처리 함수로 전달

    // 메세지 루프

    }

    return (int)Message.wParam;    // 메세지 루프가 종료 될때 Message.wParam을 리턴하고 종료됨

}

 

LRESULT CALLBACK WndProc(HWND hWnd,UINT iMessage,WPARAM wParam,LPARAM IParam)

{

    HDC hdc;

    PAINTSTRUCT ps;

    static int x;

    static int y;

    static BOOL bNowDraw=FALSE;

    

    switch (iMessage){

        case WM_LBUTTONDOWN:

            x=LOWORD(IParam);

            y=HIWORD(IParam);

            bNowDraw=TRUE;

            return 0;

        case WM_MOUSEMOVE:

            if(bNowDraw==TRUE) {

                hdc=GetDC(hWnd);

                MoveToEx(hdc,x,y,NULL);

                x=LOWORD(IParam);

                y=HIWORD(IParam);

                LineTo(hdc,x,y);

                ReleaseDC(hWnd,hdc);

            }

            return 0;

        case WM_LBUTTONUP:

            bNowDraw=FALSE;

            return 0;

        case WM_LBUTTONDBLCLK:    //더블 클릭 하였을 때

            InvalidateRect(hWnd, NULL, TRUE);    //작업영역을 무효화

            return 0;

        case WM_DESTROY:

            PostQuitMessage(0);

            return 0;

    }

        return(DefWindowProc(hWnd,iMessage,wParam,IParam)); //WndProc에서 처리하지 않은 나머지 메시지에 관한 처리

}

'프로그래밍 > C/C++' 카테고리의 다른 글

시스템 정보 GetSystemInfo  (0) 2009/08/14
메타파일 CreateEnhMetaFile  (0) 2009/08/14
입력문 MOUSE  (0) 2009/08/14
입력문 WM_KEYDOWN  (0) 2009/08/14
화면 재생성 InvalidateRect  (0) 2009/08/14
입력문 WM_CHAR  (0) 2009/08/14
Write your message and submit

입력문 WM_KEYDOWN

Posted 2009/08/14 15:35

#include <windows.h> //기본적인 데이터 타입, 함수 원형, 매크로 상수 등을 정의하며 그외 윈도우즈 프로그래밍에 필요한 보조 헤더 파일을 포함

 

LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM); //사용자와 시스템이 보내오는 메세지를 처리하는 아주 중요한 일을 하는 WInMain외 나머지 하나 시작점

                                                    //CALLBACK 메크로는 _stdcall로 정의됨

HINSTANCE g_hInst;    //HINSTANCE에 전역변수 g_hInst지정

LPCTSTR IpszClass=TEXT("MessageBox"); //IpszClass라는 전역 문자열 정의

 

int APIENTRY WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance, LPSTR IpszCmdParam,int nCmdShow)    

    //프로그램의 시작점인 엔트리 포인트(Entry Point)

    //hInstance 프로그램의 인스턴스 핸들

    //hPrevInstance 바로 앞에 실행된 현재 프로그램의 인스턴스 핸들

    //IpszCmdParam 명령행으로 입력된 프로그램 인수

    //nCmdShow 프로그램이 실행될 형태이며 최소화, 보통 모양

{                                                                                                    

 

    HWND hWnd;

    MSG Message; //어떤 종류의 메시지인가를 나타냄

    //tagMSG

    // hwnd : 메시지를 받을 윈도우 핸들

    // message : 어떤 종류의 메세지 인지 나타내는 값

    // wParam : 전달된 메시지에 대한 부가적인 정보를 가짐

    // IParam : 전달된 메시지에 대한 보가적 정보를 가짐

    // time : 메시지 발생 시간

    // pt : 메시지가 발생할시 마우스 위치

    WNDCLASS WndClass; // 클래스 종류 지정

    g_hInst=hInstance;

 

    WndClass.cbClsExtra=0; //예약 영역

    WndClass.cbWndExtra=0; //예약 영역+

    WndClass.hbrBackground=(HBRUSH)GetStockObject(LTGRAY_BRUSH); //배경 색상지정

    WndClass.hCursor=LoadCursor(NULL,IDC_NO); //사용할 마우스 커서 지정

    WndClass.hIcon=LoadIcon(NULL,IDI_QUESTION); //사용할 아이콘 지정

    WndClass.hInstance=hInstance; //등록하는 프로그램 번호 hInstance 값을 그대로 대임함

    WndClass.lpfnWndProc=WndProc; //윈도우의 메시지 처리 함수 지정

    WndClass.lpszClassName=IpszClass; //윈도우 클래스의 이름을 문자열로 지정, 여기서 지정한 이름 이 CreateWindow함수에 전달됨

    WndClass.lpszMenuName=NULL; //사용할 메뉴를 지정, 메뉴는 프로그램 코드에서 실행중에 만드는 것이 아니라 리소스 에디터에 의해 별도로 만들어짐

    WndClass.style=CS_HREDRAW|CS_VREDRAW; //윈도위우의 스타일 지정

    RegisterClass(&WndClass); //WNDCLASS 구조체의 번지를 전달

 

    hWnd=CreateWindow(IpszClass,TEXT("My First Program"),WS_OVERLAPPEDWINDOW,300,100,CW_USEDEFAULT,CW_USEDEFAULT,NULL,(HMENU)NULL,hInstance,NULL);

    ShowWindow(hWnd,nCmdShow);

    // IpszClassName 생성하고자 하는 윈도우의 클래스를 지정하는 문자열

    // IpszWindowsName 윈도우 타이틀바에 나타날 문자열

    // dwStyle 만들고자 하는 윈도우의 형태를 지정하는 인수

    // X, Y, nWidth, nHeight 윈도우의 크기와 위치를 지정하며 픽셀 단위를 사용함

    // hWndParent 부모 윈도우가 있을 경우 부모 윈도우의 핸들을 지정

    // hmenu 윈도우에서 사용할 메뉴의 핸들을 지정

    // hinst 프로그램의 핸들을 지정 WinMain의 인수로 전달된 hInstance를 대입

    // IpvParam CREATESTRUCT라는 구조체의 번지이며 여러개의 윈도우를 만들때 각 윈도우에 고유의 파라미터를 전달하는 특수한 목적에 사용

    // BOOL ShowWindow(hWnd, nCmdShow); hWnd 인수는 화면으로 출력하고자 하는 윈도우의 핸들이며 CreateWindow 함수가 리턴한 핸들을 그대로 넘기면됨,

    // nCmdShow는 윈도우를 화면에 출력하는 방법을 지정하며 다음 매크로를 상수들이 정의되어 있음

    // SW_HIDE 윈도움 숨김

    // SW_MINIMIZE 윈도우를 최소화

    // SW_RESTORE 윈도우를 활성화

    // SW_SHOW 윈도우를 활성화하여 보여줌

    // SW_SHOWNORMAL 윈도우를 활성화하여 보여줌

        while (GetMessage(&Message,NULL,0,0)){ //메시지 큐에서 메시지를 읽어들임, 메시지 큐는 시스템이나 사용자로 부터 발생하는 메시지가 임시 저장하는 영역

        TranslateMessage(&Message); //키보드의 입력 메세지를 가공하여 프로그램에서 쉽게 쓸 수 있도록 함

        DispatchMessage(&Message); //메시지 큐에서 꺼낸 메시지를 윈도우의 메시지 처리 함수로 전달

    // 메세지 루프

    }

    return (int)Message.wParam;    // 메세지 루프가 종료 될때 Message.wParam을 리턴하고 종료됨

}

 

LRESULT CALLBACK WndProc(HWND hWnd,UINT iMessage,WPARAM wParam,LPARAM IParam)

{

    HDC hdc;

    PAINTSTRUCT ps;

    static int x=100;

    static int y=100;

 

    switch (iMessage){

        case WM_KEYDOWN:

            switch (wParam){

        case VK_LEFT:    //왼쪽 커서 이동키에 대한 정의 누를 경우 지정한 x좌표만큼 더함

            x-=8;

            break;

        case VK_RIGHT:    //오른쪽 커서 이동키에 대한 정의 누를 경우 지정한 x좌표만큼 더함

            x+=8;

            break;

        case VK_UP:        //위쪽 커서 이동키에 대한 정의 누를 경우 지정한 y좌표만큼 더함

            y-=8;

            break;

        case VK_DOWN:    //아래쪽 커서키에 대한 정의 누를 경우 지정한 y좌표만큼 더함

            y+=8;

            break;

            }

        InvalidateRect(hWnd,NULL,FALSE); // 3번째 인수를FALSE로 입력하면 잔상이 남고, 잔상은 다른 프로그램에 지워진다.

            return 0;

        case WM_PAINT:

            hdc=BeginPaint(hWnd,&ps);

            TextOut(hdc,x,y,TEXT("A"),1);    //해당 변수의 위치에 A를 출력하고 좌표값 기억을 위해 x,y를 static 변수로 선언함

            EndPaint(hWnd,&ps);

            return 0;

        case WM_DESTROY:

            PostQuitMessage(0);

            return 0;

    }

    // 윈도우 프로시저

    // WinMain내의 메시지 루프는 메시지를 메시지 처러 함수로 보내기만 할뿐이며

    // WndProc은 메시지가 입력되면 운영체제의 의해 호출되어 메시지를 처리함

    // 이렇게 운영체제에 의해 호출되는응용프로그램 내의 함수를 콜백 함수라 함

    // WndProc의 인수는 모두 4개이며 MSG 구조체의 앞쪽 멤버 4개와 동일

    // hWnd는 메시지를 받을 윈도우의 핸들이며 iMessage는 어떤 종류의 메시지인지 변화에 관한 정보를 가짐

    // wParam, IParam은 iMessage의 메시지에 따른 부가적인 정보를 가짐

    return(DefWindowProc(hWnd,iMessage,wParam,IParam)); //WndProc에서 처리하지 않은 나머지 메시지에 관한 처리

}

'프로그래밍 > C/C++' 카테고리의 다른 글

메타파일 CreateEnhMetaFile  (0) 2009/08/14
입력문 MOUSE  (0) 2009/08/14
입력문 WM_KEYDOWN  (0) 2009/08/14
화면 재생성 InvalidateRect  (0) 2009/08/14
입력문 WM_CHAR  (0) 2009/08/14
출력문 MessageBox  (0) 2009/08/14
Write your message and submit

화면 재생성 InvalidateRect

Posted 2009/08/14 15:34

BOOL InvalidateRect(HWND hWnd, CONST RECT *lpRect, BOOL bErase);

윈도우가 다시 그려져야 할 필요가 있다 있는데, 이 말은 무효 영역(Invalid Region)이 있다는 뜻

예로 다른 프로그램에 가려졌을 때 그 부분이 무효화되었다고 하며 가렸던 프로그램이 이동하여 무효 영역이 다시 그려져야할 때 WM_PAINT에 메시지를 보내 다시 그리게 한다.

hWnd는 무효화의 대상이 되는 윈도우(다시그려져야 할 윈도우)

lpRect는 무효화할 사각 영역을 지정함, 값이 NULL이면 윈도우의 전 영역이 무효화됨

bErase는 무효화전 배경을 다시 그릴 것인지(TRUE), 배경을 지우지 않고 그릴것인지 지정,

저작자 표시 비영리

'프로그래밍 > C/C++' 카테고리의 다른 글

입력문 MOUSE  (0) 2009/08/14
입력문 WM_KEYDOWN  (0) 2009/08/14
화면 재생성 InvalidateRect  (0) 2009/08/14
입력문 WM_CHAR  (0) 2009/08/14
출력문 MessageBox  (0) 2009/08/14
출력문 도형  (0) 2009/08/14
Write your message and submit

입력문 WM_CHAR

Posted 2009/08/14 15:31

윈도우는 도스와 달리 여러 프로그램이 동시에 실행되기 때문에 Focus라는 것을 상태를 두어 관심을 받는 프로그램외의 프로그램은 대기하며 포커스를 갖은 프로그램만 WM_CHAR, WM_KEYDOWN를 보내 키보드 입력을 처리한다.


Focus를 가진 프로그램 한번에 하나만 존재함

 

소스

#include <windows.h> //기본적인 데이터 타입, 함수 원형, 매크로 상수 등을 정의하며 그외 윈도우즈 프로그래밍에 필요한 보조 헤더 파일을 포함

 

LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM); //사용자와 시스템이 보내오는 메세지를 처리하는 아주 중요한 일을 하는 WInMain외 나머지 하나 시작점

                                                    //CALLBACK 메크로는 _stdcall로 정의됨

HINSTANCE g_hInst;    //HINSTANCE에 전역변수 g_hInst지정

LPCTSTR IpszClass=TEXT("Key"); //IpszClass라는 전역 문자열 정의

 

int APIENTRY WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance, LPSTR IpszCmdParam,int nCmdShow)    

    //프로그램의 시작점인 엔트리 포인트(Entry Point)

    //hInstance 프로그램의 인스턴스 핸들

    //hPrevInstance 바로 앞에 실행된 현재 프로그램의 인스턴스 핸들

    //IpszCmdParam 명령행으로 입력된 프로그램 인수

    //nCmdShow 프로그램이 실행될 형태이며 최소화, 보통 모양

{                                                                                                    

 

    HWND hWnd;

    MSG Message; //어떤 종류의 메시지인가를 나타냄

    //tagMSG

    // hwnd : 메시지를 받을 윈도우 핸들

    // message : 어떤 종류의 메세지 인지 나타내는 값

    // wParam : 전달된 메시지에 대한 부가적인 정보를 가짐

    // IParam : 전달된 메시지에 대한 보가적 정보를 가짐

    // time : 메시지 발생 시간

    // pt : 메시지가 발생할시 마우스 위치

    WNDCLASS WndClass; // 클래스 종류 지정

    g_hInst=hInstance;

 

    WndClass.cbClsExtra=0; //예약 영역

    WndClass.cbWndExtra=0; //예약 영역+

    WndClass.hbrBackground=(HBRUSH)GetStockObject(LTGRAY_BRUSH); //배경 색상지정

    WndClass.hCursor=LoadCursor(NULL,IDC_NO); //사용할 마우스 커서 지정

    WndClass.hIcon=LoadIcon(NULL,IDI_QUESTION); //사용할 아이콘 지정

    WndClass.hInstance=hInstance; //등록하는 프로그램 번호 hInstance 값을 그대로 대임함

    WndClass.lpfnWndProc=WndProc; //윈도우의 메시지 처리 함수 지정

    WndClass.lpszClassName=IpszClass; //윈도우 클래스의 이름을 문자열로 지정, 여기서 지정한 이름 이 CreateWindow함수에 전달됨

    WndClass.lpszMenuName=NULL; //사용할 메뉴를 지정, 메뉴는 프로그램 코드에서 실행중에 만드는 것이 아니라 리소스 에디터에 의해 별도로 만들어짐

    WndClass.style=CS_HREDRAW|CS_VREDRAW; //윈도위우의 스타일 지정

    RegisterClass(&WndClass); //WNDCLASS 구조체의 번지를 전달

 

    hWnd=CreateWindow(IpszClass,TEXT("My First Program"),WS_OVERLAPPEDWINDOW,300,100,CW_USEDEFAULT,CW_USEDEFAULT,NULL,(HMENU)NULL,hInstance,NULL);

    ShowWindow(hWnd,nCmdShow);

    // IpszClassName 생성하고자 하는 윈도우의 클래스를 지정하는 문자열

    // IpszWindowsName 윈도우 타이틀바에 나타날 문자열

    // dwStyle 만들고자 하는 윈도우의 형태를 지정하는 인수

    // X, Y, nWidth, nHeight 윈도우의 크기와 위치를 지정하며 픽셀 단위를 사용함

    // hWndParent 부모 윈도우가 있을 경우 부모 윈도우의 핸들을 지정

    // hmenu 윈도우에서 사용할 메뉴의 핸들을 지정

    // hinst 프로그램의 핸들을 지정 WinMain의 인수로 전달된 hInstance를 대입

    // IpvParam CREATESTRUCT라는 구조체의 번지이며 여러개의 윈도우를 만들때 각 윈도우에 고유의 파라미터를 전달하는 특수한 목적에 사용

    // BOOL ShowWindow(hWnd, nCmdShow); hWnd 인수는 화면으로 출력하고자 하는 윈도우의 핸들이며 CreateWindow 함수가 리턴한 핸들을 그대로 넘기면됨,

    // nCmdShow는 윈도우를 화면에 출력하는 방법을 지정하며 다음 매크로를 상수들이 정의되어 있음

    // SW_HIDE 윈도움 숨김

    // SW_MINIMIZE 윈도우를 최소화

    // SW_RESTORE 윈도우를 활성화

    // SW_SHOW 윈도우를 활성화하여 보여줌

    // SW_SHOWNORMAL 윈도우를 활성화하여 보여줌

        while (GetMessage(&Message,NULL,0,0)){ //메시지 큐에서 메시지를 읽어들임, 메시지 큐는 시스템이나 사용자로 부터 발생하는 메시지가 임시 저장하는 영역

        TranslateMessage(&Message); //키보드의 입력 메세지를 가공하여 프로그램에서 쉽게 쓸 수 있도록 함

        DispatchMessage(&Message); //메시지 큐에서 꺼낸 메시지를 윈도우의 메시지 처리 함수로 전달

    // 메세지 루프

    }

    return (int)Message.wParam;    // 메세지 루프가 종료 될때 Message.wParam을 리턴하고 종료됨

}

LRESULT CALLBACK WndProc(HWND hWnd,UINT iMessage,WPARAM wParam,LPARAM lParam)

{

    HDC hdc;

    PAINTSTRUCT ps;

    static TCHAR str[256]; //메세지가 발생할때 마다 초기화 되기 때문에 static을 넣어 정적 변수로 선언

    int len;

 

    switch (iMessage){

        case WM_CHAR: //문자의 조립

            len=lstrlen(str);

            str[len]=(TCHAR)wParam; //입력된 문자의 코드를 wParam으로 전달

            str[len+1]=0; //wParam값 뒤에 0을 써 넣어 문자열 끝을 표시함

            InvalidateRect(hWnd,NULL,FALSE); //새로 문자열 입력이 될 때

WM_PAINT메세지 발생 하기위해 사용

            return 0;

        case WM_PAINT: //메시지를 실제 출력

            hdc=BeginPaint(hWnd,&ps);

            TextOut(hdc,100,100,str,lstrlen(str));

            EndPaint(hWnd,&ps);

            return 0;

        case WM_DESTROY:

            PostQuitMessage(0);

            return 0;

    }

    return(DefWindowProc(hWnd,iMessage,wParam,lParam));

}

'프로그래밍 > C/C++' 카테고리의 다른 글

입력문 WM_KEYDOWN  (0) 2009/08/14
화면 재생성 InvalidateRect  (0) 2009/08/14
입력문 WM_CHAR  (0) 2009/08/14
출력문 MessageBox  (0) 2009/08/14
출력문 도형  (0) 2009/08/14
출력문 DrawText  (0) 2009/08/14
Write your message and submit

출력문 MessageBox

Posted 2009/08/14 15:28
LRESULT CALLBACK WndProc(HWND hWnd,UINT iMessage,WPARAM wParam,LPARAM IParam)

{

           switch (iMessage){

                     case WM_LBUTTONDOWN: //마우스 왼쪽버튼누를시 처리함

                                MessageBox(hWnd, TEXT("마우스 왼쪽 버튼을 눌렀습니다"),TEXT("메세지 박스"),MB_OK);

 

                                // 마우스 왼쪽 버튼을 누를때 오너 윈도우 hWnd에 메세지 박스라는 타이틀의 박스안에

                                // "마우스 왼쪽 버튼을 눌렷습니다."라는 메세지를 보내주라는 명령

                                // 메세지 박스가 떠있는 동안은  오너 윈도우를 사용할 수 없다.

                                return 0; //WndProc은 메시지를 처리했을경우 반드시 0을 리턴해야함

                     case WM_DESTROY: //WM_DESTROY 처리, Alt+F4나 프로그램을 끝내려는 동작을 의미함

                                PostQuitMessage(0);

                                return 0;

           }

           // 윈도우 프로시저

           // WinMain내의 메시지 루프는 메시지를 메시지 처러 함수로 보내기만 할뿐이며

           // WndProc은 메시지가 입력되면 운영체제의 의해 호출되어 메시지를 처리함

           // 이렇게 운영체제에 의해 호출되는응용프로그램 내의 함수를 콜백 함수라 함

           // WndProc의 인수는 모두 4개이며 MSG 구조체의 앞쪽 멤버 4개와 동일

           // hWnd는 메시지를 받을 윈도우의 핸들이며 iMessage는 어떤 종류의 메시지인지 변화에 관한 정보를 가짐

           // wParam, IParam iMessage의 메시지에 따른 부가적인 정보를 가짐

           return(DefWindowProc(hWnd,iMessage,wParam,IParam)); //WndProc에서 처리하지 않은 나머지 메시지에 관한 처리

}

*MessageBox 추가 설명

Int MessageBox(HWND hWnd, LPCTSTR lpText, LPCTSTR lpCaption, UINT uType);

uType값에 따른 버튼의 의미

MB_ABORTRETRYIGNORE :Abort, Retry, Ignore 세 개의 버튼이 나타난다.

MB_OK : OK 버튼 하나만 나타난다.

MB_OKCANCEL : OK, Cancel 두 개의 버튼이 나타난다.

MB_RETRYCANCEL : Retry, Cancel 두 개의 버튼이 나타난다.

MB_YESNO : Yes,No 두 개의 버튼이 나타난다.

MB_YESNOCANCEL : Yes, No, Cancel 세 개의 버튼이 나타난다.

저작자 표시 비영리

'프로그래밍 > C/C++' 카테고리의 다른 글

화면 재생성 InvalidateRect  (0) 2009/08/14
입력문 WM_CHAR  (0) 2009/08/14
출력문 MessageBox  (0) 2009/08/14
출력문 도형  (0) 2009/08/14
출력문 DrawText  (0) 2009/08/14
파일 입출력문 CreateFile  (0) 2009/08/14
Write your message and submit

출력문 도형

Posted 2009/08/14 15:27

LRESULT CALLBACK WndProc(HWND hWnd,UINT iMessage,WPARAM wParam,LPARAM IParam)

{

           HDC hdc;

           // 글씨를 출력하기 위해 DC의 핸들을 hdc로 지정

           PAINTSTRUCT ps;

           // 출력된 문자열이 지워졌을 경우 다시 복원하기 위해 선언함

                      switch (iMessage){

                     case WM_DESTROY: //WM_DESTROY 액션 처리

                                PostQuitMessage(0);

                                // WM_DESTROY 발생시 PostQuitMessage 함수를 호출하여 WM_QUIT 메시지가 입력되면 메시지 루프

                                // GetMessage 함수 리턴값이 FALSE가 되어 while 루프를 빠져나오며 WinMain이 종료됨

                                return 0; //WndProc은 메시지를 처리했을경우 반드시 0을 리턴해야함

                     case WM_PAINT: // WM_PAINT 액션 처리

                                hdc=BeginPaint(hWnd,&ps);        // DC 핸들 시작

                                hdc=BeginPaint(hWnd,&ps);

                                SetPixel(hdc,10,10,RGB(255,0,0));     //선의 색상지정

                                MoveToEx(hdc,50,50,NULL);          //선 긋기의 시작점 (Line to와 함께 사용

                                LineTo(hdc,300,90);         // 선 긋기의 끝점

                                Rectangle(hdc,50,100,200,180);      // 사각형 그리기

                                Ellipse(hdc,220,100,400,200);         // 원그리기

                                EndPaint(hWnd,&ps);  //DC 핸들 종료

                                return 0;

           }

           // 윈도우 프로시저

           // WinMain내의 메시지 루프는 메시지를 메시지 처러 함수로 보내기만 할뿐이며

           // WndProc은 메시지가 입력되면 운영체제의 의해 호출되어 메시지를 처리함

           // 이렇게 운영체제에 의해 호출되는응용프로그램 내의 함수를 콜백 함수라 함

           // WndProc의 인수는 모두 4개이며 MSG 구조체의 앞쪽 멤버 4개와 동일

           // hWnd는 메시지를 받을 윈도우의 핸들이며 iMessage는 어떤 종류의 메시지인지 변화에 관한 정보를 가짐

           // wParam, IParam iMessage의 메시지에 따른 부가적인 정보를 가짐

           return(DefWindowProc(hWnd,iMessage,wParam,IParam)); //WndProc에서 처리하지 않은 나머지 메시지에 관한 처리

}


도형 문자열 출력

사용 함수

SetPixel(hdc,10,10,RGB(255,0,0));     //선의 색상지정

MoveToEx(hdc,50,50,NULL);          //선 긋기의 시작점 (Line to와 함께 사용

LineTo(hdc,300,90);         // 선 긋기의 끝점

Rectangle(hdc,50,100,200,180);      // 사각형 그리기

Ellipse(hdc,220,100,400,200);         // 원그리기

저작자 표시 비영리

'프로그래밍 > C/C++' 카테고리의 다른 글

입력문 WM_CHAR  (0) 2009/08/14
출력문 MessageBox  (0) 2009/08/14
출력문 도형  (0) 2009/08/14
출력문 DrawText  (0) 2009/08/14
파일 입출력문 CreateFile  (0) 2009/08/14
유니코드  (0) 2009/08/14
Write your message and submit

출력문 DrawText

Posted 2009/08/14 15:25

LRESULT CALLBACK WndProc(HWND hWnd,UINT iMessage,WPARAM wParam,LPARAM IParam)

{

           HDC hdc;

           // 글씨를 출력하기 위해 DC의 핸들을 hdc로 지정

           PAINTSTRUCT ps;

           // 출력된 문자열이 지워졌을 경우 다시 복원하기 위해 선언함

           RECT rt={100,100,400,300};           // RECT 영역지정 (left,top,right,bottom)

           TCHAR *str=TEXT("님은 갔습니다. 아아 사랑하는 나의 님은 갔습니다. 푸른 산빛을 깨치고 단풍나무 숲을 향하여 난 작은 길을 걸어서 차마 떨치고 갔습니다. 황금의 꽃같이 굳고 빛나던 옛 맹세는 차디찬 티끌이 되어 한숨의 미풍에 날아갔습니다.");  //출력 메시지 변수 선언 및 값 입력

           switch (iMessage){

                     case WM_DESTROY: //WM_DESTROY 액션 처리

                                PostQuitMessage(0);

                                // WM_DESTROY 발생시 PostQuitMessage 함수를 호출하여 WM_QUIT 메시지가 입력되면 메시지 루프

                                // GetMessage 함수 리턴값이 FALSE가 되어 while 루프를 빠져나오며 WinMain이 종료됨

                                return 0; //WndProc은 메시지를 처리했을경우 반드시 0을 리턴해야함

                     case WM_PAINT: // WM_PAINT 액션 처리

                                hdc=BeginPaint(hWnd,&ps);        // DC 핸들 시작

                                DrawText(hdc,str,-1,&rt,DT_CENTER|DT_WORDBREAK);          // *str 지정한 문자열을 DC의 핸들 hdc를 이용 DT_CENTER(가운데정렬),DT_WORDBREAK(오른쪽 끝에서 자동 개행됨)설정 적용후 출력

                                EndPaint(hWnd,&ps);  //DC 핸들 종료

                                return 0;

           }

           // 윈도우 프로시저

           // WinMain내의 메시지 루프는 메시지를 메시지 처러 함수로 보내기만 할뿐이며

           // WndProc은 메시지가 입력되면 운영체제의 의해 호출되어 메시지를 처리함

           // 이렇게 운영체제에 의해 호출되는응용프로그램 내의 함수를 콜백 함수라 함

           // WndProc의 인수는 모두 4개이며 MSG 구조체의 앞쪽 멤버 4개와 동일

           // hWnd는 메시지를 받을 윈도우의 핸들이며 iMessage는 어떤 종류의 메시지인지 변화에 관한 정보를 가짐

           // wParam, IParam iMessage의 메시지에 따른 부가적인 정보를 가짐

           return(DefWindowProc(hWnd,iMessage,wParam,IParam)); //WndProc에서 처리하지 않은 나머지 메시지에 관한 처리

}

 

 

 

 

 

여러줄 문자열 출력

사용 함수

DrawText : 여러줄 문자열 출력

예) DrawText(hdc,str,-1,&rt,DT_CENTER|DT_WORDBREAK);
RECT : 출력 영역 지정

예) RECT rt={100,100,400,300};

저작자 표시 비영리

'프로그래밍 > C/C++' 카테고리의 다른 글

출력문 MessageBox  (0) 2009/08/14
출력문 도형  (0) 2009/08/14
출력문 DrawText  (0) 2009/08/14
파일 입출력문 CreateFile  (0) 2009/08/14
유니코드  (0) 2009/08/14
비트 OR 연산자  (0) 2009/08/14
Write your message and submit

파일 입출력문 CreateFile

Posted 2009/08/14 15:24

TCHAR buf[1024];

LRESULT CALLBACK WndProc(HWND hWnd,UINT iMessage,WPARAM wParam,LPARAM lParam)

{

           HDC hdc;

           PAINTSTRUCT ps;

           HANDLE hFile;

           DWORD dwRead;

           RECT rt;

           switch (iMessage) {

                     case WM_LBUTTONDOWN:

                                hFile=CreateFile("C:\\test.txt",GENERIC_READ,0,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);

                                // CreateFile 함수는 7개의 인수를 가지는데

                                // lpFileName "test.txt"는 열거나 만들고자 하는 파일의 완전 경로를 문자열로 지정한다. UNC(\\....)사용가능

                                // dwDesiredAccess 액세스 타입을 지정한다. OR연산자를 통행 GENERIC_WRITE플래그를 연결할수 있다.

                                // dwShareMode 열린 파일의 공유 모드를 지정한다. 이 인수를 0으로 하면 공유하지 않음

                                // lpSecurityAttributes 리턴된 핸들을 차일드 프로세스로 상속할 것인지 지정 사용하지 않을경우 NULL로 지정

                                // dwCreationDisposition 만들고자 하는 파일이 이미 생성되었을 경우, 없을경우 어떻게 처리할지 정의 OPEN_ EXISTING은 이미 있는 파일을 열되 만약 파일이 없으면 에러 코드를 되돌린다.

                                // dwFlagsAndAttributes 파일의 속성과 여러가지 옵션을 지정 FILE_ATTRIBUTE_NORMAL 아무속성도 없는 보통 파일

                                // hTemplateFile 새로 만들고자 하는 파일의 추가 속성을 지원하는 템플릿의 핸들을 지정 NULL로 지정하는것이 보통

 

                                if (hFile!=INVALID_HANDLE_VALUE) {

                                          ReadFile(hFile,buf,1024,&dwRead,NULL);

// 파일을 읽어들이기 위해서는 5개의 인수를 취하는데 첫번째 쓰인 인수는 데이터를 읽을 대상 파일의 핸들

// 두번째 인수는 읽은 데이터를 저장할 버퍼, 세 번째 인수는 읽고자 하는 양

// 네번째 인수가 가리키는 DWORD형 변수에 대입됨,

// 다섯 번째 인순수는 비동기 입출력을 할때 사용하는데 비동기 입출력을 하지 않을때는 NULL로 표시

                                          CloseHandle(hFile);         // 파일 핸들도 메모리를 차지하고 또한 입출력을 위해 대량의 버퍼를 사용하므로 다 사용한 후에는 해제함

                                          InvalidateRect(hWnd,NULL,TRUE);

                                }

                                return 0;

                     case WM_PAINT: // 읽어드린 Test.txt를 화면에 출력

                                hdc=BeginPaint(hWnd,&ps);

                                GetClientRect(hWnd,&rt);

                                DrawText(hdc,buf,-1,&rt,DT_WORDBREAK);

                                EndPaint(hWnd,&ps);

                                return 0;

                     case WM_DESTROY:        // 프로그램 종료

                                PostQuitMessage(0);

                                return 0;

           }

           return(DefWindowProc(hWnd,iMessage,wParam,lParam));

}

저작자 표시 비영리

'프로그래밍 > C/C++' 카테고리의 다른 글

출력문 도형  (0) 2009/08/14
출력문 DrawText  (0) 2009/08/14
파일 입출력문 CreateFile  (0) 2009/08/14
유니코드  (0) 2009/08/14
비트 OR 연산자  (0) 2009/08/14
핸들 Handle  (0) 2009/08/14
Write your message and submit

유니코드

Posted 2009/08/14 15:23

유니코드는 16비트의 단일한 값으로 지구상의 모든 문자를 표현할 수 있는 문자 코드 체계이다. 유니코드의 등장 배경과 내부적인 구성 원리 등의 자세한 사항에 대해서는 다음에 따로 상세하게 다루되 여기서는 준비만 해 두자. 유니 코드를 지원하려면 문자형이나 문자열에 대해 C언어의 타입을 바로 쓰지 말고 유니코드 설정에 따라 변경되는 중간 타입을 사용한다. C언어에 익숙한 사람들은 앞으로 문자나 문자열을 표현할 때 다음 타읍들을 쓰도록하자

 

C 타입

유니코드 타입

char

TCHAR

char

LPSTR

const char*

LPCTSTR

TCHAR C의 기본 타입 중 하나인 char와 일단 같지만 유니코드로 컴파일할 때는 wchar_t타입이 된다. Wchar_t는 실제로는 unsigned short 로 정의 되어 있으며 부호없는 16비트 정수형이다. TCHAR타입의 실제 정의문은 다음과 같이 조건부 컴파일문으로 작성되어 있다.

 

#ifdef UNICODE

typedef wchar_t TCHAR;

#else

typedef char TCHAR;

#endif

char를 바로 쓴 소스는 유니코드로 바꿀 때 일일이 소스를 뜯어 고친 후 다시 컴파일해야 하지만 TCHAR라는 중간 타입을 사용한 소스는 프로젝트 설정에 따라 소스도 같이 바뀌는 효과가 있으므로 소스는 그대로 두고 컴파일만 다시 하면 된다. 문자열이 필요할 때도 char *를 쓰지 말고 가급적이면 LPSTR또는 TCHAR*를 쓰는 것이 현명하다.

 

C 표준 함수

유니코드 지원 함수

strlen

lstrlen

strcpy

lstrcpy

strcat

lstrcat

strcmp

lstrcmp

sprintf

wsprintf

Strlen char타입의 문자열 길이만 조사하지만 lstrlen TCHAR타입의 묹열에 대해서도 동작하므로 이식에 훨씬 더 유리하다. 문자열 상수도 타입이 있으므로 겹 따옴표안에 바로 문자열 상수를 쓰지 말고 TEXT 매크로로 둘러 싸는 것이 좋다.

TCHAR *str=”string”;       //이렇게 쓰지 말고

TCHAR *str=TEXT(“string”);          //TEXT 메크로 안에 문자열 상수를 쓴다.

TEXT 메크로는 유니코드 설정에 따라 문자열 상수의 타입을 변경한다. 유니코등로 컴파일할 때는 각 문자가 16비트의 유니코드 문자가 되며 그렇지 않을 때는 8비트의 안시 문자가 된다.

저작자 표시 비영리

'프로그래밍 > C/C++' 카테고리의 다른 글

출력문 DrawText  (0) 2009/08/14
파일 입출력문 CreateFile  (0) 2009/08/14
유니코드  (0) 2009/08/14
비트 OR 연산자  (0) 2009/08/14
핸들 Handle  (0) 2009/08/14
출력문 TextOut  (0) 2009/08/14
Write your message and submit

비트 OR 연산자

Posted 2009/08/14 15:21

전달 가능한 옵션이 여러 개 있을 경우 필요한 옵션수 만큼 인수를 전달 받는 것이 아니라 하나의 인수에 복수 개의 옵션을 묶어 전달하는데 이때 사용되는 연산자가 비트 OR연산자이다.

 

도스에서는 이런방식으로 옵션을 전달하는 경우가 fopen 등 극소수의 함수뿐이지만 윈도우에서윈 아주 빈번하다. 예를 든다면 CreateWindows 함수는 만들고자 하는 윈도우의 스타일을 인수로 전달 받는데 WS_CHILD, WS_CAPTION, WS_BORDER등 옵션이 수십 개나 되지만 단 하나의 인수로 이 옵션들을 모두 전달 받는다. 만약 각각의 스타일을 개별 인수로 전달받는다면 이 함수는 엄청난 수의 인수를 가져야 할 것이다.

 

뿐만 아니라 호출할 때는 CreateWindows(NULL,0,FALSE,0,0,0,….)처럼 관심없는 인수에도 일일이 값을 지정해야 하므로 불편하고 스타일의 순서를 정확하게 외우는 것도 보통일이 아니다. 비트 OR 연산자를 사용하면 관심없는 인수는 생략해 버릴 수 있고 OR 연산은 교환 법칙이 성립하므로 값의 순서에 무관하며 여러 가지 옵션을 묶어서 전달하므로 호출 속도도 빠르다

저작자 표시 비영리

'프로그래밍 > C/C++' 카테고리의 다른 글

파일 입출력문 CreateFile  (0) 2009/08/14
유니코드  (0) 2009/08/14
비트 OR 연산자  (0) 2009/08/14
핸들 Handle  (0) 2009/08/14
출력문 TextOut  (0) 2009/08/14
변수 와 데이터  (0) 2009/07/24
Write your message and submit