|
/*========================================================*/ <<<あゆしゃの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 |