C++/CLIでWindows フォームをつくる

Microsoft Visual Studio が2015から2017になりました。

新しいもの好きなので、早速ダウンロードしてみました。

ところが、C++のWindowsフォームのテンプレートがオンラインでは出てきません(4月9日現在)

 

仕方がないので、自力で作ります。

新しいプロジェクトでテンプレートC++の空のCLRプロジェクトを選びOKボタンを押します。

 

 

続いて、プロジェクトのメニューバーから新しい項目の追加をしてください。

 

 

続いて、新しい項目の追加からUIのWindowsフォームを選んで、追加ボタンを押します。

 

 

MyForm.h[デザイン]でエラーメッセージが表示されますが、かまわず

次に、プロジェクトのプロパティを選択します。

 

 

次にプロパティページで、システムのサブシステムにWindows(/SUBSYSTEM:WINDOWS)を指定し適用ボタンを押します。

(サブシステムをクリックして、プルダウンメニューから選択します。)

 

 

次に、詳細設定から、エントリーポイントを編集します。ここでは、Mainと入れてください。

(エントリーポイントをクリックしてプルダウンメニューから、<編集>を選んでください。

別画面で出ますので、そこで入力してください。)

 

 

<編集>を選ぶと、別画面が出ますので、半角英数字でMainと打ち込んでください。

 

 

OKボタンを押すと、

 

 

となります。

 

今度は、プロパティページの

OKボタンを押して、プロパティを終了させてください。

 

次に、Myform.cppをダブルクリックして

 

 

 

上のようになっていますので、

 

次のように書き換えてください。(コピーアンドペースト等で)

 

#include "MyForm.h"

using namespace System;
using namespace System::Windows::Forms;


[STAThread]
void Main(array<String^>^ args)
{
    Application::EnableVisualStyles();
    Application::SetCompatibleTextRenderingDefault(false);

    Project2::MyForm form;
    Application::Run(%form);
}

 

以上

 

なお後ろから3番目のproject2(下の行番号では、13行目)は、このページの最初に空のCLRプロジェクトで自分の付けた名前(プロジェクト名)に変えてください。

でないとエラーとなります。

また、最初の#include "Myform.h"も新規項目の追加で付けた名前です。

また、void MainのMainもエントリーポイントで付けた名前になります。

 

(内容の説明については、ここで見てください。)

 

 

ご苦労様でした。

あとは、ファンクションキーPF5などで実行してもらえば動きます。

 

もし、uuid.libを開くことができませんとエラーメッセージがでたら、Windows10のバージョンが合っていません。

 

 

Windows SDK バージョンを10.0.10586.0などに変えてください。

 

 

なお、Myform[デザイン]は×印で一度閉じたのち、

 

 

 

再度ソリューションエクスプローラのMyform.hをダブルクリックしてください。

 

 

 

C++/CLI初心者入門1からこのページに来た人は、C++/CLI初心者入門1へ戻ってください。

 

続いて、次回はこのテンプレートをVisual Studioに登録する方法を書いておきます。

 

 

JUGEMテーマ:プログラミング

| C++プログラム | 11:17 | comments(9) | trackbacks(0) |

C++/CLI(グラフィック)アナログ時計のプログラム2

前回のつづきです。

 

今度は、タイマーを使って、時計を動かしてみます。

 

ボタン3(連続線画)を押したときのイベント及びタイマーのイベントです。

 

button2->PerformClick();

は、ボタン2(線画)を押したことにします。これで、現在の時刻が表示されます。

 

timer1->Interval = 5000;

は、タイマーのイベントが起こる間隔を指定します。5秒ごとにイベントは発生します。

Myform[デザイン]のプロパティで設定してもらえばいりません。

 

timer1->Start();

は、タイマーをスタートします。

 

そのあとの、タイマーのイベントはMyform[デザイン]で、timer1をダブルクリックして作ってください。

 

gtime();

は、最初に作った時間を取得する関数です。

if (aminu != aminu2){
    button2->PerformClick();
    aminu2 = aminu;
    }

は、分が変わったらボタン2(線画)をクリックします。これによって表示が更新されます。

 

5秒ごとにイベントが発生しますので、分の誤差はー5(最高5秒遅れる)秒以内となります。

もちろん、イベント間隔は変えてもらって構いませんし、

他の方法(三つぐらい思いつきましたがこれがシンプルだと?)もあります。

 

一応これで、ボタン3(連続線画)を押すと時計が動きますので、完成です。

 

でも、ちょっとグラフィック的にさみしいので、画像と重ねてみます。

画像は、グーグルで時計画像で探して、

 

 

これを使わしてもらうことにしました。

これでよければ、上の画像を右クリックして、名前を付けて保存から適当な場所に保存しておいてください。

 

画像の合成のしかた

1.重ねたい画像を描き、透明にしたいところは、特定の色にする。(ここでは、時計の針)

2.重ねたい画像の特定の色を透明色とする。(ここでは、白色)

3.背景画像(ここでは、上の画像)に重ねたい画像を描く

で行います。

 

画像合成の場合は、針だけあればよいので、針だけを表示するようにして、

上の画像と合成する関数を作ります。

 

 

関数名はsaido()にしてあります。

真ん中あたりまでは、ボタン2(線画)のイベントのボックスと円と文字を描くことを除いたものです。

(ただし、中心を110,110から120,120に変えてあります。)

 

bmpPicBox->MakeTransparent(Color::White);

は、時計の針の画像の白色を透明色にします。

 

if (filenamae == ""){
   openFileDialog1->ShowDialog();
   filenamae = openFileDialog1->FileName;
}

は、背景画像ファイルを指定します。ボタン1(画像)で指定されていればパスします。

 

Bitmap^ bmpPich = gcnew Bitmap(openFileDialog1->FileName);

は、背景画像のメモリをbmpPichという名前で作ります。

 

Graphics^g1 = Graphics::FromImage(bmpPich);

は、背景画像に描くGraphicsをg1という名前で作ります。

 

g1->DrawImage(bmpPicBox, 0, 0, bmpPicBox->Width, bmpPicBox->Height);

は、背景画像に時計の針の画像を描きます。

 

pictureBox1->Image = bmpPich;

は、背景画像をピクチャボックスに表示します。

 

 

ボタン4(画像合成)のイベント

 

button2->PerformClick();がsaido()に変わっただけで、

最初に説明したボタン3と同じです。

 

 

ボタン4(画像合成)を押して時計の画像を指定した例

 

 

他の背景画像に変えてみました

 

 

お疲れ様でした、ここでの目的は達成しました。

 

ソースコードは、

 

Myform.hのソースコードページ(時計)に置いてあります。

 

 

アプリとして使う場合は、ボタン1、2、3及びtimer1はいりませんので削除してください。

また、背景画像も固定なら、openfileDialogもいりません。filenamaeに直接ファイルを指定してください

タイマーのイベントにif文をつければ簡単にアラームもできますので、必要なら試してみてください。

 

 

 

 

JUGEMテーマ:PC関連

| C++プログラム | 20:30 | comments(0) | trackbacks(0) |

C++/CLI(グラフィック)アナログ時計のプログラム

 

どうしても避けて通れないのが、グラフィックの操作ですが、

苦手な分野なので、説明が遅くなってしまいました。

というのも、とにかく面倒くさいのと、数学(算数?)を駆使しなければなりません。

 

自分だけのアナログ時計をつくりながら説明していきます。

 

一般的なフォームを使ったグラフィックのパターンは次のとおりです。

 

1.フォーム上にpictureBoxを作る

2.bitmap で画像のメモリ領域を確保する。

3.pictureBoxとbitmapを結びつける。

4.graphics でbitmapに対して線やボックスや円や文字を描く。

 

のような形になります。

 

とにかく、作ってみましょう!

(ただし、初心者入門を読んでもらっている前提で説明してます。)

 

 

ツールボックスからbuttonを4つ、Labelラベルを1つ、pictureBox1つ

openFileDialogを1つ、timerを2つ、作ってください。

 

なお、今回はpictureBox1のSizeは必ず240の240にしておいてください。

あとは、好みに合わせてプロパティを変えてください。

 

これは、説明用プログラムなので、アナログ時計だけ作るなら、buttonとtimerは1つでいいです。

 

今回は、ちょっと長いので、少しづつ説明していきます。

 

 

共通の変数の説明と現在の時間の関数を作ります。

DateTime atime = DateTime::Now;は、現在の時間をatimeに呼び込みます。

 

ボタン1(画像)のイベントです。

 

Bitmap^ bmpPicBox = gcnew Bitmap(openFileDialog1->FileName);

はbmpPicBoxという名前でメモリを確保し、

pictureBox1->Image = bmpPicBox;で画像ファイルを表示します。

ここまでは、簡単ですね

 

ボタン2(線画)のイベントです。

 

Bitmap^ bmpPicBox = gcnew Bitmap(pictureBox1->Width, pictureBox1->Height);

はさっきのファイル名ではなく、pictureBox1の縦と横を指定します。

つまり、とりあえず空のデータでメモリを取ります。

Graphics^g = Graphics::FromImage(pictureBox1->Image);

gという名前でGraphicsをつくり、実行場所をpictureBox1のImageつまりbmpPicBoxとします。

 

g->Clear(Color::White);

は、白色で塗りつぶし、つまりクリア処理をします。(ペイントソフトでの塗りつぶしです)

 

Pen^ p = gcnew Pen(Color::Black, 2);

は、pという名前で線の色と太さを作ります。(ペイントソフトでの線の種類です)

 

g->DrawRectangle(p, 10, 10, 200, 200);

は、四角(ボックス)を描きます。カッコ内(先ほどのペン,描き始めのX軸,Y軸,描く大きさのX,Y)

つまり、xの10、y10からx方向200,y方向200の四角を描きます。

 

g->DrawEllipse(p, 10, 10, 200, 200);

は、円を描きます。カッコ内は同じです。

 

System::Drawing::Font^ drawFont = gcnew System::Drawing::Font("MS UI Gothic", 16);

は、文字のフォントの指定です。

 

SolidBrush^ drawBrush = gcnew SolidBrush(Color::Black);

は、文字の色の指定です。

 

g->DrawString("12", drawFont, drawBrush, 100, 18);

は、文字を描きます。

 

続きです。

 

if (aminu <= 15) kakudo = 90 - aminu * 6;
else kakudo = 450 - aminu * 6;

は、角度を求めています。15分を0度として、360度を60分で割って1分につき6度移動させます。

 

radi = kakudo * 3.141592 / 180;

は、ラジアン単位を求めています。三角関数を使うためです。

(ラジアンは円周を半径で割った値です。半径と同じ長さの円周が1で半円(180度)が円周率になります)

 

xziku = 110 + (Math::Cos(radi) * 90);
yziku = 110 - (Math::Sin(radi) * 90);

XYの110は中心の値です。

は、x軸は三角関数の斜面(半径)に対する底辺(X軸)の割合の値(コサイン)

y軸は三角関数の斜面に対する右辺(Y軸)の割合の値(サイン)となります。

これで、半径(90)の円周上の座標が算出できます。

 

g->DrawLine(p1, 110, 110, xziku, yziku);

は、線を描きます。

 

短針についても同様です。

 

秒針も作りたい方は、関数で秒(atime.second)の変数を作ったのち、長針と同じ方法でいいです。

 

これは、参考なので、実際コードを書くときは、大きさや中心のXY座標などは変数にしてあらかじめ数値をいれ

計算によって算出するようすると、メンテナンスしやすくなります。

 

どうでしょうか?かなり数学の知識が必要となってきます。

でも、使いこなせれば、割合を計算して線やボックスを描くだけですから、

グラフや円グラフなどは簡単に作れるようになると思います。

 

アナログ時計には、あと少しですが、ちょっと休憩して

次回に、タイマーと画像の重ね方を行います。

 

ボタン2(線画)を押した例(現在の時間が出ます)

 

 

 

ソースコードは、その2に置いてあります。

 

アナログ時計のプログラム2へつづく

 

 

 

JUGEMテーマ:PC関連

| C++プログラム | 10:49 | comments(0) | trackbacks(0) |

C++/CLI(ゲームパッドでの操作)参考プログラム

今回は、ゲームパッド(joypad)を使ったものです。

ゲームパッドを持ってない場合は、読み飛ばしください。

(興味があれば、左のドスパラやビックカメラなどで、1000円くらいで買えます。)

 

いろんな方法があるようでが、

まえに、音楽ファイルをMCIで再生で説明した、WIN32のAPIを使ったものです。

 

いつものように、ボタンとラベルを作ってください。

 

 

 

まず、Myform.hの最初に、

 

 

#include <Windows.h>
#pragma comment(lib,"winmm.lib")

を追加して、win32のAPIを使用できるようにしてください。

 

ボタンをクリックしたときの処理です。

 

 

ゲームパッドを使うには、JOYINFOEX関数(構造体)を使います。

JOYINFOEX JoyInfoEx;
JoyInfoEx.dwSize = sizeof(JOYINFOEX);
JoyInfoEx.dwFlags = JOY_RETURNALL;

使うには、dwSizeとdwFlagsを教えてあげなければいけないそうです。

(sizeofとはJOYINFOEXのメモリの大きさ、JOY_RETURNALLとはすべてのデータを受け取る)

 

ゲームパッドが接続しているか?を調べます。

for (int i = 0; i < joyGetNumDevs(); i++) {
     if (JOYERR_NOERROR == joyGetPosEx(i, &JoyInfoEx)) {

         MessageBox::Show( "ジョイスティック No" + i.ToString() + "接続されています。");
     }
}

joyGetNumDevs()が接続されている数を返してくれます。

joyGetPosEx(i, &JoyInfoEx)を実行してエラーがないときは、JOYERR_NOERRORが帰ってきます。

(なぜ、&JoyInfoExに&がついていると思うかもしれませんが。ここで名前を付けたJoyInfoExは、

ここの外にあるwin32の関数にはわかりません。&はアドレスを示し、win32ではアドレスを元に値を得て実行します。)

ので、つながっていれば、メッセージボックスで教えてくれます。

 

String^ a = "";
String^ b = "";
String^ c = "";

説明するまでもありませんが、文字変数を作ってます。

 

        while (1) {
            if (JOYERR_NOERROR == joyGetPosEx(0, &JoyInfoEx)) {
                a = "dwXpos=" + JoyInfoEx.dwXpos;
                b = "dwYpos=" + JoyInfoEx.dwYpos;
                c = "dwButton=" + JoyInfoEx.dwButtons;}
            else {
                MessageBox::Show("エラーが発生しました。");
                return;}

            if (c != "dwButton=0"){
                label1->Text = a + "¥n" + b + "¥n" + c;
                MessageBox::Show("ボタンが押されました。");}

            if ((a != "dwXpos=32767")||(b != "dwYpos=32767")) {
                label1->Text = a + "¥n" + b + "¥n" + c;
                MessageBox::Show("十字ボタンが押されました。");}

            if (c == "dwButton=512") {
                MessageBox::Show("終了します。");
                return;}

            Sleep(200);
        }

 

while(1)とは、永久ループです。{}の中の実行文を間違えるとプログラムが固まります。

万一固まってしまったら、タスクマネージャーで強制終了させてください。

 

if (JOYERR_NOERROR == joyGetPosEx(0, &JoyInfoEx))は前と同じで、

ゲームパッドの1つ目がエラーでなければ

a = "dwXpos=" + JoyInfoEx.dwXpos;

b = "dwYpos=" + JoyInfoEx.dwYpos;
c = "dwButton=" + JoyInfoEx.dwButtons;

を実行します。

 

dwXposは、十字ボタンの左と右

dwYposは、十字ボタンの上と下

dwButtonsは、ボタンの番号が入ります。

(この関数joyGetPosEx(0, &JoyInfoEx)が実行されるたびに数値が入ります)

 

else {
     MessageBox::Show("エラーが発生しました。");
     return;}

でエラー(接続されていない)の時はメッセージボックスがでます。

 

if (c != "dwButton=0"){
    label1->Text = a + "¥n" + b + "¥n" + c;
    MessageBox::Show("ボタンが押されました。");}

でボタンが押されるとdwButton=0以外の数値が入りますので、

ラベルに表示し、メッセージを出します。

 

if ((a != "dwXpos=32767")||(b != "dwYpos=32767")) {
      label1->Text = a + "¥n" + b + "¥n" + c;
      MessageBox::Show("十字ボタンが押されました。");}

も同じで、十字ボタンが押されるとdwXpos=32767または、dwYpos=32767以外の数値が入りますので、

ラベルに表示し、メッセージを出します。

 

if (c == "dwButton=512") {
    MessageBox::Show("終了します。");
    return;}

は、ボタンの10を押すとdwButton=512が入りますので、永久ループから抜けることができます。

 

Sleep(200);は0.2秒待つということです。(レスポンスがよい数値にしてもらってかまいません。

ただし、0にはしないでくださいゲームパッドを受け付けなくなる可能性があります。)

 

ソースコードを見たいときは、

MyForm.hのソースコードのページ

においてあります。

 

 

で、終わりにしようと思いましたが、

 

サンプルプログラムだけでは、もしかしてゲームパッドを買ってもらった人に申し訳ないので、

キーボードのシュミレータのプログラムを載せておきます。

これによって、ゲームパッドをボタンを押した時、キーボードのボタンを押したことになりますので、

キーボードの↑、→、←ボタンを使うゲームでは、ゲームパッドで遊ぶことができます。

 

キー操作のために、user32.libを使います。ので

 

を追加してください。

 

 

簡単な説明:

if ((d & 1) != 0) keybd_event(VK_UP, 0, 0, 0);の

(d & 1)はビット演算子の理論積です。

たとえば、ボタン1と4が同時に押されたばあい、dは1001(下記のJoyInfoEx.dwButtonsの値参照)となりますが、

(d & 1)では、

 1001

×0001

ーーーーー

 0001になります。

(d & 2)では、 

 1001

×0010

ーーーーー

 0000になります。

(d & 4)では、 

 1001

×0100

ーーーーー

 0000になります。

(d & 8)では、 

 1001

×1000

ーーーーー

 1000になります。

 

ということで、押されていないボタンは、0になり、押されているボタンは0以外となります。

このことによって、ボタンを同時に複数押しても、一度に両方を読み取ることができます。

 

keybd_event(VK_UP, 0, 0, 0);はキーボードの↑を押したことと同じです。

keybd_event(VK_UP, 0, KEYEVENTF_KEYUP, 0);はキーボードの↑を離したことと同じです。

以下同じですが、最後のsleep(30)はパソコンの性能に合わせて調整してください。

 

ここでは、ボタン1が↑、ボタン2が→、ボタン3が↓、ボタン4が←、ボタン9がスペースキーとなってます。

終了するときは、ボタン10です。

 

各ゲームパッドの配置によって調整してください。

JoyInfoEx.dwButtons;の値

ボタン1   1(2進数:         1)

ボタン2   2(2進数:        10)

ボタン3   4(2進数:       100)

ボタン4   8(2進数:      1000)

ボタン5  16(2進数:     10000)

ボタン6  32(2進数:    100000)

ボタン7  64(2進数:   1000000)

ボタン8 128(2進数:  10000000)

ボタン9 256(2進数: 100000000)

ボタン10  512(2進数:1000000000)

です。

ちなみに、十字ボタンは

左がdwXpos=0、押さないときはdwXpos=32767、右がdwXpos=65525

上がdwYpos=0、押さないときはdwYpos=32767、下がdwXpos=65525

です。

 

ソースコードを見たいときは、

Myform.hのソースコードページ(joypad)

に置いてあります。

 

プログラムを実行して、ゲームパッドが接続されているか確認したあと、

ゲームなどをスタートすれば、ゲームパッドで遊べます。

(このプログラムでは、プログラムの終了はボタン10です。)

 

無料ゲームのサイトの

wowGameフリーレーサーで調整させて頂きました。

 

 

JUGEMテーマ:PC関連

| C++プログラム | 11:00 | comments(0) | trackbacks(0) |

C++/CLI(パソコンで録音)その他応用編

前回約束したとおり、今回はMCIを使ってパソコンの音を録音をしてみます。

 

プログラムを解かりやすくするため、チェック機能は除いてありますので、

操作は、正しく行ってください。(間違えても動かないだけですが)

 

 

いつものように、ボタンを2つ、ラベルを1つ、saveFileDialogを1つ作ってください。

 

 

これは、前回説明したとおりです。

 

 

これも、前回説明したとおりです。

 

 

cmd = "open new alias rec type waveaudio";

は、録音するときのopen命令です。残念ながらwaveファイルしかできません。

cmd = "set rec channels 2 samplespersec 44100 bitspersample 16";

は、見てわかるとおり、チャネル数は2、サンプル数は44100、ビットレートは16

ということです。(適宜変更してもらってもOKです)

ファイル名を入れてOKボタンを押すと録音が始まります。

(この場合は、拡張子.wavまでファイル名を入れてください。

または、saveFileDialogのプロパティで拡張子を指定してください)

 

 

cmd = "save rec " + "¥"" + saveFileDialog1->FileName + "¥"";

は、ファイルへの保存となります。

あとは、難しいことはないと思います。

あとは、最後の行の関数のkakikomi()を作るだけです。

なぜ必要なのかというと、

MCIで作られるwaveファイルは、1秒当たりの必要ファイルなバイト数が書き込まれていません。

なので、一般のメディアプレイヤーで再生することができまません

 

関数kakikomi()を削除して実行するときは、

バイナリエディタで、waveファイルの29番目から(10,B1,02,00)と4バイト上書きすれば再生できます。

バイナリエディタの使い方はこちらです。

 

 

 

でも、それでは芸がないので、

 

関数kakikomi()を作ってバイナリデータをファイルに書き込みます。

 

 

int bspeed = 44100 * 2 * 2;

は、1秒当たりの必要ファイルなバイト数の計算です。

(1秒間に、44,100回サンプルし、右と左の2チャンネル、16ビットで表すので、バイトだと2バイト)

 

MessageBox::Show(Convert::ToString(bspeed,16));

は、それを、16進数で表示しています。

以上の2行は、参考として作ったので、いらなければ削除しても構いません。

 

array<Byte>^ content = File::ReadAllBytes(saveFileDialog1->FileName);

は、バイト配列contentを作り、ファイルをcontentに呼び込みます。

この、File::を使うために、

を追加してください。

 

content[28] = 0x10;

content[29] = 0xB1;
content[30] = 0x02;
content[31] = 0x00;

は、それぞれバイナリデータを書き込んでいます。

0xとは、16進数という意味です。コンピュータは0から数えますので[28]が29番目となります。

それと、バイナリデータの数値は、逆から入れていきますので、00,02,B1,10のバイナリは

10,B1,02,00となります。(ただし、サンプル数を変えたときはここもそれに合わせてください。)

 

File::WriteAllBytes(saveFileDialog1->FileName,content);

は、先ほどとは逆に、バイト配列contentの内容をファイルに書き込みます。

 

以上で説明は終わりです。

 

それでも、エラーとなる場合は、パソコンの環境の問題だと考えられます。

 

 

サウンドの録音で、ステレオミキサーが既定のデバイスになっていて、

目盛りが動いていないときはエラーとなりますので注意してください。

Windows10のrealtekでは、ドライバをWindows10用に変えないと動かないものがあります。

realtekのドライバのリンクからダウンロードしてください。

また、そもそもステレオミキサー自体が入っていないパソコンもあります。

その場合は、マイクがあればマイクを端子に差し込み、

マイクを既定のデバイスに変更して、マイクから録音してみてください。

 

なお、waveファイルは無圧縮でファイルが大きいので、適宜mp3等に変換してください。

(まえに書いた(動画形式変換)応用編を読んでもらえばmp3にできます。)

 

ソースプログラム(myform.h)が必要なかたは

rokuon.zip(1.74KB)からダウンロードしてください。

ただし、このソースは上記の説明用のものとは違い、録音wavファイルの書き込みは停止ボタンを押したあと入力します。

実際使うにはこの方が便利?だと思ったので、その代わり一時保存データがカレントディレクトリにできます。

以下がソースの主要な部分です。

 

 

音楽などを録音するときは、ステレオミキサーの録音レベルは大きく、

スピーカーのボリュームも大きく、そうすると音がうるさいので、

外付けのスピーカーの音量を小さくして録音すると、CDのような音量で録音できます。

 

余談:youtubeやjoysoundでカラオケ動画を再生し、それに合わせてマイクで録音してみました。

歌手になったようでなかなか楽しいですよ

専門的には、Windowsのミキサーによる音はあまり良くないと書いてありましたが、

モスキート音が聞こえない老人には十分でした。

 

 

 

JUGEMテーマ:PC関連

| C++プログラム | 14:46 | comments(0) | trackbacks(0) |

09
--
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
--
>>
<<
--
Profile
New entries
Archives
Categories
Recent comment
カウンター


今日
昨日
レンタルサーバ/プロバイダー




ファッション
カタログ通販ベルーナ(Belluna)

イマージュ - IMAGEアウトレットセール
yahoo・その他


買い物
ビックカメラ.com



Mobile
qrcode
Links
Others
無料ブログ作成サービス JUGEM