ラベル C++/CLI の投稿を表示しています。 すべての投稿を表示
ラベル C++/CLI の投稿を表示しています。 すべての投稿を表示

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);
}

2012年8月25日土曜日

[C++/CLI] いろいろメモ


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


え~新作業場にてVC++で画面作成をすることになり四苦八苦しならが作成しているときに使った、非常に個人的なメモ投稿となっております。
まぁそれでも似たような事を知りたい人がいるかもしれないと公開しました。
この辺の事情を察して、ご覧ください。
当分の間、随時更新されていくはずです。
後付けし続けると大変長い投稿になるので項目ごとに投稿するように修正予定。
そんなわけで追加分は下書きとして保存中・・・。

●関連・面白そうサイトメモ
http://www.plustarnet.com/aspil/Programming/

http://www.atmarkit.co.jp/fdotnet/special/cppcli/cppcli_03.html

・前田稔(Maeda Minoru)の超初心者のプログラム入門
http://www.eonet.ne.jp/~maeda/index.html

方法 : System::String を wchar_t* または char* に変換する
http://msdn.microsoft.com/ja-jp/library/d1ae6tz5(v=vs.80)


公式に面白そうな企画があったっぽい
Visual Studio 2008 でゲームを作ろう 第 1 回プロジェクトファイル
http://www.microsoft.com/ja-jp/download/details.aspx?id=14288


・C++/CLI: とある文字列の相互変換(コンバージョン)
http://codezine.jp/article/detail/4774

・Programing Enlightened 文字列操作
http://vene.wankuma.com/prog/CppCli_strings.aspx


・方法 : さまざまな文字列型間で変換する
http://msdn.microsoft.com/ja-jp/library/ms235631(v=vs.80).aspx

●さすがに個別記事化するほどでもない技術情報

マネージ?アンマネージ?
#pragma unmanaged
#pragma managed


コマンドライン引数の値を取得
// 以下の順で指定されているのを想定
// [1] iniファイルへのフルパス
// [2] 
// [3] 
array<String^>^ args = System::Environment::GetCommandLineArgs();

if(args->Length > 1)
    iniPath = args[1];