/*************************************************************************************************** pCopyControl リストボックスのアイテムをテキストとしてコピー Copyright (C) 2008 by Pyo PapparaSoft ***************************************************************************************************/ // ------------------------------------------------------------------------------------------------- // インクルード // ------------------------------------------------------------------------------------------------- #include // ウィンドウ #include "resource.h" // リソース // ------------------------------------------------------------------------------------------------- // プリプロセッサ定義 // ------------------------------------------------------------------------------------------------- // クラス #define APP_TITLE "pCopyControl" // アプリケーションタイトル #define CLASSNAME_MAIN "MainFrame" // クラス名(メインウィンドウ) #define CLASSNAME_FINDERTOOL "FinderToolFrame" // クラス名(ファインダーツール) // コントロールID #define IDC_FINDERTOOL 100 // ファインダーツール #define IDC_EDIT 101 // エディットコントロール // バッファサイズ #define BUF_SIZE_S 255 // 文字列用バッファの長さ(Small) #define BUF_SIZE_M 1023 // 文字列用バッファの長さ(Medium) #define BUF_SIZE_L 4096 // 文字列用バッファの長さ(Large) // フォント #define DEFAULT_FONTNAME "MS ゴシック" // フォント名 // ------------------------------------------------------------------------------------------------- // 関数プロトタイプ宣言 // ------------------------------------------------------------------------------------------------- LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); // プロシージャ(メインウィンドウ) LRESULT CALLBACK FinderToolProc(HWND, UINT, WPARAM, LPARAM); // プロシージャ(ファインダーツール) HFONT InitFont(char *, int, int); // フォント作成 BOOL DrawRectFill(HDC, int, int, int, int, COLORREF); // 矩形描画 // ------------------------------------------------------------------------------------------------- // 変数 // ------------------------------------------------------------------------------------------------- // システム HINSTANCE hInst; // インスタンスハンドル char strinfo[BUF_SIZE_L + 1]; // 情報取得用 // 情報表示エディットコントロール HWND hEdit; // ウィンドウハンドル // ファインダーツール HWND hFinder; // ウィンドウハンドル // ************************************************************************************************* // メイン関数 // ************************************************************************************************* int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow) { HWND hWnd; // ウィンドウハンドル MSG msg; // メッセージ WNDCLASSEX wc; // ウィンドウクラス // インスタンスハンドルのコピー hInst = hInstance; // --------------------------------------------------------------------------------------------- // ファインダーツールのクラス登録 // --------------------------------------------------------------------------------------------- // ウィンドウクラスの設定 wc.cbSize = sizeof(wc); // 構造体の大きさ wc.style = NULL; // スタイル wc.lpfnWndProc = FinderToolProc; // メッセージ処理関数 wc.cbClsExtra = 0; wc.cbWndExtra = 0; wc.hInstance = hInstance; // プログラムのハンドル wc.hIcon = NULL; // アイコン wc.hCursor = LoadCursor(NULL, IDC_ARROW); // カーソル wc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH); // ブラシ wc.lpszMenuName = NULL; // メニュー wc.lpszClassName = CLASSNAME_FINDERTOOL; // クラス名 wc.hIconSm = NULL; // 小さいアイコン // ウインドウクラス登録 if (!RegisterClassEx(&wc)) { return 0; } // --------------------------------------------------------------------------------------------- // メインウィンドウの作成 // --------------------------------------------------------------------------------------------- // ウィンドウクラスの設定 wc.cbSize = sizeof(wc); // 構造体の大きさ wc.style = NULL; // スタイル wc.style = CS_HREDRAW | CS_VREDRAW; // スタイル wc.lpfnWndProc = WndProc; // メッセージ処理関数 wc.cbClsExtra = 0; wc.cbWndExtra = 0; wc.hInstance = hInstance; // プログラムのハンドル wc.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_ICON)); wc.hCursor = LoadCursor(NULL, IDC_ARROW); // カーソル wc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH); // ブラシ wc.lpszMenuName = NULL; // メニュー wc.lpszClassName = CLASSNAME_MAIN; // クラス名 wc.hIconSm = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_ICON)); // ウインドウクラス登録 if (!RegisterClassEx(&wc)) { return 0; } // ウィンドウ作成 hWnd = CreateWindowEx( 0, // 拡張スタイル CLASSNAME_MAIN, // クラス名 APP_TITLE, // テキスト WS_OVERLAPPEDWINDOW, // スタイル CW_USEDEFAULT, CW_USEDEFAULT, // 位置 360, 480, // 大きさ NULL, // 親ウインドウのハンドル NULL, // メニューハンドル hInstance, // インスタンスハンドル NULL // ウィンドウ作成データ ); if (hWnd == NULL) { return 0; } // ウィンドウ表示 ShowWindow(hWnd, iCmdShow); UpdateWindow(hWnd); // メッセージループ while (GetMessage(&msg, NULL, 0, 0)) { TranslateMessage(&msg); DispatchMessage(&msg); } return (int)msg.wParam; } // ************************************************************************************************* // ウィンドウプロシージャ // ************************************************************************************************* LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wp, LPARAM lp) { static HFONT hFont_Edit; // エディットコントロールのフォント RECT rc; // 矩形 // メッセージ判断 switch (msg) { // ウィンドウが作成されたとき case WM_CREATE: // ファインダーツール作成 hFinder = CreateWindowEx( 0, // 拡張スタイル CLASSNAME_FINDERTOOL, // クラス名 "", // テキスト WS_CHILD | // 子ウィンドウ WS_VISIBLE | // 表示 0, 0, 0, // 位置 0, 0, // 大きさ hWnd, // ウィンドウハンドル (HMENU)IDC_FINDERTOOL, // コントロールID hInst, // インスタンスハンドル NULL // ウィンドウ作成データ ); if (hFinder == NULL) { return -1; } // エディットコントロール作成 hEdit = CreateWindowEx( WS_EX_CLIENTEDGE | // くぼんだ境界線 0, // 拡張スタイル "EDIT", // クラス名 "", // テキスト WS_CHILD | // 子ウィンドウ WS_VISIBLE | // 表示 ES_MULTILINE | // マルチライン ES_WANTRETURN | // Enterキーで改行 WS_VSCROLL | // 垂直スクロールバー WS_HSCROLL | // 水平スクロールバー ES_AUTOVSCROLL | // 垂直オートスクロール ES_AUTOHSCROLL | // 水平オートスクロール ES_NOHIDESEL | // フォーカスを失っても選択状態を保つ 0, 0, 0, // 位置 0, 0, // 大きさ hWnd, // ウィンドウハンドル (HMENU)IDC_EDIT, // コントロールID hInst, // インスタンスハンドル NULL // ウィンドウ作成データ ); if (hEdit == NULL) { return -1; } // フォント作成 hFont_Edit = InitFont(DEFAULT_FONTNAME, 12, 0); if (hFont_Edit == NULL) { return -1; } // フォント設定 SendMessage(hEdit, WM_SETFONT, (WPARAM)hFont_Edit, TRUE); return 0; // ウィンドウサイズが変更されたとき case WM_SIZE: // ウィンドウのクライアント領域取得 GetClientRect(hWnd, &rc); // 子ウィンドウのサイズを変更 MoveWindow(hFinder, 0, 0, rc.right, 32, TRUE);; MoveWindow(hEdit, 0, 32, rc.right, rc.bottom - 32, TRUE); return 0; // Windowsの終了、またはログオフ case WM_QUERYENDSESSION: // アプリケーション終了 case WM_CLOSE: // ウィンドウ破棄 DestroyWindow(hWnd); return 0; // ウィンドウが破棄されたとき case WM_DESTROY: // フォント破棄 DeleteObject(hFont_Edit); // 終了メッセージ PostQuitMessage(0); return 0; } return DefWindowProc (hWnd, msg, wp, lp); } // ************************************************************************************************* // ファインダーツールのプロシージャ // ************************************************************************************************* LRESULT CALLBACK FinderToolProc(HWND hWnd, UINT msg, WPARAM wp, LPARAM lp) { // 描画情報 PAINTSTRUCT ps; // 描画の構造体 HDC hdc; // デバイスコンテキスト static HFONT hFont; // フォント HFONT hFont_old; // デフォルトのフォント RECT rc; // 矩形情報 // リストボックス情報 HWND hWnd_Get; // 取得対象ウィンドウハンドル POINT p_mouse; // マウス座標 int itemnum; // リストボックスのアイテム数 int len; // 文字列の長さ int i; // 一時変数 // メッセージ判断 switch (msg) { // ウィンドウが作成されたとき case WM_CREATE: // フォント作成 hFont = InitFont(DEFAULT_FONTNAME, 12, 0); if (hFont == NULL) { return -1; } return 0; // マウス左ボタンが押されたとき case WM_LBUTTONDOWN: // マウスキャプチャ開始 SetCapture(hWnd); // マウスカーソル変更 SetCursor(LoadCursor(0, IDC_CROSS)); return 0; // マウス左ボタンが押されて上がったとき case WM_LBUTTONUP: // マウスキャプチャ終了(WM_CAPTURECHANGED送信) ReleaseCapture(); // マウスカーソル変更 SetCursor(LoadCursor(0, IDC_ARROW)); return 0; // マウスが移動したとき case WM_MOUSEMOVE: // 現在キャプチャしている場合 if (GetCapture() == hWnd) { } return 0; // 背景描画 case WM_ERASEBKGND: // 背景色は描画しない return TRUE; // 描画 case WM_PAINT: // 描画開始 hdc = BeginPaint(hWnd, &ps); // クライアント領域を取得 GetClientRect(hWnd, &rc); // 矩形描画(背景の塗りつぶし) DrawRectFill(hdc, 0, 0, rc.right, rc.bottom, 0xffffff); // フォント変更 hFont_old = (HFONT)SelectObject(hdc, hFont); // 文字色変更 SetTextColor(hdc, 0x000000); // 文字列描画 lstrcpy(strinfo, "ここからドラッグ&ドロップでリストボックスを選択します"); TextOut(hdc, 4, 10, strinfo, lstrlen(strinfo)); // フォントを元に戻す SelectObject(hdc, hFont_old); // 描画終了 EndPaint(hWnd, &ps); return 0; // マウスキャプチャーを開放したとき(キャプチャーしているときにAlt + Tabなどでも送られてくる) case WM_CAPTURECHANGED: // エディットコントロールのテキストを削除 SetWindowText(hEdit, ""); // マウス位置取得 GetCursorPos(&p_mouse); // マウス下のウィンドウハンドルを取得 hWnd_Get = WindowFromPoint(p_mouse); if (hWnd_Get == NULL) { return 0; } // リストボックスのアイテム数を取得 itemnum = (int)SendMessage(hWnd_Get, LB_GETCOUNT, 0, 0); if (itemnum <= 0) { return 0; } // エディットコントロールに追加していく for (i = 0; i < itemnum; i++) { // アイテムのテキストの長さを取得 len = (int)SendMessage(hWnd_Get, LB_GETTEXTLEN, i, 0); if (len > BUF_SIZE_L) { lstrcpy(strinfo, "Error: BUFFER OVER FLOW"); } else { // アイテムのテキストをを取得 SendMessage(hWnd_Get, LB_GETTEXT, i, (LPARAM)strinfo); } // 次のアイテムがある場合 if (i + 1 < itemnum) { // 改行を追加 lstrcat(strinfo, "\r\n"); } // エディットコントロールに挿入 SendMessage(hEdit, EM_REPLACESEL, TRUE, (LPARAM)strinfo); } return 0; // ウィンドウ破棄 case WM_DESTROY: // フォント破棄 DeleteObject(hFont); return 0; } return DefWindowProc (hWnd, msg, wp, lp); } // ************************************************************************************************* // フォント作成 // ************************************************************************************************* HFONT InitFont(char *fontname, int height, int style) { int b; // 太字 DWORD i; // 斜体 DWORD u; // 下線 DWORD s; // 打ち消し線 // スタイルの変換 if (style & 1) { b = FW_BOLD; } else { b = FW_DONTCARE; } i = style & 2; u = style & 4; s = style & 8; // フォント作成 return CreateFont( height, // 高さ 0, // 平均文字幅(0で近似値を適当に選択) 0, // ベースラインの角度(0〜3600) 0, // 文字角度(0〜3600) b, i, u, s, // 太さ、斜体、下線、取り消し線 DEFAULT_CHARSET, // 指定なし OUT_DEFAULT_PRECIS, // 出力精度 CLIP_DEFAULT_PRECIS, // クリッピング精度 DEFAULT_QUALITY, // 出力品質 DEFAULT_PITCH | // デフォルトピッチ FF_DONTCARE | // 一般的なフォントファミリ 0, fontname // フォント名 ); } // ************************************************************************************************* // 矩形描画 // ************************************************************************************************* BOOL DrawRectFill(HDC hdc, int x, int y, int sx, int sy, COLORREF color) { HBRUSH hBrush, hBrush_old; // ブラシハンドル RECT rc; // 描画領域 // ブラシの作成 hBrush = CreateSolidBrush(color); // オブジェクトの選択 hBrush_old = (HBRUSH)SelectObject(hdc, hBrush); // 領域の設定 SetRect(&rc, x, y, x + sx, y + sy); // 塗りつぶし FillRect(hdc, &rc, hBrush); // オブジェクトを元に戻す SelectObject(hdc, hBrush_old); // 破棄 DeleteObject(hBrush); return TRUE; }