ソース掲示板




すべてから検索

キーワード   条件 表示 現行ログ 過去ログ トピックス 名前 本文
マウス移動中の色をダイアログに表示 ( No.1 )
日時: 2009/03/18 23:47
名前: lightbox





ソースコードとバイナリのダウンロード

※ 取得した色が白と黒の時にキャプチャを継続できるように、決定を右クリックに変更

拡張子:
// *********************************************************
// 【スポイトプログラム】
// *********************************************************

#define _WIN32_WINNT 0x0500
#include <tchar.h>
#include "lightbox\lightbox.h"

#pragma comment( lib, "lightbox\\lightbox.lib" )
#pragma comment( lib, "shlwapi.lib" )

#define CONNECT_DELOBJECT	LBOX_USER + 1

LboxTool Tool;			// ツールオブジェクト
LboxDlg *Dlg = NULL;

LRESULT CALLBACK DialogProc( HWND, UINT, WPARAM, LPARAM );

// *********************************************************
// Windows アプリケーションとしてのエントリポイント
// Link.exe で /SUBSYSTEM:WINDOWS がデフォルトで
// 指定される事になります
// *********************************************************
int APIENTRY _tWinMain(
	HINSTANCE hInstance,
	HINSTANCE hPrevInstance,
	LPTSTR lpCmdLine,
	int nCmdShow
)
{

	// ダイアログ表示
	DialogBox(
		hInstance,
		(LPCTSTR)1, 
		GetDesktopWindow(), 
		(DLGPROC)DialogProc);

	return 0;
}

int flg = 0;
int r,g,b;
HWND color;
// *********************************************************
//  MDB 接続ダイアログ
// *********************************************************
LRESULT CALLBACK DialogProc( HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam )
{

	switch( message ) {
	case WM_INITDIALOG:

		// ダイアログオブジェクト作成
		Dlg = new LboxDlg( hDlg );
		Dlg->ChangeIcon( 1 );

		// デスクトップの左上
		Dlg->MoveWindow(0,0);
		color =  GetDlgItem(hDlg, 4);

		return true;


	// 色を決定
	// 但し、白と黒は無視
	case WM_RBUTTONDOWN:

		{
			POINTS pts;
			POINT pt;
			pts = MAKEPOINTS(lParam);
			pt.x = pts.x;
			pt.y = pts.y;
			ClientToScreen( hDlg, &pt );

			HDC DispDC;
			COLORREF Clr;

			DispDC = CreateDC("DISPLAY",NULL,NULL,NULL);
			Clr = GetPixel(DispDC,pt.x,pt.y);
			DeleteDC(DispDC);

			LboxString LString;
			LString.Printf("%02X%02X%02X",
				GetRValue(Clr), GetGValue(Clr), GetBValue(Clr));

			// 白と黒以外なら、カラーコードをクリップボードへコピー
			// して終了
			if ( LString != "FFFFFF" && LString != "000000" ) {
				// クリップボードへコピー
				Tool.CopyClipboard( LString.szLboxString );
				Dlg->End( LOWORD(wParam) );
				Dlg->SendMsg( CONNECT_DELOBJECT, 0, 0 );
			}

		}

		break;

	// なにもせずに終了
	case WM_LBUTTONUP:
		ReleaseCapture();
		Dlg->End( LOWORD(wParam) );
		Dlg->SendMsg( CONNECT_DELOBJECT, 0, 0 );

		break;

	// マウス移動中のカラーコードを表示
	case WM_MOUSEMOVE:

		{
			POINTS pts;
			POINT pt;
			pts = MAKEPOINTS(lParam);
			pt.x = pts.x;
			pt.y = pts.y;
			ClientToScreen( hDlg, &pt );

			HDC DispDC;
			COLORREF Clr;

			DispDC = CreateDC("DISPLAY",NULL,NULL,NULL);
			Clr = GetPixel(DispDC,pt.x,pt.y);
			DeleteDC(DispDC);

			r = GetRValue(Clr);		// rgb の保存は、色を設定する為
			g = GetGValue(Clr);
			b = GetBValue(Clr);
			LboxString LString;
			LString.Printf("%02X%02X%02X",
				GetRValue(Clr), GetGValue(Clr), GetBValue(Clr));

			HWND hLabel;
			// カラーコード表示
			hLabel = GetDlgItem(hDlg, 3);
			SetWindowText( hLabel, LString.szLboxString );

			hLabel = GetDlgItem(hDlg, 4);
			// 文字部分の背景色で色を表現する為に、内容を更新する
			SetWindowText( hLabel, "    " );

		}
		break;

	case WM_CTLCOLORSTATIC:
		// スタティックコントロールで色を表現
		if ( (HWND)lParam == color ) {
			// テキスト部分の背景色
			SetBkColor((HDC)wParam, RGB( r,g,b )); 
			// ヌルブラシでコントロール全体の背景色を変更( つまり変わらない )
			// 必ずブラシを返す必要があります
			return (LRESULT)GetStockObject(NULL_BRUSH);
		}
		break;

	case WM_COMMAND:

		// スポイト開始
		if( LOWORD(wParam) == 1 ) {
			INPUT inmouse;
			MOUSEINPUT mi;

			memset( &mi, 0x00, sizeof( MOUSEINPUT ) );

			// マウスの処理を作成
			mi.dwFlags = MOUSEEVENTF_LEFTDOWN;

			inmouse.type = INPUT_MOUSE;
			inmouse.mi = mi;

			// マウスの送信
			int ret;
			ret = SendInput( 1, &inmouse, sizeof( INPUT ) );

			// マウスダウンでドラッグ状態をエミュレート

			// キャプチャ開始
			SetCapture(hDlg);
			// 十字カーソル
			SetCursor(LoadCursor(NULL, IDC_CROSS));

		}

		// x ボタンで終了
		if( LOWORD(wParam) == 2 ) {
			SetCursor(LoadCursor(NULL, IDC_ARROW));
			ReleaseCapture();
			Dlg->End( LOWORD(wParam) );
			Dlg->SendMsg( CONNECT_DELOBJECT, 0, 0 );
		}

		break;

	case CONNECT_DELOBJECT:

		// ダイアログオブジェクトの廃棄
		delete Dlg;
		break;

	}
	return FALSE;
}