画像処理ソリューション
これを見れば画像処理の入門から基礎~応用まで全てがわかるのを目指して!
   
翻訳(Translate)

プロフィール

Akira

ニックネーム:Akira
東京都の町田事業所に勤務
画像処理ソフトの開発を行っています。リンクフリーです!
詳細プロフィールは こちら
お問い合わせは、こちら↓

【補助HP】
画像処理ソリューションWeb版 【Newブログ】
イメージングソリューション

スポンサーリンク


カテゴリ

最近のコメント

カレンダー

07 | 2017/08 | 09
S M T W T F S
- - 1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31 - -

趣味のブログ

iPhone萬歳!
iPhoneの情報いろいろ。
ブログ学習帳
ブログ、SEO、アフィリエイト情報など(まだまだこれから)
俺流クラフト日記
ハンドメイド作品の記録(現在、放置中)

スポンサーリンク 最近の記事
(09/18)  計測測定展に光切断のデモを出展しました
(08/17)  ディジタル画像技術事典200に記事が載りました
(06/09)  光切断を画像センシング展で公開
(05/14)  中国(上海)へ行って来ました
(04/12)  韓国へ行って来ました
(03/10)  私の求める新人像
(01/18)  エレクトロテストジャパンにカラー光切断法のデモを出展しました。
(12/23)  ユニークアクセス200万達成!
(12/10)  【カラー光切断法】YouTube動画まとめ
(11/04)  国際画像機器展2014にカラー光切断法を出展します。
(10/05)  第25回コンピュータビジョン勉強会@関東に参加してきました。
(09/08)  フーリエ変換の記事を追加しました。
(08/09)  【画像処理】ランキング低下中
(07/06)  記事の更新が停滞中...
(06/08)  画像センシング展2014でカラー光切断法のデモを行います。
(05/17)  カラー光切断法の動画を公開しました。
(04/30)  ソニーα NEX-5Rで星空撮影
(04/10)  カラー光切断法の取込結果を追加しました
(03/08)  Korea Vision Show 2014へ行ってきました
(02/05)  フーリエ変換シリーズを始めます。
(01/06)  2014年、あけましておめでとうございます。
(12/04)  カラー光切断法を公開(国際画像機器展2013にて)
(11/13)  国際画像機器展2013に出展します
(10/14)  「画像処理のためのC#」はじめます。
(09/16)  【C#,VB.NET】高速描画コントロールをバージョンアップしました。
(09/04)  拡大鏡に輝度値表示、ルーラー機能を追加した個人ツールを公開
(08/05)  7月の拍手Top5
(07/06)  2013年6月人気記事Top5
(05/12)  SONY α NEX-5Rレビュー
(04/24)  SONY α NEX-5RY購入

【C++/CLI】フォーム間参照

メインページC++/CLI プログラミング 


下図のように、メインのフォームから設定値を設定するための子ウィンドウ(ダイアログボックス)を
表示し親のウィンドウに値を設定しなおす方法を紹介します。

  フォーム間参照

 フォームを開く

  フォームをモーダルで表示する場合は
ShowDialogメソッドを、
  モードレスで表示する場合はShowメソッドを用います。

  (コード例) Form1.hにて
 #include "Form2.h"
  :
  :
Form2^ frm2 = gcnew Form2;
//Form2の表示、Form2の親(Owner)をForm1(this)に設定
frm2->ShowDialog(this);

  ここでのポイントはForm1からForm2を参照できるようにForm2をfrm2という
  フィールド(メンバ変数)に代入していることと、Form2の親がForm1であることがわかるように
  ShowDialogメソッドでForm1(this)を設定しています。
  こうすることで、自分のフォームの親はどのフォームなのか?を調べる場合はフォームの
  Ownerプロパティを参照することで可能となります。
  ただし、Showメソッドを使った場合は引数でthisを指定することができないので、
  
   frm2->Owner = this;
   frm2->Show();
  
  というようにします。

 別フォームの参照

  別のフォームからテキストボックスなどのオブジェクトを
参照する場合には
  
    frm2->textBox1->Text
  
  などとしたくなるのですが、デフォルトではエラーとなってしまいます。
  そこで別のフォームからオブジェクトを参照できるようにオブジェクトのModifiersプロパティ
  Publicなどに設定すると、別のフォームからオブジェクトを参照できるようになります。

  フォーム間参照


 循環参照(相互参照)

  今回の例のように、Form1からForm2を参照、Form2からForm1を参照するので、
  Form1.hにて
    
#include "Form2.h"
  Form2.hにて
    
#include "Form1.h"
  としたくなるのですが、お互いを参照してグルグル回ってしまうので、ヘッダの宣言の部分を
  *.hファイルではなく、*.cppファイルに持って行きます。

  今回のサンプルの例ではイベント処理の部分も*.cppファイルに持っていって

  (コード例) Form2.cppにて
 
#include "StdAfx.h"
#include "Form2.h"

#include "Form1.h"

using namespace prjForm;

System::Void Form2::Form2_Load(System::Object^  sender, System::EventArgs^  e) {

    Form1^ ParentForm;
    
    if (this->Owner != nullptr){
        //親のフォームクラス
        ParentForm = static_cast<Form1^>(this->Owner);

        this->textBox1->Text = ParentForm->textBox1->Text;
        this->textBox2->Text = ParentForm->textBox2->Text;
        this->textBox3->Text = ParentForm->textBox3->Text;
    }
}


 サンプルプログラム

  このサンプルプログラムはこちら(右ボタン→対象をファイルに保存)でダウンロードができます。
  VisualStudio2005 Express Edition で作成しています。
  


Loading...
スポンサーリンク

この記事に対するコメント
Re: Showメソッドによるモードレスで表示する場合
この件については、C言語でいうところの’スコープ’という概念について別途ご理解下さい。
簡単にいうと設定した変数やクラスがどの範囲まで有効か?参照可能か?という事なのですが、
MessageBoxの前で
 Form2^ frm2 = gcnew Form2;
と宣言してしまうとbutton1_Clickイベント内で宣言しているfrm2とは、名前こそ同じものですが、実態(中身)が異なります。
今回の場合はbutton1_Clickイベントで使うfrm2とForm2Closeメソッド内で使うfrm2は(中身が)同じ物でなくてはなりません。
なので、frm2をForm1クラス内で使いたい場合はクラス宣言お下あたりで

public ref class Form1 : public System::Windows::Forms::Form
{
private:Form2^ frm2;

のようにして下さい。
そして、オリジナルのサンプルからは、button1_Clickイベント内で
Form2^ frm2 = gcnew Form2;
としている部分を
frm2 = gcnew Form2;
として下さい。

以上、よろしくお願い致します。

【2012/05/02 22:14】 URL | Akira #- [ 編集]

Re: Showメソッドによるモードレスで表示する場合
私自身最近では、この辺の感じが面倒なので、フォームアプリケーションを作る時はC++/CLIでなくC#を使うようになってしまったのですが...
ここの記事で公開しているサンプルプログラムはダウンロードして頂いている(IEにて可能です)として、そのプログラムベースで話すと、今回はShowメソッドを使いたいという事なので、Form1からは

frm2->Show(this);

としてForm2を表示します。
また、Form1のクラスに例えば

public: void Form2Close() {

MessageBox::Show(frm2->DialogResult.ToString());
}

のようにPublicのメソッドを作成しておきます。
あとは、Form2のボタンが押された時にForm1のPublicのメソッドを呼び出すためのメソッドをForm2.cppファイル(.hファイルではダメ)に作成。例えば↓

System::Void Form2::FormClose(){

Form1^ ParentForm;

if (this->Owner != nullptr){
//親のフォームクラス
ParentForm = static_cast<Form1^>(this->Owner);

ParentForm->Form2Close();
}
}

このメソッドをForm2のボタンが押されたタイミングで呼び出せばForm1側からDialogResultが確認できると思います。
ただ、ちょっと面倒なので、やはりフォームアプリケーションはC#をおすすめします。
C#だと、この記事に書いてあるような循環参照的な部分にハマる事は無いと思います。
【2012/05/02 19:05】 URL | Akira #- [ 編集]

Showメソッドによるモードレスで表示する場合
早々のご回答ありがとうございます。
>>そのため、例えばForm1側にForm2が閉じられた時に呼び出すPublicのメソッド>>を作成しておき、Form2のボタンが押された時にこのメソッドを呼び出す事で

この部分で悩んでおります。Form2側のOKボタンクリックで呼び出すメソッドはFoerm2側でしか作成できないと思っています。初歩的なところで勘違いしての質問でしたら申し訳ありません。※メソッド=Form2のOKボタンのクリックイベントで起動させる。
【2012/05/02 18:23】 URL | fw #RXj5PPbs [ 編集]

Re: Showメソッドによるモードレスで表示する場合
コメント頂きありがとうございます。
今回のようにShowメソッドでForm2を表示した場合は、Form2のボタンにDialogResultを割り付けてもForm1からはForm2が閉じられたタイミングが分からないと思います。
そのため、例えばForm1側にForm2が閉じられた時に呼び出すPublicのメソッドを作成しておき、Form2のボタンが押された時にこのメソッドを呼び出す事で、Form1側からはForm2のDialogResultプロパティを参照する事でOKボタンが押されたかどうか?分かると思います。
以上、よろしくお願い致します。
【2012/05/02 18:07】 URL | Akira #- [ 編集]

Showメソッドによるモードレスで表示する場合
いつも、参考にさせて頂いております、ありがとうございます。
すみませんが、教えてください。

Showメソッドによるモードレスで表示する場合いは、DialogResultが
使えないのですが、FORM1からFORM2側でOKが押されたことを知るには
どうしたらよいのでしょうか?
よろしくお願いします。
【2012/05/02 17:31】 URL | fw #RXj5PPbs [ 編集]

細線化アルゴリズムを記載しました
細線化の検索でいらした方はこちらのページを参照願います。
http://imagingsolution.blog107.fc2.com/blog-entry-138.html
細線化のアルゴリズムについて、紹介しています。
【2009/06/15 20:45】 URL | Akira #- [ 編集]

Re: タイトルなし
> OpenCVで、画像を「線幅1の細い線でできた画像」に変換するプログラムを教えて下さい。
ご質問頂きありがとうございます。
しかしながら、ただのC言語を用いた細線化処理は行った事があるのですが、OpenCVを使った細線化は行った事が無く、私も少し調べてみましたが、OpenCVそのものには細線化の関数は無さそうなので、OpenCV特有の処理というよりは、そのままC言語に近い処理での説明が多いようです。
その中でもそれっぽい説明だったのが
http://www.eml.ele.cst.nihon-u.ac.jp/~momma/wiki/wiki.cgi/OpenCV/%E7%B4%B0%E7%B7%9A%E5%8C%96.html
細線化のアルゴリズムについては、二値化された画像において、8近傍のパターンが特定条件を満たす場合、その画素を消去するものが多いのですが、この説明については
http://codezine.jp/article/detail/98?p=1
のページが参考になると思います。
細線化アルゴリズムはいろいろあるのですが、アルゴリズムの名前だけ列挙すると
Hilditch、田村、Zhang Suen、・・・
などのアルゴリズムがあります。

細線化についてはいづれ記事にしようと思っているのですが、まずは上記のページを参照願えますでしょうか。
よろしくお願い致します。
【2009/01/06 01:52】 URL | Akira #- [ 編集]


OpenCVで、画像を「線幅1の細い線でできた画像」に変換するプログラムを教えて下さい。
【2009/01/04 00:04】 URL | 細線化 #AVNby.KY [ 編集]


この記事に対するコメントの投稿














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


この記事に対するトラックバック
トラックバックURL
→http://imagingsolution.blog107.fc2.com/tb.php/109-8376c266
この記事にトラックバックする(FC2ブログユーザー)

現在の閲覧者数: / 合計