COLOR CHECK



ホームページを作るときなどに役立つ、色を見るプログラムです。
コピーボタンを押すことでRGBの16進表記をクリップボードに転送します

ソースのダウンロード

※)サンプルの作成はVC++5.0で行いました。
※2)サンプルはWIN32APIのみでMFCは使っていません。

COLOR CHECKの画面

解説

(全体の流れ)

  1. COMCTL32.LIBの読み込み、初期化
  2. ウィンドウ(ダイアログ)の作成
  3. コントロール類の初期化処理(色定義ファイルcolors.cndの読み込み等)
  4. スライダーコントロールの変化に応じてラベルを更新し、ブラシを作成して色見本を出力する
  5. リストボックスをダブルクリックした場合、スライダーやラベル、色見本を更新する
  6. 終了処理(リストボックスに関連させたメモリ領域の開放など)






(詳細)
1.COMCTL32.LIBの読み込み、初期化

スライダーコントロールを使用するのでCOMCTL32.LIBを読み込みます。(SkeletonMain.cpp)
INITCOMMONCONTROLSEX icc;

i cc.dwSize = sizeof(INITCOMMONCONTROLSEX);
icc.dwICC = ICC_BAR_CLASSES;
I nitCommonControlsEx(&icc);

これで初期化も出来ています
2.ウィンドウ(ダイアログ)の作成
リソースエディタで上の画像のようなダイアログを作ります。
IDはソースファイルを参考にしてください。
これで後はCreateDialog関数を使って実際に作成します。(WinInit.cpp)
g_hWnd = CreateDialog (
hInst, MAKEINTRESOURCE(IDD_MAIN),
NULL, (DLGPROC)MainWinProc);
3.コントロール類の初期化処理(色定義ファイルcolors.cndの読み込み等)
次に、コントロール類のハンドルをグローバル変数に格納し、リストボックスにデータを入れます。(CtrlInit.cpp)
hRedSlider = GetDlgItem(hWnd, IDC_RED_SLIDE);
hGreenSlider = GetDlgItem(hWnd, IDC_GREEN_SLIDE);
hBlueSlider = GetDlgItem(hWnd, IDC_BLUE_SLIDE);

hRedVal = GetDlgItem(hWnd, IDC_RED_VALUE);
hGreenVal =GetDlgItem(hWnd, IDC_GREEN_VALUE);
hBlueVal = GetDlgItem(hWnd, IDC_BLUE_VALUE);

hHexVal= GetDlgItem(hWnd, IDC_HEX_VALUE);
hColList = GetDlgItem(hWnd, IDC_COLOR_LIST);
次の処理でスライダーの範囲を0〜255にセットする。
SendMessage(hRedSlider, TBM_SETRANGEMAX, (WPARAM)1, (LPARAM)255);
SendMessage(hRedSlider, TBM_SETRANGEMIN, (WPARAM)1, (LPARAM)0);
SendMessage(hGreenSlider, TBM_SETRANGEMAX, (WPARAM)1, (LPARAM)255);
SendMessage(hGreenSlider, TBM_SETRANGEMIN, (WPARAM)1, (LPARAM)0);
SendMessage(hBlueSlider, TBM_SETRANGEMAX, (WPARAM)1, (LPARAM)255);
SendMessage(hBlueSlider, TBM_SETRANGEMIN, (WPARAM)1, (LPARAM)0);
最後にリストボックスに読み込んだファイルのデータをセットする
while (fscanf(fp, "%s %d %d %d", colname, &red, &green, &blue) != EOF)
{
idx = SendMessage(hColList, LB_ADDSTRING, 0, (LPARAM)colname);

COLORDATA *dat = (COLORDATA*)malloc(sizeof(COLORDATA));

dat->colname = colname;
dat->red = red;
dat->green = green;
dat->blue = blue;

SendMessage(hColList, LB_SETITEMDATA, (WPARAM)idx, (LPARAM)dat);
}
リストボックスにLB_SETITEMDATAメッセージを送信すると指定したセルに32Bitのデータを関連付けられる。
サンプルではここに新しく確保したデータの構造体へのポインタを格納している。
4.スライダーコントロールの変化に応じてラベルを更新し、ブラシを作成して色見本を出力する
スライダーコントロールを動かすとWM_HSCROLLメッセージが送られる。(MainWinProc.cpp)
だから、このメッセージに対応すれば良い。
case WM_HSCROLL:
switch (LOWORD(wParam)) {
case TB_TOP:
// すぺて同じ処理です case TB_BOTTOM:
case TB_LINEDOWN:
case TB_LINEUP:
case TB_THUMBPOSITION:
case TB_THUMBTRACK:
case TB_PAGEUP:
case TB_PAGEDOWN:
これからわかるように、すぺてのトラックバーからのメッセージに同じように処理を行う。
後はこの変更に応じてWM_PAINTメッセージを送り、色見本を更新する。
5.リストボックスをダブルクリックした場合、スライダーやラベル、色見本を更新する
リストボックスをクリックするとLBN_DBLCLKメッセージが送られてくるのでそれに応答するようにする。(MainWinProc.cpp)
case IDC_COLOR_LIST:
if (HIWORD(wParam) == LBN_DBLCLK) {
index = SendMessage(hColList, LB_GETCURSEL, 0, 0);
data = (COLORDATA*)SendMessage(hColList, LB_GETITEMDATA, (WPARAM)index, 0);
上のようにして、リストボックスのセルに関連させたデータを取得し、それにしたがって色見本を更新する。
6.終了処理(リストボックスに関連させたメモリ領域の開放など)
最後に終了処理をする(MainWinProc.cpp)
case WM_CLOSE:
{
for (int i = 0; i < SendMessage(hColList, LB_GETCOUNT, 0, 0); i++)
{
data = (COLORDATA*)SendMessage(hColList, LB_GETITEMDATA, (WPARAM)i, 0);
free(data);
}
} DestroyWindow (hwnd);
これにより割り当てられたメモリを開放する。


間違いを発見した方、質問をしたい方はこちらへお願いします。


トップページへ

Gポイントポイ活 Amazon Yahoo 楽天

無料ホームページ 楽天モバイル[UNLIMITが今なら1円] 海外格安航空券 海外旅行保険が無料!