DDX_CBString

DDX_CBStringは、選択されたアイテムのテキストや入力されたテキストを取得できる。

DDX_CBString (MFC)

ValueでCString
ValueでCString

今回、コンボボックスの変数の追加で、ValueでCStringを指定する。

このように追加される。

IDC_COMBO1とm_xvComboBox1は、DDX_CBStringで紐付く。

"Item1"から"Item3"まで追加。

Button1が押された時、UpdateDataで更新すると、m_xvComboBox1にテキストが格納されるので、メッセージボックスで表示。

Item1の選択
Item1の選択

"Item1"を選択してButton1を押すと、

Item1を表示
Item1を表示

"Item1"を表示。

Item2の選択
Item2の選択

"Item2"だと、

Item2の表示
Item2の表示

"Item2"を表示。

Item3の選択
Item3の選択

"Item3"だと、

Item3の表示
Item3の表示

"Item3"を表示。

ABCDEの入力
ABCDEの入力

アイテムにない"ABCDE"を入力した場合は、

ABCDEの表示
ABCDEの表示

"ABCDE"が表示される。

Sample/mfc/DDX_CBString/DDX_CBString/src/DDX_CBString at master · bg1bgst333/Sample · GitHub

DDX_CBIndex

DDX_CBIndexは、コンボボックスで選択されたアイテムが何番目かを取得できる。

DDX_CBIndex | Microsoft Docs

コンボボックスの配置
コンボボックスの配置

コンボボックスを配置する。
Typeはドロップダウン。
ドロップダウンで表示する領域もきちんと拡げておく。

変数の追加
変数の追加

変数の追加で、

ControlはCComboBox
ControlはCComboBox

ControlはCComboBox、

Valueはint
Valueはint

Valueはintとする。

このように変数が追加される。

IDC_COMBO1とm_xvComboBox1はDDX_CBIndexで紐付けられる。

m_xcComboBox1.AddStringで"Item1"から"Item3"まで追加。

Button1が押されたら、UpdateDataで更新、m_xvComboBox1に選択されたアイテムが何番目か格納されるので、メッセージボックスで表示。

起動時
起動時

起動時はこのような状態。

アイテム選択
アイテム選択

右の"▼"で選ぶことができる。

Item1
Item1

Item1を選択し、Button1を押すと、

0番目
0番目

0となり、

Item2
Item2

Item2だと、

1番目
1番目

1となり、

Item3
Item3

Item3だと、

2番目
2番目

2となる。

注意しないといけないのが、

Item1と入力
Item1と入力

選択ではなく、自分で入力したテキストがアイテムにあった場合は、

選択ではないので-1
選択ではないので-1

選択をしているわけではないので-1となる。

Sample/mfc/DDX_CBIndex/DDX_CBIndex/src/DDX_CBIndex at master · bg1bgst333/Sample · GitHub

DDX_LBString

DDX_LBStringは、選択されたアイテムのテキストを取得できる。

DDX_LBString | Microsoft Docs

リストボックス
リストボックス

また、リストボックスで、

変数の追加
変数の追加

変数の追加。

ValueでCString
ValueでCString

前回はValueでintだったが、今回はValueでCStringにする。
前回と同様にControlの変数も追加する。

このように変数が追加される。

DDX_LBStringでIDC_LIST1とm_xvListBox1が紐付いている。

"Item1"から"Item3"まで追加。

Button1が押されたら、UpdateDataで更新する。
その後、m_xvListBox1に選択されたアイテムのテキストが格納されるので、メッセージボックスで表示。

Item1を選択
Item1を選択

Item1を選択して、Button1を押すと、

Item1を表示
Item1を表示

Item1と表示される。

Item2を選択
Item2を選択

Item2なら、

Item2を表示
Item2を表示

Item2と表示。

Item3を選択
Item3を選択

Item3なら、

Item3を表示
Item3を表示

Item3と表示。

未選択
未選択

何も選択していない場合は、

空文字列
空文字列

空の文字列。

Sample/mfc/DDX_LBString/DDX_LBString/src/DDX_LBString at master · bg1bgst333/Sample · GitHub

DDX_LBIndex

リストボックスで選択されたアイテムを取得する場合、Controlにしてクラスオブジェクトから取る方法も、Valueにしてプリミティブ型変数から取る方法もある。
DDX_LBIndexは、プリミティブ型変数から選択されたアイテムが何番目かを取得できる。

DDX_LBIndex | Microsoft Docs

リストボックス
リストボックス

また、リストボックスで、

変数の追加
変数の追加

変数の追加で、

Value
Value

Valueでintのm_xvListBox1を追加する。
また、

Control
Control

ControlでCListBoxのm_xcListBox1を追加する。

このように追加される。

m_xcListBox1はDDX_Controlなのに対し、m_xvListBox1はDDX_LBIndexとなる。

"Item1"から"Item3"を追加。

Button1が押されたら、UpdateDataで更新して、m_xvListBox1に選択されたアイテムのインデックスが格納されるので、それを文字列に変換してメッセージボックスで表示。

Item1
Item1

Item1を選択して、Button1を押すと、

0番目
0番目

0番目なので0。

Item2
Item2

Item2だと、

1番目
1番目

1番目なので1。

Item3
Item3

Item3は、

2番目
2番目

2番目なので2。
ちなみに、

未選択
未選択

起動時の状態のまま、何も選択していないと、

-1
-1

-1となる。

Sample/mfc/DDX_LBIndex/DDX_LBIndex/src/DDX_LBIndex at master · bg1bgst333/Sample · GitHub

DDX_Control

今回は、リストボックスの操作を行う。

DDX_Control | Microsoft Docs

これまではコントロールの状態とプリミティブ型変数の値やCStringなどを紐づけていたが、今回はコントロールの状態とそのコントロールのクラスオブジェクトを紐づけることで、状態を取得したり、操作したりする。

リストボックス配置
リストボックス配置

リストボックスを配置。

変数の追加
変数の追加

変数を追加。

カテゴリControl
カテゴリControl

前回まではカテゴリはValueだったが、今回はControl。
変数の種類はCListBoxにする。
これで、

m_xcListBox1が追加される。

DDX_ControlDlg.cppで、

ここでDDX_Controlで、IDC_LIST1とm_xcListBox1が紐付いてる。
また、

OnInitDialogで、m_xcListBox1.AddStringで、"Item1"、"Item2"、"Item3"を追加する。
で、

Button1が押された時のハンドラOnBnClickedButton1で、m_xcListBox1.AddStringで、"Item4"、"Item5"をさらに追加する。

起動時
起動時

"Item1"、"Item2"、"Item3"が追加されている。
Button1を押すと、

Button1でアイテム追加
Button1でアイテム追加

"Item4"、"Item5"が追加される。

Sample/mfc/DDX_Control/DDX_Control/src/DDX_Control at master · bg1bgst333/Sample · GitHub

native

Android NDKは、AndroidC/C++コードを使えるようにするツール。

NDK の概要  |  Android NDK  |  Android Developers
プロジェクトへの C / C++ コードの追加  |  Android Developers

プロジェクト作成時に、

プロジェクト作成
プロジェクト作成

[Include C++ Support]をチェックすると、

ここまでは一緒
ここまでは一緒

ここまでは一緒・・・。

少ない
少ない

少なくなってる・・・。

変わらない
変わらない

変わらない・・・。

C++設定
C++設定

これが出てきたらこんな感じで。

NDKがない
NDKがない

NDKが無いとこうなる。
リンククリックでインストール画面に、

NDKインストール
NDKインストール

NDKをインストール。

完了
完了

しかし、これでgradle syncしても、

CMakeがない
CMakeがない

CMakeが必要と出る。

今回はCMakeを使う方法を取る。Eclipse以前ではndk-buildを使っていたが、Android StudioだとCMakeの方法が主流らしい。(ndk-buildの場合はいずれ)

CMakeのインストール
CMakeのインストール

インストール。

完了
完了

完了。

SDK Manager
SDK Manager

LLDBも入れる。

LLDB
LLDB

チェックを入れて、

インストール
インストール

インストール。

完了
完了

完了。

app/src/main/cpp/の下に、native-lib.cppがあるので、

MainActivity.javaで、

このように書く。
C/C++側の関数はnativeとつけて宣言しておくと呼び出せる。

サンプル: hello-jni  |  Android NDK  |  Android Developers

stringFromJNIは、Java_com_bgstation0_ndk_sample_ntv_1_MainActivity_stringFromJNIに、intFromJNIは、Java_com_bgstation0_ndk_sample_ntv_1_MainActivity_intFromJNIに、対応してる。

実行すると、

実行結果
実行結果

こうなる。

Sample/ndk/native/NTV/NTV_ at master · bg1bgst333/Sample · GitHub

GoogleCloudMessaging

プッシュ通知を行うには、GoogleCloudMessaging(GCM)を使う。
(※. 現在はFirebase Cloud Messaging(FCM)に移行しているので、新規に使うことはできない。といっても、ここでも、FCMで新規登録した情報でGCMのクラスを使おうとしているだけなのだが。)

Cloud Messaging  |  Google Developers
GoogleCloudMessaging  |  Google APIs for Android  |  Google Developers
Google Cloud Messaging(GCM)連携 | ECHOPF

これはダッシュボード
これはダッシュボード

どこかにプロジェクト作成するところがあるはずだけど・・・。

プロジェクト作成
プロジェクト作成

このダイアログが出ればいいけど・・・。

GCMのプロジェクト
GCMのプロジェクト

こんな風に名前つける。

認証情報
認証情報

プロジェクト作成したら認証情報。

新しいキー
新しいキー

ここまできたら、

Google Developers

ここの、

Firebase
Firebase

Firebaseの、

Cloud Messaging
Cloud Messaging

Cloud Messaging。

コンソールかな
コンソールかな

コンソールの表示かGO TO CONSOLEどっちかな。

追加かな

これもプロジェクトの追加なのかインポートなのか。

GCM
GCM

これが出てきたらGCMのプロジェクトを選ぶ。

ダッシュボードのようなもの
ダッシュボードのようなもの

こんな感じでダッシュボードみたいなのが出ました。

いったん、ちょっと中断して、GCMのAndroidプロジェクトを作成する。

Android
Android

これで、

プロジェクト
プロジェクト

これで、

Empty
Empty

これで、

AppCompatなし
AppCompatなし

これで、

Project Structure
Project Structure

できたら、Project Structureで、

ライブラリ追加
ライブラリ追加

ライブラリ追加。

またPlay Services
またPlay Services

またPlay Services。

でさっきのダッシュボードのAndroidマークを押せばいいのかな。

ここでパッケージ名とSHA-1
ここでパッケージ名とSHA-1

ここで登録をしないといけない。
(GoogleとFirebaseで別れてしまっているので面倒)

json
json

で、jsonダウンロードしろとか、

gradle
gradle

こういう風にしろとかね。

で、Androidプロジェクトの方は、

MainActivity.javaで、

実際にはgcm.registerのところに送信者IDを入れる。

GcmIntentService.javaで、

GcmBroadcastReceiver.javaで、

こんな風にする。

これで実行すると、

何も起きない
何も起きない

UIは何も起きないが、

レジスト成功
レジスト成功

Device registeredできてる。

サーバーキー
サーバーキー

Google側のAPIキーと以前のサーバーキーが同じだったらいけるのかな・・・。
あと送信者IDを入れ忘れないようにと・・・。

随分前にやったので、現在はできないかもだけど、思い出しながらメモ書き・・・。

Sample/gcm/GoogleCloudMessaging/GCM/GCM_ at master · bg1bgst333/Sample · GitHub