|
日時: 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;
}
|