2012年9月18日火曜日

[C++/CLI] イベント関数の引数についてくるobjectを各コンポーネントにしてみる

[共通] 当 Blog の投稿に関する基本事項について
→ http://fuunyan.blogspot.jp/2012/09/blog.html


たとえば DateTimePicker を使用して期間を指定できるデザインの画面の場合・・・
2種類あったら合計4イベント書くことになるけど、これを使えば1つのイベントを使いまわせる。

System::Void DateValueChanged(System::Object^  sender, System::EventArgs^  e)
{
    System::Windows::Forms::DateTimePicker^  dtWork;
    System::Windows::Forms::DateTimePicker^  dtFrom;
    System::Windows::Forms::DateTimePicker^  dtTo;

    dtWork = safe_cast(sender);

    // 呼び出し元のコンポーネントを判断し、処理対象となるコンポーネントを選定する
    if((dtWork->Name == Date1From->Name) || (dtWork->Name == Date1To->Name))
    {
        dtFrom = Date1From;
        dtTo = Date1To;
    }

    if((dtWork->Name == Date2From->Name) || (dtWork->Name == Date2To->Name))
    {
        dtFrom = Date2From;
        dtTo = Date2To;
    }

    // ・From, To 共に有効な場合 From < To となるように入力後にデータ確認を行う。
    // ・どちらか片方のみ有効の場合は入力制約を設けない。
    // ・片側入力から両側入力になった場合、後から有効になったコンポーネントの指定日付を
    //  先に有効であったコンポーネントの指定日付と合わせる。
    if((dtFrom->Checked && dtTo->Checked) && (dtFrom->Value > dtTo->Value))
        if(dtWork->Name == dtFrom->Name)
            dtFrom->Value = dtTo->Value;
        else
            dtTo->Value = dtFrom->Value;
}

[C++/CLI] 別のプロセスにメッセージを送信する


[共通] 当 Blog の投稿に関する基本事項について
→ http://fuunyan.blogspot.jp/2012/09/blog.html


例によって経過などはリストボックスに追加する方向で

・投げるほう
FindWindow で対象画面を見つけて SendMessage でメッセージを送信。
// stdafx.h に追加したやつら
#include <windows.h>
#pragma comment(lib, "user32.lib")

// 対象ウィンドウの検索
HWND  hWND;
hWND = FindWindow(nullptr, L"送信先画面名");
if(hWND == nullptr)
{
    LBox->Items->Add("not find...");
    return;
}
else
    LBox->Items->Add("find...");

// メッセージ送信
COPYDATASTRUCT cds;

cds.dwData = 0;
cds.cbData = sizeof("送信文字列 ") + 1;
cds.lpData = L"送信文字列";
::SendMessage(hWND, WM_COPYDATA, 0, (LPARAM)&cds);

・受けるほう
WndProc をオーバーライドして独自処理を作成。
その中で送信メッセージを処理する。
// stdafx.h に追加したやつら
#include <windows.h>

// protectedに追加(デストラクタの後ろとか?)
protected:
virtual void WndProc(Message% m) override
{
    switch(m.Msg)
    {
        case WM_COPYDATA:
            // 処理記述
            COPYDATASTRUCT *cds = (COPYDATASTRUCT*)m.LParam.ToInt32();
            String^ str = gcnew String( (wchar_t*)cds->lpData);
            listBox1->Items->Insert(0, str);
            break;
    }
    Form::WndProc(m);
}

[共通] 当 Blog の投稿に関する基本事項について

当 Blog 内に投稿されているすべての記事に適用する基本事項を記載します。

この投稿の内容は当 Blog 内のすべての投稿に適用されます。

特に断りがない限り、投稿主である「AL(ある)」は本投稿の条件を適用した状態で記事を投稿しているとお考えください。
この投稿の内容は状況変化に応じ随時変更いたします。
変更後の内容は(変更以前に投稿したものを含め)すべての投稿に適用いたします。

1)記載内容の真偽について
この Blog は技術系情報の個人的メモ書きサイトとして立ち上げました。
この性質上、投稿内に記載されているコード類は動作確認をしたうえで記載しているはずですが、まれに最終的なコードが反映されていない(=間違っている)可能性があります。
このため記載コードについては参照程度に留め、最終的な動作確認等は閲覧者個人でお願いいたします。

2)事故について
閲覧者が投稿内容を参照し、自身のプログラム等に反映後、結果としてリカバリ不能な事態が発生したとしても投稿主は責任を持ちません。
閲覧した投稿の内容を反映される場合は、閲覧者個人の責任で行ってください。

3)意見・要望について
投稿内容に関する質問や指摘、要望は受け付けております。
もしこれらの連絡を取りたい場合はコメント欄に記載していただくか、投稿主宛にメールを送ってください。
ただし頂いた質問や要望についての回答義務は負わないものとします。
(公開する以上、読みやすい、意味のあるものにしたいため前向きに対応はいたします)