ƼÁ¬ Ãß°¡

MoveCursor

SoEnty07 ÇÁ·ÎÁ§Æ®´Â ƼÁ¬À» ´ë·®À¸·Î ´Ã¸°´Ù. °³º° ƼÁ¬ ÀÛ¼º ¹æ¹ýµµ ÇϳªÀÇ ½Ç½À ÁÖÁ¦ÀÌÁö¸¸ SoEntyÀÇ ±¸Á¶¿Í´Â Å« »ó°üÀÌ ¾ø´Ù. »ó¼¼ÇÑ ¼³¸íº¸´Ù´Â ÀÛ¾÷ ±â·Ï Á¤µµ¸¸ ³²±â°í ÇÙ½É ºÎºÐ¿¡ ´ëÇؼ­¸¸ °£·«ÇÏ°Ô ¼³¸íÇϱâ·Î ÇÑ´Ù.

MoveCursor´Â ÀÏÁ¤ ½Ã°£µ¿¾È Ä¿¼­°¡ ¿òÁ÷ÀÌÁö ¾ÊÀ¸¸é ÇÑÄ­ ¿À¸¥ÂÊÀ¸·Î ¿òÁ÷¿© Áִ ƼÁ¬ÀÌ´Ù. ÀÌ·±°Ô ¿Ö ÇÊ¿äÇÑ°¡ ½Í°ÚÁö¸¸ º¸¾ÈÀÌ ¾ö°ÝÇÑ È¸»ç¿¡¼­´Â È­¸é º¸È£±â¸¦ °­Á¦ ¼³Á¤ÇÏ¿© ¾÷¹«¿¡ ¹æÇØ°¡ µÇ±âµµ ÇÑ´Ù. ¶Ç ÀçÅà ±Ù¹«½Ã Àá½Ã ÀÚ¸®¸¦ ºñ¿ï ¶§ Ç×»ó ¿Â¶óÀÎ »óŸ¦ À¯ÁöÇØ ÁÖ°í ¹é±×¶ó¿îµå ÀÛ¾÷½Ã ÄÄÇ»Å͸¦ °è¼Ó Ç®½ºÇǵå·Î µ¹¸± ¼ö ÀÖ¾î ¿©·¯ °¡Áö ¿ëµµ°¡ ÀÖ´Ù.

 

class CMoveCursor : public CTidget

{

public:

        HBITMAP bitOn, bitOff;

        bool bCursorMove;                           // Ä¿¼­ °­Á¦ À̵¿ ¿©ºÎ

        int TimerInterval;                               // ŸÀÌ¸Ó ÁÖ±â

        int CursorInterval;                             // Ä¿¼­ °­Á¦ À̵¿ ÁÖ±â(ÃÊ´ÜÀ§)

        int CursorKeepSec;                            // Ä¿¼­°¡ ¿òÁ÷ÀÌÁö ¾Ê°í Á¦ ÀÚ¸®¿¡ ÀÖ¾ú´ø ½Ã°£

        int RejectCount;                     // Ä¿¼­ À̵¿ ȸ¼ö(½ºÅ©¸° ¼¼À̹ö ¹æÁö ȸ¼ö)

        POINT OldCursorPt;                           // ÀÌÀü Ä¿¼­ À§Ä¡

 

        LRESULT OnCreate(WPARAM wParam, LPARAM lParam);

        LRESULT OnDestroy(WPARAM wParam, LPARAM lParam);

        void OnDraw(HDC hdc, int width, int height);

        void OnClick();

        LRESULT OnTimer(WPARAM wParam, LPARAM lParam);

        LRESULT OnContextMenu(WPARAM wParam, LPARAM lParam);

 

        void LoadSetting();

        void SaveSetting();

        static INT_PTR CALLBACK MoveCursorDlgProc(HWND hDlg,

                   UINT iMessage, WPARAM wParam, LPARAM lParam);

};

 

¿É¼ÇÀÌ ¾à°£ ¸¹´Ù. µÎ °³ÀÇ ºñÆ®¸ÊÀ¸·Î »óŸ¦ º¸¿© ÁÖ¸ç ŸÀÌ¸Ó µ¹¸®¸ç Ä¿¼­ À̵¿½ÃÅ°°í Æ˾÷â ¿­¾î ¿É¼ÇÀ» Á¶Á¤ÇÏ´Â ÀϹÝÀûÀÎ ±¸¼ºÀÌ´Ù.

 

LRESULT CMoveCursor::OnCreate(WPARAM wParam, LPARAM lParam) {

        bitOn = LoadBitmap(g_hInst, MAKEINTRESOURCE(IDB_MOVECURSORON));

        bitOff = LoadBitmap(g_hInst, MAKEINTRESOURCE(IDB_MOVECURSOROFF));

 

        LoadSetting();

        RejectCount = 0;

        if (bCursorMove) {

                   SetTimer(win_hWnd, 1, TimerInterval, NULL);

        }

        return 0;

}

 

LRESULT CMoveCursor::OnDestroy(WPARAM wParam, LPARAM lParam) {

        setting.set(dget_id, L"moveCursor", bCursorMove);

        DeleteObject(bitOn);

        DeleteObject(bitOff);

        KillTimer(win_hWnd, 1);

        return 0;

}

 

void CMoveCursor::OnDraw(HDC hdc, int width, int height)

{

        int wh = trayWindow.tidgetSize;

        if (bCursorMove) {

                   StretchBitmap(hdc, 0, 0, wh, wh, bitOn);

        } else {

                   StretchBitmap(hdc, 0, 0, wh, wh, bitOff);

        }

}

 

void CMoveCursor::OnClick()

{

        bCursorMove = !bCursorMove;

        if (bCursorMove) {

                   KillTimer(win_hWnd, 1);

        } else {

                   SetTimer(win_hWnd, 1, TimerInterval, NULL);

        }

        SaveSetting();

        InvalidateRect(win_hWnd, NULL, FALSE);

}

 

LRESULT CMoveCursor::OnTimer(WPARAM wParam, LPARAM lParam)

{

        POINT pt;

 

        GetCursorPos(&pt);

        // °°Àº ÀÚ¸®¿¡ ÀÖ´Â ´©Àû ½Ã°£ °»½Å

        if (pt.x == OldCursorPt.x && pt.y == OldCursorPt.y) {

                   CursorKeepSec += TimerInterval / 1000;

                   // ½ºÅ©¸° ¼¼À̹ö°¡ ¶ã ½Ã°£ÀÌ µÇ¸é °­Á¦·Î Ä¿¼­ ÇÑÄ­ ¿À¸¥ÂÊÀ¸·Î ¿Å±è

                   if (CursorKeepSec >= CursorInterval) {

                              CursorKeepSec = 0;

                              mouse_event(MOUSEEVENTF_MOVE, 1, 0, 0, 0);

                              RejectCount++;

                   }

                   // À§Ä¡°¡ ¹Ù²î¸é ´©Àû ½Ã°£ ¸®¼Â

        } else {

                   CursorKeepSec = 0;

                   OldCursorPt = pt;

        }

        return 0;

}

 

LRESULT CMoveCursor::OnContextMenu(WPARAM wParam, LPARAM lParam)

{

        if (!IsWindow(hOptionPopup)) {

                   hOptionPopup = CreateDialogParam(g_hInst, MAKEINTRESOURCE(IDD_MOVECURSOR),

                              win_hWnd, MoveCursorDlgProc, (LPARAM)this);

                   ShowWindow(hOptionPopup, SW_SHOW);

        }

        return 0;

}

 

INT_PTR CALLBACK CMoveCursor::MoveCursorDlgProc(HWND hDlg, UINT iMessage, WPARAM wParam, LPARAM lParam)

{

        static CMoveCursor* pTidget;

        TCHAR str[128];

        RECT wrt;

 

        switch (iMessage) {

        case WM_INITDIALOG:

                   pTidget = (CMoveCursor*)lParam;

                   GetWindowRect(trayWindow.win_hWnd, &wrt);

                   MovePopupToSide(hDlg, wrt.left, wrt.top);

 

                   // ¹üÀ§¸¦ ¹Ý´ë·Î Áà¾ß À§°¡ Áõ°¡, ¾Æ·¡°¡ °¨¼ÒÀÌ´Ù.

                   SendDlgItemMessage(hDlg, IDC_SPINMOVECURSORCYCLE, UDM_SETRANGE, 0, MAKELPARAM(600, 60));

 

                   wsprintf(str, L"À̵¿ Ƚ¼ö : %d¹ø", pTidget->RejectCount);

                   SetDlgItemText(hDlg, IDC_STMOVECURSORCOUNT, str);

                   if (pTidget->bCursorMove) {

                              CheckDlgButton(hDlg, IDC_CHKMOVECURSOR, BST_CHECKED);

                   }

                   SetDlgItemInt(hDlg, IDC_EDMOVECURSORCYCLE, pTidget->CursorInterval, FALSE);

                   return TRUE;

        case WM_NCACTIVATE:

                   if (wParam == FALSE && hOptionPopup != NULL) {

                              pTidget->CursorInterval = GetDlgItemInt(hDlg, IDC_EDMOVECURSORCYCLE, NULL, FALSE);

                              pTidget->TimerInterval = pTidget->CursorInterval * 100;

                              if (IsDlgButtonChecked(hDlg, IDC_CHKMOVECURSOR) == BST_CHECKED) {

                                        pTidget->bCursorMove = true;

                                        SetTimer(pTidget->win_hWnd, 1, pTidget->TimerInterval, NULL);

                              } else {

                                        pTidget->bCursorMove = false;

                                        KillTimer(pTidget->win_hWnd, 1);

                              }

 

                              pTidget->SaveSetting();

 

                              hOptionPopup = NULL;

                              DestroyWindow(hDlg);

                   }

                   return TRUE;

        case WM_COMMAND:

                   switch (LOWORD(wParam)) {

                   case IDCANCEL:

                              hOptionPopup = NULL;

                              DestroyWindow(hDlg);

                              return TRUE;

                   }

                   break;

        }

        return FALSE;

}

 

void CMoveCursor::LoadSetting()

{

        bCursorMove = setting.get(dget_id, L"moveCursor", 0);

        CursorInterval = setting.get(dget_id, L"CursorInterval", 180);

        // ŸÀ̸Ӵ À̵¿ÁÖ±âÀÇ 1/10À¸·Î ÀÚµ¿ ¼³Á¤ÇÑ´Ù. 180Ãʸé 18ÃÊ¿¡ Çѹø¾¿ È®ÀÎÇϸé ÃæºÐÇÏ´Ù.

        // ÃÖÃÊ ¿É¼ÇÀ¸·Î ¸¸µé¾ú´Âµ¥ »ç¿ëÀÚ°¡ ÀÌ·± ³»ºÎÀûÀÎ °ª±îÁö ¼±ÅÃÇÒ ÇÊ¿ä´Â ¾ø´Ù.

        TimerInterval = CursorInterval * 100;

        CursorKeepSec = 0;

}

 

void CMoveCursor::SaveSetting()

{

        setting.set(dget_id, L"bCursorMove", bCursorMove);

        setting.set(dget_id, L"CursorInterval", CursorInterval);

}

 

º¸Åë È­¸é º¸È£±â¸¦ 5ºÐÀ¸·Î ¼³Á¤ÇϹǷΠµðÆúÆ® ÁÖ±â´Â 3ºÐÀ¸·Î ¼³Á¤Çß´Ù. ÀÌ Æ¼Á¬ÀÌ ÄÑÁ® ÀÖÀ¸¸é 3ºÐ ³»·Î À̵¿ÀÌ ¾øÀ» ¶§ Ä¿¼­¸¦ ÇÑÄ­ ¿À¸¥ÂÊÀ¸·Î ¿Å°Ü ÁØ´Ù. ±×·¸´Ù°í ¸Å 3ºÐ¸¶´Ù ¿Å±â´Â °ÍÀº ¾Æ´Ï°í 3ºÐ µ¿¾È Ä¿¼­°¡ Á¦ÀÚ¸®¿¡ ÀÖÀ» ¶§¸¸ µ¿ÀÛÇÑ´Ù. »ç¿ëÀÚ°¡ Ä¿¼­¸¦ ±îµü°Å¸®°í ÀÖ´Ù¸é ±»ÀÌ ¿Å°ÜÁÙ ÇÊ¿ä ¾ø´Ù.

SizeMeter

ÀÌ À§Á¬Àº À©µµ¿ì Å©±â¸¦ ÃøÁ¤ÇÏ´Â °£´ÜÇÑ À§Á¬ÀÌ´Ù. 4K ¸ð´ÏÅ͸¦ ¾²´Ù°¡ QHD·Î ´Ù¿î±×·¹À̵åÇÏ¸é ¾ó¸¶³ª Á¼¾ÆÁö³ª º¸°í ½ÍÀ» ¶§, 1024 * 768 Å©±âÀÇ À̹ÌÁö Å©±â°¡ ³» ¸ð´ÏÅͻ󿡼­ ¾ó¸¶¸¸ÇÑ Å©±âÀÎÁö È®ÀÎÇØ º¸°í ½ÍÀ» ¶§ »ç¿ëÇÑ´Ù.

 

class CSizeMeter : public CTidget

{

public:

        HBITMAP icon;

 

        LRESULT OnCreate(WPARAM wParam, LPARAM lParam);

        LRESULT OnDestroy(WPARAM wParam, LPARAM lParam);

        void OnDraw(HDC hdc, int width, int height);

        void OnClick();

};

 

class CSizeMeterWin : public CWindow

{

public:

        void Create(HWND hParent);

        LRESULT OnSize(WPARAM wParam, LPARAM lParam);

        void OnDraw(HDC hdc, int width, int height);

        LRESULT OnKeyDown(WPARAM wParam, LPARAM lParam);

};

 

ƼÁ¬°ú ƼÁ¬ÀÌ ¶ç¿ì´Â À©µµ¿ì·Î ±¸¼ºµÈ´Ù.

 

LRESULT CSizeMeter::OnCreate(WPARAM wParam, LPARAM lParam) {

        icon = LoadBitmap(g_hInst, MAKEINTRESOURCE(IDB_SIZEMETER));

        return 0;

}

 

LRESULT CSizeMeter::OnDestroy(WPARAM wParam, LPARAM lParam) {

        DeleteObject(icon);

        return 0;

}

 

void CSizeMeter::OnDraw(HDC hdc, int width, int height) {

        int wh = trayWindow.tidgetSize;

        StretchBitmap(hdc, 0, 0, wh, wh, icon);

}

 

void CSizeMeter::OnClick() {

        CSizeMeterWin* pWin = new CSizeMeterWin();

        pWin->Create(NULL);

}

 

void CSizeMeterWin::Create(HWND hParent)

{

        CreateWindow(L"CWindow", L"SizeMeter", WS_OVERLAPPEDWINDOW | WS_VISIBLE,

                   CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,

                   NULL, (HMENU)NULL, g_hInst, this);

}

 

LRESULT CSizeMeterWin::OnSize(WPARAM wParam, LPARAM lParam)

{

        CWindow::OnSize(wParam, lParam);

 

        InvalidateRect(win_hWnd, NULL, TRUE);

        return 0;

}

 

void CSizeMeterWin::OnDraw(HDC hdc, int width, int height)

{

        TCHAR str[111];

 

        SetBkMode(hdc, TRANSPARENT);

        SetTextAlign(hdc, TA_CENTER);

        wsprintf(str, TEXT("%d x %d"), width, height);

        TextOutSz(hdc, width / 2, height / 2, str);

        lstrcpy(str, TEXT("1 ~ 9 : Ç¥ÁØ Å©±â"));

        TextOutSz(hdc, width / 2, height / 2 + 30, str);

}

 

LRESULT CSizeMeterWin::OnKeyDown(WPARAM wParam, LPARAM lParam)

{

        RECT crt;

        int w, h;

 

        w = 0;

        switch (wParam) {

        case '1':

                   w = 320; h = 240; break;

        case '2':

                   w = 640; h = 480; break;

        case '3':

                   w = 800; h = 600; break;

        case '4':

                   w = 1024; h = 768; break;

        case '5':

                   w = 1280; h = 1024; break;

        case '6':

                   w = 1600; h = 1200; break;

        case '7':

                   w = 1920; h = 1080; break;

        case '8':

                   w = 2560; h = 1440; break;

        case '9':

                   w = 3840; h = 2160; break;

        }

        if (w != 0)

        {

                   SetRect(&crt, 0, 0, w, h);

                   DWORD Style = GetWindowLong(win_hWnd, GWL_STYLE);

                   DWORD ExStyle = GetWindowLong(win_hWnd, GWL_EXSTYLE);

 

                   AdjustWindowRectEx(&crt, Style, GetMenu(win_hWnd) != NULL, ExStyle);

                   SetWindowPos(win_hWnd, NULL, 0, 0, crt.right - crt.left, crt.bottom - crt.top,

                              SWP_NOMOVE | SWP_NOZORDER);

        }

        return 0;

}

 

È­¸é¿¡ ÇöÀç Å©±â¸¦ º¸¿© ÁÖ°í Å° ÀÔ·ÂÀ» ÅëÇØ 1024 * 768 µîÀÇ Çػ󵵷Πºü¸£°Ô Å©±â¸¦ Á¶Á¤ÇÑ´Ù. Å©±â´Â À©µµ¿ì ±âÁØÀÌ ¾Æ´Ï¶ó ÀÛ¾÷ ¿µ¿ª ±âÁØÀÌ´Ù. ÀÌ Æ¼Á¬Àº Àü¿¡ Àá½Ã ¸¸µé¾î µÎ¾ú´ø °ÍÀ» °¡Á®¿Í Æ÷ÇÔ½ÃŲ °ÍÀε¥ °³¼±ÀÇ ¿©Áö°¡ ¸¹´Ù. ¸ð´ÏÅÍ Çػ󵵸¦ Á¶»çÇÏ¿© ½ÇÁ¦ Å©±âÀÇ ÀÚ¸¦ º¸¿©ÁÖ¸é ±×°Íµµ ½Ç¿ëÀûÀÏ °Í °°´Ù. Áö±ÝÀº ¾çÀ» ´Ã¸®´Âµ¥ ±Þ±ÞÇØ ÀÏ´Ü Æ÷ÇÔ¸¸ ½ÃÄÑ µÎ¾ú´Ù.

Tetris

Àß ¾Æ´Â Å×Æ®¸®½º °ÔÀÓÀÌ´Ù. ¾÷¹«Áß¿¡ ½É½ÉÇÒ ¶§ Ç϶ó°í ³Ö¾î ºÃ´Ù.

 

class CTetris : public CTidget

{

public:

        HBITMAP icon;

 

        LRESULT OnCreate(WPARAM wParam, LPARAM lParam);

        LRESULT OnDestroy(WPARAM wParam, LPARAM lParam);

        void OnDraw(HDC hdc, int width, int height);

        void OnClick();

};

 

class CTetrisWin : public CWindow

{

public:

        enum { EMPTY, BRICK, WALL = 7/*sizeof(Shape) / sizeof(Shape[0]) + 1*/ };

        int ts;

        int bw;

        int bh;

        int board[1000][1000];

        int nx, ny;

        int brick, rot;

        int nbrick;

        int score;

        int bricknum;

        int Interval;

        enum Status { GAMEOVER, RUNNING, PAUSE };

        Status GameStatus;

        HBRUSH arBrush[8];

 

        CTetrisWin() : CWindow() {

                   ts = 24;

                   bw = 10;

                   bh = 20;

                   score = 0;

                   bricknum = 0;

                   memset(board, 0, sizeof(board));

        }

 

        void Create();

        LRESULT OnCreate(WPARAM wParam, LPARAM lParam);

        LRESULT OnDestroy(WPARAM wParam, LPARAM lParam);

        LRESULT OnTimer(WPARAM wParam, LPARAM lParam);

        void OnDraw(HDC hdc, int width, int height);

        LRESULT OnKeyDown(WPARAM wParam, LPARAM lParam);

 

        void MakeNewBrick();

        int GetAround(int x, int y, int b, int r);

        BOOL MoveDown();

        void TestFull();

        void PrintTile(HDC hdc, int x, int y, int c);

        void AdjustMainWindow();

};

 

°ÔÀÓ Çϳª¸¦ Åë°·Î ³Ö´Ù º¸´Ï ¾Æ¹«·¡µµ ±æÀÌ°¡ Á» ±æ±â´Â ÇÏ´Ù.

 

LRESULT CTetris::OnCreate(WPARAM wParam, LPARAM lParam)

{

        icon = LoadBitmap(g_hInst, MAKEINTRESOURCE(IDB_TETRIS));

        return 0;

}

 

LRESULT CTetris::OnDestroy(WPARAM wParam, LPARAM lParam)

{

        DeleteObject(icon);

        return 0;

}

 

void CTetris::OnDraw(HDC hdc, int width, int height) {

        int wh = trayWindow.tidgetSize;

        StretchBitmap(hdc, 0, 0, wh, wh, icon);

}

 

void CTetris::OnClick() {

        // °ÔÀÓ À©µµ¿ì¸¦ »ý¼ºÇÏ¿© ¶ç¿î´Ù.

        CTetrisWin* pWin = new CTetrisWin();

        pWin->Create();

}

 

// Ŭ·¡½º¾È¿¡ ÃʱâÈ­µÈ ¹è¿­ ¼±¾ðÇÏ´Â ¹æ¹ýÀ» ¸ð¸£°ÚÀ½. C¹®¹ýÀ» ´Ù ±îÀ𠹬À½.

struct TetPoint {

        int x, y;

};

TetPoint Shape[][4][4] = {

        { {0,0,1,0,2,0,-1,0}, {0,0,0,1,0,-1,0,-2}, {0,0,1,0,2,0,-1,0}, {0,0,0,1,0,-1,0,-2} },

        { {0,0,1,0,0,1,1,1}, {0,0,1,0,0,1,1,1}, {0,0,1,0,0,1,1,1}, {0,0,1,0,0,1,1,1} },

        { {0,0,-1,0,0,-1,1,-1}, {0,0,0,1,-1,0,-1,-1}, {0,0,-1,0,0,-1,1,-1}, {0,0,0,1,-1,0,-1,-1} },

        { {0,0,-1,-1,0,-1,1,0}, {0,0,-1,0,-1,1,0,-1}, {0,0,-1,-1,0,-1,1,0}, {0,0,-1,0,-1,1,0,-1} },

        { {0,0,-1,0,1,0,-1,-1}, {0,0,0,-1,0,1,-1,1}, {0,0,-1,0,1,0,1,1}, {0,0,0,-1,0,1,1,-1} },

        { {0,0,1,0,-1,0,1,-1}, {0,0,0,1,0,-1,-1,-1}, {0,0,1,0,-1,0,-1,1}, {0,0,0,-1,0,1,1,1} },

};

 

void CTetrisWin::Create()

{

        CreateWindow(TEXT("CWindow"), L"Tetris", WS_OVERLAPPED | WS_SYSMENU | WS_BORDER | WS_CAPTION | WS_VISIBLE,

                   10, 10, 100, 100,

                   NULL, (HMENU)NULL, g_hInst, this);

}

 

LRESULT CTetrisWin::OnCreate(WPARAM wParam, LPARAM lParam)

{

        GameStatus = GAMEOVER;

        srand(GetTickCount());

        AdjustMainWindow();

 

        // ¸ÞÀÎ À©µµ¿ìÀÇ ¿·¿¡ ¿¬´Ù.

        RECT wrt;

        GetWindowRect(mainWindow.win_hWnd, &wrt);

        MovePopupToSide(win_hWnd, wrt.left, wrt.top);

 

        // 0¹øÀº ºóÄ­, 1~6Àº º®µ¹. 7Àº º®

        COLORREF arTileColor[] = { 0, 0xff0000, 0x00ff00, 0x0000ff, 0xffff00, 0xff00ff, 0x00ffff, 0x000000 };

        for (int i = 1; i <= 7; i++) {

                   arBrush[i] = CreateSolidBrush(arTileColor[i]);

        }

 

        return 0;

}

 

LRESULT CTetrisWin::OnDestroy(WPARAM wParam, LPARAM lParam)

{

        for (int i = 1; i <= 7; i++) {

                   DeleteObject(arBrush[i]);

        }

        return 0;

}

 

LRESULT CTetrisWin::OnTimer(WPARAM wParam, LPARAM lParam)

{

        if (MoveDown() == TRUE) {

                   MakeNewBrick();

        }

        return 0;

}

 

void CTetrisWin::OnDraw(HDC hdc, int width, int height)

{

        int x, y, i;

        TCHAR str[128];

 

        FillRect(hdc, 0, 0, width, height, (HBRUSH)GetStockObject(LTGRAY_BRUSH));

 

        // Å׵θ® ±×¸²

        for (x = 0; x < bw + 1; x++) {

                   PrintTile(hdc, x, 0, WALL);

                   PrintTile(hdc, x, bh + 1, WALL);

        }

        for (y = 0; y < bh + 2; y++) {

                   PrintTile(hdc, 0, y, WALL);

                   PrintTile(hdc, bw + 1, y, WALL);

        }

 

        // °ÔÀÓÆÇ ±×¸²

        for (x = 1; x < bw + 1; x++) {

                   for (y = 1; y < bh + 1; y++) {

                              PrintTile(hdc, x, y, board[x][y]);

                   }

        }

 

        // À̵¿ÁßÀÎ º®µ¹ ±×¸²

        if (GameStatus != GAMEOVER && brick != -1) {

                   for (i = 0; i < 4; i++) {

                              PrintTile(hdc, nx + Shape[brick][rot][i].x, ny + Shape[brick][rot][i].y, brick + 1);

                   }

        }

 

        // ´ÙÀ½ º®µ¹ ±×¸²

        for (x = bw + 3; x <= bw + 11; x++) {

                   for (y = bh - 5; y <= bh + 1; y++) {

                              if (x == bw + 3 || x == bw + 11 || y == bh - 5 || y == bh + 1) {

                                        PrintTile(hdc, x, y, WALL);

                              } else {

                                        PrintTile(hdc, x, y, 0);

                              }

                   }

        }

        if (GameStatus != GAMEOVER) {

                   for (i = 0; i < 4; i++) {

                              PrintTile(hdc, bw + 7 + Shape[nbrick][0][i].x, bh - 2 + Shape[nbrick][0][i].y, nbrick + 1);

                   }

        }

 

        // Á¤º¸ Ãâ·Â

        HFONT oldFont;

        oldFont = (HFONT)SelectObject(hdc, mainFont[1]);

        SetBkMode(hdc, TRANSPARENT);

        lstrcpy(str, TEXT("1~9:°ÔÀÓÆÇ Å©±â"));

        TextOutSz(hdc, (bw + 4) * ts, 30, str);

        lstrcpy(str, TEXT("Enter:½ÃÀÛ/ÁßÁö"));

        TextOutSz(hdc, (bw + 4) * ts, 60, str);

        wsprintf(str, TEXT("Á¡¼ö : %d   "), score);

        TextOutSz(hdc, (bw + 4) * ts, 90, str);

        wsprintf(str, TEXT("º®µ¹ : %d °³   "), bricknum);

        TextOutSz(hdc, (bw + 4) * ts, 120, str);

        SelectObject(hdc, oldFont);

}

 

LRESULT CTetrisWin::OnKeyDown(WPARAM wParam, LPARAM lParam)

{

        int x, y;

        int trot;

 

        // °ÔÀÓ ½ÃÀÛ ¿©ºÎ¿¡ »ó°ü¾øÀÌ µ¿ÀÛÇÏ´Â Å°

        if (wParam == VK_RETURN) {

                   if (GameStatus == GAMEOVER) {

                              for (x = 0; x < bw + 2; x++) {

                                        for (y = 0; y < bh + 2; y++) {

                                                   board[x][y] = (y == 0 || y == bh + 1 || x == 0 || x == bw + 1) ? WALL : EMPTY;

                                        }

                              }

                              score = 0;

                              bricknum = 0;

                              GameStatus = RUNNING;

                              nbrick = random(sizeof(Shape) / sizeof(Shape[0]));

                              MakeNewBrick();

                              Interval = 1000;

                              SetTimer(win_hWnd, 1, Interval, NULL);

                   } else if (GameStatus == RUNNING) {

                              GameStatus = PAUSE;

                              KillTimer(win_hWnd, 1);

                   } else if (GameStatus == PAUSE) {

                              GameStatus = RUNNING;

                              SetTimer(win_hWnd, 1, Interval, NULL);

                   }

        }

 

        // °ÔÀÓÆÇ Å©±â´Â ½ÃÀÛ Àü¿¡¸¸ ¹Ù²Ü ¼ö ÀÖ´Ù.

        if (GameStatus == GAMEOVER && wParam >= '1' && wParam <= '9') {

                   switch (wParam) {

                   case '1':

                              bw = 8; bh = 16; ts = 32;

                              break;

                   case '2': // µðÆúÆ®

                              bw = 10; bh = 20; ts = 24;

                              break;

                   case '3':

                              bw = 12; bh = 24; ts = 40;

                              break;

                   case '4':

                              bw = 15; bh = 30; ts = 28;

                              break;

                   case '5': // FHD ÃÖ´ë Å©±â

                              bw = 200; bh = 100; ts = 8;

                              break;

                   case '6':

                              bw = 20; bh = 40; ts = 32;

                              break;

                   case '7':

                              bw = 50; bh = 100; ts = 16;

                              break;

                   case '8':

                              bw = 200; bh = 100; ts = 16;

                              break;

                   case '9': // 4k ÃÖ´ë Å©±â

                              bw = 400; bh = 200; ts = 8;

                              break;

                   }

                   // ÀÌÀüÆÇ¿¡ ÇÏ´ø°Ç ´Ù Áö¿ì°í Á¶Á¤ÇÑ´Ù.

                   memset(board, 0, sizeof(board));

                   AdjustMainWindow();

                   return 0;

        }

 

        // ÀÌÇÏÀÇ Å°´Â °ÔÀÓ Áß¿¡´Â ¾µ ¼ö ¾ø´Ù.

        if (GameStatus != RUNNING || brick == -1) {

                   return 0;

        }

 

        switch (wParam) {

        case VK_LEFT:

                   if (GetAround(nx - 1, ny, brick, rot) == EMPTY) {

                              nx--;

                              InvalidateRect(win_hWnd, NULL, FALSE);

                   }

                   break;

        case VK_RIGHT:

                   if (GetAround(nx + 1, ny, brick, rot) == EMPTY) {

                              nx++;

                              InvalidateRect(win_hWnd, NULL, FALSE);

                   }

                   break;

        case VK_UP:

                   trot = (rot == 3 ? 0 : rot + 1);

                   if (GetAround(nx, ny, brick, trot) == EMPTY) {

                              rot = trot;

                              InvalidateRect(win_hWnd, NULL, FALSE);

                   }

                   break;

        case VK_DOWN:

                   if (MoveDown() == TRUE) {

                              MakeNewBrick();

                   }

                   break;

        case VK_SPACE:

                   while (MoveDown() == FALSE) { ; }

                   MakeNewBrick();

                   break;

        }

 

        return 0;

}

 

void CTetrisWin::MakeNewBrick()

{

        bricknum++;

        brick = nbrick;

        nbrick = random(sizeof(Shape) / sizeof(Shape[0]));

        nx = bw / 2;

        ny = 3;

        rot = 0;

        InvalidateRect(win_hWnd, NULL, FALSE);

        if (GetAround(nx, ny, brick, rot) != EMPTY) {

                   KillTimer(win_hWnd, 1);

                   GameStatus = GAMEOVER;

                   MessageBox(win_hWnd, L"GAME OVER", L"¾Ë¸²", MB_OK);

        }

}

 

int CTetrisWin::GetAround(int x, int y, int b, int r)

{

        int i, k = EMPTY;

 

        for (i = 0; i < 4; i++) {

                   k = max(k, board[x + Shape[b][r][i].x][y + Shape[b][r][i].y]);

        }

        return k;

}

BOOL CTetrisWin::MoveDown()

{

        if (GetAround(nx, ny + 1, brick, rot) != EMPTY) {

                   TestFull();

                   return TRUE;

        }

        ny++;

        // Áï½Ã ±×·Á¼­ º®µ¹ÀÌ ³»·Á°¡´Â ¸ð¾çÀ» º¸¿© ÁØ´Ù.

        InvalidateRect(win_hWnd, NULL, FALSE);

        // ÆøÀÌ ³Ê¹« ³ÐÀ¸¸é ¾Ö´Ï¸ÞÀ̼ÇÇÏÁö ¾Ê´Â´Ù.

        if (bw < 100) {

                   UpdateWindow(win_hWnd);

        }

        return FALSE;

}

void CTetrisWin::TestFull()

{

        int i, x, y, ty;

        int count = 0;

        static int arScoreInc[] = { 0,1,3,8,20 };

 

        for (i = 0; i < 4; i++) {

                   board[nx + Shape[brick][rot][i].x][ny + Shape[brick][rot][i].y] = brick + 1;

        }

        // À̵¿ÁßÀÎ º®µ¹ÀÌ Àá½Ã ¾ø´Â »óÅÂ.

        brick = -1;

 

        for (y = 1; y < bh + 1; y++) {

                   for (x = 1; x < bw + 1; x++) {

                              if (board[x][y] == EMPTY) break;

                   }

                   if (x == bw + 1) {

                              count++;

                              for (ty = y; ty > 1; ty--) {

                                        for (x = 1; x < bw + 1; x++) {

                                                   board[x][ty] = board[x][ty - 1];

                                        }

                              }

                              InvalidateRect(win_hWnd, NULL, FALSE);

                              UpdateWindow(win_hWnd);

                              Sleep(150);

                   }

        }

        score += arScoreInc[count];

        if (bricknum % 10 == 0 && Interval > 200) {

                   Interval -= 50;

                   SetTimer(win_hWnd, 1, Interval, NULL);

        }

}

 

void CTetrisWin::PrintTile(HDC hdc, int x, int y, int c)

{

        HPEN oldPen;

        HBRUSH oldBrush;

        RECT brt;

 

        if (c == EMPTY) {

                   if (ts > 20) {

                              Rectangle(hdc, x * ts + ts / 2 - 1, y * ts + ts / 2 - 1, x * ts + ts / 2 + 1, y * ts + ts / 2 + 1);

                   } else {

                              SetPixel(hdc, x * ts + ts / 2, y * ts + ts / 2, RGB(128, 128, 128));

                   }

        } else {

                   SetRect(&brt, x * ts, y * ts, x * ts + ts, y * ts + ts);

 

                   oldBrush = (HBRUSH)SelectObject(hdc, arBrush[c]);

                   oldPen = (HPEN)SelectObject(hdc, GetStockObject(NULL_PEN));

                   Rectangle(hdc, brt.left, brt.top, brt.right, brt.bottom);

                   SelectObject(hdc, oldBrush);

                   SelectObject(hdc, oldPen);

 

                   // ÀÔü°¨À» ÁÙ·Á°í Çߴµ¥ ¿¹»ÚÁö ¾Ê°í Á» ´À¸².

                   /*white = CreatePen(PS_SOLID, 1, RGB(200, 200, 200));

                   gray = CreatePen(PS_SOLID, 1, RGB(32, 32, 32));

                   oldPen = (HPEN)SelectObject(hdc, white);

                   MoveToEx(hdc, brt.left, brt.top, NULL); LineTo(hdc, brt.left, brt.bottom);

                   MoveToEx(hdc, brt.left, brt.top, NULL); LineTo(hdc, brt.right, brt.top);

                   SelectObject(hdc, gray);

                   MoveToEx(hdc, brt.left, brt.bottom, NULL); LineTo(hdc, brt.right, brt.bottom);

                   MoveToEx(hdc, brt.right, brt.top, NULL); LineTo(hdc, brt.right, brt.bottom);

                   SelectObject(hdc, oldPen);

                   DeleteObject(white);

                   DeleteObject(gray);

                   */

        }

}

 

void CTetrisWin::AdjustMainWindow()

{

        RECT crt;

        SetRect(&crt, 0, 0, (bw + 12) * ts, (bh + 2) * ts);

        AdjustWindowRect(&crt, WS_OVERLAPPED | WS_SYSMENU | WS_BORDER | WS_CAPTION, FALSE);

        SetWindowPos(win_hWnd, NULL, 0, 0, crt.right - crt.left, crt.bottom - crt.top,

                   SWP_NOMOVE | SWP_NOZORDER);

}

 

±×·¡µµ À̸¸ÇÏ¸é ¼Ò½º ±æÀÌ°¡ ªÀº ÆíÀÌ´Ù. ÀÌ °ÔÀÓµµ ´õ °³¼±ÇÒ ¿©Áö°¡ ¸¹´Ù.

OneImage

OneImage´Â µü ÇϳªÀÇ À̹ÌÁö¸¦ ¹Ì¸® µî·ÏÇØ ³õ°í Ŭ¸¯½Ã ½Å¼ÓÇÏ°Ô ¿­¾î¼­ º¸¿©Áִ ƼÁ¬ÀÌ´Ù. °³¹ßÀ» ÇÏ´Ù º¸¸é ¼³°èµµ³ª »ö»óÇ¥, ±âȹ¾È µîÀ» ÀÚÁÖ Âü°íÇØ¾ß Çϴµ¥ ¸Å¹ø ÆÄÀÏÀ» ¿­¾î µÚÀû°Å¸®±â ±ÍÂú´Ù. ÀÌ·² ¶§ ¹Ì¸® À̹ÌÁö·Î ¸¸µé¾î µÎ¸é ½Å¼ÓÇÏ°Ô ¿­¾î È®ÀÎÇÒ ¼ö ÀÖ´Ù.

À̹ÌÁö Ãâ·ÂÀº Win32 API¸¸À¸·Î´Â ¾ÈµÇ¸ç GDI+¸¦ »ç¿ëÇØ¾ß ÇÑ´Ù. ´ÙÇàÈ÷ À©µµ¿ì10Àº GDI+¸¦ ±âº» ³»ÀåÇÏ°í ÀÖ¾î º°´Ù¸¥ Ãß°¡ ¶óÀ̺귯¸®°¡ ¾ø¾îµµ ÀÌ ±â´ÉÀ» ¹Ù·Î »ç¿ëÇÒ ¼ö ÀÖ´Ù. ´ë½Å ¸î°¡Áö Áغñ¸¦ ÇØ µÎ¾î¾ß ÇÑ´Ù. ¸ÕÀú ´ÙÀ½ À¯Æ¿¸®Æ¼ ÇÔ¼ö¸¦ ÀÛ¼ºÇÑ´Ù.

 

// ÁöÁ¤ÇÑ ¿µ¿ªÀÇ Áß¾Ó¿¡ Á¾È¾ºñ ¸ÂÃß¾î À̹ÌÁö Ãâ·Â

void DrawImageCenter(HDC hdc, Image* pImage, int width, int height, bool erase, HBRUSH backBrush)

{

        Graphics G(hdc);

        int iw, ih;

        int l, t, r, b, tsize;

 

        iw = pImage->GetWidth();

        ih = pImage->GetHeight();

        if (iw < width && ih < height) {

                   l = width / 2 - iw / 2;

                   t = height / 2 - ih / 2;

                   r = l + iw;

                   b = t + ih;

        } else {

                   // À̹ÌÁöÀÇ Á¾È¾ºñ°¡ ´õ Å©¸é : È­¸éÀÌ ¼¼·Î·Î ±æÂßÇÒ ¶§

                   if ((double)iw / ih > (double)width / height) {

                              l = 0;

                              r = width;

                              // È­¸é ÆøÀÇ ºñÀ²¸¸Å­ ±×¸²ÀÇ Æøµµ ÁÙÀδÙ.

                              tsize = int(ih * width / (double)iw);

                              t = height / 2 - tsize / 2;

                              b = t + tsize;

                   } else {

                              t = 0;

                              b = height;

                              tsize = int(iw * height / (double)ih);

                              l = width / 2 - tsize / 2;

                              r = l + tsize;

                   }

        }

 

        G.DrawImage(pImage, l, t, r - l, b - t);

 

        // À̹ÌÁö ¹Ù±ùÀ»  ¹è°æ»öÀ¸·Î ä¿î´Ù.

        if (erase) {

                   FillRect(hdc, 0, 0, width, t, backBrush);

                   FillRect(hdc, 0, 0, l, height, backBrush);

                   FillRect(hdc, 0, b, width, height, backBrush);

                   FillRect(hdc, r, t, width, height, backBrush);

        }

}

 

// ȸÀüµÈ À̹ÌÁö¸¦ À§ÂÊ ¹æÇâÀ¸·Î µ¹¸°´Ù. 2, 4, 5, 6¹ø »óŵµ ÀÖ¾î Á» ´õ ¸é¹ÐÇÑ ¿¬±¸°¡ ÇÊ¿äÇÏ´Ù.

void FixImageOrientation(Image* pImage)

{

        UINT size, count;

        // 1¹øÀÌ Á¤¹æÇâÀ̸ç ÀÌ °æ¿ì´Â exif¿¡ ¹æÇâ Á¤º¸°¡ ±â·ÏµÇÁö ¾Ê´Â´Ù.

        unsigned short orientation = 1;

        PropertyItem* arPro;

        pImage->GetPropertySize(&size, &count);

 

        arPro = (PropertyItem*)malloc(size);

        pImage->GetAllPropertyItems(size, count, arPro);

        for (int i = 0; i < (int)count; i++) {

                   if (arPro[i].id == PropertyTagOrientation) {

                              orientation = *(unsigned short*)arPro[i].value;

                   }

        }

 

        switch (orientation) {

        case 6:

                   pImage->RotateFlip(Rotate90FlipNone);

                   break;

        case 3:

                   pImage->RotateFlip(Rotate180FlipNone);

                   break;

        case 8:

                   pImage->RotateFlip(Rotate270FlipNone);

                   break;

        }

}

 

// ÇöÀç ¸ð´ÏÅ͸¦ °¡µæ ä¿î´Ù.

void makeFullScreen(HWND hWnd)

{

        SetWindowLongPtr(hWnd, GWL_STYLE, WS_POPUP | WS_VISIBLE);

 

        int nowMonitor = GetMonitorOfWindow(hWnd);

        RECT rt = arMonitor[nowMonitor].rcMonitor;

        SetWindowPos(hWnd, HWND_NOTOPMOST, rt.left, rt.top,

                   rt.right - rt.left, rt.bottom - rt.top, SWP_FRAMECHANGED);

}

 

»çÁøÀº Ç×»ó ÀÏÁ¤ ¿µ¿ªÀÇ Áß¾Ó¿¡ Á¾È¾¹Ù¸¦ ¸ÂÃß¾î Ãâ·ÂÇØ¾ß ÇÑ´Ù. À©µµ¿ìÀÇ ¸éÀûÀ» ÃÖ´ëÇÑ È°¿ëÇ쵂 Âî±×·¯ÁöÁö´Â ¸»¾Æ¾ß ÇÑ´Ù. DrawImageCenter ÇÔ¼ö´Â ÁÖ¾îÁø ¿µ¿ªÀÇ Á¾È¾ºñ¸¦ °è»êÇÏ¿© Á¤È®ÇÏ°Ô Ãâ·ÂÇØ ÁØ´Ù. °è»ê½ÄÀÌ º¸±âº¸´Ù ¾à°£ º¹ÀâÇÏ´Ù.

µðÁöÅÐ Ä«¸Þ¶ó·Î ÂïÀº À̹ÌÁö´Â ¹æÇâÀÌ ±â·ÏµÇ¾î Àִµ¥ ÀÌ ¹æÇâÀ» Àоî À̹ÌÁö¸¦ ȸÀüÇؼ­ º¸¿© Áà¾ß ÇÑ´Ù. ±×·¸Áö ¾ÊÀ¸¸é »ç¶÷ÀÌ ¼± ¸ð½ÀÀº Ç×»ó ´©¿ö ÀÖ´Â ¸ð¾çÀ¸·Î Ãâ·ÂµÈ´Ù. FixImageOrientation ÇÔ¼ö´Â »çÁøÀÇ EXIF Á¤º¸¸¦ ÂüÁ¶ÇÏ¿© À̹ÌÁö¸¦ ȸÀü½ÃŲ´Ù.

makeFullScreen ÇÔ¼ö´Â âÀ» ÃÖ´ë À§Ä¡·Î È®´ëÇÑ´Ù. È­¸é Àüü¿¡ À̹ÌÁö¸¦ °¡µæ ä¿ö º¸°í ½ÍÀ» ¶§ ÀÌ ÇÔ¼ö¸¦ È£ÃâÇÏ¸é µÈ´Ù.  GDI+´Â ÃʱâÈ­Çؾ߸¸ »ç¿ëÇÒ ¼ö ÀÖ´Ù. Á÷Á¢ ÃʱâÈ­Çϱâ´Â ¹ø°Å·Î¿ì¹Ç·Î ´ÙÀ½ µµ¿ì¹Ì Ŭ·¡½º¸¦ Util.h¿¡ ¼±¾ðÇÑ´Ù.

 

class CGdiPlusStarter

{

private:

       ULONG_PTR m_gpToken;

 

public:

       bool m_bSuccess;

       CGdiPlusStarter() {

                  GdiplusStartupInput gpsi;

                  m_bSuccess = (GdiplusStartup(&m_gpToken, &gpsi, NULL) == Ok);

       }

       ~CGdiPlusStarter() {

                  GdiplusShutdown(m_gpToken);

       }

};

 

»ý¼ºÀÚ¿¡¼­ ÃʱâÈ­ÇÏ°í Æı«ÀÚ¿¡¼­ ¼Ë´Ù¿îÇÑ´Ù. ÀÌ·± ŸÀÔÀÇ Àü¿ª º¯¼ö Çϳª¸¸ ¸¸µé¾î µÎ¸é ÃʱâÈ­°¡ Á¤¸®°¡ ÀÚµ¿À¸·Î ¼öÇàµÈ´Ù. SoEnty.cpp¿¡ ÀÌ Å¸ÀÔÀÇ º¯¼ö¸¦ Àü¿ªÀ¸·Î ¼±¾ðÇØ µÐ´Ù.

 

CGdiPlusStarter g_gps;

 

ÀÌÁ¦ À̹ÌÁö ƼÁ¬À» ¸¸µé¾î º¸ÀÚ. ƼÁ¬°ú ÇÔ²² À̹ÌÁö ºä¾îâµµ °°ÀÌ ¸¸µé¾î¾ß ÇÑ´Ù. °Ô´Ù°¡ ÀÌ Ã¢Àº À̹ÌÁö ½½¶óÀÌ´õ À§Á¬°ú °øÀ¯ÇÏ´Â ±â´ÉÀÌ ÀÖ¾î Àü¹æ ¼±¾ðÀÌ ÇÊ¿äÇÏ´Ù.

 

class CImageViewer;

class COneImage : public CTidget

{

public:

        TCHAR imagePath[MAX_PATH];

        Image* nowImage;

        HBITMAP icon;

        CImageViewer* pViewer;

 

        LRESULT OnCreate(WPARAM wParam, LPARAM lParam);

        LRESULT OnDestroy(WPARAM wParam, LPARAM lParam);

        void OnDraw(HDC hdc, int width, int height);

        void OnClick();

        LRESULT OnContextMenu(WPARAM wParam, LPARAM lParam);

        LRESULT OnUser1(WPARAM wParam, LPARAM lParam);

};

 

class CImageSlide;

class CImageViewer : public CWindow

{

public:

        int parentType;                       // ´©°¡ ºÎ¸ðÀÎÁö. 0 = ½½¶óÀÌ´õ, 1 = oneImage

        CDget* pParent;                     // ºÎ¸ð °´Ã¼. ¾Æ·¡ º¯¼ö·Î ¹Ì¸® ij½ºÆÃÇØ µÐ´Ù.

        CImageSlide* pSlide;

        COneImage* pOneImage;

        int nowIdx;                                                            // ½½¶óÀÌ´õÀÇ ÇöÀç À妽º

        TCHAR imagePath[MAX_PATH];           // OneImageÀÇ À̹ÌÁö °æ·Î

        Image* nowImage;                                       // ·±Å¸ÀÓ¿¡ »ý¼ºÇÏ´Â À̹ÌÁö °´Ã¼

        bool fullScreen;

        WINDOWPLACEMENT prevWndPlace;

 

        void Create(int parentType, CDget* parent);

        LRESULT OnCreate(WPARAM wParam, LPARAM lParam);

        LRESULT OnDestroy(WPARAM wParam, LPARAM lParam);

        LRESULT OnPaint(WPARAM wParam, LPARAM lParam);

        LRESULT OnSize(WPARAM wParam, LPARAM lParam);

        LRESULT OnKeyDown(WPARAM wParam, LPARAM lParam);

        LRESULT OnLButtonDblClk(WPARAM wParam, LPARAM lParam);

        LRESULT OnUser1(WPARAM wParam, LPARAM lParam);

 

        void toggleFullScreen();

};

 

ƼÁ¬ÀÇ ±¸Çö ÄÚµåºÎÅÍ ÀÛ¼ºÇØ º¸ÀÚ.

 

LRESULT COneImage::OnCreate(WPARAM wParam, LPARAM lParam)

{

        nowImage = NULL;

        pViewer = NULL;

 

        setting.get(dget_id, L"imagePath", L"", imagePath, MAX_PATH);

        if (lstrlen(imagePath) != 0) {

                   nowImage = Image::FromFile(imagePath);

                   FixImageOrientation(nowImage);

        }

        icon = LoadBitmap(g_hInst, MAKEINTRESOURCE(IDB_ONEIMAGE));

 

        return 0;

}

 

LRESULT COneImage::OnDestroy(WPARAM wParam, LPARAM lParam)

{

        DeleteObject(icon);

        if (nowImage != NULL) {

                   delete nowImage;

        }

        if (pViewer != NULL) {

                   DestroyWindow(pViewer->win_hWnd);

        }

 

        return 0;

}

 

void COneImage::OnDraw(HDC hdc, int width, int height)

{

        int wh = trayWindow.tidgetSize;

        if (nowImage == NULL) {

                   StretchBitmap(hdc, 0, 0, wh, wh, icon);

        } else {

                   DrawImageCenter(hdc, nowImage, wh, wh, true, win_backBrush);

        }

}

 

void COneImage::OnClick()

{

        if (nowImage != NULL) {

                   // ºä¾î¸¦ ¿¬´Ù.

                   if (pViewer == NULL) {

                              pViewer = new CImageViewer();

                              lstrcpy(pViewer->imagePath, imagePath);

                              pViewer->Create(1, this);

                   }

        }

}

 

// todo : ¿É¼Ç ´ëÈ­»óÀÚ¸¦ ¸¸µé°í °£´ÜÇÑ ¼³¸í°ú ÆÄÀÏ ¿­±â ¹öÆ°À» ¹èÄ¡ÇÑ´Ù.

// ÀÌ°É Çϱâ Àü¿¡ Æ÷Ä¿½º¸¦ ÀҾ ¿É¼ÇâÀÌ ´ÝÈ÷Áö ¾Êµµ·Ï Á¤Ã¥ºÎÅÍ °áÁ¤ÇØ¾ß ÇÑ´Ù.

LRESULT COneImage::OnContextMenu(WPARAM wParam, LPARAM lParam)

{

        OPENFILENAME OFN;

        lstrcpy(imagePath, L"");

        memset(&OFN, 0, sizeof(OPENFILENAME));

        OFN.lStructSize = sizeof(OPENFILENAME);

        OFN.hwndOwner = win_hWnd;

        OFN.lpstrFilter = TEXT("À̹ÌÁö ÆÄÀÏ(jpg, png)\0*.jpg;*.png\0");

        OFN.lpstrFile = imagePath;

        OFN.nMaxFile = MAX_PATH;

        if (GetOpenFileName(&OFN) == 0) return 0;

 

        // À̹ÌÁö°¡ °áÁ¤µÇ´Â Áï½Ã ±â·ÏÇÑ´Ù.

        setting.set(dget_id, L"imagePath", imagePath);

        nowImage = Image::FromFile(imagePath);

        FixImageOrientation(nowImage);

        InvalidateRect(win_hWnd, NULL, TRUE);

 

        return 0;

}

 

// ºä¾î°¡ Á¾·á ½ÅÈ£¸¦ º¸³»¸é ±â·ÏÇØ µÐ´Ù. ±×·¡¾ß »õ·Î ¿­ ¼ö ÀÖ´Ù.

LRESULT COneImage::OnUser1(WPARAM wParam, LPARAM lParam)

{

        pViewer = NULL;

        return 0;

}

 

»ý¼ºÇÒ ¶§ µî·ÏÇØ ³õÀº À̹ÌÁöÀÇ °æ·Î¸¦ Àаí GDI+ À̹ÌÁö·Î ¹Ì¸® º¯È¯ÇÏ¿© ¹æÇâ±îÁö ¸ÂÃç µÐ´Ù. OnDraw¿¡¼­´Â ƼÁ¬ ¿µ¿ª¿¡ µî·Ï À̹ÌÁö¸¦ ÀÛ°Ô³ª¸¶ Ãâ·ÂÇÑ´Ù. Ŭ¸¯Çϸé À̹ÌÁö ºä¾îâÀ» ¿­°í °æ·Î¸¦ ¾Ë·Á ÁØ´Ù.

¿É¼ÇâÀº º°µµ·Î ¾ø°í ¸¶¿ì½º ¿À¸¥ÂÊÀ» Ŭ¸¯Çϸé À̹ÌÁö ÀбââÀ» ¿¬´Ù. À̹ÌÁö¸¦ ¼±ÅÃÇϸé Áï½Ã º¯°æÇÑ´Ù. ºä¾î°¡ Á¾·áÇÒ ¶§ WM_USER+1 ¸Þ½ÃÁö¸¦ º¸³»¸ç À̶§ ºä¾î¸¦ ¹«È¿È­ÇÑ´Ù. Çѹø¿¡ µÎ °³ÀÇ Ã¢À» ¿­ ¼ö´Â ¾øµµ·Ï ÇØ ³õ¾Ò´Âµ¥ ±»ÀÌ ¸·À» ÇÊ¿ä±îÁö´Â ¾ø´Â °Í °°´Ù. ´ÙÀ½Àº À̹ÌÁö ºä¾îÀÇ ±¸Çö ÄÚµåÀÌ´Ù.

 

// À̹ÌÁö ºä¾î °ü·Ã todo - ±âº» ±â´É ±¸ÇöÇØ ³ù°í ´ÙÀ½Àº Â÷ÈÄ¿¡ õõÈ÷ ÇÒ °Í

// ŸÀÌƲ¹Ù Á¦°ÅÇÏ°í µÎ²¨¿î ¾×ÀÚ µÎ¸¥ ÈÄ ¾×ÀÚ µå·¡±×Çؼ­ Å©±â Á¶Á¤. ¹Ù´Ú µå·¡±×Çؼ­ À̵¿

// ¸¶¿ì½º°¡ »ó´ÜÀ¸·Î ¿Ã¶ó°¡¸é ÆÄÀϸí°ú ´Ý±â, ÃÖ´ëÈ­ ¹öÆ° º¸¿©ÁÙ °Í. ¶Ç´Â »ó´Ü ¾×ÀÚ µÎ²®°Ô Çؼ­ Ç×»ó Ç¥½Ãµµ °¡´É

// È®´ë, Ãà¼Ò, Æд×, ȸÀü, ¹Ý»ç, ¹à±â Á¶Á¤ ±â´É ±¸Çö. ½½¶óÀÌ´õÀÇ °æ¿ì PgUp, PgDnÀ¸·Î ³×ºñ°ÔÀÌ¼Ç À̵¿

void CImageViewer::Create(int parentType, CDget* parent)

{

        // ŸÀÔ¿¡ µû¶ó ºÎ¸ð¸¦ ij½ºÆÃÇØ µÐ´Ù. À§Á¬°ú ¹Ì´Ï À§Á¬ÀÌ ÇüÁ¦ °ü°è¿©¼­ C ½ºÅ¸ÀÏ·Î ´ÙÇü¼ºÀ» ±¸ÇöÇÑ´Ù.

        // CWindowÀÇ ¸â¹ö¸¦ ÂüÁ¶ÇÒ ¶§´Â pParent¸¦ ¹Ù·Î ÀÐÀ¸¸é µÈ´Ù.

        pParent = parent;

        this->parentType = parentType;

        switch (parentType) {

        case 0:

                   pSlide = (CImageSlide*)pParent;

                   break;

        case 1:

                   pOneImage = (COneImage*)pParent;

                   break;

        }

 

        CreateWindow(TEXT("CWindow"), L"À̹ÌÁö º¸±â", WS_POPUPWINDOW | WS_THICKFRAME | WS_CAPTION,

                   0, 0, 0, 0,

                   NULL, (HMENU)NULL, g_hInst, this);

 

        // ÃÖÈÄ ½ÇÇà À§Ä¡¸¦ Àоî¿Â´Ù. ÀÏ´Ü ³ë¸» ÁÂÇ¥·Î Ãʱâ ÁÂÇ¥¸¦ Àâ´Â´Ù.

        prevWndPlace.length = sizeof(WINDOWPLACEMENT);

        prevWndPlace.flags = 0;

        prevWndPlace.rcNormalPosition.left = setting.get(pParent->dget_id, L"left", 10);

        prevWndPlace.rcNormalPosition.top = setting.get(pParent->dget_id, L"top", 10);

        prevWndPlace.rcNormalPosition.right = setting.get(pParent->dget_id, L"right", 650);

        prevWndPlace.rcNormalPosition.bottom = setting.get(pParent->dget_id, L"bottom", 490);

        prevWndPlace.showCmd = setting.get(pParent->dget_id, L"showCmd", SW_SHOWNORMAL);

        SetWindowPlacement(win_hWnd, &prevWndPlace);

 

        // Àüü È­¸éÀ¸·Î ÀüȯÇÑ´Ù.

        fullScreen = setting.get(pParent->dget_id, L"fullScreen", false);

        if (fullScreen) {

                   prevWndPlace.length = sizeof(WINDOWPLACEMENT);

                   GetWindowPlacement(win_hWnd, &prevWndPlace);

                   makeFullScreen(win_hWnd);

        }

}

 

LRESULT CImageViewer::OnLButtonDblClk(WPARAM wParam, LPARAM lParam)

{

        // ÀÏ´Ü ´õºíŬ¸¯À¸·Î ÃÖ´ëÈ­ÇÑ´Ù. Â÷ÈÄ ´Ù¸¥ ¹æ¹ýÀ¸·Î ´ëüÇÒ °Í.

        toggleFullScreen();

        return 0;

}

 

LRESULT CImageViewer::OnUser1(WPARAM wParam, LPARAM lParam)

{

        // wParamÀ¸·Î Àü´ÞÇÑ »õ À̹ÌÁö¸¦ Ç¥½ÃÇÑ´Ù.

        if (nowImage != NULL) {

                   delete nowImage;

        }

        nowIdx = (int)wParam;

// nowImage = Image::FromFile(pSlide->arImage[nowIdx].c_str());

//      SetWindowText(win_hWnd, pSlide->arImage[nowIdx].c_str());

        InvalidateRect(win_hWnd, NULL, TRUE);

        return 0;

}

 

LRESULT CImageViewer::OnCreate(WPARAM wParam, LPARAM lParam)

{

        // ½½¶óÀÌ´õ´Â idx¸¦ ÁÖ°í, OneImage´Â °æ·Î¸¦ Á÷Á¢ ÁØ´Ù.

        LPCTSTR Path;

// if (parentType == 0) {

//     Path = pSlide->arImage[nowIdx].c_str();

// } else {

        Path = imagePath;

//      }

        nowImage = Image::FromFile(Path);

        FixImageOrientation(nowImage);

        SetWindowText(win_hWnd, Path);

        return 0;

}

 

LRESULT CImageViewer::OnDestroy(WPARAM wParam, LPARAM lParam)

{

        if (nowImage != NULL) {

                   delete nowImage;

        }

 

        // ÃÖÈÄ ½ÇÇà À§Ä¡¸¦ Á¶»çÇÑ´Ù. ´Ü, Àüü È­¸é ¸ðµåÀ̸é Àüü È­¸é ÀüÀÇ ³ë¸» ÁÂÇ¥¸¦ ±â·ÏÇÑ´Ù.

        if (fullScreen == false) {

                   prevWndPlace.length = sizeof(WINDOWPLACEMENT);

                   GetWindowPlacement(win_hWnd, &prevWndPlace);

        }

 

        setting.set(pParent->dget_id, L"left", prevWndPlace.rcNormalPosition.left);

        setting.set(pParent->dget_id, L"top", prevWndPlace.rcNormalPosition.top);

        setting.set(pParent->dget_id, L"right", prevWndPlace.rcNormalPosition.right);

        setting.set(pParent->dget_id, L"bottom", prevWndPlace.rcNormalPosition.bottom);

        setting.set(pParent->dget_id, L"showCmd", prevWndPlace.showCmd);

        setting.set(pParent->dget_id, L"fullScreen", fullScreen);

 

        // ºÎ¸ð¿¡°Ô ÀÚ½ÅÀÌ Á¾·áÇßÀ½À» ¾Ë¸°´Ù. ±×·¡¾ß Ŭ¸¯½Ã »õ·Î¿î ºä¾î¸¦ ¸¸µé ¼ö ÀÖ´Ù.

        SendMessage(pParent->win_hWnd, WM_USER + 1, 0, 0);

 

        // ÀÚ±â ÀÚ½ÅÀ» »èÁ¦ÇÑ´Ù. °´Ã¼¸Ê¿¡¼­µµ »èÁ¦µÈ´Ù. -> ÀÌ·¯¸é ´ÝÈú ¶§ NCDESTROY¸¦ ó¸®ÇÏÁö ¸øÇØ ´Ù¿îµÊ. -> ºÎ¸ð°¡ °ü¸®ÇØ Áà¾ß ÇÒ µí ÇÏ´Ù.

        // delete this;

        return 0;

}

 

LRESULT CImageViewer::OnPaint(WPARAM wParam, LPARAM lParam)

{

        HDC hdc;

        PAINTSTRUCT ps;

        hdc = BeginPaint(win_hWnd, &ps);

        RECT crt;

        GetClientRect(win_hWnd, &crt);

 

        // ºÎ¸ðÀÇ ¹è°æ ºê·¯½Ã »ç¿ë

        DrawImageCenter(hdc, nowImage, crt.right, crt.bottom, true, pParent->win_backBrush);

 

        EndPaint(win_hWnd, &ps);

        return 0;

}

 

LRESULT CImageViewer::OnSize(WPARAM wParam, LPARAM lParam)

{

        InvalidateRect(win_hWnd, NULL, TRUE);

        return 0;

}

 

LRESULT CImageViewer::OnKeyDown(WPARAM wParam, LPARAM lParam)

{

        if (wParam == VK_ESCAPE) {

                   DestroyWindow(win_hWnd);

        }

        if (wParam == VK_RETURN) {

                   toggleFullScreen();

        }

 

        return 0;

}

 

void CImageViewer::toggleFullScreen()

{

        fullScreen = !fullScreen;

        if (fullScreen) {

                   // Àüü È­¸éÀ¸·Î ÀüȯÇϱâ ÀüÀÇ ³ë¸» ÁÂÇ¥¸¦ ¹Ì¸® Á¶»çÇØ µÐ´Ù.

                   prevWndPlace.length = sizeof(WINDOWPLACEMENT);

                   GetWindowPlacement(win_hWnd, &prevWndPlace);

                   makeFullScreen(win_hWnd);

        } else {

                   SetWindowLongPtr(win_hWnd, GWL_STYLE, WS_POPUPWINDOW | WS_CAPTION | WS_THICKFRAME | WS_VISIBLE);

                   SetWindowPos(win_hWnd, HWND_NOTOPMOST, 0, 0, 0, 0,

                              SWP_NOMOVE | SWP_NOSIZE | SWP_FRAMECHANGED);

                   // ³ë¸» ÁÂÇ¥·Î ´Ù½Ã º¹±ÍÇÑ´Ù.

                   prevWndPlace.length = sizeof(WINDOWPLACEMENT);

                   SetWindowPlacement(win_hWnd, &prevWndPlace);

        }

}

 

À̹ÌÁö ½½¶óÀÌ´õ¿Í °ü·ÃµÈ ±â´ÉÀº ¾ÆÁ÷ À̹ÌÁö ½½¶óÀÌ´õ°¡ ¾ø¾î ÀÏ´Ü ÁÖ¼® ó¸®ÇØ µÎ¾ú´Ù. °æ·Î³ª ÷ÀÚ·Î ¹ÞÀº Á¤º¸·Î À̹ÌÁö °´Ã¼¸¦ »ý¼ºÇØ µÎ°í OnPaint¿¡¼­ Á÷Á¢ ±×¸°´Ù. Á¾·á½Ã´Â ¸¶Áö¸· À§Ä¡¿Í »óŸ¦ ÀúÀåÇØ µÎ¾î ´Ã º¸´ø À§Ä¡¿¡ ¿­¾î ÁØ´Ù.

Esc¸¦ ´©¸£¸é âÀ» ´Ý´Âµ¥ ÀÌ ºÎºÐÀº ¸¶¿ì½º UIµµ ÇÊ¿äÇÏ´Ù. Â÷ÈÄ À§ÂÊ¿¡ ¿À¹ö·¦µÇ´Â ¹ÝÅõ¸íÇÑ Ã¢À» ¸¸µé¾î À̹ÌÁö Á¤º¸³ª ´Ý±â ¹öÆ°, È®´ë/Ãà¼Ò µîÀÇ ±â´ÉÀ» Á¦°øÇϸé Àû´çÇÒ °Í °°´Ù.

EnumFont

ÆùÆ® ¿­°Å ±â´ÉÀº Win32 °³¹ßÀÚ¿¡°Ô ²À ÇÊ¿äÇÑ ±â´ÉÀÌ´Ù. °í±Þ ¾ð¾î´Â °´Ã¼°¡ ´Ù ÇØ ÁÖÁö¸¸ API´Â ÆùÆ®ÀÇ ¸ðµç Á¤º¸¸¦ ´Ù ¹àÇô¾ß ÇÑ´Ù. ¾î¶² ÆùÆ®°¡ ÀÖ´ÂÁö °í¸£±âµµ ½±Áö ¾Ê°í ÆùÆ®ÀÇ ¼Ó¼ºÀ» ÀÏÀÏÀÌ Á¶»çÇÒ ¼öµµ ¾ø¾î ¿­°ÅÇØ ºÁ¾ß¸¸ Äڵ带 ÀÛ¼ºÇÒ ¼ö ÀÖ´Ù. ±âÁ¸¿¡ ÀÌ¹Ì ¸¸µé¾î µÎ¾ú´ø À¯Æ¿¸®Æ¼¸¦ ƼÁ¬À¸·Î Æ÷ÇÔ½ÃÄ×´Ù. ¸ÕÀú ´ÙÀ½ ÇÔ¼ö¸¦ Util¿¡ ¼±¾ðÇÑ´Ù.

 

void CopyClipboardText(LPCTSTR content)

{

       HGLOBAL hmem;

       TCHAR* ptr;

 

       hmem = GlobalAlloc(GHND, (lstrlen(content) + 1) * sizeof(TCHAR));

       ptr = (TCHAR*)GlobalLock(hmem);

       memcpy(ptr, content, (lstrlen(content) + 1) * sizeof(TCHAR));

       GlobalUnlock(hmem);

       if (OpenClipboard(mainWindow.win_hWnd)) {

                  EmptyClipboard();

                  SetClipboardData(CF_UNICODETEXT, hmem);

                  CloseClipboard();

       } else {

                  GlobalFree(hmem);

       }

}

 

¹®ÀÚ¿­À» Àμö·Î ¹Þ¾Æ Ŭ¸³º¸µå·Î º¹»çÇÏ´Â ÇÔ¼öÀÌ´Ù. ¾Õ¼­ »ö»óÇ¥¿Í TextClip¿¡¼­ ÀÌ¹Ì »ç¿ëÇÑ ÀûÀÌ Àִµ¥ ¾ÕÀ¸·Îµµ Á¾Á¾ »ç¿ëÇÒ °Í °°¾Æ ¾Æ¿¹ ÇÔ¼ö·Î µû·Î ¸¸µé¾ú´Ù. ÀÌ¹Ì ¸¸µé¾î µÐ °Íµµ ÀÌ ÇÔ¼ö¸¦ È£ÃâÇϵµ·Ï ¹Ù²Ù´Â°Ô ÁÁÁö¸¸ °­Á ¿ø°í¸¦ ´Ù½Ã ¾²±â ¹ø°Å·Î¿ö ´ÙÀ½ °­Á¸¦ ¾µ ¶§ ¹Ù²Ù±â·Î ÇÑ´Ù. ´ÙÀ½ µÎ Ŭ·¡½º¸¦ ¼±¾ðÇÑ´Ù.

 

class CEnumFont : public CTidget

{

public:

    HBITMAP icon;

 

    LRESULT OnCreate(WPARAM wParam, LPARAM lParam);

    LRESULT OnDestroy(WPARAM wParam, LPARAM lParam);

    void OnDraw(HDC hdc, int width, int height);

    void OnClick();

};

 

class CEnumFontWin : public CWindow

{

public:

    HWND hList, hChkAt, hChkSort, hStNum, hBtnApi, hEdApi, hBtnMfc, hEdMfc;

    enum { EF_LIST, EF_AT, EF_SORT, EF_NUM, EF_API, EF_EDAPI, EF_MFC, EF_EDMFC };

    static const int MAXFONT = 1000;

    LOGFONT arFont[CEnumFontWin::MAXFONT];

    int arFontType[CEnumFontWin::MAXFONT];

    int numFont;  // ¹ß°ßµÈ ÆùÆ®¼ö

    int nowFont;  // ÇöÀç ÆùÆ®

    bool includeAt;  // @ ÆùÆ® Æ÷ÇÔ ¿©ºÎ

 

    LRESULT OnMessage(UINT iMessage, WPARAM wParam, LPARAM lParam);

    LRESULT OnCreate(WPARAM wParam, LPARAM lParam);

    LRESULT OnDestroy(WPARAM wParam, LPARAM lParam);

    void OnDraw(HDC hdc, int width, int height);

    LRESULT OnCommand(WPARAM wParam, LPARAM lParam);

 

    void EnumFont();

    static int CALLBACK EnumFamCallBack(ENUMLOGFONT FAR* lpelf,

        NEWTEXTMETRIC FAR* lpntm, int FontType, LPARAM lParam);

    static int compareFace(const void* a, const void* b);

    void GetCharSetStr(int CharSet, TCHAR* str);

    void GetPitchFamStr(int Pitch, TCHAR* str);

    void SetCreateFontCommand();

};

 

ƼÁ¬Àº ¾ÆÀÌÄÜ Å¬¸¯¸¸ ¹Þ¾Æ âÀ» ¶ç¿ö Áֱ⸸ ÇÑ´Ù. ¿­°ÅâÀº ¿É¼Çµµ Á» ÀÖ°í ÆùÆ® Á¤º¸¸¦ Á¶»ç ¹× Á¶¸³ÇÏ´Â ÇÔ¼öµµ ¿©·¯ °³ ÀÛ¼ºµÇ¾î ÀÖ´Ù.

 

LRESULT CEnumFont::OnCreate(WPARAM wParam, LPARAM lParam)

{

    icon = LoadBitmap(g_hInst, MAKEINTRESOURCE(IDB_ENUMFONT));

    return 0;

}

 

LRESULT CEnumFont::OnDestroy(WPARAM wParam, LPARAM lParam)

{

    DeleteObject(icon);

    return 0;

}

 

void CEnumFont::OnDraw(HDC hdc, int width, int height) {

    int wh = trayWindow.tidgetSize;

    StretchBitmap(hdc, 0, 0, wh, wh, icon);

}

 

void CEnumFont::OnClick() {

    CEnumFontWin* pWin = new CEnumFontWin();

 

    CreateWindow(TEXT("CWindow"), L"ÆùÆ® ¿­°Å",

        WS_OVERLAPPED | WS_SYSMENU | WS_BORDER | WS_CAPTION | WS_VISIBLE | WS_CLIPCHILDREN,

        100, 100, 900, 800,

        NULL, (HMENU)NULL, g_hInst, pWin);

}

 

LRESULT CEnumFontWin::OnMessage(UINT iMessage, WPARAM wParam, LPARAM lParam)

{

    HFONT hFont, oldFont;

    LPMEASUREITEMSTRUCT lpmis;

    LPDRAWITEMSTRUCT lpdis;

    HBRUSH bkBrush;

    LOGFONT tmpFont;

 

    switch (iMessage)

    {

    case WM_MEASUREITEM:

        lpmis = (LPMEASUREITEMSTRUCT)lParam;

        lpmis->itemHeight = 30;

        return 0;

    case WM_DRAWITEM:

        lpdis = (LPDRAWITEMSTRUCT)lParam;

 

        // ¼±ÅÃµÈ Ç׸ñÀº ÆĶõ ¹è°æ¿¡ Èò»öÀ¸·Î Ãâ·ÂÇÑ´Ù.

        if (lpdis->itemState & ODS_SELECTED) {

           bkBrush = GetSysColorBrush(COLOR_HIGHLIGHT);

           SetBkColor(lpdis->hDC, GetSysColor(COLOR_HIGHLIGHT));

           SetTextColor(lpdis->hDC, GetSysColor(COLOR_WINDOW));

        } else {

           bkBrush = GetSysColorBrush(COLOR_WINDOW);

           SetBkColor(lpdis->hDC, GetSysColor(COLOR_WINDOW));

           SetTextColor(lpdis->hDC, GetSysColor(COLOR_WINDOWTEXT));

        }

        FillRect(lpdis->hDC, &lpdis->rcItem, bkBrush);

 

        // 25 Çȼ¿ ³ôÀÌ·Î ±Û²Ã À̸§À» Ãâ·ÂÇÑ´Ù.

        tmpFont = arFont[lpdis->itemID];

        tmpFont.lfHeight = 25;

        tmpFont.lfWidth = 0;

        hFont = CreateFontIndirect(&tmpFont);

        oldFont = (HFONT)SelectObject(lpdis->hDC, hFont);

 

        TextOutSz(lpdis->hDC, lpdis->rcItem.left + 5, lpdis->rcItem.top + 2,

           arFont[lpdis->itemID].lfFaceName);

        SelectObject(lpdis->hDC, oldFont);

        DeleteObject(hFont);

        return 0;

    }

 

    return CWindow::OnMessage(iMessage, wParam, lParam);

}

 

LRESULT CEnumFontWin::OnCreate(WPARAM wParam, LPARAM lParam)

{

    int left, top;

    left = setting.get(L"EnumFont", L"left", 100);

    top = setting.get(L"EnumFont", L"top", 100);

    SetWindowPos(win_hWnd, NULL, left, top, 0, 0, SWP_NOZORDER | SWP_NOSIZE);

    EnsureVisible(win_hWnd);

 

    SetBackColor(GetSysColor(COLOR_BTNFACE));

    hList = CreateWindowEx(WS_EX_CLIENTEDGE, TEXT("listbox"), NULL,

        WS_CHILD | WS_VISIBLE | WS_VSCROLL | LBS_NOTIFY | LBS_OWNERDRAWFIXED,

        10, 10, 280, 550, win_hWnd, (HMENU)EF_LIST, g_hInst, NULL);

    hChkAt = CreateWindow(TEXT("button"), TEXT("@ ÆùÆ® Æ÷ÇÔ"), WS_CHILD | WS_VISIBLE |

        BS_AUTOCHECKBOX, 10, 570, 120, 25, win_hWnd, (HMENU)EF_AT, g_hInst, NULL);

    hChkSort = CreateWindow(TEXT("button"), TEXT("ÆùÆ®¸í Á¤·Ä"), WS_CHILD | WS_VISIBLE |

        BS_AUTOCHECKBOX, 10, 600, 120, 25, win_hWnd, (HMENU)EF_SORT, g_hInst, NULL);

    hStNum = CreateWindow(TEXT("static"), TEXT("¹ß°ßµÈ ÆùÆ®"), WS_CHILD | WS_VISIBLE,

        10, 630, 120, 25, win_hWnd, (HMENU)EF_NUM, g_hInst, NULL);

    hBtnApi = CreateWindow(TEXT("button"), TEXT("API ÄÚµå º¹»ç"), WS_CHILD | WS_VISIBLE |

        BS_PUSHBUTTON, 300, 450, 120, 30, win_hWnd, (HMENU)EF_API, g_hInst, NULL);

    hEdApi = CreateWindowEx(WS_EX_CLIENTEDGE, TEXT("edit"), NULL,

        WS_CHILD | WS_VISIBLE | WS_BORDER |   ES_AUTOHSCROLL | ES_MULTILINE,

        300, 490, 580, 60, win_hWnd, (HMENU)EF_EDAPI, g_hInst, NULL);

    SendMessage(hEdApi, WM_SETFONT, (WPARAM)mainFont[1], MAKELPARAM(FALSE, 0));

    hBtnMfc = CreateWindow(TEXT("button"), TEXT("MFC ÄÚµå º¹»ç"), WS_CHILD | WS_VISIBLE |

        BS_PUSHBUTTON, 300, 560, 120, 30, win_hWnd, (HMENU)EF_MFC, g_hInst, NULL);

    hEdMfc = CreateWindowEx(WS_EX_CLIENTEDGE, TEXT("edit"), NULL,

        WS_CHILD | WS_VISIBLE | WS_BORDER | ES_AUTOHSCROLL | ES_MULTILINE,

        300, 590, 580, 60, win_hWnd, (HMENU)EF_EDMFC, g_hInst, NULL);

    SendMessage(hEdMfc, WM_SETFONT, (WPARAM)mainFont[1], MAKELPARAM(FALSE, 0));

 

    SendMessage(hChkSort, BM_SETCHECK, BST_CHECKED, 0);

    EnumFont();

 

    return 0;

}

 

LRESULT CEnumFontWin::OnDestroy(WPARAM wParam, LPARAM lParam)

{

    RECT wrt;

    GetWindowRect(win_hWnd, &wrt);

    setting.set(L"EnumFont", L"left", wrt.left);

    setting.set(L"EnumFont", L"top", wrt.top);

 

    return 0;

}

 

void CEnumFontWin::OnDraw(HDC hdc, int width, int height)

{

    int TabPos[] = { 250 };

    TCHAR str[256], str2[128];

    HFONT hFont, oldFont;

 

    SetBkMode(hdc, TRANSPARENT);

 

    wsprintf(str, L"Height\t: %d", arFont[nowFont].lfHeight);

    TabbedTextOut(hdc, 300, 20, str, lstrlen(str), 1, TabPos, 0);

 

    wsprintf(str, L"Width\t: %d", arFont[nowFont].lfWidth);

    TabbedTextOut(hdc, 300, 40, str, lstrlen(str), 1, TabPos, 0);

 

    wsprintf(str, L"Escapement\t: %d", arFont[nowFont].lfEscapement);

    TabbedTextOut(hdc, 300, 60, str, lstrlen(str), 1, TabPos, 0);

 

    wsprintf(str, L"Orientation\t: %d", arFont[nowFont].lfOrientation);

    TabbedTextOut(hdc, 300, 80, str, lstrlen(str), 1, TabPos, 0);

 

    wsprintf(str, L"Weight\t: %d", arFont[nowFont].lfWeight);

    TabbedTextOut(hdc, 300, 100, str, lstrlen(str), 1, TabPos, 0);

 

    wsprintf(str, L"Italic\t: %s", arFont[nowFont].lfItalic ? L"TRUE" : L"FALSE");

    TabbedTextOut(hdc, 300, 120, str, lstrlen(str), 1, TabPos, 0);

 

    wsprintf(str, L"Underline\t: %s", arFont[nowFont].lfUnderline ? L"TRUE" : L"FALSE");

    TabbedTextOut(hdc, 300, 140, str, lstrlen(str), 1, TabPos, 0);

 

    wsprintf(str, L"StrikeOut\t: %s", arFont[nowFont].lfStrikeOut ? L"TRUE" : L"FALSE");

    TabbedTextOut(hdc, 300, 160, str, lstrlen(str), 1, TabPos, 0);

 

    GetCharSetStr(arFont[nowFont].lfCharSet, str2);

    wsprintf(str, L"CharSet\t: %s", str2);

    TabbedTextOut(hdc, 300, 180, str, lstrlen(str), 1, TabPos, 0);

 

    wsprintf(str, L"OutPrecision\t: %d", arFont[nowFont].lfOutPrecision);

    TabbedTextOut(hdc, 300, 200, str, lstrlen(str), 1, TabPos, 0);

 

    wsprintf(str, L"ClipPrecision\t: %d", arFont[nowFont].lfClipPrecision);

    TabbedTextOut(hdc, 300, 220, str, lstrlen(str), 1, TabPos, 0);

 

    wsprintf(str, L"Quality\t: %d", arFont[nowFont].lfQuality);

    TabbedTextOut(hdc, 300, 240, str, lstrlen(str), 1, TabPos, 0);

 

    GetPitchFamStr(arFont[nowFont].lfPitchAndFamily, str2);

    wsprintf(str, L"PitchAndFamily\t: %s", str2);

    TabbedTextOut(hdc, 300, 260, str, lstrlen(str), 1, TabPos, 0);

 

    wsprintf(str, L"FaceName\t: %s", arFont[nowFont].lfFaceName);

    TabbedTextOut(hdc, 300, 280, str, lstrlen(str), 1, TabPos, 0);

 

    // ÆùÆ®ÀÇ Å¸ÀÔÀ» Ãâ·ÂÇÑ´Ù. ÀÌ °ªÀº LOGFONT ±¸Á¶Ã¼¿¡´Â ¾ø´Ù.

    switch (arFontType[nowFont]) {

    case 1:

        wsprintf(str, L"FontType\t: RASTER_FONTTYPE");

        break;

    case 2:

        wsprintf(str, L"FontType\t: DEVICE_FONTTYPE");

        break;

    case 4:

        wsprintf(str, L"FontType\t: TRUETYPE_FONTTYPE");

        break;

    default:

        wsprintf(str, L"FontType\t: UnKnown(%d)", arFontType[nowFont]);

    }

    TabbedTextOut(hdc, 300, 300, str, lstrlen(str), 1, TabPos, 0);

 

    // ÆùÆ® »ùÇÃÀ» Ãâ·ÂÇÑ´Ù.

    lstrcpy(str, L"English ÇÑ±Û 1234!@#$");

    hFont = CreateFontIndirect(&arFont[nowFont]);

    oldFont = (HFONT)SelectObject(hdc, hFont);

    TextOutSz(hdc, 300, 340, str);

    SelectObject(hdc, oldFont);

    DeleteObject(hFont);

}

 

LRESULT CEnumFontWin::OnCommand(WPARAM wParam, LPARAM lParam)

{

    TCHAR content[1024];

 

    switch (LOWORD(wParam)) {

    case EF_AT:

    case EF_SORT:

        EnumFont();

        break;

    case EF_LIST:

        switch (HIWORD(wParam)) {

        case LBN_SELCHANGE:

            nowFont = SendMessage(hList, LB_GETCURSEL, 0, 0);

           SetCreateFontCommand();

           InvalidateRect(win_hWnd, NULL, TRUE);

           break;

        }

        break;

    case EF_API:

        GetWindowText(hEdApi, content, 1024);

        CopyClipboardText(content);

        break;

    case EF_MFC:

        GetWindowText(hEdMfc, content, 1024);

        CopyClipboardText(content);

        break;

    }

   

    return 0;

}

 

void CEnumFontWin::EnumFont()

{

    HDC hdc;

    int i;

 

    numFont = 0;

    nowFont = -1;

    includeAt = (SendMessage(hChkAt, BM_GETCHECK, 0, 0) == BST_CHECKED);

    hdc = GetDC(mainWindow.win_hWnd);

    EnumFontFamilies(hdc, NULL, (FONTENUMPROC)EnumFamCallBack, (LPARAM)this);

    ReleaseDC(mainWindow.win_hWnd, hdc);

 

    if (SendMessage(hChkSort, BM_GETCHECK, 0, 0) == BST_CHECKED) {

        qsort(&arFont[0], numFont, sizeof(LOGFONT), CEnumFontWin::compareFace);

    }

 

    // ¹ß°ßµÈ ¸ðµç ÆùÆ®ÀÇ Å¸ÀÔ ÆäÀ̽º¸¦ ¸®½ºÆ® ¹Ú½º¿¡ Ãâ·ÂÇÑ´Ù.

    SendMessage(hList, LB_RESETCONTENT, 0, 0);

    for (i = 0; i < numFont; i++) {

        SendMessage(hList, LB_ADDSTRING, 0, (LPARAM)arFont[i].lfFaceName);

    }

 

    TCHAR szNum[111];

    wsprintf(szNum, L"¹ß°ßµÈ ÆùÆ® : %d", numFont);

    SetWindowText(hStNum, szNum);

 

    nowFont = 0;

    SendMessage(hList, LB_SETCURSEL, nowFont, 0);

    SendMessage(win_hWnd, WM_COMMAND, MAKEWPARAM(EF_LIST, LBN_SELCHANGE), (LPARAM)hList);

    InvalidateRect(win_hWnd, NULL, TRUE);

}

 

int CALLBACK CEnumFontWin::EnumFamCallBack(ENUMLOGFONT FAR* lpelf,

    NEWTEXTMETRIC FAR* lpntm, int FontType, LPARAM lParam)

{

    CEnumFontWin* pWin = (CEnumFontWin*)lParam;

 

    if (pWin->includeAt == false && _tcsrchr(lpelf->elfLogFont.lfFaceName, '@') != nullptr) {

        return TRUE;

    }

 

    if (pWin->numFont < CEnumFontWin::MAXFONT) {

        pWin->arFont[pWin->numFont] = lpelf->elfLogFont;

        pWin->arFontType[pWin->numFont] = FontType;

        pWin->numFont++;

        return TRUE;

    } else {

        return FALSE;

    }

}

 

int CEnumFontWin::compareFace(const void* a, const void* b)

{

    LOGFONT* aFont = (LOGFONT*)a;

    LOGFONT* bFont = (LOGFONT*)b;

 

    return lstrcmp(aFont->lfFaceName, bFont->lfFaceName);

}

 

void CEnumFontWin::GetCharSetStr(int CharSet, TCHAR* str)

{

    switch (CharSet) {

    case 0:lstrcpy(str, L"ANSI_CHARSET"); break;

    case 1:lstrcpy(str, L"DEFAULT_CHARSET"); break;

    case 2:lstrcpy(str, L"SYMBOL_CHARSET"); break;

    case 128:lstrcpy(str, L"SHIFTJIS_CHARSET"); break;

    case 129:lstrcpy(str, L"HANGUL_CHARSET"); break;

    case 136:lstrcpy(str, L"CHINESEBIG5_CHARSET"); break;

    case 255:lstrcpy(str, L"OEM_CHARSET"); break;

    case 130:lstrcpy(str, L"JOHAB_CHARSET"); break;

    case 177:lstrcpy(str, L"HEBREW_CHARSET"); break;

    case 178:lstrcpy(str, L"ARABIC_CHARSET"); break;

    case 161:lstrcpy(str, L"GREEK_CHARSET"); break;

    case 162:lstrcpy(str, L"TURKISH_CHARSET"); break;

    case 163:lstrcpy(str, L"VIETNAMESE_CHARSET"); break;

    case 222:lstrcpy(str, L"THAI_CHARSET"); break;

    case 238:lstrcpy(str, L"EASTEUROPE_CHARSET"); break;

    case 204:lstrcpy(str, L"RUSSIAN_CHARSET"); break;

    case 77:lstrcpy(str, L"MAC_CHARSET"); break;

    case 186:lstrcpy(str, L"BALTIC_CHARSET"); break;

    default:lstrcpy(str, L"Etc"); break;

    }

}

 

void CEnumFontWin::GetPitchFamStr(int Pitch, TCHAR* str)

{

    switch (Pitch & 0x0f) {

    case 0:lstrcpy(str, L"DEFAULT_PITCH");

        break;

    case 1:lstrcpy(str, L"FIXED_PITCH");

        break;

    case 2:lstrcpy(str, L"VARIABLE_PITCH");

        break;

    default:lstrcpy(str, L"Etc");

    }

    switch (Pitch & 0xf0) {

    case 0x00:lstrcat(str, L" | FF_DONTCARE");

        break;

    case 0x10:lstrcat(str, L" | FF_ROMAN");

        break;

    case 0x20:lstrcat(str, L" | FF_SWISS");

        break;

    case 0x30:lstrcat(str, L" | FF_MODERN");

        break;

    case 0x40:lstrcat(str, L" | FF_SCRIPT");

        break;

    case 0x50:lstrcat(str, L" | FF_DECORATIVE");

        break;

    }

}

 

void CEnumFontWin::SetCreateFontCommand()

{

    TCHAR Argu[128];

    TCHAR Api[1024];

    TCHAR Mfc[1024];

    TCHAR CharSetStr[32];

    TCHAR PitchFamStr[32];

 

    GetCharSetStr(arFont[nowFont].lfCharSet, CharSetStr);

    GetPitchFamStr(arFont[nowFont].lfPitchAndFamily, PitchFamStr);

    wsprintf(Argu, L"(%d,0,0,0,0,0,0,0,%s,3,2,1,\r\n\t%s,TEXT(\"%s\"));",

        arFont[nowFont].lfHeight, CharSetStr, PitchFamStr, arFont[nowFont].lfFaceName);

 

    wsprintf(Api, L"hFont = CreateFont(%d,0,0,0,0,0,0,0,%s,3,2,1,"

        "\r\n\t%s,TEXT(\"%s\"));",

        arFont[nowFont].lfHeight, CharSetStr, PitchFamStr, arFont[nowFont].lfFaceName);

    wsprintf(Api, L"hFont=CreateFont%s", Argu);

    SetWindowText(hEdApi, Api);

    wsprintf(Mfc, L"Font.CreateFont%s\r\n", Argu);

    SetWindowText(hEdMfc, Mfc);

}

 

¸®½ºÆ® ¹Ú½º¿¡ ¿À³Êµå·Î¿ì·Î ÆùÆ® ¸ð¾çÀ» Á÷Á¢ ±×·Á ¼±ÅÃÇϱ⠽±µµ·Ï Çß´Ù. °¡·Î “‡ÇâÀÇ @ ÆùÆ®´Â ½ÇÁ¦·Î´Â °ÅÀÇ ¾²Áö ¾Ê´Â´Ù. ºñ½ÁÇÑ ÆùÆ®°¡ µÎ ¹ú¾¿ ÀÖ¾î ¸ñ·ÏÀÌ È¥ÀâÇØ º¸¿© µðÆúÆ®·Î Á¦¿ÜÇß´Ù. ¹°·Ð ²À ¿øÇÏ´Â Æ÷ÇÔÇؼ­ ´Ù½Ã ¿­°ÅÇÒ ¼ö ÀÖ´Ù. ÆùÆ® À̸§À¸·Î Á¤·ÄÇÏ´Â °ÍÀÌ Ã£±â ½±µÇ ½Ã½ºÅÛ¿¡ µî·ÏÇÑ ¼ø¼­´ë·Î º¸°í ½Í´Ù¸é Á¤·ÄÇÏÁö ¸»¾Æ¾ß ÇÑ´Ù.

ÆùÆ®¸¦ ¼±ÅÃÇϸé Á¤º¸¸¦ Á¶¸³ÇÏ¿© º¸¿© ÁÖµÇ ¼ýÀÚ·Î µÈ ¼Ó¼º°ªÀ» ¹®ÀÚ¿­ ÇüÅ·Π¹Ù²ã¼­ º¸¿© ÁÖ´Ù º¸´Ï Äڵ尡 ±æ´Ù. ´Ü¼øÇÑ ¸ÊÇι®ÀÌ´Ù. API¿Í MFCÀÇ ÆùÆ® »ý¼º ¸í·ÉÀ» º¸¿© ÁÖ°í Ŭ¸³º¸µå·Î º¹»çÇØ ÁØ´Ù. ¸¸µé°í ½ÍÀº ÆùÆ®¸¦ ¼±ÅÃÇؼ­ ÄÚµå ºÙ¿© ³ÖÀ¸¸é ¹Ù·Î »ý¼ºÇÒ ¼ö ÀÖ´Ù.

ÀÌ Á¤µµ¸é ÆùÆ®¸¦ °ñ¶ó ¾²´Âµ¥ º° ºÒÆíÇÔÀº ¾øÀ» °Í °°´Ù. ÇÊ¿äÇÒ ¶§ Àá±ñ ¿­¾î¼­ ÆùÆ® ¼±ÅÃÇÏ°í Äڵ常 ½ï »©³»¿À´Â ½ÄÀ¸·Î È°¿ëÇÏ¸é µÈ´Ù.

Spy

½ºÆÄÀÌ´Â ½Ã½ºÅÛ °³¹ßÀÚ¿¡°Ô ²À ÇÊ¿äÇÑ À¯Æ¿¸®Æ¼ÀÌ´Ù. ºñÁÖ¾ó ½ºÆ©µð¿À¿¡µµ Æ÷ÇԵǾî ÀÖÁö¸¸ ¸Þ´º¿¡ µî·ÏµÇ¾î ÀÖÁö ¾Ê°í Á÷Á¢ Ž»ö±â¸¦ µÚÁ®¾ß ½ÇÇàÇÒ ¼ö ÀÖ¾î Á¢±Ù¼ºÀÌ ¶³¾îÁø´Ù. ¶Ç ±â´ÉÀÌ ¿ö³« ¸¹¾Æ »ç¿ë ¹æ¹ýµµ ±×¸® °£´ÜÇÏÁö ¾Ê´Ù. ½ºÆÄÀÌÀÇ ±â´ÉÁß ²À ÇÊ¿äÇÑ ±â´É¸¸ Ãß·Á ƼÁ¬À¸·Î Á¤ÀÇÇß´Ù.

 

class CSpy : public CTidget

{

public:

    HBITMAP icon;

 

    LRESULT OnCreate(WPARAM wParam, LPARAM lParam);

    LRESULT OnDestroy(WPARAM wParam, LPARAM lParam);

    void OnDraw(HDC hdc, int width, int height);

    void OnClick();

};

 

class CSpyWin : public CWindow

{

public:

    int TimerInterval;

    HWND hWndOld;

    HWND hEditInfo, hChkPause, hEditHier;

    enum { SPY_INFO, SPY_PAUSE, SPY_HIER };

 

    LRESULT OnMessage(UINT iMessage, WPARAM wParam, LPARAM lParam);

    LRESULT OnCreate(WPARAM wParam, LPARAM lParam);

    LRESULT OnDestroy(WPARAM wParam, LPARAM lParam);

    LRESULT OnTimer(WPARAM wParam, LPARAM lParam);

 

    void GetStyleString(DWORD dwStyle, TCHAR* sStyle);

    void GetExStyleString(DWORD dwExStyle, TCHAR* sExStyle);

    static BOOL CALLBACK EnumChildProc(_In_ HWND hwnd, _In_ LPARAM lParam);

};

 

ƼÁ¬Àº âÀ» ºÒ·¯ Áֱ⸸ ÇÏ°í Á¤º¸´Â º°µµÀÇ Ã¢À» ¿­¾î º¸¿© ÁØ´Ù. À©µµ¿ì Á¤º¸ÀÇ ¾çÀÌ ¸¹°í °¡º¯ÀûÀ̾ ¿¹»ó¿Ü·Î ³ÐÁ÷ÇÑ Ã¢ÀÌ ÇÊ¿äÇÏ´Ù. ´ë»ó À©µµ¿ì¸¦ ¼±ÅÃÇÏ´Â µ¿ÀÛÀº ÇÊ¿ä ¾ø°í ŸÀ̸Ӹ¦ µ¹¸®¸ç Ä¿¼­ ¹Ù·Î ¾Æ·¡ÀÇ À©µµ¿ì¿¡ ´ëÇÑ Á¤º¸¸¦ Ãâ·ÂÇÑ´Ù.

 

LRESULT CSpy::OnCreate(WPARAM wParam, LPARAM lParam)

{

    icon = LoadBitmap(g_hInst, MAKEINTRESOURCE(IDB_SPY));

    return 0;

}

 

LRESULT CSpy::OnDestroy(WPARAM wParam, LPARAM lParam)

{

    DeleteObject(icon);

    return 0;

}

 

void CSpy::OnDraw(HDC hdc, int width, int height) {

    int wh = trayWindow.tidgetSize;

    StretchBitmap(hdc, 0, 0, wh, wh, icon);

}

 

void CSpy::OnClick() {

    CSpyWin* pWin = new CSpyWin();

 

    CreateWindow(TEXT("CWindow"), L"Spy",

        WS_OVERLAPPED | WS_SYSMENU | WS_BORDER | WS_CAPTION | WS_VISIBLE | WS_CLIPCHILDREN,

        100, 100, 635, 650,

        NULL, (HMENU)NULL, g_hInst, pWin);

}

 

LRESULT CSpyWin::OnMessage(UINT iMessage, WPARAM wParam, LPARAM lParam)

{

    switch (iMessage)

    {

    case 0:

        return 0;

    }

 

    return CWindow::OnMessage(iMessage, wParam, lParam);

}

 

LRESULT CSpyWin::OnCreate(WPARAM wParam, LPARAM lParam)

{

    int left, top;

    left = setting.get(L"Spy", L"left", 100);

    top = setting.get(L"Spy", L"top", 100);

    SetWindowPos(win_hWnd, NULL, left, top, 0, 0, SWP_NOZORDER | SWP_NOSIZE);

    EnsureVisible(win_hWnd);

 

    SetBackColor(GetSysColor(COLOR_BTNFACE));

    CreateWindow(TEXT("static"), TEXT("À©µµ¿ì Á¤º¸"), WS_CHILD | WS_VISIBLE,

        10, 10, 300, 25, win_hWnd, (HMENU)-1, g_hInst, NULL);

    hChkPause = CreateWindow(TEXT("button"), TEXT("ÀϽà Á¤Áö"), WS_CHILD | WS_VISIBLE |

        BS_AUTOCHECKBOX, 510, 10, 100, 25, win_hWnd, (HMENU)SPY_PAUSE, g_hInst, NULL);

    hEditInfo = CreateWindowEx(WS_EX_CLIENTEDGE, TEXT("edit"), NULL,

        WS_CHILD | WS_VISIBLE | WS_BORDER | ES_MULTILINE | WS_VSCROLL,

        10, 40, 600, 250, win_hWnd, (HMENU)SPY_INFO, g_hInst, NULL);

    SendMessage(hEditInfo, WM_SETFONT, (WPARAM)mainFont[1], MAKELPARAM(FALSE, 0));

    CreateWindow(TEXT("static"), TEXT("À©µµ¿ì °èÃþ"), WS_CHILD | WS_VISIBLE,

        10, 310, 300, 25, win_hWnd, (HMENU)-1, g_hInst, NULL);

    hEditHier = CreateWindowEx(WS_EX_CLIENTEDGE, TEXT("edit"), NULL,

        WS_CHILD | WS_VISIBLE | WS_BORDER | ES_MULTILINE | WS_VSCROLL,

        10, 340, 600, 250, win_hWnd, (HMENU)SPY_HIER, g_hInst, NULL);

    SendMessage(hEditHier, WM_SETFONT, (WPARAM)mainFont[1], MAKELPARAM(FALSE, 0));

 

    // 1ÃÊ¿¡ Çѹø Á¶»çÇ쵂 Â÷ÈÄ »ç¿ëÀÚ°¡ ¼±ÅÃÇÒ ¼ö ÀÖµµ·Ï ¿É¼ÇÈ­

    TimerInterval = 1000;

    SetTimer(win_hWnd, 1, TimerInterval, NULL);

    SendMessage(win_hWnd, WM_TIMER, 1, 0);

    return 0;

}

 

LRESULT CSpyWin::OnDestroy(WPARAM wParam, LPARAM lParam)

{

    RECT wrt;

    GetWindowRect(win_hWnd, &wrt);

    setting.set(L"Spy", L"left", wrt.left);

    setting.set(L"Spy", L"top", wrt.top);

 

    KillTimer(win_hWnd, 1);

    return 0;

}

 

LRESULT CSpyWin::OnTimer(WPARAM wParam, LPARAM lParam)

{

    POINT pt;

    RECT wrt, crt;

    HWND hWndPoint;

    HWND hWndParent;

    DWORD dwStyle, dwExStyle;

    TCHAR sCaption[256], sClass[256];

    TCHAR sStyle[256], sExStyle[256];

    TCHAR sLine[256];

    TCHAR sText[1024];

 

    GetCursorPos(&pt);

    GetWindowRect(win_hWnd, &wrt);

    hWndPoint = WindowFromPoint(pt);

    bool pause = (SendMessage(hChkPause, BM_GETCHECK, 0, 0) == BST_CHECKED);

 

    // ÀÌ À©µµ¿ì ¾ÈÀ̰ųª ÀÌÀü À©µµ¿ì¿Í °°°Å³ª ÀϽà Á¤Áö »óÅÂÀ̸é¸é Á¤º¸¸¦ °»½ÅÇÏÁö ¾Ê´Â´Ù.

    if (PtInRect(&wrt, pt) || hWndPoint == hWndOld || pause) {

        return 0;

    }

    hWndOld = hWndPoint;

 

    if (hWndPoint == NULL) {

        lstrcpy(sText, TEXT("À©µµ¿ì°¡ ¾øÀ½. µ¥½ºÅ©Å¾À» °¡¸®Å°´Â °æ¿ìÀÓ"));

    } else {

        GetWindowText(hWndPoint, sCaption, 256);

        GetClassName(hWndPoint, sClass, 256);

        hWndParent = GetParent(hWndPoint);

        GetWindowRect(hWndPoint, &crt);

        dwStyle = GetWindowLong(hWndPoint, GWL_STYLE);

        GetStyleString(dwStyle, sStyle);

        dwExStyle = GetWindowLong(hWndPoint, GWL_EXSTYLE);

        GetExStyleString(dwExStyle, sExStyle);

 

        wsprintf(sText,

           TEXT("ÇÚµé : %d(0x%x)\r\n")

           TEXT("Ŭ·¡½º : %s\r\n")

           TEXT("ĸ¼Ç : %s\r\n")

           TEXT("ºÎ¸ð : %d(0x%x)\r\n")

           TEXT("¿µ¿ª : (%d,%d) - (%d,%d), %d*%d\r\n")

           TEXT("½ºÅ¸ÀÏ : 0X%X\r\n    %s\r\n")

           TEXT("È®Àå ½ºÅ¸ÀÏ : 0X%X\r\n    %s\r\n"),

           (int)hWndPoint, (int)hWndPoint, sClass, sCaption, (int)hWndParent, (int)hWndParent,

           crt.left, crt.top, crt.right, crt.bottom,

           crt.right - crt.left, crt.bottom - crt.top,

           dwStyle, sStyle, dwExStyle, sExStyle);

    }

    SetWindowText(hEditInfo, sText);

 

    // todo : À©µµ¿ì °èÃþÀ» ±×·¡ÇÈÀ¸·Î º¸¿© ÁÖ°í °èÃþ ³»ÀÇ ´Ù¸¥ À©µµ¿ì Á¤º¸ Á¶»ç ±â´É ÀÛ¼º

    wstring ancestor = L"";

    HWND hwnd = hWndPoint;

    for (;;) {

        hwnd = GetParent(hwnd);

        if (hwnd == NULL) {

           HWND hdesk = GetDesktopWindow();

           lstrcpy(sCaption, L"Desktop");

           GetWindowRect(hdesk, &crt);

        } else {

           GetWindowText(hwnd, sCaption, 256);

           GetWindowRect(hwnd, &crt);

        }

        wsprintf(sLine, L"%d(%s) (%d,%d) - (%d,%d), %d*%d\r\n",

           (int)hwnd, sCaption,

           crt.left, crt.top, crt.right, crt.bottom,

           crt.right - crt.left, crt.bottom - crt.top

           );

        ancestor = sLine + ancestor;

        if (hwnd == NULL) break;

    }

 

    wstring childs = L"";

    EnumChildWindows(hWndPoint, EnumChildProc, (LPARAM)&childs);

 

    ancestor = L"Á¶»ó °èÃþ\r\n" + ancestor + L"\r\nÀÚ½Ä ¸ñ·Ï\r\n" + childs;

    SetWindowText(hEditHier, ancestor.c_str());

 

    return 0;

}

 

#define TEST(n) (dwStyle & (1 << n))

void CSpyWin::GetStyleString(DWORD dwStyle, TCHAR* sStyle)

{

    if (TEST(31)) lstrcpy(sStyle, TEXT("POPUP"));

    else if (TEST(30)) lstrcpy(sStyle, TEXT("CHILD"));

    else lstrcpy(sStyle, TEXT("OVERLAPPED"));

 

    if (TEST(29)) lstrcat(sStyle, TEXT(" | MINIMIZE"));

    if (TEST(28)) lstrcat(sStyle, TEXT(" | VISIBLE"));

    if (TEST(27)) lstrcat(sStyle, TEXT(" | DISABLED"));

    if (TEST(26)) lstrcat(sStyle, TEXT(" | CLIPSIBLINGS"));

    if (TEST(25)) lstrcat(sStyle, TEXT(" | CLIPCHILDREN"));

    if (TEST(24)) lstrcat(sStyle, TEXT(" | MAXIMIZE"));

    if (TEST(23)) lstrcat(sStyle, TEXT(" | BORDER"));

    if (TEST(22)) lstrcat(sStyle, TEXT(" | DLGFRAME"));

    // lstrcat(sStyle, L"\r\n    ");

    if (TEST(21)) lstrcat(sStyle, TEXT(" | VSCROLL"));

    if (TEST(20)) lstrcat(sStyle, TEXT(" | HSCROLL"));

    if (TEST(19)) lstrcat(sStyle, TEXT(" | SYSMENU"));

    if (TEST(18)) lstrcat(sStyle, TEXT(" | THICKFRAME"));

    if (TEST(17)) lstrcat(sStyle, TEXT(" | MINIMIZEBOX"));

    if (TEST(16)) lstrcat(sStyle, TEXT(" | MAXIMIZEBOX"));

}

 

void CSpyWin::GetExStyleString(DWORD dwExStyle, TCHAR* sExStyle)

{

    if (dwExStyle & 0x00001000L) lstrcpy(sExStyle, TEXT("RIGHT"));

    else lstrcpy(sExStyle, TEXT("LEFT"));

 

    if (dwExStyle & 0x00000010L) lstrcat(sExStyle, TEXT(" | ACCEPTFILES"));

    if (dwExStyle & 0x00040000L) lstrcat(sExStyle, TEXT(" | APPWINDOW"));

    if (dwExStyle & 0x00000200L) lstrcat(sExStyle, TEXT(" | CLIENTEDGE"));

    if (dwExStyle & 0x02000000L) lstrcat(sExStyle, TEXT(" | COMPOSITED"));

    if (dwExStyle & 0x00000400L) lstrcat(sExStyle, TEXT(" | CONTEXTHELP"));

    if (dwExStyle & 0x00010000L) lstrcat(sExStyle, TEXT(" | CONTROLPARENT"));

    if (dwExStyle & 0x00000001L) lstrcat(sExStyle, TEXT(" | DLGMODALFRAME"));

    if (dwExStyle & 0x00080000L) lstrcat(sExStyle, TEXT(" | LAYERED"));

    if (dwExStyle & 0x00400000L) lstrcat(sExStyle, TEXT(" | LAYOUTRTL"));

    if (dwExStyle & 0x00004000L) lstrcat(sExStyle, TEXT(" | LEFTSCROLLBAR"));

    if (dwExStyle & 0x00000040L) lstrcat(sExStyle, TEXT(" | MDICHILD"));

    if (dwExStyle & 0x08000000L) lstrcat(sExStyle, TEXT(" | NOACTIVATE"));

    if (dwExStyle & 0x00100000L) lstrcat(sExStyle, TEXT(" | NOINHERITLAYOUT"));

    if (dwExStyle & 0x00000004L) lstrcat(sExStyle, TEXT(" | NOPARENTNOTIFY"));

    if (dwExStyle & 0x00200000L) lstrcat(sExStyle, TEXT(" | NOREDIRECTIONBITMAP"));

    if (dwExStyle & 0x00002000L) lstrcat(sExStyle, TEXT(" | RTLREADING"));

    if (dwExStyle & 0x00020000L) lstrcat(sExStyle, TEXT(" | STATICEDGE"));

    if (dwExStyle & 0x00000080L) lstrcat(sExStyle, TEXT(" | TOOLWINDOW"));

    if (dwExStyle & 0x00000008L) lstrcat(sExStyle, TEXT(" | TOPMOST"));

    if (dwExStyle & 0x00000020L) lstrcat(sExStyle, TEXT(" | TRANSPARENT"));

    if (dwExStyle & 0x00000100L) lstrcat(sExStyle, TEXT(" | WINDOWEDGE"));

}

 

BOOL CALLBACK CSpyWin::EnumChildProc(_In_ HWND hwnd, _In_ LPARAM lParam)

{

    TCHAR sCaption[256];

    TCHAR sLine[256];

    RECT crt;

    wstring* pChilds = (wstring*)lParam;

 

    GetWindowText(hwnd, sCaption, 256);

    GetWindowRect(hwnd, &crt);

    wsprintf(sLine, L"%d(%s) (%d,%d) - (%d,%d), %d*%d\r\n",

        (int)hwnd, sCaption,

        crt.left, crt.top, crt.right, crt.bottom,

        crt.right - crt.left, crt.bottom - crt.top

    );

    (*pChilds) += sLine;

 

    return TRUE;

}

 

ÇÙ½É ÇÔ¼ö´Â WindowFromPointÀ̸ç ÀÌ ÇÔ¼ö°¡ ¸®ÅÏÇÏ´Â À©µµ¿ì¿¡ ´ëÇÑ ¸ðµç Á¤º¸¸¦ Á¶»çÇÏ¿© ¹®ÀÚ¿­·Î Á¶¸³ÇÑ´Ù. ¼Ó¼º Ç÷¡±×¸¦ ¼ýÀÚ°¡ ¾Æ´Ñ ¸íĪÀ¸·Î º¯È¯Çϱâ À§ÇÑ Äڵ尡 ±æ´Ù. À©µµ¿ì ÀÚüÀÇ ¼Ó¼º°ú À©µµ¿ì °èÃþ Á¤º¸¸¦ Á¶»çÇÏ¿© µÎ À©µµ¿ì¿¡ ³ª´©¾î º¸¿© ÁØ´Ù.

¿ø·¡ °èȹÀº À©µµ¿ì °èÃþÀ» ±×·¡ÇÈ ÇüÅ·Πǥ½ÃÇÏ°í °èÃþ »çÀ̸¦ Ŭ¸¯ÇÏ¿© À̵¿ÇÏ·Á°í ÇßÀ¸³ª ½Ã°£ÀÌ ³Ê¹« ¿À·¡ °É¸± °Í °°¾Æ ÀÏ´Ü ¹®ÀÚ¿­ ÇüÅ·ΠÃâ·ÂÇß´Ù. ´ÙÀ½¿¡ ½Ã°£ÀÌ ³ª¸é ÀÌ ºÎºÐÀº Á» ´õ °³¼±ÇØ º¼ »ý°¢ÀÌ´Ù.

ƼÁ¬ µî·Ï

Ŭ·¡½º Çϳª°¡ °ð ƼÁ¬ ÇϳªÀÌ´Ù. ÀϺΠÀ¯Æ¿¸®Æ¼ ÇÔ¼ö°¡ Ãß°¡µÇ±â´Â ÇÏÁö¸¸ À¢¸¸Çϸé Ŭ·¡½º Çϳª¿¡ ĸ½¶È­µÇ¾î ´Ù¸¥ ºÎºÐ¿¡ ¿µÇâÀ» ¹ÌÄ¡Áö ¾Ê´Â´Ù. ±×·¡¼­ »õ·Î¿î ƼÁ¬À» Ãß°¡Çϰųª ±âÁ¸ ƼÁ¬À» °³¼±ÇÏ´Â °ÍÀÌ ¾î·ÆÁö ¾Ê´Ù.

ÀÌ Àå¿¡¼­ Ãß°¡ÇÑ Æ¼Á¬À» µî·ÏÇØ¾ß °´Ã¼¸¦ ¸¸µé ¼ö ÀÖ´Ù.  CreateObject¿¡¼­ Ŭ·¡½º¸í°ú °´Ã¼ »ý¼º¹®À» ¿¬°áÇØ µÐ´Ù.

 

CTidget* CTidget::CreateObject(wstring cls)

{

       ....

       if (cls == L"MoveCursor") return new CMoveCursor();

       if (cls == L"SizeMeter") return new CSizeMeter();

       if (cls == L"Tetris") return new CTetris();

       if (cls == L"OneImage") return new COneImage();

    if (cls == L"EnumFont") return new CEnumFont();

       if (cls == L"Spy") return new CSpy();

 

       return nullptr;

}

 

ƼÁ¬ ÃʱâÈ­ ¹è¿­¿¡µµ »õ·Î ¸¸µç ƼÁ¬ÀÇ Á¤º¸¸¦ ±â·ÏÇØ µÐ´Ù.

 

STidgetInfo arTidgetInfo[] = {

       ....

       {L"Ä¿¼­ À̵¿", L"ÁÖ±âÀûÀ¸·Î Ä¿¼­¸¦ À̵¿ÇÏ¿© È­¸é º¸È£±â µ¿ÀÛÀ» ¹æÁöÇÕ´Ï´Ù.",

                  L"MoveCursor", false},

       {L"À©µµ¿ì Å©±â ÃøÁ¤", L"Ç¥ÁØ ¸ð´ÏÅÍ Å©±âÀÇ ¸éÀûÀ» ½ÇÁ¦ À©µµ¿ì·Î È®ÀÎÇÕ´Ï´Ù.",

                  L"SizeMeter", false},

       {L"Å×Æ®¸®½º", L"½É½ÉÇ®ÀÌ Å×Æ®¸®½º °ÔÀÓÀÔ´Ï´Ù. ´Ù¾çÇÑ Å©±â¸¦ Áö¿øÇÕ´Ï´Ù.",

                  L"Tetris", false},

       {L"ÂüÁ¶ À̹ÌÁö", L"´Ü ÇϳªÀÇ À̹ÌÁö¸¦ ¿øÇÏ´Â °÷¿¡ ¿øÇÏ´Â Å©±â·Î ½Å¼ÓÇÏ°Ô ¿­¾î È®ÀÎÇÑ´Ù.",

                  L"OneImage", true},

    {L"ÆùÆ® ¿­°Å", L"¼³Ä¡µÇ¾î ÀÖ´Â ÆùÆ®ÀÇ ¸ñ·ÏÀ» º¸°í Ư¼ºÀ» Á¶»çÇÕ´Ï´Ù. ÆùÆ® »ý¼º Äڵ带 ÀÛ¼ºÇÏ¿© º¹»çÇÕ´Ï´Ù. ",

        L"EnumFont", true},

    {L"½ºÆÄÀÌ", L"Ä¿¼­ À§Ä¡ÀÇ À©µµ¿ì ¼Ó¼ºÀ» Á¶»çÇÕ´Ï´Ù.",

                  L"Spy", true},

       {L"", L"", L"", false},

};

 

OneImage´Â ¸ÖƼ¸¦ Áö¿øÇÑ´Ù. µÎ °³ ÀÌ»óÀÇ À̹ÌÁö¸¦ µî·ÏÇØ ³õ°í °¢°¢ ¿­¾î º¼ ¼ö ÀÖ´Ù. µü ÇϳªÀÇ À̹ÌÁö¸¸ º¸¿© ÁÖÁö¸¸ ¿©·¯ °³ÀÇ Æ¼Á¬¿¡ °¢°¢ÀÇ À̹ÌÁö¸¦ µî·ÏÇÒ ¼ö ÀÖ¾î ½Ç¿ëÀûÀÌ´Ù. ±×·¸´Ù¸é SizeMeter³ª Tetris´Â ¾î¶³±î? À̰͵µ Å©±âº°·Î µÎ °³¸¦ ¿­¾î ºñ±³ÇØ º¼ ¼ö ÀÖÀ¸´Ï ¸ÖƼ°¡ µÇ¾î¾ß ÇÏÁö ¾ÊÀ»±î ½Í°ÚÁö¸¸ ¾êµéÀº ¿ø·¡ ¸ÖƼ°¡ µÇ¸ç âÀ» ¾ó¸¶µçÁö ¶ç¿ï ¼ö ÀÖ´Ù.

ƼÁ¬ÀÇ ¸ÖƼ ¼Ó¼ºÀº ƼÁ¬ ÀÚü¸¦ ¿©·¯ °³ ¹èÄ¡ÇÒ ¼ö Àִ°¡¸¦ ÀǹÌÇÏ´Â °ÍÀÌÁö ƼÁ¬ÀÌ ¿©´Â âÀÌ ¿©·¯ °³Àΰ¡¸¦ ÀǹÌÇÏ´Â °ÍÀº ¾Æ´Ï´Ù. LCDTest ƼÁ¬µµ ¸ÖƼ´Â ¾ÈµÇÁö¸¸ ¿©·¯ °³ÀÇ Ã¢À» ¿­¾î ³õ°í °¢ ¸ð´ÏÅÍ¿¡ ¶ç¿ö ³õÀ» ¼ö ÀÖ´Ù. ¸ÖƼÀΰ¡ ¾Æ´Ñ°¡´Â INI ÆÄÀÏ¿¡ ¼³Á¤À» µû·Î ÀúÀåÇϴ°¡ ¾Æ´Ñ°¡¿¡ ÀÇÇØ °áÁ¤µÈ´Ù.

¸ÞÀÎÀÇ OnCreate¿¡¼­ ù ½ÃÀ۽à ÀÌ Æ¼Á¬À» »ý¼ºÇÑ´Ù. ¸¸µé¾î ³ùÀ¸´Ï ¾î·µç óÀ½ºÎÅÍ º¸¿©¾ß »ç¿ëÀÚ°¡ ¾µ ¼ö ÀÖ´Ù.

 

       if (widget_num == 0) {

                  ....

                  pTidget = CTidget::CreateDefaultObject(L"MoveCursor"); arTidget.push_back(pTidget);

                  pTidget = CTidget::CreateDefaultObject(L"SizeMeter"); arTidget.push_back(pTidget);

                  pTidget = CTidget::CreateDefaultObject(L"Tetris"); arTidget.push_back(pTidget);

                  pTidget = CTidget::CreateDefaultObject(L"OneImage"); arTidget.push_back(pTidget);

        pTidget = CTidget::CreateDefaultObject(L"EnumFont"); arTidget.push_back(pTidget);

                  pTidget = CTidget::CreateDefaultObject(L"Spy"); arTidget.push_back(pTidget);

 

¼³Á¤ ÀúÀå ±â´ÉÀÌ µ¿ÀÛÇÏ°í ÀÖ¾î ¿©±â¿¡ ƼÁ¬À» µî·ÏÇÑ´Ù°í Çؼ­ ¹Ù·Î º¸ÀÌ´Â °ÍÀº ¾Æ´Ï´Ù.  ƼÁ¬ ¼±ÅÃâÀ» ¿­¾î Ãß°¡Çϰųª ¾Æ´Ï¸é ¾Æ¿¹ INI ÆÄÀÏÀ» Áö¿ö ¹ö·Á¾ß Ãʱ⠸ñ·ÏÀ» ÁغñÇÑ´Ù.