サンプル
//------------------------------------------------------------------------------
// 第11話 マウス処理で描こう
//==============================================================================
// 新規作成日:2011-05-28 (土) 07:00:00
// 最終更新日:2011-05-28 (土) 07:38:00
//------------------------------------------------------------------------------
#include <tchar.h>
#include <Windows.h>
#include <WindowsX.h>
//------------------------------------------------
// break付きのキーワード
//------------------------------------------------
#define CASE break;case
#define DEFAULT break;default
//------------------------------------------------
// このファイルで使用する関数
//------------------------------------------------
#define apiLoadImage(h,id,type,cast) ((cast)LoadImage(h,MAKEINTRESOURCE(id),type,0,0,(LR_DEFAULTSIZE | LR_SHARED)))
#define apiLoadIcon(h,id) apiLoadImage(h,id,IMAGE_ICON,HICON)
#define apiLoadCursor(h,id) apiLoadImage(h,id,IMAGE_CURSOR,HCURSOR)
//------------------------------------------------
// 列挙定数(キャプチャ動作)
//------------------------------------------------
enum eCAPTURE {
CAPTURE_NULL, // キャプチャなし
CAPTURE_START, // キャプチャ開始
CAPTURE_STOP, // キャプチャ終了
};
//------------------------------------------------
// ウインドウ・プロシージャの関数
//------------------------------------------------
extern LRESULT CALLBACK mainWindowProc( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam )
{
static POINT po[ 2 ];
static UINT nCapture;
switch ( uMsg ){
CASE WM_CREATE:
CASE WM_CLOSE:
DestroyWindow( hWnd );
CASE WM_DESTROY:
PostQuitMessage( 0 );
CASE WM_PAINT:
{
PAINTSTRUCT ps;
HDC hDC;
hDC = BeginPaint( hWnd, &ps );
SelectObject( hDC, GetStockObject(DC_PEN) );
SelectObject( hDC, GetStockObject(DC_BRUSH) );
switch ( nCapture ){
CASE CAPTURE_START:
SetDCPenColor( hDC, RGB(0xFF,0x00,0x00) );
SetDCBrushColor( hDC, RGB(0xFF,0x00,0x00) );
Ellipse( hDC, (po[0].x - 2), (po[0].y - 2), (po[0].x + 3), (po[0].y + 3) );
Ellipse( hDC, (po[1].x - 2), (po[1].y - 2), (po[1].x + 3), (po[1].y + 3) );
SelectObject( hDC, GetStockObject(NULL_BRUSH) );
Rectangle( hDC, po[0].x, po[0].y, po[1].x, po[1].y );
SelectObject( hDC, GetStockObject(DC_BRUSH) );
CASE CAPTURE_STOP:
SetDCPenColor( hDC, RGB(0x99,0x66,0x00) );
SetDCBrushColor( hDC, RGB(0xFF,0x99,0x00) );
Rectangle( hDC, po[0].x, po[0].y, po[1].x, po[1].y );
nCapture = CAPTURE_NULL;
DEFAULT:break;
}
EndPaint( hWnd, &ps );
}
CASE WM_LBUTTONDOWN:
if ( nCapture == CAPTURE_NULL ){
nCapture = CAPTURE_START;
po[ 0 ].x = po[ 1 ].x = GET_X_LPARAM( lParam );
po[ 0 ].y = po[ 1 ].y = GET_Y_LPARAM( lParam );
InvalidateRect( hWnd, NULL, TRUE );
UpdateWindow( hWnd );
SetCapture( hWnd );
}
CASE WM_MOUSEMOVE:
if ( nCapture == CAPTURE_START ){
po[ 1 ].x = GET_X_LPARAM( lParam );
po[ 1 ].y = GET_Y_LPARAM( lParam );
InvalidateRect( hWnd, NULL, TRUE );
UpdateWindow( hWnd );
}
CASE WM_LBUTTONUP:
if ( nCapture == CAPTURE_START ){
nCapture = CAPTURE_STOP;
po[ 1 ].x = GET_X_LPARAM( lParam );
po[ 1 ].y = GET_Y_LPARAM( lParam );
InvalidateRect( hWnd, NULL, TRUE );
UpdateWindow( hWnd );
ReleaseCapture();
}
DEFAULT:return DefWindowProc( hWnd, uMsg, wParam, lParam );
}
return 0;
}
//------------------------------------------------
// ウインドウ・クラスの登録
//------------------------------------------------
static ATOM funcWindowClass( HINSTANCE hInstance, LPCTSTR lpClassName )
{
WNDCLASSEX wcex = { 0 };
wcex.cbSize = sizeof(WNDCLASSEX);
wcex.style = (CS_HREDRAW | CS_VREDRAW | CS_DBLCLKS);
wcex.lpfnWndProc = mainWindowProc;
wcex.cbClsExtra = 0;
wcex.cbWndExtra = 0;
wcex.hInstance = hInstance;
wcex.hIcon = apiLoadIcon( NULL, IDI_APPLICATION );
wcex.hIconSm = apiLoadIcon( NULL, IDI_APPLICATION );
wcex.hCursor = apiLoadCursor( NULL, IDC_ARROW );
wcex.hbrBackground = (HBRUSH)GetStockObject( WHITE_BRUSH );
wcex.lpszMenuName = NULL;
wcex.lpszClassName = lpClassName;
return RegisterClassEx( &wcex );
}
//------------------------------------------------
// ウインドウの作成
//------------------------------------------------
static HWND funcCreateWindow( HINSTANCE hInstance, LPCTSTR lpClassName, LPCTSTR lpTitleName, int nCmdShow )
{
HWND hWnd = CreateWindowEx(
0, // 拡張ウインドウ・スタイル
lpClassName, // クラス名
lpTitleName, // タイトル名
WS_OVERLAPPEDWINDOW, // ウインドウ・スタイル
CW_USEDEFAULT, // 横座標
CW_USEDEFAULT, // 縦座標
CW_USEDEFAULT, // 横幅
CW_USEDEFAULT, // 高さ
NULL, // 親ウインドウのハンドル
NULL, // メニューのハンドル
hInstance, // インスタンスのハンドル
NULL ); // ウインドウ作成のデータ
if ( hWnd != NULL ){
ShowWindow( hWnd, nCmdShow );
UpdateWindow( hWnd );
}
return hWnd;
}
//------------------------------------------------
// メイン関数
//------------------------------------------------
extern int WINAPI _tWinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow )
{
LPCTSTR lpClassName = TEXT("PaintSoftWndClass");
LPCTSTR lpTitleName = TEXT("第11話 お絵かきソフトを作ろう");
MSG Msg;
if ( funcWindowClass(hInstance,lpClassName) == 0 ){
return -1;
}
if ( funcCreateWindow(hInstance,lpClassName,lpTitleName,nCmdShow) == NULL ){
return -2;
}
while ( GetMessage(&Msg,NULL,0,0) > 0 ){
TranslateMessage( &Msg );
DispatchMessage( &Msg );
}
UNREFERENCED_PARAMETER( hPrevInstance );
UNREFERENCED_PARAMETER( lpCmdLine );
return Msg.wParam;
}
//------------------------------------------------------------------------------
// End of 第11話マウス処理で描こう.cpp
//------------------------------------------------------------------------------
※コメント投稿者のブログIDはブログ作成者のみに通知されます