スクリーンショットタイマー

アップデート:October. 2024

指定ã—ãŸã‚¢ãƒ—リã®ã‚¹ã‚¯ã‚·ãƒ§ã‚’3ç§’é–“éš”ã§å–å¾—ã™ã‚‹ã‚¢ãƒ—リã§ã™ã€‚
何ã«ä½¿ã†ã®ã‹ã¨ã„ã†ã¨ãƒ»ãƒ»ãƒ»
ã‹ã®æœ‰åゲーム「MineCraft(マイクラ)ã€ã§ã€æ­»ã‚“ã å ´æ‰€ã‚’確èªã™ã‚‹ãŸã‚ã«ä½¿ã„ã¾ã™ï¼



ã“ã®ã‚²ãƒ¼ãƒ ã§ã¯ã€æ­»ã‚“ã å ´æ‰€ãŒåˆ†ã‹ã‚‰ãªã„ã¨ã€å¤§å¤‰ãªæ‚²åЇã«è¦‹èˆžã‚れるã“ã¨ã«ãªã‚Šã¾ã™ã€‚。。
ãã®ã‚ˆã†ãªæ‚²åЇã‹ã‚‰ã€å°‘ã—ã§ã‚‚多ãã®äººã‚’æ•‘ã†ã¹ãã€ãƒ—ログラムを作ã£ã¦ã€æ­»ã¬å‰ã®åº§æ¨™ã‚’確èªã§ãるよã†ã«ã—ãŸã„ã¨æ€ã„ç«‹ã¡ã¾ã—ãŸã€‚

ãã†ã„ã†ãƒ¯ã‚±ã§ã€ãŠã‚ˆã10å¹´ã¶ã‚Šã®Windowsアプリ制作ã«ãƒˆãƒ©ã‚¤ã—ã¾ã™ã€‚

ãƒ—ãƒ­ã‚°ãƒ©ãƒ ã®æ¦‚è¦
ã¾ãšã€ãƒžã‚¤ã‚¯ãƒ©ã®ãƒ—レイ開始時ã«ã€ã“ã®ã‚¢ãƒ—リã§ã‚­ãƒ£ãƒ—ãƒãƒ£é–‹å§‹æ“作を行ã„ã€å‘¨æœŸçš„ã«ãƒžã‚¤ã‚¯ãƒ©ã®ç”»é¢ã‚’キャプãƒãƒ£ã—ã¾ã™ã€‚
ãã—ã¦ã€æ­»ã‚“ã ã‚‰ã™ãã«ã‚­ãƒ£ãƒ—ãƒãƒ£ã‚’åœæ­¢ã‚’ã—ã¾ã™ã€‚
ã“れã«ã‚ˆã‚Šã€æ­»ã¬æ™‚ã«ã„ãŸå ´æ‰€ã®åº§æ¨™ã‚’確èªã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚(ワールドã®è¨­å®šã§åº§æ¨™è¡¨ç¤ºã‚’ONã«ã—ã¦ãŠãã“ã¨ã€‚)

ãã®ä»–ã®ç´°ã‹ã„仕様ã«ã¤ã„ã¦ã¯ã€ä»¥ä¸‹ã®ãƒ¡ã‚¤ã‚­ãƒ³ã‚°ã‚’å‚ç…§ã—ã¦ãã ã•ã„。


ç”»é¢ãƒ‡ã‚¶ã‚¤ãƒ³
今回ã¯ã€2024å¹´10æœˆæ™‚ç‚¹ã§æœ€æ–°ã®Visual Studio 2022(VS2022)を使ã£ã¦C++ã§åˆ¶ä½œã—ã¾ã™ã€‚
ã“ã“ã§ã¯VSã®æ“作ã«ã¤ã„ã¦ç´°ã‹ã„説明ã¯å‰²æ„›ã—ã¾ã™ãŒã€Visual Studioã«ä»˜å±žã®ãƒ€ã‚¤ã‚¢ãƒ­ã‚°ã‚¨ãƒ‡ã‚£ã‚¿ã‚’利用ã—ã¦ã€ 以下ã®ã‚ˆã†ã«éƒ¨å“(コントロール)を設置ã—ãŸç”»é¢ãƒ‡ã‚¶ã‚¤ãƒ³ã‚’作æˆã€‚



OKボタンやキャンセルボタンã¯ã‚りã¾ã›ã‚“。 ウィンドウå³ä¸Šã®ã€ŒÃ—ã€ãƒœã‚¿ãƒ³ã§ã‚¢ãƒ—リを修了ã—ã¾ã™ã€‚
ãã®ä»–ã€ä½¿ç”¨ã™ã‚‹ã‚³ãƒ³ãƒˆãƒ­ãƒ¼ãƒ«ã¯ä»¥ä¸‹ã®3種類ã®ã¿ã€‚

  • コンボボックス : キャプãƒãƒ£ã™ã‚‹ã‚¦ã‚£ãƒ³ãƒ‰ã‚¦é¸æŠž
  • ボタン : キャプãƒãƒ£é–‹å§‹ãƒ»åœæ­¢ã®ï¼’ã¤
  • スピンコントロール : アプリウィンドウã«è¡¨ç¤ºã™ã‚‹ç”»åƒã‚’切り替ãˆ


  • ã“れã ã‘ã§ã€ã‚‚ã†ã©ã‚“ãªã‚¢ãƒ—リã«ãªã‚‹ã®ã‹ã¯ã€ã ã„ãŸæƒ³åƒãŒã¤ãã¾ã™ã­ã€‚
    ãã—ã¦ã€ãƒ—ログラミングã¯ã“ã“ã‹ã‚‰ãŒæœ¬ç•ªã§ã™ï¼

    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];
    
    	}
    }
    			

    コンボボックスã®ã‚¤ãƒ³ãƒ‡ãƒƒã‚¯ã‚¹ã¨ã€ã‚¦ã‚£ãƒ³ãƒ‰ã‚¦ãƒãƒ³ãƒ‰ãƒ«ã®é…åˆ—ã®æ·»ãˆå­—ã‚’åˆã‚ã›ã‚‹ãŸã‚㫠コンボボックスã«è¿½åŠ ã—ãŸã‚¦ã‚£ãƒ³ãƒ‰ã‚¦ã®ãƒãƒ³ãƒ‰ãƒ«ã®ã¿ã®é…列を別途準備ã—ã¦ã„ã¾ã™ã€‚

    [PR]

    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も自動的ã«è§£æ”¾ã•れる
    	}
    }
    			
    [PR]

    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()ã®ãƒ‘ラメータã«ã¯ã€ãƒ•ォルダåã¨ãƒ•ァイルåを分ã‘ã¦ãれãžã‚Œè¨­å®šã—ã¾ã™ã€‚
    ã“れã§ã€è¦å®šã®ã‚¢ãƒ—リã§ãƒ“ットマップファイルãŒé–‹ã‹ã‚Œã¾ã™ã€‚


    本アプリã¯ã€ä»¥ä¸‹ã‚ˆã‚Šãƒ€ã‚¦ãƒ³ãƒ­ãƒ¼ãƒ‰ã§ãã¾ã™ã®ã§ã€è‰¯ã‹ã£ãŸã‚‰ä½¿ã£ã¦ã¿ã¦ä¸‹ã•ã„。
    ※ ãŸã ã—ã€ç°¡å˜ãªå‹•作確èªç¨‹åº¦ã—ã‹è¡Œã£ã¦ã„ã¾ã›ã‚“ã®ã§ã€ãŠä½¿ã„ã«ãªã‚‹å ´åˆã¯è‡ªå·±è²¬ä»»ã§ãŠé¡˜ã„致ã—ã¾ã™ã€‚