What's new

MFCの難しいところ(その2)

2016年8月29日

2つ目は、MFCでちょっと変わったことをしようとしたとき。
性格には、たぶんMFCコーディングが完璧にわかってさえいれば問題にならないことなのだろうけど、中途半端に知識があるばっかりに問題を難しくしてしまうことだ。

今回苦労したことのひとつに、メニューの状態を変化させるということがある。
みくみくオセロでいうならば、ゲーム中とそうでないときでメニューの状態を切り替えている。
例えば、ゲーム中は打ち返してくるコンピュータの強さを変更できないようにしている。
これは単純にゲームの最中にコロコロ強さを変えられては困るから、あえてゲーム中は選択できないようにしている。

これを実現するには、ゲームがスタートした段階でメニューを無効化し、ゲーム終了と共にメニューを有効化すればよいことになる。
理屈は簡単でしょ。

しかしウィンドウズプログラミングはそんなに甘くない。
ゲームがスタートした段階でメニューを無効化する命令を送っても、実際にはメニューは無効化されない。

これはコーディング方法が悪いとかそういうことではなく、ウィンドウズの構造がそもそもわかっていないことに問題がある。

どういうことかというと、そもそもメニューというのはあらかじめ準備されているものではなく、その場の状況により内容が変化するものであるということを理解せねばならない。
ということは、メニューが表示される瞬間に、現在あるべきメニューの状態を組み立てねばならないということになる。

このあたりの理屈がわかってくると、自動的にもうひとつの問題にぶつかる。
それは、どうやってメニューが開かれる瞬間を知るのかということ。

実はこれはメニューが開かれようとしているということをウィンドウズが通知してくれるので、それを受け取る部分を作ることで解決できる。

ならば、前回にも書いたオセロ盤を描いている「CView」から派生した「C…View」にその部分を作ればよいことになる。
かんたんじゃん!
とおもうでしょ。

ところがこれだと思ったとおりにならずメニューは変化しないのだ。
やはりウィンドウズプログラミングはそんなに甘くない。

ではうまくいかない原因はなんだろうか?
大まかな理屈は間違っていないのだから、そのプロセスに問題があることになる。

前述したウィンドウズがメニューを表示する直前に、メニューを作っているという理屈は間違っていない。
問題はメニューが表示される瞬間、ウィンドウズから通知されるメッセージを受け取る部分を作る場所に問題があるのだ。

ぼくはオセロゲームという性質上、画面繊維のことを考えてほとんどすべての処理を「C…View」クラスのファイルに書き込んでいる。
これはMFCの性質上、仕方ないことだと思っている。

なぜなら前回も書いたようにMFCでは役割ごとにプログラムファイルが分割されている。
そしてご丁寧にもその各ファイルはお互いに独立しており、お互い簡単には干渉できないようになっている。

したがって、別ファイルにウィンドウズから通知されるメッセージを処理する部分を作ってしまったら…。
相互に連絡できなくなり、思ったようにメニューを変化させられなくなると思ったのだ。

しかし、オセロ盤を描いている「C…View」に作ってもうまく動作しないのだからしかたない。
ここはマニュアルどおり、ウィンドウのフレームを管理しているファイル「MainFrm」にメニューを変化させるプログラムを書き込むことにした。

そうなると、どうやってウィンドウのフレームを管理している「MainFrm」と、オセロ盤を管理している「C…View」で連絡を取り合うのかということが問題になる。

残念ながら10年以上もMFCと距離をおいていたぼくにはその解決法が思いつかなかったので、ネットで検索しまくった。
ぼくが悩んでいることはきっとどこかの誰かも悩んでいるに違いない。
そう信じて検索を始めて3日後、やっと見つけた。

その方法とは、ウィンドウのフレームを作っている「MainFrm」をポインタにして、オセロ盤を管理している「C…View」から呼び出すというもの。
べつにどっちが呼び出す側になろうとも、ようするに状態が変化したことを通知できればそれでよいのだ。

これでやっとメニューの状態を変えることに成功した。

たぶんきっともっとスマートにやる方法があるはずだけど、今のぼくにはこれが精いっぱい。

MFCの難しいところ(その1)

2016年8月28日

東京から帰ってきてやっと少し落ち着いてきたので、久々にブログ更新。

今回はみくみくオセロを作っているときに気づいたことを書いておく。
性格には目の見えない人間がMFCプログラミングに挑戦したとき、必ずといってもいいほどぶちあたる壁について書いておく。

一言でMFCの難しいところといっても、大きく分けると3種類あると思う。

1つ目は、MFC固有の考え方になれること。
コーディング手法であったり、変数の型だったり、クラスの親子関係とか…。
MFC固有というか、ウィンドウズプログラミングにおける考え方というべきか。

例えば、MFCでウィンドウ内に何かを描く場合。
みくみくオセロであれば、オセロ盤を描いている部分。

MFCではクラス別というか役割別にファイルが分割されているので、当然書く場所が決まっている。
具体的には「CView」から派生した「C…View」(…はプロジェクト名)。
なのだが、最初に指定するMFCアプリケーションウィザードでわかりやすいように最小限の指定をするとこのファイルはなくなってしまう。

実際のコーディング段階になってから「あれっ?」ということになる。
まぁこの手の問題は調べれば簡単にわかる基礎的なことが多いので、そんなに問題にはならない。

長くなりそうなので続きは次回。

みくみくオセロをリリースして

2016年8月15日

先日みくみくオセロをリリースした。
その情報が少しずつネット上に拡散しつつあるようだ。

ホームページのアクセス解析をみているとよくわかる。

今の時期、多くの人が休みモードになってるから、普通なら平日の3分の1ぐらいしかないアクセスが…。
おとといなんか平日の2倍近くになってたもんね。

もちろんトップはみくみくオセロのダウンロードページで、それにつられて他のページビューが少しずつ伸びてるかんじ。

そしておかげさまでこのブログのアクセスも少し伸びて…。
コメントまでいただいて感謝!

夜も寝ないで昼寝してがんばったかいがあったよー。
やっぱがんばってきたことが形になって周りから反応があるとうれしい!

さーて、次は何をつくろうかなー。

次回作にご期待ください。

白くまくんがやってきた

2016年7月23日

今日新しいエアコンが来た。

日立の白くまくん。
暑い日中も、寝苦しい夜も、これからは白くまくんにおまかせクマ!

というわけで今回は今日ぼくの部屋のエアコンを交換したときの話。

ぼくの部屋には今日の朝まで東芝のエアコンが設置されてた。
20年以上も故障や不具合なく働いてくれたすぐれもの。

まぁでもいくらなんでも使いすぎだということでこの夏交換することにした。

某電気店で白くまくんを購入することに決まり、設置工事の話になったとき、店員さんに…。
「お使いのインターネットプロバイダはどこですか?」
と聞かれた。

ぼくは…。
「えぇ、エアコンを買いにきたのに、プロバイダをセールスされるのか?やだなー」
とか思いながら…
「コミュファです」
とプロバイダを変えるつもりはないことを心にこめながら答えた。

すると、店員さんはこんなことを言い出した。
「今回工事する場所にコミュファの回線が入り込んでませんか?」

なぬ?
そういわれてみれば…。
ぼくの部屋にコミュファの回線がエアコンと同じところから入り込んでたことを思い出した。

すると店員さんは…。
「エアコン工事の前に、コミュファの回線をぬいといてください」
「もしエアコン工事の際、コミュファの回線を傷つけてしまってもこちらでは責任とれないので…」

えー!?
そんなことまでしなきゃいけないのか…。
そう思いつつ、確かに店員さんの言うことにも一理ある。
しかたなくわざわざコミュファに電話して、エアコン工事前後のタイミングで回線を一度はずし、再びつなげなおしてもらうことにした。
コミュファ側の扱いとしては、移転になるらしいのでもちろんただではない。

予想外の出費にショックだったがしかたない。
もしコミュファ回線が傷ついたら、インターネットだけじゃなく、テレビも電話も使えなくなる。
背に腹は代えられないのだ。

そんなこんなで軽いショックを受けつつ今日を迎えた。

まず、コミュファの人が来て回線をはずしにかかったんだけど…。
この段階まできて、ぼくはものすごく当たり前かつ重大なことを忘れていたことに気がついた。

そういえば、エアコンを買った電気店には固定電話の番号しか登録してない。
そして家は少しわかりにくいところにあるから、もしエアコン工事の人が家の場所がわからなかったり、これからおじゃましますなどの挨拶で固定電話にかけてこようものなら…。
何度かけてもつながらないという事態が起こることになる。

そんな単純なことに今日コミュファ回線をはずす直前まで気づかなかった。

「ぼくのバカ!」
と思いながら電気店に電話して事情を説明し携帯電話の番号を伝えた。
やはり事件は会議室で起こっているのではなく、現場で起こっているのだ。

こんな電話をしたからなのだろうか…。
コミュファの回線をはずしてまもなくエアコン工事の人が来た。

いろいろどたばたしたりもしたが、無事エアコン工事も終わり、そのタイミングでコミュファの回線もつなげなおしてもらった。

そこでエアコン工事の人がコミュファの人に言っていたのだが…。
やはりエアコン工事の際に、回線を傷つけてしまうトラブルがあるので、今回みたいにしていただけると助かりますみたいなことを言ってた。

そんなやり取りを聞いて…。
思わぬ出費でショックだったが、ぼくの知識不足であることを実感できたので、まぁよしとしよう!

こんな感じで、ぼくの一日はあっという間に終わった。
もちろんこのブログ記事を書いている今ぼくの部屋は、白くまくんが冷やしてくれているクマ!

ポケモンGO配信開始

2016年7月22日

やっと日本でもスマホ用アプリ「ポケモンゴー(PokemonGO)」の配信が開始された。

ポケモンGoはあまりの楽しさから「歩きスマホ」の原因になるとかいわれてるけど…
本当のポケモン好きは「ポケモンゴープラス(Pokemon GO Plus)」をゲットするから問題なし!
とか勝手に思ってる。

ポケモンGOプラスは腕時計型端末なので、わざわざスマホの画面とにらめっこしながら歩く必要はない。
ポケモンを発見したら振動して教えてくれるらしい。
もしポケモンがいたら、ポケモンGOプラスのボタンを押してポケモンゲットだぜ!

ポケモンGOプラスみたいな商品が出るんだから、やっぱりポケットモンスターはすごいなー。

…とかいう単純な記事で今回しめくくるつもりはない(笑)。

ぼくは視覚障害者だからよく思うんだけど…。
いくら目が見えていても、見えないとき?いや見ちゃいけないときっていうのがあるよね。

例えば、今回のようなポケモンGOみたいなパターン。
いくら目が見えていても、歩きながらスマホの画面を見てたんじゃ「歩きスマホ」になっちゃうから…。
視力はあるんだけど見ちゃいけないみたいな。

これと似たものにカーナビがあるよね。
あれは音声で道をガイドしてくれる。
もし地図ばかり見ていたらたいへんだよね。

このような技術に出合うたび、
「ユーザーが見えていないことを想定して作れるんだから、もう少しがんばって全盲でもすべての操作が問題なくできる機器を増やしてほしい」
とか思っちゃう。

これはあまえなのだろうか?