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ºÐ µ¿¾È Ä¿¼°¡ Á¦ÀÚ¸®¿¡
ÀÖÀ» ¶§¸¸ µ¿ÀÛÇÑ´Ù. »ç¿ëÀÚ°¡ Ä¿¼¸¦ ±îµü°Å¸®°í ÀÖ´Ù¸é ±»ÀÌ ¿Å°ÜÁÙ ÇÊ¿ä ¾ø´Ù.
ÀÌ À§Á¬Àº À©µµ¿ì Å©±â¸¦ ÃøÁ¤ÇÏ´Â °£´ÜÇÑ À§Á¬ÀÌ´Ù. 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 µîÀÇ
Çػ󵵷Πºü¸£°Ô Å©±â¸¦ Á¶Á¤ÇÑ´Ù. Å©±â´Â À©µµ¿ì ±âÁØÀÌ ¾Æ´Ï¶ó ÀÛ¾÷ ¿µ¿ª ±âÁØÀÌ´Ù. ÀÌ Æ¼Á¬Àº Àü¿¡ Àá½Ã ¸¸µé¾î µÎ¾ú´ø °ÍÀ» °¡Á®¿Í Æ÷ÇÔ½ÃŲ °ÍÀε¥ °³¼±ÀÇ ¿©Áö°¡ ¸¹´Ù. ¸ð´ÏÅÍ Çػ󵵸¦ Á¶»çÇÏ¿© ½ÇÁ¦ Å©±âÀÇ ÀÚ¸¦ º¸¿©ÁÖ¸é ±×°Íµµ ½Ç¿ëÀûÀÏ °Í °°´Ù.
Áö±ÝÀº ¾çÀ» ´Ã¸®´Âµ¥ ±Þ±ÞÇØ ÀÏ´Ü Æ÷ÇÔ¸¸ ½ÃÄÑ µÎ¾ú´Ù.
Àß ¾Æ´Â Å×Æ®¸®½º °ÔÀÓÀÌ´Ù. ¾÷¹«Áß¿¡ ½É½ÉÇÒ ¶§ Ç϶ó°í ³Ö¾î ºÃ´Ù.
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´Â µü ÇϳªÀÇ À̹ÌÁö¸¦ ¹Ì¸® µî·ÏÇØ ³õ°í Ŭ¸¯½Ã ½Å¼ÓÇÏ°Ô
¿¾î¼ º¸¿©Áִ ƼÁ¬ÀÌ´Ù. °³¹ßÀ» ÇÏ´Ù º¸¸é ¼³°èµµ³ª »ö»óÇ¥, ±âȹ¾È
µîÀ» ÀÚÁÖ Âü°íÇØ¾ß Çϴµ¥ ¸Å¹ø ÆÄÀÏÀ» ¿¾î µÚÀû°Å¸®±â ±ÍÂú´Ù. ÀÌ·² ¶§ ¹Ì¸® À̹ÌÁö·Î ¸¸µé¾î µÎ¸é
½Å¼ÓÇÏ°Ô ¿¾î È®ÀÎÇÒ ¼ö ÀÖ´Ù.
À̹ÌÁö Ãâ·ÂÀº 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µµ ÇÊ¿äÇÏ´Ù. Â÷ÈÄ À§ÂÊ¿¡ ¿À¹ö·¦µÇ´Â ¹ÝÅõ¸íÇÑ Ã¢À» ¸¸µé¾î À̹ÌÁö
Á¤º¸³ª ´Ý±â ¹öÆ°, È®´ë/Ãà¼Ò µîÀÇ ±â´ÉÀ» Á¦°øÇϸé Àû´çÇÒ
°Í °°´Ù.
ÆùÆ® ¿°Å ±â´ÉÀº 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ÀÇ
ÆùÆ® »ý¼º ¸í·ÉÀ» º¸¿© ÁÖ°í Ŭ¸³º¸µå·Î º¹»çÇØ ÁØ´Ù. ¸¸µé°í ½ÍÀº ÆùÆ®¸¦ ¼±ÅÃÇؼ ÄÚµå ºÙ¿© ³ÖÀ¸¸é
¹Ù·Î »ý¼ºÇÒ ¼ö ÀÖ´Ù.
ÀÌ Á¤µµ¸é ÆùÆ®¸¦ °ñ¶ó ¾²´Âµ¥ º° ºÒÆíÇÔÀº ¾øÀ» °Í °°´Ù. ÇÊ¿äÇÒ
¶§ Àá±ñ ¿¾î¼ ÆùÆ® ¼±ÅÃÇÏ°í Äڵ常 ½ï »©³»¿À´Â ½ÄÀ¸·Î È°¿ëÇÏ¸é µÈ´Ù.
½ºÆÄÀÌ´Â ½Ã½ºÅÛ °³¹ßÀÚ¿¡°Ô ²À ÇÊ¿äÇÑ À¯Æ¿¸®Æ¼ÀÌ´Ù. ºñÁÖ¾ó ½ºÆ©µð¿À¿¡µµ
Æ÷ÇԵǾî ÀÖÁö¸¸ ¸Þ´º¿¡ µî·ÏµÇ¾î ÀÖÁö ¾Ê°í Á÷Á¢ Ž»ö±â¸¦ µÚÁ®¾ß ½ÇÇàÇÒ ¼ö ÀÖ¾î Á¢±Ù¼ºÀÌ ¶³¾îÁø´Ù. ¶Ç
±â´ÉÀÌ ¿ö³« ¸¹¾Æ »ç¿ë ¹æ¹ýµµ ±×¸® °£´ÜÇÏÁö ¾Ê´Ù. ½ºÆÄÀÌÀÇ ±â´ÉÁß ²À ÇÊ¿äÇÑ ±â´É¸¸ Ãß·Á ƼÁ¬À¸·Î
Á¤ÀÇÇß´Ù.
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 ÆÄÀÏÀ» Áö¿ö ¹ö·Á¾ß Ãʱ⠸ñ·ÏÀ» ÁغñÇÑ´Ù.