メルマガ:あゆしゃのC言語プログラミング
タイトル:あゆしゃのC言語プログラミング(Vol.595) CE15 メインとワークの入出力  2005/08/03


/*========================================================*/
    <<<あゆしゃのC言語プログラミング>>>
/*========================================================*/
 第595回 CE15 メインとワークの入出力
 発行    2005年8月3日(水曜日)
 発行数   約2500

{magclick}
/*========================================================*/
 はじめに ( 決り文句 )
/*========================================================*/
・このメールマガジンは、主にまぐまぐさんから発行しています。
・ジャンルは、マルチメディアのプログラム、C言語です。
・横60文字で作成し、インデントは大抵半角スペース4つです。
・ここで扱うプログラムは、C言語と半光年以内のものです。
・登録解除は、メルマガのホームページでお願いします。
・過去ログはバックナンバー(下欄参照)を活用して下さい。
・内容は私が感じたもので、最新の技術も、へたれもあります。
・わかりやすさを優先させる為、たまに嘘があるかもしれません。
・セキュリティ突破のため、暗号化された単語があります。

/*========================================================*/
 ご挨拶
/*========================================================*/

 こんにちは。あゆしゃです。

 先日、まぐまぐに「殿堂入り」というかっこいいアイコンの付い
ているメルマガを見つけました。

 よくみると、たくさんのメルマガに殿堂入りのマークが付いて
います。

★私のには付いていません。なぜ?

 調べてみると、2年以上、3000人以上のメルマガが自動的に
対象となる、というものでした。

 2年前の2003年は、その条件を満たしていました。

 ひょっとしてそのときには殿堂入りマークが付いていたのかも
知れません。

 しかし、その後はXPやアルゴリズムなどの(まじめな)話が
続いたためでしょうか、購読者数がうなぎ下がりです。

 ここはひとつ、宣伝活動が必要ですね。

{magclick}
/*========================================================*/
 今回のお題  << CE14 CCEGridクラス >>
/*========================================================*/

 まず、CCEDlg.cppからイベントハンドラを拾いましょう。

CCEDlg::OnLButtonDown

 メインで左ボタンが押されたら、

  メインのワーク位置を現在の位置に書き換えます。
  ワークからメインへ画像データを転送します。

        imgMain.m_selwk = imgMain.m_sel;
        imgMain.Copy( imgWork );

 ワークで左ボタンが押されたら、

  現在のペンで選択領域を塗りつぶします。
  さらに、マウスをキャプチャーしておきます。

  キャプチャーが必要なのは、ワークだけです。
  ワークでは色塗りをするので、マウスをグリグリ動かすから
  ちょっと領域を外れたぐらいで消えてしまっては困るのです。

        SetCapture();
        imgWork.m_bMody = TRUE;

 どちらの場合も、再描画をかけます。

        Invalidate( FALSE );

/*========================================================*/

CCEDlg::OnRButtonDown

 メインで右ボタンが押されたら、

  メインのワーク位置を現在の位置に書き換えます。
  メインからワークへ画像データを転送します。

        imgMain.m_selwk = imgMain.m_sel;
        imgWork.Copy( imgMain );

 ワークで右ボタンが押されたら、

  現在位置にある色を拾いますが、これは次回にしましょう。

/*========================================================*/

CCEDlg::OnLButtonUp

 左ボタンが離されたら、キャプチャーを開放します。

    if( GetCapture() == this )
    {
        ReleaseCapture();
    }

/*========================================================*/

CCEDlg::OnMouseMove

 ワークでキャプチャー中にマウスが動いたら、

  編集して、再描画を行います。

    if( GetCapture() == this )
    {
        if( imgWork.m_bMouseOn )
        {
            imgWork.m_bMody = TRUE;
        }
    }

 imgWork.m_bModyを立てておくと、現在位置を変更したときに
その領域を塗りつぶすように仕込みます。

/*========================================================*/

 続いて、転送処理です。

 メインもワークも同じCCEGridクラスなので、この中に処理を
作りましょう。

// イメージをコピーする
void CCEGrid::Copy( CCEGrid& wk )
{
    int i, j;
    for( i = 0; i < m_cell_size; i++ )
    {
        for( j = 0; j < m_cell_size; j++ )
        {
            SetColor( j, i, wk.GetColor( j, i ) );
        }
    }
}

 単純にコピーします。
 最適化などは一切考えません。

 SetColorとGetColorは仮想関数です。

 それぞれ、CCEMainまたはCCEWorkの関数が呼び出されます。

// 1ピクセルを取得する
COLORREF CCEMain::GetColor( int xn, int yn )
{
    COLORREF col = RGB( 0, 0, 0 );
    if( xn >= 0 && xn < m_cell_size &&
        yn >= 0 && yn < m_cell_size )
    {
        int xnum = SelX( m_selwk );
        int ynum = SelY( m_selwk );
        int ix = GetImgX1( xnum ) + xn;
        int iy = GetImgY1( ynum ) + yn;
        col = imgFile.GetPixel( ix, iy );
    }
    return col;
}

// 1ピクセルを設定する
void CCEMain::SetColor( int xn, int yn, COLORREF col )
{
    if( xn >= 0 && xn < m_cell_size &&
        yn >= 0 && yn < m_cell_size )
    {
        int xnum = SelX( m_selwk );
        int ynum = SelY( m_selwk );
        int ix = GetImgX1( xnum ) + xn;
        int iy = GetImgY1( ynum ) + yn;
        imgFile.SetPixel( ix, iy, col );
    }
}

 メインのデータはファイル(imgFile)が持っています。

 その中から目当ての座標を割り出して、その色を取得します。

// 1ピクセルを取得する
COLORREF CCEWork::GetColor( int xn, int yn )
{
    COLORREF col = RGB( 0, 0, 0 );
    if( xn >= 0 && xn < m_cell_size &&
        yn >= 0 && yn < m_cell_size )
    {
        col = col_buff[ xn ][ yn ];
    }
    return col;
}

// 1ピクセルを設定する
void CCEWork::SetColor( int xn, int yn, COLORREF col )
{
    if( xn >= 0 && xn < m_cell_size &&
        yn >= 0 && yn < m_cell_size )
    {
        col_buff[ xn ][ yn ] = col;
    }
}

 ワークのほうは簡単です。

 色を配列で管理しているので、それを参照するだけです。


 どちらの場合も、必ず範囲チェックを行います。

 基本的に不要な処理ですが、関数としての独立機動兵器性を
高めるために必要です。

/*========================================================*/

 というわけで、ソフトを固めました。

(実行ファイル)※実行にはMFC70.dllが必要です
http://ayusya.hp.infoseek.co.jp/Download/CE_050803_exe.zip

(VC++7.0プロジェクト)
http://ayusya.hp.infoseek.co.jp/Download/CE_050803_src.zip

(実行イメージ)
http://ayusya.hp.infoseek.co.jp/Image/CE_050803.jpg

 左側の画面で右クリックすると、その画像が右側の画面に転送
されます。

 右側の画面で左クリックすると、塗りつぶすことができます。

 左側の画面で左クリックすると、右側の画面が左側の画面へ
転送されます。

 Undo機能を入れていないため、実際にこのレベルで作業をする
のは極めて危険です、というかペンが5*5固定なのでどうしよう
もないのですが。

 実行イメージは、「ボール680ミリキャノン砲装備」を
編集しているっぽい風景です。

{magclick}
/*========================================================*/
 さいごに
/*========================================================*/

 今回を、お休み前の最後の配信とします。

 次回の配信は、8月19日(金曜日)です。

{magclick}
/*========================================================*/
 次回予告
/*========================================================*/

 次回は8月19日(金曜日)に、第596回をお送りします。
 お題は「CE16 パレットの変更」

 パレットは16色固定でしたが、フレームカラーや右クリック
により読み込んだ色などを独立した色として追加定義します。

 お楽しみに!

/*========================================================*/
 最後の決り文句
/*========================================================*/
 このメールマガジンは、まぐまぐさんから発行しています。
 このメールマガジンを解除したい場合は、まぐまぐさんをご利用
ください。このメルマガのまぐまぐアイディーは最後にあります。
 このメールマガジンには広告が挿入されていますか?
 このメールマガジンの内容に文面の引用はありませんか?
 めーらっくすの場合はめーらっくすの利用方に従ってください。
 このメールマガジンの内容の、転用、流用、宣伝、リンク、
よいお盆を なんて大歓迎です。

{magclick}
/*========================================================*/
 
/*========================================================*/

発行者 あゆしゃ

ホームページ::あゆしゃの世界
http://ayusya.hp.infoseek.co.jp/

ご意見・ご感想・ご質問メール
mailto:ayusya@flamenco.plala.or.jp

まぐまぐ::アイディー
0000020674

まぐまぐ::登録と解除
http://www.mag2.com/m/0000020674.htm

まぐまぐ::バックナンバー
http://jazz.tegami.com/backnumber/frame.cgi?id=0000020674

めーらっくす::アイディー
MM3E1AEE285AB4F

めーらっくす::登録と解除
http://www.mailux.com/mm_dsp.php?mm_id=MM3E1AEE285AB4F 

めーらっくす::バックナンバー★最近のものならこちらが便利★
http://www.mailux.com/mm_bno_list.php?mm_id=MM3E1AEE285AB4F

ブラウザの閉じるボタンで閉じてください。