본문 바로가기

전체 글

그리기 모드(코드) 반전모드를 사용하는 예제를 만들어 보자. 마우스가 이동하는 대로 선을 그리되 선이 그려지는 과정을 보여준다.즉 마우스 버튼을 누른 위치에서부터 시작해서 마우스 버튼을 놓는 자리까지 선을 긋되 버튼을 누른 채로 마우스를 움직이면 중간에 그려질 선의 모양을 보여주는 것이다. 코드는 다음과 같다. LRESULT CALLBACK WndProc(HWND hWnd, UINT iMessage, WPARAM wParam, LPARAM lParam) { HDC hdc; static bool bNowDraw = false; static int sx, sy, oldx, oldy; switch (iMessage) { case WM_LBUTTONDOWN: sx = LOWORD(lParam); sy = HIWORD(lParam).. 더보기
그리기 모드 그리기 모드란 도형이 그려질 때 원래 그려져 있던 그림과 새로 그려지는 그림과의 관계를 정의하는 것을 말한다.그리기 모드를 개념적으로 이해하기 위해 아주 단순한 흑백의 그래픽 환경을 가정해 보자.무엇인가를 화면에 그린다는 것은 비디오 메모리에 그림의 이미지를 기록해 넣는 동작을 말하며 이 때 원래 비디오 메모리에 있던값과 새로 써지는 값 사이의 관계를 생각해 볼 수 있다. 가장 단순하게는 새로 그려지는 값으로 원래 있던 값을 덮어 버리는 경우가 있으며 비트 논리 연산에 의해 두 값을 적당히 혼합하는 방법들도 있다.다음 그림은 두 개의 흑백 그림을 4가지 비트 연산으로 합쳐본 것이다.가로로 놓인 막대가 원래 그려져 있던 그림이며 세로로 놓여져 있는 막대가 새로 그려지는 그림이다.첫 번째 COPY는 새로 그.. 더보기
Old의 의미 우리는 지금까지 GDI 오브젝트를 사용할 때마다 항상 같은 타입의 Old 핸들을 선언하고 SelectObject로 선택할 때 밀려 나온 이전에 사용되었던 객체를 Old에 대입받아 두었다가 파괴하기 전에 Old를 다시 DC에 선택하였다.지금부터 이런 식의 코드가 왜 필요한지 연구해 보도록 하자. 아래의 코드는 마우스 왼쪽 버튼을 누를 때 굵기 2의 파란색 펜을 만들고 DC에 선택하여 사용하기를 1000번 반복하는 코드이다. case WM_LBUTTONDOWN: hdc = GetDC(hWnd); for(int i=0; i 더보기
브러쉬 만들기 브러쉬는 StockObject로 만들어 사용할 수 있지만, StockObject에는 단색 브러쉬 뿐임으로 이 외의 브러쉬는 직접 사용자가 만들어 사용해야만 한다. 브러쉬를 만드는 함수는 다음과 같다. HBRUSH CreateSolidBrush(COLORREF crColor);HBRUSH CreateHatchBrush(int fnStyle, COLORREF clrref); 첫 번째 함수는 단색의 브러쉬만을 만들 수 있으며, 브러시의 색상만 인수로 전달한다. 두 번째 함수는 브러쉬의 무늬와 색상을 지정할 수 있다. 지정할 수 있는 무늬의 종류는 다음과 같다. 두 함수 모두 리턴하는 값은 만들어진 브러쉬의 핸들이다. 코드----------------LRESULT CALLBACK WndProc(HWND hWnd.. 더보기
나만의 펜을 만들어 보자! 윈도우즈가 제공하는 펜은 흰색, 검정색, 투명색 세 가지 뿐이며, 파란색, 노란색 등의 원색 펜은 없다. 그러므로 다양한 색의 펜을 사용하고 싶다면 직접 만들어서 사용하는 방법밖에 없다. 펜을 만들 때는 다음 함수를 사용한다. HPEN CreatePen(int fnStyle, int nWidth, COLORREF crColor); 세 개의 인수를 가지며 각 인수의 의미는 다음과 같다. fnStyle 그려질 선의 모양을 지정한다. 이 값을 변경하면 다양한 형태의 선을 만들 수 있다. PS_SOLID는 실선, PS_DASH는 긴 점선, PS_DOT은 점선, PS_DASHDOT은 일점 쇄선, PS_DASHDOTDOT은 이점 쇄선이다.하지만 선의 굵기가 2 이상이면 무조건 실선으로 그려짐으로, 위의 모양을 사용.. 더보기
StockObject를사용한 GDI브러쉬 색 변경 틀린 정보가 다소 있을 수 있습니다! 만약 틀린 내용이 있을 시 댓글로 피드백 주시면 감사할 듯싶습니다! 일단 dc를 얻어온 후, Rectangle을 사용해 사각형을 출력한다.LRESULT CALLBACK WndProc(HWND hWnd, UINT iMessage, WPARAM wParam, LPARAM lParam){ HDC hdc; PAINTSTRUCT ps; switch(iMessage){ case WM_PAINT: hdc = BeginPaint(hWnd, &ps); Rectangle(hdc, 50, 50, 300, 300); EndPaint(hWnd, &ps); return 0; case WM_DESTROY: PostQuitMessage(0); return 0; } return (DefWindow.. 더보기
GDI? GDI (Graphic Device Interface)는 화면 프린터 등의 모든 출력장치를 제어하는 윈도우즈의 핵심 모듈 중 하나이다.윈도우즈의 모든 출력은 GDI를 거쳐 화면과 프린터로 나가게 되어있다.GDI오브젝트란 그래픽 출력에 사용되는 도구를 말하며, 펜, 브러쉬, 폰트 등등 이 모두 GDI오브젝트에 속한다.GDI오브젝트를 모아 놓은 것이 DC이며, GDI는 현재 DC에 선택되어있는 GDI오브젝트를 사용한다. GDI오브젝트는 GDI가 그래픽 출력을 위해 사용하는 도구일 뿐만 아니라, 사용자가 GDI의 출력을 조정할 수 있는 도구이기도 하다. 더보기
LoadString 윈도우즈에서는 문자열들도 리소스의 일종으로 취급되는데, 대량의 문자열을 사용하는 프로그램은 리소스에 문자열을 정의해 놓고 필요할 때마다 리소스의 문자열을 읽어와 사용한다. 그럴때 LoadString함수를 사용한다. int LoadString(HINSTANCE hInstance,UINt uID,LPTSTR lpBuffer,int nBufferMax); 첫 번째 인수는 문자열 리소스를 가진 인스턴스 핸들인데,g_hInst = hInstance 라는 구문이 왜 존재하는지 알려준다. 두 번째 인수는 읽어올 문자열의 ID를 전달하는 역할을 한다.세 번째 인수는 전달받은 문자열의 ID에서 문자열을 읽을 버퍼를 지정한다.네 번째 인수는 버퍼의 길이인데, 버퍼의 길이가 필요한 이유는 생략하겠다. LoadString(g.. 더보기