// ウィンドウプロシージャ LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { HDC hdc; static BOOL onClip = FALSE; static BOOL firstDraw = TRUE; static RECT clipRect = {0, 0, 0, 0}; switch (message) { case WM_RBUTTONDOWN: // キャンセル DestroyWindow(hWnd); return DefWindowProc(hWnd, message, wParam, lParam); break; case WM_TIMER: // ESCキー押下の検知 if (GetKeyState(VK_ESCAPE) & 0x8000){ DestroyWindow(hWnd); return DefWindowProc(hWnd, message, wParam, lParam); } break; case WM_MOUSEMOVE: if (onClip) { // 新しい座標をセット clipRect.right = LOWORD(lParam) + ofX; clipRect.bottom = HIWORD(lParam) + ofY; hdc = GetDC(NULL); drawRubberband(hdc, &clipRect, FALSE); ReleaseDC(NULL, hdc); } break; case WM_LBUTTONDOWN: { // クリップ開始 onClip = TRUE; // 初期位置をセット clipRect.left = LOWORD(lParam) + ofX; clipRect.top = HIWORD(lParam) + ofY; // マウスをキャプチャ SetCapture(hWnd); } break; case WM_LBUTTONUP: { // クリップ終了 onClip = FALSE; // マウスのキャプチャを解除 ReleaseCapture(); // 新しい座標をセット clipRect.right = LOWORD(lParam) + ofX; clipRect.bottom = HIWORD(lParam) + ofY; // 画面に直接描画,って形 HDC hdc = GetDC(NULL); // 線を消す drawRubberband(hdc, &clipRect, TRUE); // 座標チェック if ( clipRect.right < clipRect.left ) { int tmp = clipRect.left; clipRect.left = clipRect.right; clipRect.right = tmp; } if ( clipRect.bottom < clipRect.top ) { int tmp = clipRect.top; clipRect.top = clipRect.bottom; clipRect.bottom = tmp; } // 画像のキャプチャ int iWidth, iHeight; iWidth = clipRect.right - clipRect.left + 1; iHeight = clipRect.bottom - clipRect.top + 1; if(iWidth == 0 || iHeight == 0) { // 画像になってない, なにもしない ReleaseDC(NULL, hdc); DestroyWindow(hWnd); break; } // ビットマップバッファを作成 HBITMAP newBMP = CreateCompatibleBitmap(hdc, iWidth, iHeight); HDC newDC = CreateCompatibleDC(hdc); // 関連づけ SelectObject(newDC, newBMP); // 画像を取得 BitBlt(newDC, 0, 0, iWidth, iHeight, hdc, clipRect.left, clipRect.top, SRCCOPY); // ウィンドウを隠す! ShowWindow(hWnd, SW_HIDE); /* // 画像をクリップボードにコピー if ( OpenClipboard(hWnd) ) { // 消去 EmptyClipboard(); // セット SetClipboardData(CF_BITMAP, newBMP); // 閉じる CloseClipboard(); } */ // テンポラリファイル名を決定 TCHAR tmpDir[MAX_PATH], tmpFile[MAX_PATH]; GetTempPath(MAX_PATH, tmpDir); GetTempFileName(tmpDir, _T("gya"), 0, tmpFile); if (savePNG(tmpFile, newBMP)) { // うp if (!uploadFile(hWnd, tmpFile)) { // アップロードに失敗... // エラーメッセージは既に表示されている /* TCHAR sysDir[MAX_PATH]; if (SUCCEEDED(StringCchCopy(sysDir, MAX_PATH, tmpFile)) && SUCCEEDED(StringCchCat(sysDir, MAX_PATH, _T(".png")))) { MoveFile(tmpFile, sysDir); SHELLEXECUTEINFO lsw = {0}; lsw.hwnd = hWnd; lsw.cbSize = sizeof(SHELLEXECUTEINFO); lsw.lpVerb = _T("open"); lsw.lpFile = sysDir; ShellExecuteEx(&lsw); } */ } } else { // PNG保存失敗... MessageBox(hWnd, _T("Cannot save png image"), szTitle, MB_OK | MB_ICONERROR); } // 後始末 DeleteFile(tmpFile); DeleteDC(newDC); DeleteObject(newBMP); ReleaseDC(NULL, hdc); DestroyWindow(hWnd); PostMessage(hWnd,WM_CLOSE,0,0); // PostQuitMessage(0); } break; case WM_DESTROY: PostQuitMessage(0); break; default: return DefWindowProc(hWnd, message, wParam, lParam); } return 0; }
// �E�B���h�E�v���V�[�W�� LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { HDC hdc; static BOOL onClip = FALSE; static BOOL firstDraw = TRUE; static RECT clipRect = {0, 0, 0, 0}; switch (message) { case WM_RBUTTONDOWN: // �L�����Z�� DestroyWindow(hWnd); return DefWindowProc(hWnd, message, wParam, lParam); break; case WM_TIMER: // ESC�L�[�����̌��m if (GetKeyState(VK_ESCAPE) & 0x8000){ DestroyWindow(hWnd); return DefWindowProc(hWnd, message, wParam, lParam); } break; case WM_MOUSEMOVE: if (onClip) { // �V�������W���Z�b�g clipRect.right = LOWORD(lParam) + ofX; clipRect.bottom = HIWORD(lParam) + ofY; hdc = GetDC(NULL); drawRubberband(hdc, &clipRect, FALSE); ReleaseDC(NULL, hdc); } break; case WM_LBUTTONDOWN: { // �N���b�v�J�n onClip = TRUE; // �����ʒu���Z�b�g clipRect.left = LOWORD(lParam) + ofX; clipRect.top = HIWORD(lParam) + ofY; // �}�E�X���L���v�`�� SetCapture(hWnd); } break; case WM_LBUTTONUP: { // �N���b�v�I�� onClip = FALSE; // �}�E�X�̃L���v�`�������� ReleaseCapture(); // �V�������W���Z�b�g clipRect.right = LOWORD(lParam) + ofX; clipRect.bottom = HIWORD(lParam) + ofY; // ��ʂɒ��ڕ`��C���Č` HDC hdc = GetDC(NULL); // �������� drawRubberband(hdc, &clipRect, TRUE); // ���W�`�F�b�N if ( clipRect.right < clipRect.left ) { int tmp = clipRect.left; clipRect.left = clipRect.right; clipRect.right = tmp; } if ( clipRect.bottom < clipRect.top ) { int tmp = clipRect.top; clipRect.top = clipRect.bottom; clipRect.bottom = tmp; } // �摜�̃L���v�`�� int iWidth, iHeight; iWidth = clipRect.right - clipRect.left + 1; iHeight = clipRect.bottom - clipRect.top + 1; if(iWidth == 0 || iHeight == 0) { // �摜�ɂȂ��ĂȂ�, �Ȃɂ����Ȃ� ReleaseDC(NULL, hdc); DestroyWindow(hWnd); break; } // �r�b�g�}�b�v�o�b�t�@���쐬 HBITMAP newBMP = CreateCompatibleBitmap(hdc, iWidth, iHeight); HDC newDC = CreateCompatibleDC(hdc); // �֘A�Â� SelectObject(newDC, newBMP); // �摜���擾 BitBlt(newDC, 0, 0, iWidth, iHeight, hdc, clipRect.left, clipRect.top, SRCCOPY); // �E�B���h�E���B��! ShowWindow(hWnd, SW_HIDE); /* // �摜���N���b�v�{�[�h�ɃR�s�[ if ( OpenClipboard(hWnd) ) { // ���� EmptyClipboard(); // �Z�b�g SetClipboardData(CF_BITMAP, newBMP); // ���� CloseClipboard(); } */ // �e���|�����t�@�C���������� TCHAR tmpDir[MAX_PATH], tmpFile[MAX_PATH]; GetTempPath(MAX_PATH, tmpDir); GetTempFileName(tmpDir, _T("gya"), 0, tmpFile); if (savePNG(tmpFile, newBMP)) { // ���� if (!uploadFile(hWnd, tmpFile)) { // �A�b�v���[�h�Ɏ��s... // �G���[���b�Z�[�W�͊��ɕ\������Ă��� /* TCHAR sysDir[MAX_PATH]; if (SUCCEEDED(StringCchCopy(sysDir, MAX_PATH, tmpFile)) && SUCCEEDED(StringCchCat(sysDir, MAX_PATH, _T(".png")))) { MoveFile(tmpFile, sysDir); SHELLEXECUTEINFO lsw = {0}; lsw.hwnd = hWnd; lsw.cbSize = sizeof(SHELLEXECUTEINFO); lsw.lpVerb = _T("open"); lsw.lpFile = sysDir; ShellExecuteEx(&lsw); } */ } } else { // PNG�ۑ����s... MessageBox(hWnd, _T("Cannot save png image"), szTitle, MB_OK | MB_ICONERROR); } // ��n�� DeleteFile(tmpFile); DeleteDC(newDC); DeleteObject(newBMP); ReleaseDC(NULL, hdc); DestroyWindow(hWnd); PostQuitMessage(0); } break; case WM_DESTROY: PostQuitMessage(0); break; default: return DefWindowProc(hWnd, message, wParam, lParam); } return 0; }