スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
  1. --/--/--(--) --:--:--|
  2. スポンサー広告

ボタンクリックで色が変わるエディットコントロール

MFCを使用してボタンクリックで色が変わるエディットコントロールのサンプルです。

本来WM_CTLCOLORメッセージは親ウィンドウに送られます。
MFCは発生元に送り返す仕組みがあるので、
エディットコントロールののCtlColorでWM_CTLCOLORメッセージを処理できます。


急いで作ったので
間違えがあるかもしれないので注意。


起動してエディットコントロールに文字を入力したところ。



ボタンを押したところ。



ボタンを押したところ。



以下はエディットコントロールとダイアログのソースです。
そのほかのファイルは想像して作ってください。
このブログには画像以外のファイルを置けないのでソース等は置けません。


#pragma once

// CColorEdit

class CColorEdit : public CEdit
{
    DECLARE_DYNAMIC(CColorEdit)

public:
    CColorEdit();
    virtual ~CColorEdit();
    void SetBgColor(COLORREF newBgColor, bool redraw = true);

protected:
    DECLARE_MESSAGE_MAP()

    COLORREF    m_color;
    COLORREF    m_bgColor;
    CBrush      m_brush;

public:
    afx_msg HBRUSH CtlColor(CDC* /*pDC*/, UINT /*nCtlColor*/);
};



// ColorEdit.cpp : 実装ファイル
//

#include "stdafx.h"
#include "ColorEdit_1.h"
#include "ColorEdit.h"

// CColorEdit

IMPLEMENT_DYNAMIC(CColorEdit, CEdit)

CColorEdit::CColorEdit()
{
    m_color = RGB(0,0,0);
    m_bgColor = RGB(255,255,255);
}

CColorEdit::~CColorEdit()
{
}

BEGIN_MESSAGE_MAP(CColorEdit, CEdit)
    ON_WM_CTLCOLOR_REFLECT()
END_MESSAGE_MAP()

// CColorEdit メッセージ ハンドラ

HBRUSH CColorEdit::CtlColor(CDC* pDC, UINT /*nCtlColor*/)
{
    pDC->SetTextColor(m_color);
    pDC->SetBkColor(m_bgColor);
    return m_brush;
}

void CColorEdit::SetBgColor(COLORREF newBgColor, bool redraw)
{
  m_bgColor = newBgColor;
  m_brush.DeleteObject();
  m_brush.CreateSolidBrush(newBgColor);
  if(redraw && m_hWnd != NULL) RedrawWindow(NULL,NULL,RDW_FRAME | RDW_INVALIDATE | RDW_UPDATENOW);
}



// ColorEdit_1Dlg.h : ヘッダー ファイル
//

#pragma once
#include "afxwin.h"
#include "ColorEdit.h"

// CColorEdit_1Dlg ダイアログ
class CColorEdit_1Dlg : public CDialog
{
// コンストラクション
public:
    CColorEdit_1Dlg(CWnd* pParent = NULL);  // 標準コンストラクタ

// ダイアログ データ
    enum { IDD = IDD_COLOREDIT_1_DIALOG };

    protected:
    virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV サポート


// 実装
protected:
    HICON m_hIcon;

    // 生成された、メッセージ割り当て関数
    virtual BOOL OnInitDialog();
    afx_msg void OnPaint();
    afx_msg HCURSOR OnQueryDragIcon();
    DECLARE_MESSAGE_MAP()
public:
    CColorEdit m_edit1;
public:
    afx_msg void OnBnClickedButton1();
public:
    afx_msg void OnBnClickedButton2();
};



// ColorEdit_1Dlg.cpp : 実装ファイル
//

#include "stdafx.h"
#include "ColorEdit_1.h"
#include "ColorEdit_1Dlg.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#endif

// CColorEdit_1Dlg ダイアログ

CColorEdit_1Dlg::CColorEdit_1Dlg(CWnd* pParent /*=NULL*/)
    : CDialog(CColorEdit_1Dlg::IDD, pParent)
{
    m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}

void CColorEdit_1Dlg::DoDataExchange(CDataExchange* pDX)
{
    CDialog::DoDataExchange(pDX);
    DDX_Control(pDX, IDC_EDIT1, m_edit1);
}

BEGIN_MESSAGE_MAP(CColorEdit_1Dlg, CDialog)
    ON_WM_PAINT()
    ON_WM_QUERYDRAGICON()
    //}}AFX_MSG_MAP
    ON_BN_CLICKED(IDC_BUTTON1, &CColorEdit_1Dlg::OnBnClickedButton1)
    ON_BN_CLICKED(IDC_BUTTON2, &CColorEdit_1Dlg::OnBnClickedButton2)
END_MESSAGE_MAP()

// CColorEdit_1Dlg メッセージ ハンドラ

BOOL CColorEdit_1Dlg::OnInitDialog()
{
    CDialog::OnInitDialog();

    // このダイアログのアイコンを設定します。アプリケーションのメイン ウィンドウがダイアログでない場合、
    //  Framework は、この設定を自動的に行います。
    SetIcon(m_hIcon, TRUE);         // 大きいアイコンの設定
    SetIcon(m_hIcon, FALSE);        // 小さいアイコンの設定

    // TODO: 初期化をここに追加します。

    return TRUE;  // フォーカスをコントロールに設定した場合を除き、TRUE を返します。
}

// ダイアログに最小化ボタンを追加する場合、アイコンを描画するための
//  下のコードが必要です。ドキュメント/ビュー モデルを使う MFC アプリケーションの場合、
//  これは、Framework によって自動的に設定されます。

void CColorEdit_1Dlg::OnPaint()
{
    if (IsIconic())
    {
        CPaintDC dc(this); // 描画のデバイス コンテキスト

        SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);

        // クライアントの四角形領域内の中央
        int cxIcon = GetSystemMetrics(SM_CXICON);
        int cyIcon = GetSystemMetrics(SM_CYICON);
        CRect rect;
        GetClientRect(&rect);
        int x = (rect.Width() - cxIcon + 1) / 2;
        int y = (rect.Height() - cyIcon + 1) / 2;

        // アイコンの描画
        dc.DrawIcon(x, y, m_hIcon);
    }
    else
    {
        CDialog::OnPaint();
    }
}

// ユーザーが最小化したウィンドウをドラッグしているときに表示するカーソルを取得するために、
//  システムがこの関数を呼び出します。
HCURSOR CColorEdit_1Dlg::OnQueryDragIcon()
{
    return static_cast<HCURSOR>(m_hIcon);
}

void CColorEdit_1Dlg::OnBnClickedButton1()
{
    m_edit1.SetBgColor(RGB(255,200,220));
}

void CColorEdit_1Dlg::OnBnClickedButton2()
{
    m_edit1.SetBgColor(RGB(200,220,255));
}


コンストラクタでm_brushを作り忘れてた。
エラーにはならないようだな。
CColorEdit::CtlColorがNULLを返してデフォルトの色にされるってことかな。

デフォルトの背景色が白とは限らないから
初期状態(まだCColorEdit::SetBgColorを実行していないとき)のm_bgColorの色と食い違うんじゃないかな。

で、Windows XPでやってみた。
画面のプロパティでウィンドウの背景色を白以外にした。
しかし
起動後ボタンを押す前は
pDC->SetBkColor(m_bgColor);

で白になるはずがならなかった。
  1. 2007/11/20(火) 22:51:19|
  2. Win/C++
  3. | トラックバック:0
  4. | コメント:1
<<CSharpToHTMLを改造するぞう | ホーム | 2chブラウザの>>

コメント

管理人のみ閲覧できます

このコメントは管理人のみ閲覧できます
  1. 2007/11/21(水) 14:43:58 |
  2. |
  3. #
  4. [ 編集]

コメントの投稿


管理者にだけ表示を許可する

トラックバック

トラックバックURLはこちら
http://wclrp.blog90.fc2.com/tb.php/37-d0e807b9
この記事にトラックバックする(FC2ブログユーザー)
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。