Step1. ã€VC++】ウィンドウã®ä¸€è¦§ã‚’å–å¾—ã—ã¦ãƒªã‚¹ãƒˆä½œæˆ
アプリ画é¢ä¸Šã«ã‚るコンボボックス(ドãƒãƒƒãƒ—ダウンå¼ã®ãƒªã‚¹ãƒˆãƒœãƒƒã‚¯ã‚¹ï¼‰ã«
ã‚らã‹ã˜ã‚èµ·å‹•ã—ã¦ã„るアプリã®ã‚¦ã‚£ãƒ³ãƒ‰ã‚¦ã®ãƒªã‚¹ãƒˆã‚’è¨å®šã—ã¦ã€
ã‚ャプãƒãƒ£ã™ã‚‹ã‚¦ã‚£ãƒ³ãƒ‰ã‚¦ï¼ˆMineCraftï¼‰ã‚’é¸æŠžã§ãるよã†ã«ã—ã¾ã™ã€‚
ウィンドウã®ä¸€è¦§ã‚’å–得:
èµ·å‹•ã—ã¦ã„るウィンドウã®ä¸€è¦§ã‚’å–å¾—ã™ã‚‹ã«ã¯ã€EnumWindows()ã¨ã„ã†é–¢æ•°ã‚’使ã„ã¾ã™ã€‚
EnumWindows()ã®å¼•æ•°ã«ã€ä½œæˆã™ã‚‹ã‚¢ãƒ—リå´ã§å®šç¾©ã—ãŸã‚³ãƒ¼ãƒ«ãƒãƒƒã‚¯é–¢æ•°ã‚’渡ã™ã“ã¨ã«ã‚ˆã£ã¦ã€
å–å¾—ã—ãŸã‚¦ã‚£ãƒ³ãƒ‰ã‚¦æƒ…å ±ãŒã‚³ãƒ¼ãƒ«ãƒãƒƒã‚¯ã•れã¾ã™ã€‚
コールãƒãƒƒã‚¯é–¢æ•°ã¯ã€ä»¥ä¸‹ã®ã‚ˆã†ã«ã‚°ãƒãƒ¼ãƒãƒ«é–¢æ•°ã¨ã—ã¦å®šç¾©ã—ã¾ã™ã€‚
ã“ã®ä¸ã§ã€ã‚¦ã‚£ãƒ³ãƒ‰ã‚¦ãƒãƒ³ãƒ‰ãƒ«ã®ãƒªã‚¹ãƒˆã‚’å–得。
// EnumWindows()ã®ã‚³ãƒ¼ãƒ«ãƒãƒƒã‚¯ã‚’定義
#define MAX_NUM_ENUMWND 100 // 列挙ã™ã‚‹ã‚¦ã‚£ãƒ³ãƒ‰ã‚¦ã®æœ€å¤§æ•°
HWND g_hwnd[MAX_NUM_ENUMWND]; // æ ¼ç´ã™ã‚‹é…列変数
int g_cnt = 0; // カウンタ
BOOL CALLBACK EnumWindowsProc(HWND hwnd, LPARAM lParam)
{
// ウィンドウãŒå¯è¦–ã§ãªã‘れã°ãƒªã‚¿ãƒ¼ãƒ³
if (IsWindowVisible(hwnd) == FALSE) return TRUE;
// 最大数を超ãˆãŸå ´åˆã¯åˆ—挙を終了ã•ã›ã‚‹
if (g_cnt >= MAX_NUM_ENUMWND) return FALSE;
// é…åˆ—å¤‰æ•°ã«æ ¼ç´
g_hwnd[g_cnt] = hwnd;
g_cnt++;
return TRUE;
}
ãã—ã¦ã€ãƒ€ã‚¤ã‚¢ãƒã‚°ãŒç”Ÿæˆã•れãŸã‚¿ã‚¤ãƒŸãƒ³ã‚°ã§ã€EnumWindows()を呼ã³å‡ºã™ã€‚
int CScrennshotTimerDlg::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CDialogEx::OnCreate(lpCreateStruct) == -1)
return -1;
// TODO: ã“ã“ã«ç‰¹å®šãªä½œæˆã‚³ãƒ¼ãƒ‰ã‚’è¿½åŠ ã—ã¦ãã ã•ã„。
// ウィンドウを列挙ã™ã‚‹
EnumWindows(EnumWindowsProc, 0);
return 0;
}
ウィンドウã®ä¸€è¦§ã‚’コンボボックスã«è¨å®šï¼š
ãã—ã¦ã€ãƒ€ã‚¤ã‚¢ãƒã‚°ãƒœãƒƒã‚¯ã‚¹ã®åˆæœŸåŒ–処ç†InitDialog()ã®ä¸ã§ã€
ウィンドウãƒãƒ³ãƒ‰ãƒ«ã‹ã‚‰å–å¾—ã—ãŸã‚¦ã‚£ãƒ³ãƒ‰ã‚¦ã‚¿ã‚¤ãƒˆãƒ«ã‚’
コンボボックスã«è¨å®šã—ã¦ã„ãã¾ã™ã€‚
ã“ã“ã§ã€å³ã‚¯ãƒªãƒƒã‚¯ãƒ¡ãƒ‹ãƒ¥ãƒ¼ã‹ã‚‰ã€ã‚³ãƒ³ãƒœãƒœãƒƒã‚¯ã‚¹ã®ãƒ¡ãƒ³ãƒå¤‰æ•°ã€Œm_ComboBoxWndã€ã¨ã—ã¦å®šç¾©ã—ã¦ãŠãã“ã¨ã€‚
BOOL CScrennshotTimerDlg::OnInitDialog()
{
CDialogEx::OnInitDialog();
:
:
// TODO: åˆæœŸåŒ–ã‚’ã“ã“ã«è¿½åŠ ã—ã¾ã™ã€‚
// ウィンドウを列挙ã™ã‚‹
int id = -1;
for (g_cnt = 0; g_cnt < MAX_NUM_ENUMWND; g_cnt++) {
// ウィンドウタイトルãŒãªã„å ´åˆã¯è¿½åŠ ã—ãªã„
TCHAR strWindowText[1024];
::GetWindowText(g_hwnd[g_cnt], strWindowText, 1024);
if (strWindowText[0] == 0) continue;
// ã‚³ãƒ³ãƒœãƒœãƒƒã‚¯ã‚¹ã«æ–‡å—åˆ—ã‚’è¿½åŠ ã€‚
id = m_ComboBoxWnd.AddString(strWindowText);
// コンボボックスã®idã¨HWNDã‚’ç´ã¥ã‘
g_hwnd_cb[id] = g_hwnd[g_cnt];
}
}
コンボボックスã®ã‚¤ãƒ³ãƒ‡ãƒƒã‚¯ã‚¹ã¨ã€ã‚¦ã‚£ãƒ³ãƒ‰ã‚¦ãƒãƒ³ãƒ‰ãƒ«ã®é…åˆ—ã®æ·»ãˆå—ã‚’åˆã‚ã›ã‚‹ãŸã‚㫠コンボボックスã«è¿½åŠ ã—ãŸã‚¦ã‚£ãƒ³ãƒ‰ã‚¦ã®ãƒãƒ³ãƒ‰ãƒ«ã®ã¿ã®é…列を別途準備ã—ã¦ã„ã¾ã™ã€‚
Step2. ã€VC++】タイマーをセットã—ã¦é¸æŠžã—ãŸã‚¦ã‚£ãƒ³ãƒ‰ã‚¦ã‚’ã‚ャプãƒãƒ£
é¸æŠžã—ãŸã‚¦ã‚£ãƒ³ãƒ‰ã‚¦ã®ç”»åƒã‚’å–å¾—ã™ã‚‹æ–¹æ³•ãŒåˆ†ã‹ã‚‰ãªã‹ã£ãŸã®ã§ã€
デスクトップ全体ã®ç”»åƒã‚’å–å¾—ã—ã¦ã€ãã®ä¸ã‹ã‚‰é¸æŠžã—ãŸã‚¦ã‚£ãƒ³ãƒ‰ã‚¦éƒ¨åˆ†ã‚’抽出ã—ã¦ã„ã¾ã™ã€‚
3秒タイマーã®é–‹å§‹ã¨çµ‚了:
「開始ã€ãƒœã‚¿ãƒ³ã§3秒タイマーをセットã—ã€ã€Œåœæ¢ã€ãƒœã‚¿ãƒ³ã§ã‚¿ã‚¤ãƒžãƒ¼ã‚’解除ã—ã¾ã™ã€‚
ãれãžã‚Œã®ãƒœã‚¿ãƒ³ã®ã‚¤ãƒ™ãƒ³ãƒˆãƒãƒ³ãƒ‰ãƒ©ã‚’è¿½åŠ ã—ã¦ã€ä»¥ä¸‹ã®ã‚ˆã†ã«è¨˜è¿°ã—ã¾ã™ã€‚
void CAboutDlg::OnBnClickedButtonStart()
{
// TODO: ã“ã“ã«ã‚³ãƒ³ãƒˆãƒãƒ¼ãƒ«é€šçŸ¥ãƒãƒ³ãƒ‰ãƒ©ãƒ¼ ã‚³ãƒ¼ãƒ‰ã‚’è¿½åŠ ã—ã¾ã™ã€‚
SetTimer(1, 3000, NULL);
}
void CAboutDlg::OnBnClickedButtonStop()
{
// TODO: ã“ã“ã«ã‚³ãƒ³ãƒˆãƒãƒ¼ãƒ«é€šçŸ¥ãƒãƒ³ãƒ‰ãƒ©ãƒ¼ ã‚³ãƒ¼ãƒ‰ã‚’è¿½åŠ ã—ã¾ã™ã€‚
KillTimer(1);
}
指定ã—ãŸã‚¦ã‚£ãƒ³ãƒ‰ã‚¦ã®ç”»é¢ã‚’å–得:
次ã«ã€ã‚¿ã‚¤ãƒžãƒ¼ãƒãƒ³ãƒ‰ãƒ© OnTimer()ã®ä¸ã§ã€é¸æŠžã—ãŸã‚¦ã‚£ãƒ³ãƒ‰ã‚¦ã®ç”»é¢ã‚’ã‚ャプãƒãƒ£ã€‚
ã“ã“ã§ã¯ã€ãƒ¡ãƒ¢ãƒªã‚³ãƒ³ãƒ†ã‚スト上ã«ç”»åƒã‚’展開ã—ã¦ã„ã¾ã™ã€‚
void CScrennshotTimerDlg::OnTimer(UINT_PTR nIDEvent)
{
// TODO: ã“ã“ã«ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ ãƒãƒ³ãƒ‰ãƒ©ãƒ¼ ã‚³ãƒ¼ãƒ‰ã‚’è¿½åŠ ã™ã‚‹ã‹ã€æ—¢å®šã®å‡¦ç†ã‚’呼ã³å‡ºã—ã¾ã™ã€‚
// コンボボックスã§é¸æŠžã•れã¦ã„るインデックス
int cursel = m_ComboBoxWnd.GetCurSel();
// 確èª
TCHAR strWindowText[1024];
::GetWindowText(g_hwnd_cb[cursel], strWindowText, 1024);
// é¸æŠžã—ãŸã‚¦ã‚£ãƒ³ãƒ‰ã‚¦ãƒãƒ³ãƒ‰ãƒ«ã®é ˜åŸŸ
::GetWindowRect(g_hwnd_cb[cursel], &rc);
width = rc.right-rc.left;
height = rc.bottom-rc.top;
//スクリーンã®ã‚µã‚¤ã‚ºã«åˆã‚ã›ã¦ãƒ“ットマップを作æˆ
//DIBã®æƒ…å ±ã‚’è¨å®šã™ã‚‹
bmpInfo.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
bmpInfo.bmiHeader.biWidth = width;
bmpInfo.bmiHeader.biHeight = height;
bmpInfo.bmiHeader.biPlanes = 1;
bmpInfo.bmiHeader.biBitCount = 24;
bmpInfo.bmiHeader.biCompression = BI_RGB;
//DIBSection作æˆ
hdc = ::GetDC(m_hWnd); //æç”»å…ˆã®ã‚¦ã‚£ãƒ³ãƒ‰ã‚¦ãƒãƒ³ãƒ‰ãƒ«
hBitmap = ::CreateDIBSection(hdc, &bmpInfo, DIB_RGB_COLORS, (void**)&lpPixel, NULL, 0);
hMemDC = ::CreateCompatibleDC(hdc);
::SelectObject(hMemDC, hBitmap);
::ReleaseDC(m_hWnd, hdc);
//é¸æŠžã—ãŸã‚¦ã‚£ãƒ³ãƒ‰ã‚¦ç”»é¢ã®ç¯„囲ををDIBSectionã«ã‚³ãƒ”ー
hdc = ::GetDC(NULL);
::BitBlt(hMemDC, 0, 0, width, height, hdc, rc.left, rc.top, SRCCOPY);
::ReleaseDC(NULL, hdc);
// ç”»é¢ã‚’æ›´æ–°
InvalidateRect(NULL, TRUE);
CDialogEx::OnTimer(nIDEvent);
}
å–å¾—ã—ãŸç”»åƒã‚’スクショアプリ上ã«è¡¨ç¤º
OnTimer()ã®å‡¦ç†ã§ã€ç”»é¢ã‚ャプãƒãƒ£ã‚’ã—ãŸå¾Œã«ã€InvalidateRect()を呼ã³å‡ºã—ã¦
アプリ画é¢ã®æ›´æ–°ã‚’行ã£ã¦ã„ã¾ã™ã€‚
ã“れã«ã‚ˆã‚Šã€OnPaint()ãŒå®Ÿè¡Œã•れã¾ã™ã®ã§ã€ã‚¿ã‚¤ãƒžãƒ¼å‡¦ç†ã§ãƒ¡ãƒ¢ãƒªä¸Šã«å±•é–‹ã—ãŸç”»åƒã‚’
今度ã¯ã‚¢ãƒ—リ画é¢ä¸Šã«ã€ã‚µã‚¤ã‚ºã‚’åˆã‚ã›ã¦è»¢é€ã—ã¾ã™ã€‚
void CScrennshotTimerDlg::OnPaint()
{
CPaintDC dc(this); // æç”»ã®ãƒ‡ãƒã‚¤ã‚¹ コンテã‚スト
if (IsIconic())
{
:
:
// ã‚¢ã‚¤ã‚³ãƒ³ã®æç”»
dc.DrawIcon(x, y, m_hIcon);
}
else
{
CDialogEx::OnPaint();
//標示画é¢ã¸ãƒªã‚µã‚¤ã‚ºã—ã¦è»¢é€ï¼ˆæ¨ªé•·ã®ç”»é¢ãªã®ã§ã€å¹…ã«åˆã‚ã›ã¦é«˜ã•を調整)
if (width == 0 || height == 0) return;
::StretchBlt(dc, DISP_LEFT, DISP_TOP, DISP_WIDTH, DISP_WIDTH*height/width, hMemDC, 0, 0, width, height, SRCCOPY);
// æç”»ã—ãŸã‚‰ãƒªã‚½ãƒ¼ã‚¹é–‹æ”¾
DeleteDC(hMemDC);
DeleteObject(hBitmap); //BMPを削除ã—ãŸæ™‚ã€lpPixelも自動的ã«è§£æ”¾ã•れる
}
}
Step3. ã€VC++】ユーザー定義ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’è¿½åŠ ã—ã¦ã€ç”»åƒã‚’ファイルã«ä¿å˜
å¿…è¦ãªå‡¦ç†ã§ã¯ãªã„ãŒã€ã‚ãˆã¦ãƒ¦ãƒ¼ã‚¶ãƒ¼å®šç¾©ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ãƒãƒ³ãƒ‰ãƒ©ã‚’è¿½åŠ ã™ã‚‹æ–¹æ³•ã‚’
説明ã™ã‚‹ãŸã‚ã«ã€å–å¾—ã—ãŸç”»åƒã®ãƒ•ァイルä¿å˜ã‚’ユーザー定義メッセージãƒãƒ³ãƒ‰ãƒ©ã§è¡Œã„ã¾ã™ã€‚
ユーザーメッセージã®å®šç¾©ã¨ã€ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ãƒãƒ³ãƒ‰ãƒ©ã®è¿½åŠ
ScreenshotTimer.h:
メッセージIDã®defineã¨ã€ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ãƒãƒ³ãƒ‰ãƒ©ã®å®£è¨€ã‚’行ã„ã¾ã™ã€‚
// ユーザーメッセージIDã®å®šç¾©ï¼ˆWM_APP(0x8000)~0xBFFFFã§å®šç¾©ï¼‰
#define WM_APP_SAVECAPTURE (WM_APP + 1)
// CScrennshotTimerDlg ダイアãƒã‚°
class CScrennshotTimerDlg : public CDialogEx
{
:
:
DECLARE_MESSAGE_MAP()
public:
afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);
:
:
// ユーザー定義メッセージãƒãƒ³ãƒ‰ãƒ©
afx_msg LRESULT OnSaveCapture(WPARAM wParam, LPARAM lParam);
};
ScreenshotTimer.cpp:
メッセージIDeã¨ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ãƒãƒ³ãƒ‰ãƒ©é–¢æ•°ã®é–¢é€£ä»˜ã‘ã¨ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ãƒãƒ³ãƒ‰ãƒ©ã®å®Ÿè£…を行ã„ã¾ã™ã€‚
BEGIN_MESSAGE_MAP(CScrennshotTimerDlg, CDialogEx)
:
:
// ユーザー定義メッセージ
ON_MESSAGE(WM_APP_SAVECAPTURE, &CScrennshotTimerDlg::OnSaveCapture)
END_MESSAGE_MAP()
LRESULT CScrennshotTimerDlg::OnSaveCapture(WPARAM wParam, LPARAM lParam)
{
CImage image;
CString name;
//ä¿å˜ç”¨ãƒ•ォルダを作æˆ
_mkdir("./capture");
//作æˆã—ãŸãƒ•ォルダã«ä¿å˜
name.Format(_T("./capture/%02d.bmp"), wParam);
image.Attach(hBitmap);
int ret = image.Save(name, Gdiplus::ImageFormatBMP);
return 0;
}
è¿½åŠ ã—ãŸãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ãƒãƒ³ãƒ‰ãƒ©ã®ä¸ã§ã¯ã€å–å¾—ã—ãŸç”»åƒã‚’ファイルä¿å˜ã—ã¦ã„ã¾ã™ã€‚
ç”»åƒãƒ•ァイルã®ä¿å˜å ´æ‰€ã¯ã€exeファイルã¨åŒã˜å ´æ‰€ã«ç”Ÿæˆã•れる"capture"ãƒ•ã‚©ãƒ«ãƒ€å†…ã«æ ¼ç´ã•れã¾ã™ã€‚
※ ã‚ã¨ã§æ°—ã¥ãã¾ã—ãŸãŒã€ã‚¯ãƒ©ã‚¹ã‚¦ã‚£ã‚¶ãƒ¼ãƒ‰ã‚’使ãˆã°ã€ã€Œã‚«ã‚¹ã‚¿ãƒ メッセージã®è¿½åŠ ã€ã¨ã„ã†ãƒœã‚¿ãƒ³ãŒã‚ã‚‹ã®ã§ã€
自動ã§ãƒ¦ãƒ¼ã‚¶ãƒ¼å®šç¾©ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ãƒãƒ³ãƒ‰ãƒ©ã‚’è¿½åŠ å‡ºæ¥ã‚‹ã¿ãŸã„ã§ã™ã€‚。。
ãã—ã¦ã€ã‚ã¨ã¯ã“ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ãƒãƒ³ãƒ‰ãƒ©ãŒå®Ÿè¡Œã•れるよã†ã«ã€ç”»åƒã‚’å–å¾—ã—ãŸã‚‰ï¼ˆOntimer()ã®ä¸ã§ï¼‰
以下ã®ã‚ˆã†ã«Postmessage()ã—ã¾ã™ã€‚
// ç”»åƒä¿å˜ã®ãŸã‚ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’é€ä¿¡
img_no++; // ä¿å˜ç•ªå·
if (img_no > MAX_CAPUTURE) img_no = 0; // 最大数を超ãˆãŸã‚‰ãƒªã‚»ãƒƒãƒˆ
PostMessage(WM_APP_SAVECAPTURE, img_no, 0);
ä¿å˜ã™ã‚‹ç”»åƒãƒ•ァイルã¯10個ã¾ã§ã€‚
ãれを超ãˆãŸã‚‰ã€å¤ã„ç”»åƒã‹ã‚‰ä¸Šæ›¸ãä¿å˜ã™ã‚‹ã‚ˆã†ã«ãªã£ã¦ã„ã¾ã™ã€‚
Step4. ã€VC++】スピンコントãƒãƒ¼ãƒ«ã§ç”»åƒã‚’切り替ãˆã¦ã€æ‹¡å¤§è¡¨ç¤ºã€‚
タイマーãŒã‚¹ãƒˆãƒƒãƒ—ã—ãŸå¾Œã€å–å¾—ã—ãŸ10æžšã®ç”»åƒã‚’スピンコントãƒãƒ¼ãƒ«ã§
切り替ãˆã‚‹ã“ã¨ãŒå‡ºæ¥ã‚‹ã‚ˆã†ã«ã—ã¾ã™
ã¾ãŸã€è¡¨ç¤ºã—ã¦ã„ã‚‹ç”»åƒã‚’ダブルクリックã™ã‚‹ã“ã¨ã§ã€ç”»åƒã‚’è¦å®šã‚¢ãƒ—リã§é–‹ãã¾ã™ã€‚
(表示ã•れる画åƒãŒå°ã•ãã¦ã€è‚心ã®åº§æ¨™ãŒè¡¨ç¤ºã•れãªã„ã®ã§ã€‚。。)
スピンコントãƒãƒ¼ãƒ«ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ãƒãƒ³ãƒ‰ãƒ©ã‚’è¿½åŠ ã—ã¦ç”»åƒåˆ‡ã‚Šæ›¿ãˆ
VSã®ãƒ€ã‚¤ã‚¢ãƒã‚°ã‚¨ãƒ‡ã‚£ã‚¿ã§ã€ã‚¹ãƒ”ンコントãƒãƒ¼ãƒ«ã‚’ダブルクリックã™ã‚‹ã¨
自動的ã«ã‚³ãƒ³ãƒˆãƒãƒ¼ãƒ«ã‚’押ã—ãŸæ™‚ã«å‹•作ã™ã‚‹ãƒãƒ³ãƒ‰ãƒ©ãŒè¿½åŠ ã•れã¾ã™ã€‚
ãã“ã«ã€ç”»åƒã‚’切り替ãˆã‚‹å‡¦ç†ã‚’è¿½åŠ ã—ã¾ã™ã€‚
void CScrennshotTimerDlg::OnDeltaposSpin1(NMHDR* pNMHDR, LRESULT* pResult)
{
LPNMUPDOWN pNMUpDown = reinterpret_cast(pNMHDR);
// TODO: ã“ã“ã«ã‚³ãƒ³ãƒˆãƒãƒ¼ãƒ«é€šçŸ¥ãƒãƒ³ãƒ‰ãƒ©ãƒ¼ ã‚³ãƒ¼ãƒ‰ã‚’è¿½åŠ ã—ã¾ã™ã€‚
// 標示ä¸ã®ç”»åƒãŒæœªç¢ºå®šï¼ˆã‚¿ã‚¤ãƒžãƒ¼å‹•作ä¸ï¼‰ã¯ä½•も処ç†ã—ãªã„。
if (sel_no == 0) return;
if(pNMUpDown->iDelta > 0) // â†ãŒæŠ¼ã•ã‚ŒãŸæ™‚
{
// å‰ã®ç”»åƒç•ªå·ã«ã™ã‚‹
sel_no--;
// ç”»åƒç•ªå·ãŒï¼‘ã¾ã§ã‚‚ã©ã£ãŸã‚‰æ¬¡ã¯æœ€å¤§ç•ªå·
if (sel_no < 1) sel_no = MAX_CAPUTURE;
//最åˆã«æ¨™ç¤ºã•れã¦ã„ãŸç•ªå·ã‚ˆã‚Šæˆ»ã‚‹ã“ã¨ã¯ãªã„
if (sel_no == img_no)
{
AfxMessageBox(_T("ã“れ以上戻れã¾ã›ã‚“"), MB_OK | MB_ICONINFORMATION);
sel_no++;
// ç”»åƒç•ªå·ãŒæœ€å¤§ç•ªå·ã‚’è¶…ãˆãŸã‚‰ï¼‘ã«
if (sel_no > MAX_CAPUTURE) sel_no = 1;
return;
}
}
else if (pNMUpDown->iDelta < 0) // â†’ãŒæŠ¼ã•ã‚ŒãŸæ™‚
{
//最åˆã«æ¨™ç¤ºã•れã¦ã„ãŸç•ªå·ã‚ˆã‚Šé€²ã‚€ã“ã¨ã¯ãªã„
if (sel_no == img_no)
{
AfxMessageBox(_T("ã“れ以上進ã‚ã¾ã›ã‚“"), MB_OK | MB_ICONINFORMATION);
return;
}
// å…ˆã®ç”»åƒç•ªå·ã«ã™ã‚‹
sel_no++;
// ç”»åƒç•ªå·ãŒæœ€å¤§ç•ªå·ã‚’è¶…ãˆãŸã‚‰ï¼‘ã«
if (sel_no > MAX_CAPUTURE) sel_no = 1;
}
else
{
return;
}
// ç”»åƒãƒ•ァイルを画é¢çŠ¶ã«æ¨™ç¤º
CString name;
name.Format(_T("./capture/%02d.bmp"), sel_no);
hBitmap = (HBITMAP)LoadImage(AfxGetInstanceHandle(), name, IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE);
hdc = ::GetDC(m_hWnd); //æç”»å…ˆã®ã‚¦ã‚£ãƒ³ãƒ‰ã‚¦ãƒãƒ³ãƒ‰ãƒ«
hMemDC = ::CreateCompatibleDC(hdc);
::SelectObject(hMemDC, hBitmap);
::ReleaseDC(m_hWnd, hdc);
// ç”»é¢ã‚’æ›´æ–°
InvalidateRect(NULL, TRUE);
*pResult = 0;
}
タイマー動作ä¸ã¯ã€ã‚¹ãƒ”ンコントãƒãƒ¼ãƒ«ã‚’押ã—ã¦ã‚‚何も動作ã—ã¾ã›ã‚“。
ãã®ä»–ã«ã‚‚色々ã¨ã‚¬ãƒ¼ãƒ‰å‡¦ç†ã‚’入れã¦ã„ã‚‹ã®ã§ã€å°‘々複雑ã«ãªã£ã¦ã„ã¾ã™ãŒãƒ»ãƒ»ãƒ»
スピンコントãƒãƒ¼ãƒ«ã‚’押ã™ã¨ã€ãれã«å¿œã˜ãŸç•ªå·ã®ãƒ•ァイルã‹ã‚‰ç”»åƒã‚’èªã¿è¾¼ã¿ã€
メモリ上ã«ç”»åƒã‚’展開。
ã‚ã¨ã¯ã€Invalidaterect()を呼ã³å‡ºã—ã€ç”»é¢ä¸Šã«ç”»åƒè¡¨ç¤ºã—ã¾ã™ã€‚
ç”»åƒã‚¨ãƒªã‚¢ã‚’ダブルクリックã—ã¦ã€ç”»åƒã‚’è¦å®šã‚¢ãƒ—リã§é–‹ã
ダイアãƒã‚°ã‚¦ã‚£ãƒ³ãƒ‰ã‚¦ã®ãƒ€ãƒ–ルクリックイベントã®ãƒãƒ³ãƒ‰ãƒ©ã‚’è¿½åŠ ã€‚
上図ã®ã‚ˆã†ã«ã€ã‚¯ãƒ©ã‚¹ã‚¦ã‚£ã‚¶ãƒ¼ãƒ‰ã‹ã‚‰â€WM_LBUTTONDBCLKâ€ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ãƒãƒ³ãƒ‰ãƒ©ã‚’è¿½åŠ ã§ãã¾ã™ã€‚
void CScrennshotTimerDlg::OnLButtonDblClk(UINT nFlags, CPoint point)
{
// TODO: ã“ã“ã«ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ ãƒãƒ³ãƒ‰ãƒ©ãƒ¼ ã‚³ãƒ¼ãƒ‰ã‚’è¿½åŠ ã™ã‚‹ã‹ã€æ—¢å®šã®å‡¦ç†ã‚’呼ã³å‡ºã—ã¾ã™ã€‚
// 標示画åƒãŒæœªç¢ºå®šã®å ´åˆã¯ä½•ã‚‚ã—ãªã„。
if (sel_no == 0) return;
//クリックä½ç½®ãŒç”»åƒã‚¨ãƒªã‚¢å†…ã‹ã©ã†ã‹
if (point.x >= DISP_LEFT && point.x <= DISP_LEFT + DISP_WIDTH
&& point.y >= DISP_TOP && point.y <= DISP_TOP + DISP_WIDTH * height / width)
{
// ç”»åƒãƒ•ァイルを画é¢çŠ¶ã«æ¨™ç¤º
CString name;
name.Format(_T("%02d.bmp"), sel_no);
// ファイルåを指定ã—ã¦é–¢é€£ä»˜ã‘られãŸã‚¢ãƒ—リケーションを起動
::ShellExecute(NULL, _T("open"),name, NULL, _T("./capture"), SW_SHOWNORMAL);
}
CDialogEx::OnLButtonDblClk(nFlags, point);
}
クリックä½ç½®ãŒç”»åƒã‚¨ãƒªã‚¢å†…ã§ã‚れã°ã€è¡¨ç¤ºã—ã¦ã„ã‚‹ç”»åƒã‚’è¦å®šã®ã‚¢ãƒ—リã§é–‹ã„ã¦
拡大表示ã™ã‚‹ã‚ˆã†ã«ã—ã¦ã„ã¾ã™ã€‚
ShellExecute()ã®ãƒ‘ラメータã«ã¯ã€ãƒ•ォルダåã¨ãƒ•ァイルåを分ã‘ã¦ãれãžã‚Œè¨å®šã—ã¾ã™ã€‚
ã“れã§ã€è¦å®šã®ã‚¢ãƒ—リã§ãƒ“ットマップファイルãŒé–‹ã‹ã‚Œã¾ã™ã€‚
本アプリã¯ã€ä»¥ä¸‹ã‚ˆã‚Šãƒ€ã‚¦ãƒ³ãƒãƒ¼ãƒ‰ã§ãã¾ã™ã®ã§ã€è‰¯ã‹ã£ãŸã‚‰ä½¿ã£ã¦ã¿ã¦ä¸‹ã•ã„。
※ ãŸã ã—ã€ç°¡å˜ãªå‹•作確èªç¨‹åº¦ã—ã‹è¡Œã£ã¦ã„ã¾ã›ã‚“ã®ã§ã€ãŠä½¿ã„ã«ãªã‚‹å ´åˆã¯è‡ªå·±è²¬ä»»ã§ãŠé¡˜ã„致ã—ã¾ã™ã€‚
スクリーンショットタイマー ダウンãƒãƒ¼ãƒ‰ã¯ã‚³ãƒãƒ©