티스토리 뷰

Studying/API, MFC

[API] MemDC

hongkyu 2009. 1. 21. 12:59

#include <windows.h>

LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);
HINSTANCE g_hInst;
HWND hWndMain;
LPCTSTR lpszClass=TEXT("MemoryDC");

int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
                          LPSTR lpszCmdParam, int nCmdShow)
{
     HWND hWnd;
     MSG Message;
     WNDCLASS WndClass;
     g_hInst=hInstance;
    
     WndClass.cbClsExtra=0;
     WndClass.cbWndExtra=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;
     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);

     ShowWindow(hWnd,nCmdShow);

     hWndMain=hWnd;
    
     while(GetMessage(&Message,0,0,0)) {
          TranslateMessage(&Message);
          DispatchMessage(&Message);
     }
     return Message.wParam;
}

LRESULT CALLBACK WndProc(HWND hWnd,UINT iMessage,WPARAM wParam,LPARAM lParam)
{
     HDC hdc, MemDC;
     HBITMAP OldBitmap;    
     static HBITMAP NewBitmap;
     static POINT point;    
     static BOOL bnowDraw=FALSE;    
     PAINTSTRUCT ps;    

     switch(iMessage) {
     case WM_CREATE:         
          hdc=GetDC(hWnd);
          NewBitmap=CreateCompatibleBitmap(hdc,1024,768);
          MemDC=CreateCompatibleDC(hdc);
          OldBitmap=(HBITMAP)SelectObject(MemDC, NewBitmap);
          SelectObject(MemDC, GetStockObject(WHITE_PEN));
          Rectangle(MemDC, 0,0,1024,768);
          SelectObject(MemDC, OldBitmap);
          DeleteDC(MemDC);
          ReleaseDC(hWnd, hdc);    
          return 0;
     case WM_LBUTTONDOWN:
          point.x=LOWORD(lParam);
          point.y=HIWORD(lParam);
          bnowDraw=TRUE;
          return 0;
     case WM_MOUSEMOVE:
          if (bnowDraw==TRUE) {
               hdc=GetDC(hWnd);
               MemDC=CreateCompatibleDC(hdc);
               OldBitmap=(HBITMAP)SelectObject(MemDC, NewBitmap);
               MoveToEx(hdc,point.x,point.y,NULL);
               MoveToEx(MemDC,point.x,point.y,NULL);
               point.x=LOWORD(lParam);
               point.y=HIWORD(lParam);
               LineTo(hdc,point.x,point.y);
               LineTo(MemDC,point.x,point.y);
               SelectObject(MemDC, OldBitmap);
               DeleteDC(MemDC);
               ReleaseDC(hWnd,hdc);
               }
          return 0;
     case WM_LBUTTONUP:
          bnowDraw=FALSE;
          return 0;
     case WM_PAINT:
          hdc=BeginPaint(hWnd, &ps);
          MemDC=CreateCompatibleDC(hdc);
          OldBitmap=(HBITMAP)SelectObject(MemDC, NewBitmap);
          BitBlt(hdc,0,0,1024,768,MemDC,0,0,SRCCOPY);
          SelectObject(MemDC, OldBitmap);
          DeleteDC(MemDC);
          EndPaint(hWnd, &ps);
          return 0;
     case WM_RBUTTONDOWN:
     case WM_DESTROY:
          DeleteObject(NewBitmap);
          PostQuitMessage(0);
          return 0;    
     }
     return(DefWindowProc(hWnd,iMessage,wParam,lParam));
}

// Copyright @ H.K.
// Last Update : 2009-01-21

반응형
댓글
«   2024/05   »
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
최근에 올라온 글
글 보관함
Total
Today
Yesterday