Eclipse-PHP環境でちょっとハマった
プログラミング [2019/09/30]
「VS2017-はじめの・・・」で説明してきた、Winタブレット向けのアプリの相方(サーバ側)の試作をしていたときの話です。
もう、半年以上前の話なので、ほとんど細かいことは覚えてないのですが、当時のメモがあったので、それを元にハマったことを書きます。
Eclipse上でPHPのサーバスクリプトを作ってデバッグするときの注意点になるかと思います。
Eclipseのバージョンは、Oxygen.2 Release (4.7.2)
◆初めて使うときに躓かないために
とは言っても結局は、あまり考えないで進めて、ハマってからしか詳細を調べないのが普通ですよね。
さるの場合、最初のワークスペース指定から、何も考えずに適当にやったら、Eclipse起動時、あるいはPHP実行時に「Post startup...中に内部エラーが発生しました。」、「ローカルホストのPHPビルトイン・サーバーに公開中・・・」などのエラーが出るようになった。テストできない状態になった。
原因は、適当にやりすぎたから。
でも、それを解消してやり直しを掛けるのに結構手間取った。
まずは、やらかしたときの手順を追って行きます。
長いです。
※以降、絵が小さいときは、クリックすると読める程度の絵が出ると思います。
もう、半年以上前の話なので、ほとんど細かいことは覚えてないのですが、当時のメモがあったので、それを元にハマったことを書きます。
Eclipse上でPHPのサーバスクリプトを作ってデバッグするときの注意点になるかと思います。
Eclipseのバージョンは、Oxygen.2 Release (4.7.2)
◆初めて使うときに躓かないために
とは言っても結局は、あまり考えないで進めて、ハマってからしか詳細を調べないのが普通ですよね。
さるの場合、最初のワークスペース指定から、何も考えずに適当にやったら、Eclipse起動時、あるいはPHP実行時に「Post startup...中に内部エラーが発生しました。」、「ローカルホストのPHPビルトイン・サーバーに公開中・・・」などのエラーが出るようになった。テストできない状態になった。
原因は、適当にやりすぎたから。
でも、それを解消してやり直しを掛けるのに結構手間取った。
まずは、やらかしたときの手順を追って行きます。
長いです。
※以降、絵が小さいときは、クリックすると読める程度の絵が出ると思います。
スポンサーサイト
嬉し恥ずかしお百姓一年生(9):秋野菜他状況
園芸 [2019/09/29]
先週、小雨の中やっとこさハクサイの移植を終えたのだが、防虫対策が未完成です。
防虫ネットを被せたのは、全体の20%以下だろう。
残りはクスリを使ってしまおうと思った。
できれば、化学的なものは避けたいと思って、ネットでどんなのがあるか探した。
見つかったのは、「無農薬 不快害虫よけ 虫よらず」。
ホームセンターで探したが、同様の商品は置いてなかったので、通販で1.5kg 2袋セットで2690円を購入。
届いたのを見たら、予想したのよりなんか小さかった。
これでは、どうも足らないのではないかと思って、
ついに、近くのホームセンターでオルトランを購入した。こちらは、1.5kg 消費税込み2130円弱。
上記、2種類を携えて、実家の畑へ。
でも・・・
防虫ネットを被せたのは、全体の20%以下だろう。
残りはクスリを使ってしまおうと思った。
できれば、化学的なものは避けたいと思って、ネットでどんなのがあるか探した。
見つかったのは、「無農薬 不快害虫よけ 虫よらず」。
ホームセンターで探したが、同様の商品は置いてなかったので、通販で1.5kg 2袋セットで2690円を購入。
届いたのを見たら、予想したのよりなんか小さかった。
これでは、どうも足らないのではないかと思って、
ついに、近くのホームセンターでオルトランを購入した。こちらは、1.5kg 消費税込み2130円弱。
上記、2種類を携えて、実家の畑へ。
でも・・・
嬉し恥ずかしお百姓一年生(8):ハクサイ植替地獄
園芸 [2019/09/26]
植えっぱなし、ほったらかし園芸は、さすがに何も上手くいかないことを実感し始めたころ。
ダイコンの芽すら虫か鳥に食われて、出だし失敗したので、
ハクサイはいくらかマシに育てたいと思って、いつもよりは下調べをした。
◆ハクサイ続き
まずは、タネ播きはトレーで行う。
畝の作り方。
トレーから畑へ移植。
間引き。
虫よけは必須っぽい。
追肥も必要。
トレー種まきを実施したら、予想以上に早く芽が出て少し慌てた。
外の半日陰っぽいところに置いたら、屋根からの雨水が直撃して、一列全滅した。

3週間前、ダイコンの植替えを優先して実施。
その後、枝豆を収穫し、その後に畝を作った。
ハクサイの植替えの全工程は、
1)雑草をホーで根っこ部分から掘り起こして片付けて
2)肥料を撒いてマメトラで再度耕して、
3)畝をつくって
4)肥料を入れながら、苗を移植する
5)水をやる
ですが、当日は30℃を超す残暑で、日陰で休んでいる時間が長くて、
枝豆もサヤもぎしないといけなし、3)の段階で時間切れ。
トレーのハクサイがひょろひょろ伸び始めたので、一部はポットに植え替えたが。
結局、トレーに一か月ほど居てもらった。
翌週、移植を開始。
今回は、虫よけ網を掛けてやるつもりで、買いに行ったが、結構するのね。
5mx1.8mで1500円弱。
さるのおこづかいは既に尽きてたので、3本だけ買ってきた。
前週作った畝に植替えを実施。
クマっぽい獣の足跡はあったけど。
ダイコンの芽すら虫か鳥に食われて、出だし失敗したので、
ハクサイはいくらかマシに育てたいと思って、いつもよりは下調べをした。
◆ハクサイ続き
まずは、タネ播きはトレーで行う。
畝の作り方。
トレーから畑へ移植。
間引き。
虫よけは必須っぽい。
追肥も必要。
トレー種まきを実施したら、予想以上に早く芽が出て少し慌てた。
外の半日陰っぽいところに置いたら、屋根からの雨水が直撃して、一列全滅した。

3週間前、ダイコンの植替えを優先して実施。
その後、枝豆を収穫し、その後に畝を作った。
ハクサイの植替えの全工程は、
1)雑草をホーで根っこ部分から掘り起こして片付けて
2)肥料を撒いてマメトラで再度耕して、
3)畝をつくって
4)肥料を入れながら、苗を移植する
5)水をやる
ですが、当日は30℃を超す残暑で、日陰で休んでいる時間が長くて、
枝豆もサヤもぎしないといけなし、3)の段階で時間切れ。
トレーのハクサイがひょろひょろ伸び始めたので、一部はポットに植え替えたが。
結局、トレーに一か月ほど居てもらった。
翌週、移植を開始。
今回は、虫よけ網を掛けてやるつもりで、買いに行ったが、結構するのね。
5mx1.8mで1500円弱。
さるのおこづかいは既に尽きてたので、3本だけ買ってきた。
前週作った畝に植替えを実施。
クマっぽい獣の足跡はあったけど。
嬉し恥ずかしお百姓一年生(7):性懲りもなく秋野菜
園芸 [2019/09/24]
これまでの、なんちゃってな植えっぱなし園芸を
性懲りもなくまだ続けています。
「8月に種まきする野菜」で検索すると、
ダイコン、ハクサイ、アスパラ菜、・・・と出ててきました。
タネを買ってきて・・・
まずは、ダイコンを植える先を作らなきゃ。
◆ダイコン
春に一度耕して、何も植えなかったところを
1)草刈り機で草を刈って
2)刈った草を集めて、寄せて
3)ホーで根っこ部分から掘り起こして片付けて
4)肥料を撒いてマメトラで再度耕して、
5)畝をつくって
6)肥料を入れて、タネを撒く
7)水をやる
ってやって、やっと種まき完成です。
例えば、4月くらいに種まきするのであれば、1)~3)は不要な作業です。
春より、大変じゃないかーい。
ともあれ、まだ残暑厳しいお盆のさなかに、ダイコンのタネマキを行いました。
ところが・・・・
性懲りもなくまだ続けています。
「8月に種まきする野菜」で検索すると、
ダイコン、ハクサイ、アスパラ菜、・・・と出ててきました。
タネを買ってきて・・・
まずは、ダイコンを植える先を作らなきゃ。
◆ダイコン
春に一度耕して、何も植えなかったところを
1)草刈り機で草を刈って
2)刈った草を集めて、寄せて
3)ホーで根っこ部分から掘り起こして片付けて
4)肥料を撒いてマメトラで再度耕して、
5)畝をつくって
6)肥料を入れて、タネを撒く
7)水をやる
ってやって、やっと種まき完成です。
例えば、4月くらいに種まきするのであれば、1)~3)は不要な作業です。
春より、大変じゃないかーい。
ともあれ、まだ残暑厳しいお盆のさなかに、ダイコンのタネマキを行いました。
ところが・・・・
’19秋キノコ採り:2回目
山菜・きのこ採り [2019/09/22]
先週、マメ(マイタケの幼菌)を3つほど見つけて、残してきたので、
当然今週は、回収に行きました。
今回は、山友2も参戦。

400m以上の標高差をヒーコラ言いながら上り詰めて、
さあ、マイタケちゃん大きくなったかなー?
予想通り、居なーい。
やっぱね。
まさか、先週の日月(休日)だとまだ幼菌の状態だったはずなので、それを持って帰ったとは思えないから。
平日も動ける、プロの方ですよね。
ちっ。
めげない、めげない。
その後、1時間程探しまくりました。
でも、居なーい。
やっとこさ、別の小さいのを1つめっけた。

あーーやれやれ。坊主を免れた。
1つ見つけたので、俄然やる気を取り戻したのですが・・・
当然今週は、回収に行きました。
今回は、山友2も参戦。

400m以上の標高差をヒーコラ言いながら上り詰めて、
さあ、マイタケちゃん大きくなったかなー?
予想通り、居なーい。
やっぱね。
まさか、先週の日月(休日)だとまだ幼菌の状態だったはずなので、それを持って帰ったとは思えないから。
平日も動ける、プロの方ですよね。
ちっ。
めげない、めげない。
その後、1時間程探しまくりました。
でも、居なーい。
やっとこさ、別の小さいのを1つめっけた。

あーーやれやれ。坊主を免れた。
1つ見つけたので、俄然やる気を取り戻したのですが・・・
クマ・・・ですか2
自然観察 [2019/09/21]
7月の初旬に、どうも実家山林にクマの出没形跡を見つけて以来、若干、神経過敏になっているさるです。
先々週、ハクサイを植えるため、その山林を通った先にある畑に行きました。
というか、毎週行っているんですけどね。
9月にしてはかなり暑い日で、作業は全く捗らず(日陰で休んでる時間が長いから)、
畑に畝(うね)をやっとこさ盛ったところで、作業を終了してきた。
先週、続きの作業をやろうと畑に行ってみると、盛った畝に何やらポツポツとけものの足跡が。

タヌキか?

なんか、大小あるような。
さらに、足跡を追うと・・・
先々週、ハクサイを植えるため、その山林を通った先にある畑に行きました。
というか、毎週行っているんですけどね。
9月にしてはかなり暑い日で、作業は全く捗らず(日陰で休んでる時間が長いから)、
畑に畝(うね)をやっとこさ盛ったところで、作業を終了してきた。
先週、続きの作業をやろうと畑に行ってみると、盛った畝に何やらポツポツとけものの足跡が。

タヌキか?

なんか、大小あるような。
さらに、足跡を追うと・・・
’19秋キノコ採り:1回目
山菜・きのこ採り [2019/09/20]
毎年、同じ話ばっかで。
目的は一緒だし、場所も大して変わらないし。
でも、取り敢えず載せちゃいます。
9月の第2週土曜。
昨年と同じ時期のスタートとなりました。
幸い前の週土日は、真夏のような暑さだったのですが、先週は過ごしやすい気温でした。
「猛暑の夏の年は、キノコが豊作になる」と亡くなった爺が申しておりました。
でも、昨年が豊作だったので2年連続となるとは、ちょっと期待し過ぎでしょう。
マイタケの下見を兼ねた雑キノコ採り、あるいは夏キノコの奥手を探しに山友と出かけました。
現場は、昨年マイタケがバカ採れした山奥。(結局マイタケ狙いみたいですね。)


ところが・・・
目的は一緒だし、場所も大して変わらないし。
でも、取り敢えず載せちゃいます。
9月の第2週土曜。
昨年と同じ時期のスタートとなりました。
幸い前の週土日は、真夏のような暑さだったのですが、先週は過ごしやすい気温でした。
「猛暑の夏の年は、キノコが豊作になる」と亡くなった爺が申しておりました。
でも、昨年が豊作だったので2年連続となるとは、ちょっと期待し過ぎでしょう。
マイタケの下見を兼ねた雑キノコ採り、あるいは夏キノコの奥手を探しに山友と出かけました。
現場は、昨年マイタケがバカ採れした山奥。(結局マイタケ狙いみたいですね。)


ところが・・・
嬉し恥ずかしお百姓一年生(6):野望の赤ソバ
園芸 [2019/09/19]
荒らしちゃった畑、一番広い区画で30aくらいはある。
柿の木が植わっているが、半分くらいは枯れていて、夏には、カヤ(ススキ)の混ざった草原になります。
7-8月中に一生懸命、1m以上の背丈の雑草を刈っても、9月中旬でこんな感じに戻ります。

(刈らなかった場合は、以下の写真の左側のようになる。)

今後徐々に畑化するにしても、こんな広さなので、手の掛かるものは大型機械も持ってないし、体力的に無理かなと思ってます。
以前、秋に観光で行った高原で、元は牧草地っぽいところで、ピンク色の花畑を見たことがあった。
帰って来て調べて、その花がソバであることが分かった。
普段、蕎麦屋で普通にでてくるのは、白い花が咲くいわゆるソバで、それとはちょっと品種が異なるらしい。
ソバは、最近田んぼの転作作物として、実家近辺でも割と盛んに栽培されている。
さっきの写真の草原の左側には別の家の田んぼがあって、100mくらい下流側の田んぼでもソバが栽培されてます。
でも、赤いのはない。
ソバは、割と痩せた土地でも育つっぽいイメージだし、雑草除けによさそう。
せっかくだし、すこし珍しいものを植えようと思って、ネットで赤ソバのタネを探した。
直ぐ見つかった。「高嶺ルビー」という品種?商品名?のタネが通販で購入できる。
ちょっと多め?で8袋(送料込みで2800円弱)買って見た。
1年で畑全体をピンクに染める程の量は、種の購入コストもそうだが、蒔くエリアの準備ができないので、
8袋分を元手にどんどん増やせないかなーと思っている。
さるの2つめの野望は、上の草原をピンクの絨毯の畑にすることです。
種袋先生によると、播き時が8月となっていた。
なのでこのエリアの草刈り作業の最終日(8月初旬)に、耕してあった一角に種を植えて見た。
柿の木が植わっているが、半分くらいは枯れていて、夏には、カヤ(ススキ)の混ざった草原になります。
7-8月中に一生懸命、1m以上の背丈の雑草を刈っても、9月中旬でこんな感じに戻ります。

(刈らなかった場合は、以下の写真の左側のようになる。)

今後徐々に畑化するにしても、こんな広さなので、手の掛かるものは大型機械も持ってないし、体力的に無理かなと思ってます。
以前、秋に観光で行った高原で、元は牧草地っぽいところで、ピンク色の花畑を見たことがあった。
帰って来て調べて、その花がソバであることが分かった。
普段、蕎麦屋で普通にでてくるのは、白い花が咲くいわゆるソバで、それとはちょっと品種が異なるらしい。
ソバは、最近田んぼの転作作物として、実家近辺でも割と盛んに栽培されている。
さっきの写真の草原の左側には別の家の田んぼがあって、100mくらい下流側の田んぼでもソバが栽培されてます。
でも、赤いのはない。
ソバは、割と痩せた土地でも育つっぽいイメージだし、雑草除けによさそう。
せっかくだし、すこし珍しいものを植えようと思って、ネットで赤ソバのタネを探した。
直ぐ見つかった。「高嶺ルビー」という品種?商品名?のタネが通販で購入できる。
ちょっと多め?で8袋(送料込みで2800円弱)買って見た。
1年で畑全体をピンクに染める程の量は、種の購入コストもそうだが、蒔くエリアの準備ができないので、
8袋分を元手にどんどん増やせないかなーと思っている。
さるの2つめの野望は、上の草原をピンクの絨毯の畑にすることです。
種袋先生によると、播き時が8月となっていた。
なのでこのエリアの草刈り作業の最終日(8月初旬)に、耕してあった一角に種を植えて見た。
嬉し恥ずかしお百姓一年生(5):オクラとブルーベリー苗木の状況
園芸 [2019/09/18]
いずれは、荒らした畑を復活させて、ブルーベリー園にしてやろうじゃないの。
と、野望を大きく膨らまたのはこの春です。
今のなんでもかんでも植えて見て、失敗作のオンパレードも、
まずは、畑作りの大変さを身をもって体感してみるという目的(苦しい言い訳)でもあります。
さて、今回は全ての発端となったブルーベリーの状況と、忘れてたオクラの話です。
昨年挿し木したブルーベリーに新芽が出て俄然やる気になり、
そのためにボカシ肥を作ってみて、
荒らした畑状況を把握するために耕して、
ついでに、思い付きで野菜を植えている・・・
これが実情です。
さて、春のブルーベリーの苗木がこんなでした。

その後・・・
と、野望を大きく膨らまたのはこの春です。
今のなんでもかんでも植えて見て、失敗作のオンパレードも、
まずは、畑作りの大変さを身をもって体感してみるという目的(苦しい言い訳)でもあります。
さて、今回は全ての発端となったブルーベリーの状況と、忘れてたオクラの話です。
昨年挿し木したブルーベリーに新芽が出て俄然やる気になり、
そのためにボカシ肥を作ってみて、
荒らした畑状況を把握するために耕して、
ついでに、思い付きで野菜を植えている・・・
これが実情です。
さて、春のブルーベリーの苗木がこんなでした。

その後・・・
嬉し恥ずかしお百姓一年生(4):ニラ、コマツナ、ニンジン
園芸 [2019/09/16]
7月の末、少し落ち着いて来たので、掘った畑に何か植えようと考えた。
「7月に種播きできる野菜」と検索して、その内ニラとコマツナのタネを買ってきて、撒いた。
ニンジンは、数年前のものがあったのでそれを使った。
タネの播き方は、タネの袋の裏にちーさい字で書いてある。
その他、育て方にい関する色んなことが書いてあります。
タネからの場合、さるのお百姓の先生は7割がたこのタネの袋の裏書です。
それを読んでも分からない場合はWeb。
で、7月の下旬に現場の畑に行ってみると、畑は草ボーボー。
雑草をネキリ(ホー)で排除して、もう一回マメトラで耕し、畝を盛って種播きを実施。
暑い時期だったので結構大変だった。
今後のことも考えて、畝も多めに作った。
(二か月近く経って、何も植えない内に草ボーボです。)
で、現状は・・・
「7月に種播きできる野菜」と検索して、その内ニラとコマツナのタネを買ってきて、撒いた。
ニンジンは、数年前のものがあったのでそれを使った。
タネの播き方は、タネの袋の裏にちーさい字で書いてある。
その他、育て方にい関する色んなことが書いてあります。
タネからの場合、さるのお百姓の先生は7割がたこのタネの袋の裏書です。
それを読んでも分からない場合はWeb。
で、7月の下旬に現場の畑に行ってみると、畑は草ボーボー。
雑草をネキリ(ホー)で排除して、もう一回マメトラで耕し、畝を盛って種播きを実施。
暑い時期だったので結構大変だった。
今後のことも考えて、畝も多めに作った。
(二か月近く経って、何も植えない内に草ボーボです。)
で、現状は・・・
VS2017-はじめの1/10歩(18):暗号化処理を取り込む
プログラミング [2019/09/16]
「くりぷと」って聞いて・・・「元素にそんな名前のがあったよーな」と思ってしまうさるです。
Windows10タブレット向けのアプリを作ろうとしています。
VS2017を使うんだけど慣れてないからVS6でまずは作ってました。言わばWin32アプリです。
両方の環境(クロス環境)でコンパイルできるソースとして書いてます。
これまでの書き込みも含めると、
→ナレーション再生と音声認識を使う
→そのため音声データの作り方(多言語対応)
→ナレーション(.WAV)再生のサンプルコード
→音声認識のサンプルコード
→VS6で作ったC/C++コードをVS2017に持って行って.cppレベルで共通にする方法
→ダイアログベースのプログラム
→背景に画像(.BMP)を使う
→ラベルを透かす
→ボタンの色を変える
→Windowsタブレット上でピンチイン/アウト:拡大縮小
→タブレット画面の回転への対応
→カスタムなチェックボックス作成
→ボタンに画像を貼付ける
→スクロールとスワイプ
→HTTPでファイルを送受信する
→手法1:ブラウザ使って
→手法2:Wininetを使う
→暗号化処理を取り込む←今回
となってます。
世の中、データの暗号化は当たり前に使われる時代なんですよね。
ほぼ、そんなこと気にせず通信環境で動くアプリやサービスを使ってるけど。
例えば、LAN環境で使用するローカルなDBサーバシステムがあったとします。
そのサーバシステムに対して、LAN環境外でデータの更新がしたくなったとします。
つまり、持ち歩きのPCで加工したい部分を予め取り出して、どっか別の場所で加工して、戻す仕掛け。
そうすれば、DBとのデータの出し入れだけLAN環境のエリアで行えば、そのデータの加工はどこでへ行ってもできる。
「そんなの公衆回線を使ってDBアクセス環境を作っちゃえばいいじゃん。」と思われるでしょう。
今はほとんど通信料は定額だし、WiFi環境もそこいらに・・・・
ないんです。
さるの棲む田舎では、WiFiスポットを探すどころか、電波が届かないところも未だにざらにあるのですよ。
ちなみに、さるの実家でのポケットWiFiの可否としては
・Do*omo △ :スンゲー遅い。3G<->4G行ったり来たり。
・A* × :通じません
・Softb* 不明:カバー域マップで見るとつながることになってる。
そんなところで外回りされる方のためには、データの部分的持ち歩きはあってもいい機能ではないかと。
定額と謂えども、その分の通信コストも削減できるはず。
ただし、ローカルなデータを持ち出すのだから、端末を落としたら大変です。
しかも今のところ持ち歩きデバイスはWindowsタブレットだし。
なのでファイル自体は「暗号化しておこう」と思ったのが、事の始まりです。
いつもながら、前置き長くてすいません。
そんなこんなで、「暗号化」についてちょっとだけ勉強することになった。
暗号化方式も色々あるらしが、「AES」というのがよさげらしい。
調べているうちに、「ローカル環境内の通信で、タブレットからDBアクセス時にハッキングされたら?」と思ってしまった。
(ローカルな環境でしかやれないことだし、そんなに心配するほどでもないのだけど。)
-ユーザ認証は必要でしょう。
-ってことは、ID/パスワードをサーバ側スクリプトに送り込むよな。
-裸で?
-せめてパスワードは分からないようにしようよ。
-どんなのがある?
-「PBKDF2」※という単語が出てきた。
-じゃそれ使って見よう。
-当然、データもダウンロード段階で暗号化。
-保存もそのままで、参照・編集時に復号ね。
と思ったのがウンのツキ。
この時点で「暗号化」についての知識はゼロです。
使われている言葉すら分かりません。
調べ始めたんだけど、色んな説明してくれてるサイトはあるんだけど、
Windows、VCで絞ると、割と無かった印象。
なので、結構時間が掛かりました。
それで・・・・
Windows10タブレット向けのアプリを作ろうとしています。
VS2017を使うんだけど慣れてないからVS6でまずは作ってました。言わばWin32アプリです。
両方の環境(クロス環境)でコンパイルできるソースとして書いてます。
これまでの書き込みも含めると、
→ナレーション再生と音声認識を使う
→そのため音声データの作り方(多言語対応)
→ナレーション(.WAV)再生のサンプルコード
→音声認識のサンプルコード
→VS6で作ったC/C++コードをVS2017に持って行って.cppレベルで共通にする方法
→ダイアログベースのプログラム
→背景に画像(.BMP)を使う
→ラベルを透かす
→ボタンの色を変える
→Windowsタブレット上でピンチイン/アウト:拡大縮小
→タブレット画面の回転への対応
→カスタムなチェックボックス作成
→ボタンに画像を貼付ける
→スクロールとスワイプ
→HTTPでファイルを送受信する
→手法1:ブラウザ使って
→手法2:Wininetを使う
→暗号化処理を取り込む←今回
となってます。
世の中、データの暗号化は当たり前に使われる時代なんですよね。
ほぼ、そんなこと気にせず通信環境で動くアプリやサービスを使ってるけど。
例えば、LAN環境で使用するローカルなDBサーバシステムがあったとします。
そのサーバシステムに対して、LAN環境外でデータの更新がしたくなったとします。
つまり、持ち歩きのPCで加工したい部分を予め取り出して、どっか別の場所で加工して、戻す仕掛け。
そうすれば、DBとのデータの出し入れだけLAN環境のエリアで行えば、そのデータの加工はどこでへ行ってもできる。
「そんなの公衆回線を使ってDBアクセス環境を作っちゃえばいいじゃん。」と思われるでしょう。
今はほとんど通信料は定額だし、WiFi環境もそこいらに・・・・
ないんです。
さるの棲む田舎では、WiFiスポットを探すどころか、電波が届かないところも未だにざらにあるのですよ。
ちなみに、さるの実家でのポケットWiFiの可否としては
・Do*omo △ :スンゲー遅い。3G<->4G行ったり来たり。
・A* × :通じません
・Softb* 不明:カバー域マップで見るとつながることになってる。
そんなところで外回りされる方のためには、データの部分的持ち歩きはあってもいい機能ではないかと。
定額と謂えども、その分の通信コストも削減できるはず。
ただし、ローカルなデータを持ち出すのだから、端末を落としたら大変です。
しかも今のところ持ち歩きデバイスはWindowsタブレットだし。
なのでファイル自体は「暗号化しておこう」と思ったのが、事の始まりです。
いつもながら、前置き長くてすいません。
そんなこんなで、「暗号化」についてちょっとだけ勉強することになった。
暗号化方式も色々あるらしが、「AES」というのがよさげらしい。
調べているうちに、「ローカル環境内の通信で、タブレットからDBアクセス時にハッキングされたら?」と思ってしまった。
(ローカルな環境でしかやれないことだし、そんなに心配するほどでもないのだけど。)
-ユーザ認証は必要でしょう。
-ってことは、ID/パスワードをサーバ側スクリプトに送り込むよな。
-裸で?
-せめてパスワードは分からないようにしようよ。
-どんなのがある?
-「PBKDF2」※という単語が出てきた。
-じゃそれ使って見よう。
-当然、データもダウンロード段階で暗号化。
-保存もそのままで、参照・編集時に復号ね。
と思ったのがウンのツキ。
この時点で「暗号化」についての知識はゼロです。
使われている言葉すら分かりません。
調べ始めたんだけど、色んな説明してくれてるサイトはあるんだけど、
Windows、VCで絞ると、割と無かった印象。
なので、結構時間が掛かりました。
それで・・・・
嬉し恥ずかしお百姓一年生(3):カボチャ、サトイモ、エダマメ
園芸 [2019/09/14]
春先に草刈りの手間をいくらかでも省きたいがために、荒らした畑の一部をマメトラで耕して見た。
実家裏の段々畑で5aくらい、裏山向こうの畑10aくらい。
何か植えようかと思って、タネを播いて育て始めたものの、それだけでは耕した分全ては使えそうになかった。
特に裏山向こうの畑に関してはNo Plan。
「そういや、爺婆元気だったときは何を植えてたっけな~」と考えた。
たしか、カボチャとか長芋、サトイモなんかが植わってたな。
6月初めころ、ホームセンターでカボチャ2品種と里芋の苗を買って、即畑に植えた。
3か月経過して、現状は・・・
実家裏の段々畑で5aくらい、裏山向こうの畑10aくらい。
何か植えようかと思って、タネを播いて育て始めたものの、それだけでは耕した分全ては使えそうになかった。
特に裏山向こうの畑に関してはNo Plan。
「そういや、爺婆元気だったときは何を植えてたっけな~」と考えた。
たしか、カボチャとか長芋、サトイモなんかが植わってたな。
6月初めころ、ホームセンターでカボチャ2品種と里芋の苗を買って、即畑に植えた。
3か月経過して、現状は・・・
VS2017-はじめの1/10歩(17):HTTPでファイルを送受信する(2)
プログラミング [2019/09/14]
VS2017を使うんだけど慣れてないからVS6でまずは作ってました。
さらに、言わばWin32アプリです。
両方の環境(クロス環境)でコンパイルできるソースとして書いてます。
これまでの書き込みも含めると、
→ナレーション再生と音声認識を使う
→そのため音声データの作り方(多言語対応)
→ナレーション(.WAV)再生のサンプルコード
→音声認識のサンプルコード
→VS6で作ったC/C++コードをVS2017に持って行って.cppレベルで共通にする方法
→ダイアログベースのプログラム
→背景に画像(.BMP)を使う
→ラベルを透かす
→ボタンの色を変える
→Windowsタブレット上でピンチイン/アウト:拡大縮小
→タブレット画面の回転への対応
→カスタムなチェックボックス作成
→ボタンに画像を貼付ける
→スクロールとスワイプ
→HTTPでファイルを送受信する
→手法1:ブラウザ使って
→手法2:Wininetを使う←今回
前回、1週間くらい掛けて調べた挙句に、当初の前提をチャラにして、
ブラウザコントロールは使わずに必要な機能を再度作ることにしました。
つまり、サーバスクリプト側には、
・ダウンロード:欲しいデータをリクエストして、
お返しにそのデータファイルをレスポンスしてもらう。
・アップロード:アップしたいデータを伝えて、一緒にファイルも送り込み、
結果のステータスのみレスポンスしてもらう。
◆ファイルを単純にダウンロードするだけ
URLDownloadToFile()を使ったら、あっさりできた。
しかも、呼び出したプログラムのカレントフォルダに書き込んでくれる。
(前回の「IEイベント操作方法」捜索は、もっと早くにあきらめればよかった。)
ヘッダとかに以下が必要。
ダイアログとかにダウンロード用のボタンがあるものとして。
ウィンドウプロシジャ内で
URLDownloadToFile()関数の先頭パラメタg_pWB2は、AtlAxGetControl()が使えましたが、NULLでも大丈夫そうです。
g_FileDLUrlは、ダウンロードするファイルのURL、あるいはスクリプトのURLを指定します。
◆ファイルを問答無用でサーバ側に送りつける
ダウンロードで、ブラウザが必要なHTMLのフォームを介してのダウンロードは断念したので、アップロードも問答無用としたい。
調べました。
https://www.experts-exchange.com/questions/21043473/Automating-Internet-Explorer-to-upload-files-with-VC.html ★
HTMLとしてブラウザ上に表示されているformを操作するような感じなのかな?
まずは、キープ。
http://frog.raindrop.jp/knowledge/archives/000287.html
MFCを使う方法の説明。MFCかー。
http://programing-memo.blogspot.com/2011/05/ccgi.html
サーバ側の処理をC++で・・・みたいなので違います。
http://sdlabo.org/index.php?C%E8%A8%80%E8%AA%9E%E3%81%A7POST%E3%81%97%E3%81%A6%E3%83%90%E3%82%A4%E3%83%8A%E3%83%AA%E3%83%87%E3%83%BC%E3%82%BF%E3%82%92%E3%82%A2%E3%83%83%E3%83%97%E3%83%AD%E3%83%BC%E3%83%89 ★
WinSockを使う方法かと思います。シンプルで分かりやすい。
これもキープ。
https://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=34969&forum=7 ▼
VBのWebClient.UploadFileをVCでやりたいけど、上手くいかないとのQ。
Aがない。
でも、WebClientってこれまでも出てきた気がする。
これしか、ないのか?
と、ここで「cURL」というワードが登場。
https://teratail.com/questions/100418
https://curl.haxx.se/libcurl/c/example.html
https://curl.haxx.se/download.html
wikiで説明を読むと、なんか自由に使ってよさげなフリーのライブラリらしく、Windows版もある。
使用方法を説明するサンプルコードもあって、見ると至ってシンプルだ。
ダウンロードもアップロードもある。
ぐっと来てますが、
あれもこれもを追加すると、今はいいけど先々の継続性に不安を抱えることになるわけで。
MS社提供環境に絞って仕方なく使っているのも、いくらかでもOS/VSのバージョンアップ時の「互換」を期待してのこと。
・・・もうちょっと調べよう。
これまで使ってきたヘッダやライブラリをベースにファイルのアップロードについて語っているところを探すために「COM」「IWebBrowser2」とかのキーワードをプラスして探しましたがなかなか、さるが理解できそうなところに当たらない。
飽きちゃって、ぼやっと検索されたサイトを見てたら、
あれ?「Wininet」ってあるのね。
要はブラウザじゃない、URLアクセスですよね。
なんだよ、ちゃんとあるんだね。
ダウンロードのサンプルはすぐ見つかりました。
https://blog.systemjp.net/entry/2016/08/10/110128
http://yamatyuu.net/computer/program/sdk/wininet/wgetbin/index.html
アップも?・・・ありました。
https://code.i-harness.com/ja-jp/q/7309e
https://stackoverflow.com/questions/10097216/c-wininet-file-upload-with-http-post
https://www.dinop.com/vc/wininet_post.html
またもや方針転換です。
URLDownLoad()を使うのは止めて、Wininet APIを使います。
まあともかく、動かせそうなレベルまでコードを書きました。(ほぼパクリですけどね。)
じゃあ、動かして見ましょー・・・
さらに、言わばWin32アプリです。
両方の環境(クロス環境)でコンパイルできるソースとして書いてます。
これまでの書き込みも含めると、
→ナレーション再生と音声認識を使う
→そのため音声データの作り方(多言語対応)
→ナレーション(.WAV)再生のサンプルコード
→音声認識のサンプルコード
→VS6で作ったC/C++コードをVS2017に持って行って.cppレベルで共通にする方法
→ダイアログベースのプログラム
→背景に画像(.BMP)を使う
→ラベルを透かす
→ボタンの色を変える
→Windowsタブレット上でピンチイン/アウト:拡大縮小
→タブレット画面の回転への対応
→カスタムなチェックボックス作成
→ボタンに画像を貼付ける
→スクロールとスワイプ
→HTTPでファイルを送受信する
→手法1:ブラウザ使って
→手法2:Wininetを使う←今回
前回、1週間くらい掛けて調べた挙句に、当初の前提をチャラにして、
ブラウザコントロールは使わずに必要な機能を再度作ることにしました。
つまり、サーバスクリプト側には、
・ダウンロード:欲しいデータをリクエストして、
お返しにそのデータファイルをレスポンスしてもらう。
・アップロード:アップしたいデータを伝えて、一緒にファイルも送り込み、
結果のステータスのみレスポンスしてもらう。
◆ファイルを単純にダウンロードするだけ
URLDownloadToFile()を使ったら、あっさりできた。
しかも、呼び出したプログラムのカレントフォルダに書き込んでくれる。
(前回の「IEイベント操作方法」捜索は、もっと早くにあきらめればよかった。)
ヘッダとかに以下が必要。
//----------------------------------------------
#include <urlmon.h> //URLDownload()
#pragma comment(lib, "urlmon.lib")
//----------------------------------------------
ダイアログとかにダウンロード用のボタンがあるものとして。
ウィンドウプロシジャ内で
//----------------------------------------------
case WM_COMMAND:
if (LOWORD(wParam) == IDC_BTDL1) {
//パターン1:URLDownloadToFile
HRESULT rs;
rs = URLDownloadToFile(g_pWB2, g_FileDLUrl, "tameshite.zip", 0, NULL);
if (rs == S_OK) {
OutputDebugString(_T("Download success!\n"));
}
else if (rs == E_ABORT) { //0x80004004
//URLDownloadToFile()の第3パラメタでパス指定するとアボートされる。
//→IEテンプレートフォルダ?(このプログラムのカレント)に書き込まれる。
OutputDebugString(_T("Download error!! E_ABORT\n"));
}
else {
OutputDebugString(_T("Download error!! unknown\n"));
int rt = GetLastError();
}
}
:
//----------------------------------------------
URLDownloadToFile()関数の先頭パラメタg_pWB2は、AtlAxGetControl()が使えましたが、NULLでも大丈夫そうです。
g_FileDLUrlは、ダウンロードするファイルのURL、あるいはスクリプトのURLを指定します。
◆ファイルを問答無用でサーバ側に送りつける
ダウンロードで、ブラウザが必要なHTMLのフォームを介してのダウンロードは断念したので、アップロードも問答無用としたい。
調べました。
https://www.experts-exchange.com/questions/21043473/Automating-Internet-Explorer-to-upload-files-with-VC.html ★
HTMLとしてブラウザ上に表示されているformを操作するような感じなのかな?
まずは、キープ。
http://frog.raindrop.jp/knowledge/archives/000287.html
MFCを使う方法の説明。MFCかー。
http://programing-memo.blogspot.com/2011/05/ccgi.html
サーバ側の処理をC++で・・・みたいなので違います。
http://sdlabo.org/index.php?C%E8%A8%80%E8%AA%9E%E3%81%A7POST%E3%81%97%E3%81%A6%E3%83%90%E3%82%A4%E3%83%8A%E3%83%AA%E3%83%87%E3%83%BC%E3%82%BF%E3%82%92%E3%82%A2%E3%83%83%E3%83%97%E3%83%AD%E3%83%BC%E3%83%89 ★
WinSockを使う方法かと思います。シンプルで分かりやすい。
これもキープ。
https://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=34969&forum=7 ▼
VBのWebClient.UploadFileをVCでやりたいけど、上手くいかないとのQ。
Aがない。
でも、WebClientってこれまでも出てきた気がする。
これしか、ないのか?
と、ここで「cURL」というワードが登場。
https://teratail.com/questions/100418
https://curl.haxx.se/libcurl/c/example.html
https://curl.haxx.se/download.html
wikiで説明を読むと、なんか自由に使ってよさげなフリーのライブラリらしく、Windows版もある。
使用方法を説明するサンプルコードもあって、見ると至ってシンプルだ。
ダウンロードもアップロードもある。
ぐっと来てますが、
あれもこれもを追加すると、今はいいけど先々の継続性に不安を抱えることになるわけで。
MS社提供環境に絞って仕方なく使っているのも、いくらかでもOS/VSのバージョンアップ時の「互換」を期待してのこと。
・・・もうちょっと調べよう。
これまで使ってきたヘッダやライブラリをベースにファイルのアップロードについて語っているところを探すために「COM」「IWebBrowser2」とかのキーワードをプラスして探しましたがなかなか、さるが理解できそうなところに当たらない。
飽きちゃって、ぼやっと検索されたサイトを見てたら、
あれ?「Wininet」ってあるのね。
要はブラウザじゃない、URLアクセスですよね。
なんだよ、ちゃんとあるんだね。
ダウンロードのサンプルはすぐ見つかりました。
https://blog.systemjp.net/entry/2016/08/10/110128
http://yamatyuu.net/computer/program/sdk/wininet/wgetbin/index.html
アップも?・・・ありました。
https://code.i-harness.com/ja-jp/q/7309e
https://stackoverflow.com/questions/10097216/c-wininet-file-upload-with-http-post
https://www.dinop.com/vc/wininet_post.html
またもや方針転換です。
URLDownLoad()を使うのは止めて、Wininet APIを使います。
まあともかく、動かせそうなレベルまでコードを書きました。(ほぼパクリですけどね。)
じゃあ、動かして見ましょー・・・
VS2017-はじめの1/10歩(16):HTTPでファイルを送受信する(1)
プログラミング [2019/09/13]
VS2017を使うんだけど慣れてないからVS6でまずは作ってました。
さらに、言わばWin32アプリです。
両方の環境(クロス環境)でコンパイルできるソースとして書いてます。
これまでの書き込みも含めると、
→ナレーション再生と音声認識を使う
→そのため音声データの作り方(多言語対応)
→ナレーション(.WAV)再生のサンプルコード
→音声認識のサンプルコード
→VS6で作ったC/C++コードをVS2017に持って行って.cppレベルで共通にする方法
→ダイアログベースのプログラム
→背景に画像(.BMP)を使う
→ラベルを透かす
→ボタンの色を変える
→Windowsタブレット上でピンチイン/アウト:拡大縮小
→タブレット画面の回転への対応
→カスタムなチェックボックス作成
→ボタンに画像を貼付ける
→スクロールとスワイプ
→HTTPでファイルを送受信する
→手法1:ブラウザ使って←今回
→手法2:Wininetを使う
以降、試行錯誤も含めて説明しているので、きっと「何言ってるかわかんない」ことが多いかと思います。
さる用の身勝手備忘録なのでご勘弁を。
やろうとしていることを簡単に説明すると
タブレット上のアプリでサーバ側のスクリプトをキックして、DB上のデータをtsvファイルの形で受け取ること。
当然tsvファイルは暗号化済みのもの。
当初は、サーバ側スクリプト(CGI)で取り出すデータを指定してやる手順を想定した。
以前だれかが作ったHTMLを吐き出す前提スクリプトが存在していて、それを「使えるなら使おう」と考えたから。
なので、タブレット側のアプリ内でブラウザを動かす方法から調べ始めた。
◆ダイアログ上でブラウザを動かす
まずは、上記のタイトル+「VC」でググりまくって、以下の参考サイトを見つけた。
http://www.nitoyon.com/vc/tips/ie_component.htm ★1
http://www.ne.jp/asahi/hishidama/home/tech/vcpp/webbrowser.html ★2
http://www14.big.or.jp/~ken1/tech/tech17.html
https://docs.microsoft.com/ja-jp/dotnet/framework/winforms/controls/webbrowser-control-overview
上記の★サイトを参考に
1)リソース
以下はVS6で実施。
ダイアログを作成し、作ったダイアログ上で右クリックして表示されるプルダウンメニューから「ActiveXコントロ-ルの挿入」を選択し、表示されるダイログ上のリストから「Microsoft Web Browser」を選択する。
→なんか黒く塗り潰された矩形が表示されたので、多分追加できたのだろう。
サイズだけダイアログ フルフルになるように調整。
2)ソースコード
共通ヘッダファイル(.h)とかに以下を追加
WinMain()ソース(.cpp)のWinMain()内で
IEダイアログ処理ソース(.cpp)内に以下追加
IEダイアログのWM_INITDIALOGメッセージ処理で
あっさり表示されました。
「ラッキー!」とか思って、VS2017にそのコードを持っていって、実行させると、AtlAxDialogBox()でエラーで終わる。
ステップ実行で追っかけたりして、どうもコントロールのCreateWindowに問題がありそうなところまでは分かった。
VS2017のリソースエディタで、ActiveX(Microsoft Web Browser)を貼り付け直してみたが、ダメ。
OSを変えると、GUID/クラス名らしき部分の表現を変更するような例もあったので、まねっこしたが、ダメ。
一度VS6に戻って、
3)ソースコード再修正
AtlAxDialogBox()をDialogBox()に替えて
AtlAxGetControl()前で、以下を追加
AtlAxGetControl()自体は、以下に変更
VS6では、アッサリ動きました。
再度、VS2017に持って行ったら、やっぱりダメ。CreateWindow()でエラーになる。
リターンコードが、ERROR_CANNOT_FIND_WND_CLASS(1407)。
★1参考サイトに"AtlAxWin80"に変えみるとか、OSのバージョンに依存するらしいことが書かれてあったので、
"AtlAxWinXX"で、XX=70,71,80,81,100,120,170を全て試してみたけど・・全部ハズレでした。
「AtlAxWin」で検索しまくってたら
https://social.msdn.microsoft.com/Forums/en-US/88a981ea-8125-4917-a45e-87cfbc7fd1dd/createwindowatlaxwin-does-not-work-using-vs2003?forum=windowssdk★3
がひっかかった。
4)ソースコード再々修正
「ATLAXWIN_CLASS」というのがどっかに定義されてるっぽい記述。
「hwndie = CreateWindow(ATLAXWIN_CLASS,・・・」と指定したら、動いた。
なので、以下をヘッダとかに追加。
これで、VS2017でビルドしても動きます。
注意)AtlAxDialogBox()をDialogBox()に変えた影響で、最初に表示するURLをlParamで伝えられなくなったので、そこも別の方法にする必要あります。
さて、そこからが長かった。
さらに、言わばWin32アプリです。
両方の環境(クロス環境)でコンパイルできるソースとして書いてます。
これまでの書き込みも含めると、
→ナレーション再生と音声認識を使う
→そのため音声データの作り方(多言語対応)
→ナレーション(.WAV)再生のサンプルコード
→音声認識のサンプルコード
→VS6で作ったC/C++コードをVS2017に持って行って.cppレベルで共通にする方法
→ダイアログベースのプログラム
→背景に画像(.BMP)を使う
→ラベルを透かす
→ボタンの色を変える
→Windowsタブレット上でピンチイン/アウト:拡大縮小
→タブレット画面の回転への対応
→カスタムなチェックボックス作成
→ボタンに画像を貼付ける
→スクロールとスワイプ
→HTTPでファイルを送受信する
→手法1:ブラウザ使って←今回
→手法2:Wininetを使う
以降、試行錯誤も含めて説明しているので、きっと「何言ってるかわかんない」ことが多いかと思います。
さる用の身勝手備忘録なのでご勘弁を。
やろうとしていることを簡単に説明すると
タブレット上のアプリでサーバ側のスクリプトをキックして、DB上のデータをtsvファイルの形で受け取ること。
当然tsvファイルは暗号化済みのもの。
当初は、サーバ側スクリプト(CGI)で取り出すデータを指定してやる手順を想定した。
以前だれかが作ったHTMLを吐き出す前提スクリプトが存在していて、それを「使えるなら使おう」と考えたから。
なので、タブレット側のアプリ内でブラウザを動かす方法から調べ始めた。
◆ダイアログ上でブラウザを動かす
まずは、上記のタイトル+「VC」でググりまくって、以下の参考サイトを見つけた。
http://www.nitoyon.com/vc/tips/ie_component.htm ★1
http://www.ne.jp/asahi/hishidama/home/tech/vcpp/webbrowser.html ★2
http://www14.big.or.jp/~ken1/tech/tech17.html
https://docs.microsoft.com/ja-jp/dotnet/framework/winforms/controls/webbrowser-control-overview
上記の★サイトを参考に
1)リソース
以下はVS6で実施。
ダイアログを作成し、作ったダイアログ上で右クリックして表示されるプルダウンメニューから「ActiveXコントロ-ルの挿入」を選択し、表示されるダイログ上のリストから「Microsoft Web Browser」を選択する。
→なんか黒く塗り潰された矩形が表示されたので、多分追加できたのだろう。
サイズだけダイアログ フルフルになるように調整。
2)ソースコード
共通ヘッダファイル(.h)とかに以下を追加
//----------------------------------------------
//WebBrowser(ActiveX)表示用
#include <atlbase.h> //ATL基本機能用
extern CComModule _Module; //ATL利用時必須。変数名は限定らしい。
#include <atlcom.h> //ATL COM共通用(VC6.0時には明示が必要)
#include <atlhost.h> //ATLコンテナ機能サポート用
//----------------------------------------------
WinMain()ソース(.cpp)のWinMain()内で
//----------------------------------------------
//メッセージループ前に
_Module.Init(0, g_hInst); //ATLモジュールを初期化
AtlAxWinInit(); //コンテナ機能の初期化
:
//メッセージループ後で、プログラム終了前に
_Module.Term(); //ATLモジュールの終了処理
:
:
//IEダイアログを呼び出したいところで
AtlAxDialogBox(g_hInst, MAKEINTRESOURCE(IDD_IE), hDlg, (DLGPROC) DlgBrowseProc, (LPARAM) szUrl);
:
//----------------------------------------------
IEダイアログ処理ソース(.cpp)内に以下追加
//----------------------------------------------
//グローバル変数
CComModule _Module; //CComModuleの実体定義
CComQIPtr<IWebBrowser2> g_pWB2; //IWebBrowser2へのスマートポインタ
//----------------------------------------------
IEダイアログのWM_INITDIALOGメッセージ処理で
//----------------------------------------------
CComPtr<IUnknown> punkIE;
g_pWB2 = (CComPtr<IUnknown>) NULL;
//ActiveXへのI/Fを要求する
if (AtlAxGetControl(GetDlgItem(hDlg, IDC_EXPLORER1), &punkIE) == S_OK) {
g_pWB2 = punkIE;
}
if (!g_pWB2) {
//エラー処理
EndDialog(hDlg, 0);
return TRUE;
}
CComVariant vEmpty, vUrl((PTCHAR) lParam);
g_pWB2->Navigate2( &vUrl,
&vEmpty, //Flags:BrowserNavConstants列挙体で定義されている値の組合せ?
&vEmpty, //TargetFrameName:フレーム名 <a ... target="xxxx" ...>で指定するような名前
&vEmpty, //PostData:POSTで送るデータ。指定しないとGET。
&vEmpty); //Headers:追加のHTMLヘッダ
//----------------------------------------------
あっさり表示されました。
「ラッキー!」とか思って、VS2017にそのコードを持っていって、実行させると、AtlAxDialogBox()でエラーで終わる。
ステップ実行で追っかけたりして、どうもコントロールのCreateWindowに問題がありそうなところまでは分かった。
VS2017のリソースエディタで、ActiveX(Microsoft Web Browser)を貼り付け直してみたが、ダメ。
OSを変えると、GUID/クラス名らしき部分の表現を変更するような例もあったので、まねっこしたが、ダメ。
一度VS6に戻って、
3)ソースコード再修正
AtlAxDialogBox()をDialogBox()に替えて
//----------------------------------------------
//AtlAxDialogBox(g_hInst, MAKEINTRESOURCE(IDD_IE), hDlg, (DLGPROC)DlgBrowseProc, (LPARAM)szUrl);
DialogBox(g_hInst, (LPCTSTR)IDD_IE, NULL, (DLGPROC)DlgBrowseProc);
//----------------------------------------------
AtlAxGetControl()前で、以下を追加
//----------------------------------------------
RECT rect;
HWND hwndie;
GetWindowRect(hDlg, &rect);
hwndie = CreateWindow("AtlAxWin",
"Shell.Explorer.2",
WS_CHILD | WS_VISIBLE,
0, 0, rect.right-rect.left, rect.bottom-rect.top,
hDlg, (HMENU)0, g_hInst, NULL);
//----------------------------------------------
AtlAxGetControl()自体は、以下に変更
//----------------------------------------------
//if (AtlAxGetControl(GetDlgItem(hDlg, IDC_EXPLORER1), &punkIE) == S_OK) {
if (AtlAxGetControl(hwndie, &punkIE) == S_OK) {
g_pWB2 = punkIE;
}
if (!g_pWB2) {
//エラー処理
EndDialog(hDlg, 0);
return TRUE;
}
//----------------------------------------------
VS6では、アッサリ動きました。
再度、VS2017に持って行ったら、やっぱりダメ。CreateWindow()でエラーになる。
リターンコードが、ERROR_CANNOT_FIND_WND_CLASS(1407)。
★1参考サイトに"AtlAxWin80"に変えみるとか、OSのバージョンに依存するらしいことが書かれてあったので、
"AtlAxWinXX"で、XX=70,71,80,81,100,120,170を全て試してみたけど・・全部ハズレでした。
「AtlAxWin」で検索しまくってたら
https://social.msdn.microsoft.com/Forums/en-US/88a981ea-8125-4917-a45e-87cfbc7fd1dd/createwindowatlaxwin-does-not-work-using-vs2003?forum=windowssdk★3
がひっかかった。
4)ソースコード再々修正
「ATLAXWIN_CLASS」というのがどっかに定義されてるっぽい記述。
「hwndie = CreateWindow(ATLAXWIN_CLASS,・・・」と指定したら、動いた。
なので、以下をヘッダとかに追加。
//----------------------------------------------
#ifndef ATLAXWIN_CLASS
#define ATLAXWIN_CLASS "AtlAxWin"
#endif
//----------------------------------------------
これで、VS2017でビルドしても動きます。
注意)AtlAxDialogBox()をDialogBox()に変えた影響で、最初に表示するURLをlParamで伝えられなくなったので、そこも別の方法にする必要あります。
さて、そこからが長かった。
嬉し恥ずかしお百姓一年生(2):変なブロッコリーとナス
園芸 [2019/09/12]
荒らしてしまった畑を有効活用させようかと、今年から耕しはじめました。
実家の裏の段々畑と、歩いて裏山を超えて10分くらいの畑のほんの一部。
毎週日曜は、お百姓仕事の日と決めてます。
でも、そのほとんどは草刈りに明け暮れている感じ。
先々週、広い方の圃場(畑)と山林(栗林)の草刈りを終えたところ。
全体を一巡するのに、3か月くらい掛かってます。
1クールする間に2度目、3度目刈りしたところもある。
2度刈りしてないところは、既に元通りの原野状態です。
で、今回の失敗作は・・・
実家の裏の段々畑と、歩いて裏山を超えて10分くらいの畑のほんの一部。
毎週日曜は、お百姓仕事の日と決めてます。
でも、そのほとんどは草刈りに明け暮れている感じ。
先々週、広い方の圃場(畑)と山林(栗林)の草刈りを終えたところ。
全体を一巡するのに、3か月くらい掛かってます。
1クールする間に2度目、3度目刈りしたところもある。
2度刈りしてないところは、既に元通りの原野状態です。
で、今回の失敗作は・・・
嬉し恥ずかしお百姓一年生(1):エゴマ、大葉、鷹の爪
園芸 [2019/09/11]
毎年草を刈るだけの荒らしてしまった畑が結構な広さである。
今年の春に、思い立って、「何か植えよう。」
「いずれは、ブルーベリー園にしちゃおう。」
ってことで、畑仕事を始めました。
実は、家庭菜園すらやったこともないのに。
家のものに何がほしいかリクエストを取ったら、
エゴマ、大葉(シソ)、鷹の爪(唐辛子) だと。
全部、薬味じゃん。
エゴマって・・・。
韓流狂いのさる2号が、焼き肉を食べに行ったときに出てきた、エゴマの葉っぱをイタく気に入ったようで、やれとの指令。
5月に上記の3種のタネを買って、播こうと思って、物置の園芸用/種まき用の土を探したら、他のタネがポロポロ出てきた。
4~5年くらい前にさる2号が、棲家の近くの畑を借りてこざると共に家庭菜園をやってたときの余り。
エダマメ、ニンジン、オクラ、二十日大根などがあった。
「古くなって芽が出るか分からないけど、これも使ってやろう。」ってことで課題も増やして。
いざ、始めました。
で、なぜ、この記録を始めたか言うと、
ぜんぜん、上手く行っていないからです。
ともかく、やることが多いし、やったこと(ノウハウ)がないので、細かいところが全然分かんない。
先生もいないので、色んなことが???の連続・・・天気、病気、虫、獣、で雑草。
ともかく、コツコツやるしかないなってことで、
色々なことを、役に立つ立たない関係なく、少しでも技術力アップのためのメモとして、残して行こうかと思います。
今のところ、先生は・・・Webの中の情報です。
では、最初の4品の現状です。
今年の春に、思い立って、「何か植えよう。」
「いずれは、ブルーベリー園にしちゃおう。」
ってことで、畑仕事を始めました。
実は、家庭菜園すらやったこともないのに。
家のものに何がほしいかリクエストを取ったら、
エゴマ、大葉(シソ)、鷹の爪(唐辛子) だと。
全部、薬味じゃん。
エゴマって・・・。
韓流狂いのさる2号が、焼き肉を食べに行ったときに出てきた、エゴマの葉っぱをイタく気に入ったようで、やれとの指令。
5月に上記の3種のタネを買って、播こうと思って、物置の園芸用/種まき用の土を探したら、他のタネがポロポロ出てきた。
4~5年くらい前にさる2号が、棲家の近くの畑を借りてこざると共に家庭菜園をやってたときの余り。
エダマメ、ニンジン、オクラ、二十日大根などがあった。
「古くなって芽が出るか分からないけど、これも使ってやろう。」ってことで課題も増やして。
いざ、始めました。
で、なぜ、この記録を始めたか言うと、
ぜんぜん、上手く行っていないからです。
ともかく、やることが多いし、やったこと(ノウハウ)がないので、細かいところが全然分かんない。
先生もいないので、色んなことが???の連続・・・天気、病気、虫、獣、で雑草。
ともかく、コツコツやるしかないなってことで、
色々なことを、役に立つ立たない関係なく、少しでも技術力アップのためのメモとして、残して行こうかと思います。
今のところ、先生は・・・Webの中の情報です。
では、最初の4品の現状です。
VS2017-はじめの1/10歩(15):スクロールとスワイプ
プログラミング [2019/09/08]
VS2017を使うんだけど慣れてないからVS6でまずは作ってました。
さらに、言わばWin32アプリです。
両方の環境(クロス環境)でコンパイルできるソースとして書いてます。
これまでの書き込みも含めると、
→ナレーション再生と音声認識を使う
→そのため音声データの作り方(多言語対応)
→ナレーション(.WAV)再生のサンプルコード
→音声認識のサンプルコード
→VS6で作ったC/C++コードをVS2017に持って行って.cppレベルで共通にする方法
→ダイアログベースのプログラム
→背景に画像(.BMP)を使う
→ラベルを透かす
→ボタンの色を変える
→Windowsタブレット上でピンチイン/アウト:拡大縮小
→タブレット画面の回転への対応
→カスタムなチェックボックス作成
→ボタンに画像を貼付ける
→スクロールとスワイプ←今回
となってます。
今回は、さる的に毎回引っかかるスクロールの話です。
今回作ってたタブレット向けのアプリには、スクロール動作に影響のある以下の機能課題/仕様がありました。
・ダイアログの背景を単純な塗りつぶしではなく、画像を貼り付けるようにします。
・画面のサイズは、デスクトップの横方向サイズに合わせて可変です。
・ダイアログ内のレイアウト(表示項目)がデータに応じて縦方向に可変です。
・スクロールは、縦方向にのみサポートします。
・スワイプでのスクロールをサポートします。
多分、読んでもイメージしにくいかと思いますが、ともかく元のダイアログウィンドウの表示比率がコロコロ変わるので、
それに見合ったスクロール制御の処理ルーチンが必要だということです。
◆スクロール制御の基本
Windowsでは、スクロールを制御する際、まずはSCROLLINFO構造体を使ってSetScrollInfo()関数でスクロールに関連する情報をシステム側に通知します。
これをやれば、スクロールバーの操作には勝手に反応してスクロール制御をやってくれるのか?といえば、そうではない。
スクロール関連のイベント(WM_VSCROLL/WM_HSCROLL&SB_LINEDOWN/SB_LINEUP/SB_PAGEDOWN/SB_PAGEUP/SB_THUMBPOSITION/SB_THUMBTRACK)は、個別にプログラム内でScrollWindow()/SetScrollPos()/UpdateWindow()等で処理してあげないといけない。
・ScrollWindow()
:スクロール対象のウインドウの中身の移動
(無効領域(今まで見えてなかった部分)の再描画動作は含まない。)
・SetScrollPos()
:スクロールバーの表示状態の変更
・UpdateWindow()
:ウィンドウ内容の再描画を促す
(無効領域(今まで見えてなかった部分)の描画)
なんで、こんなに面倒なの?と素朴な疑問を感じるのですが、そうなってるんです。
◆ローカルなスクロール情報
上記の制御をプログラム内で分かりやすく管理しようと思って以下のような、構造体(テーブル)を使ってます。
MYSCROLLINF内にboxhという名前のメンバを用意してあります。
これは、システム側で準備しているSCROLLINFO内のnPageというメンバがあって、どこぞのサイトの説明を見ると「スライダーのサイズ」という説明があったので、それを単純に解釈して準備しました。
ただし、「サイズ」とは言うものの単位のある「サイズ」ではないということを理解できていませんでした。
実際のスライダーのサイズはコントロール側がSCROLLINFO内の他メンバとの計算で決めているようです。
なので、このboxhは(セットはしてるけど)使われてません。
もうちょっとさるの解釈を説明すると、
SCROLLINFOのnMin/nMaxは、nPosの取り得る範囲を示しています。
nPosはスライダーの位置を示します。
nPageは、nMin~nMaxの何個分を1ページと扱うかを示すもので、1ページとして見せるサイズです。
SCROLLINFOは、あくまでもスクロールバーの見せ方を指定するものであって、nMin、nMax、nPage、nPosの値に単位の概念はないと思ってください。
なので、実際のスクロールバーの稼動範囲の大きさがH(pixel)だとすれば、スライダーの実際の大きさHsはおそらく
Hs=H/((nMax-nMin+1)/nPage) だと予想します。
なので、スクロールバーのサイズを変えれば、スライダーのサイズは変わる。
バー全体に対する大きさの比率は変わらないと思ってます。(試してないので、予想です。)

前にも説明しましたが、実際のウインドウの内容のスクロールは別のAPIでpixel単位で制御しなくちゃならないので、
単位なしのSCROLLINFOと、同時に実際のpixel単位の実際の表示域で2系統の数値が出てくることになります。
それはちょっと混乱の元だと思ったので、SCROLLINFOにはどうせ単位の概念がないのだから、pixel単位の数値で指定することにしました。
それでは、処理サンプルです。
◆ウィンドウプロシジャ内の処理
※1:このブログの「VS2017-はじめの1/10歩(12):タブレット画面の回転への対応」で、RelocationControlles()という関数経由でコールする例を載せてあります。
それをご参照ください。
・ウィンドウのサイズが変更された場合(WM_SIZE発生)のSCROLLINFOの設定しなおしは、SetMyScrollInfo()関数
・スクロールバー操作等で発生するイベント(WM_VSCROLL)は、MoveMyVScroll()関数
・マウスホイール操作(WM_MOUSEWHEEL)イベントでは、WM_VSCROLLイベントを自分自身に発行するようにしています。
・g_ScEditというMYSCROLLINF型のテーブルを外部変数として確保しています。
複数のダイアログを同時制御するような場合は、ダイアログ毎にMYSCROLLINF型のテーブルを準備する必要があります。
(これも、本当はクラス化すれば、もっとスッキリするんですけど・・・。先送りです。)
WM_MOUSEWHEELイベントは、VS6の普通の状態ではサポートされていなかったようで、
以下の定義を共通ヘッダ等に入れる必要がありました。(昔から使ってたので、たぶん。)
実際の処理関数の中身は・・・
さらに、言わばWin32アプリです。
両方の環境(クロス環境)でコンパイルできるソースとして書いてます。
これまでの書き込みも含めると、
→ナレーション再生と音声認識を使う
→そのため音声データの作り方(多言語対応)
→ナレーション(.WAV)再生のサンプルコード
→音声認識のサンプルコード
→VS6で作ったC/C++コードをVS2017に持って行って.cppレベルで共通にする方法
→ダイアログベースのプログラム
→背景に画像(.BMP)を使う
→ラベルを透かす
→ボタンの色を変える
→Windowsタブレット上でピンチイン/アウト:拡大縮小
→タブレット画面の回転への対応
→カスタムなチェックボックス作成
→ボタンに画像を貼付ける
→スクロールとスワイプ←今回
となってます。
今回は、さる的に毎回引っかかるスクロールの話です。
今回作ってたタブレット向けのアプリには、スクロール動作に影響のある以下の機能課題/仕様がありました。
・ダイアログの背景を単純な塗りつぶしではなく、画像を貼り付けるようにします。
・画面のサイズは、デスクトップの横方向サイズに合わせて可変です。
・ダイアログ内のレイアウト(表示項目)がデータに応じて縦方向に可変です。
・スクロールは、縦方向にのみサポートします。
・スワイプでのスクロールをサポートします。
多分、読んでもイメージしにくいかと思いますが、ともかく元のダイアログウィンドウの表示比率がコロコロ変わるので、
それに見合ったスクロール制御の処理ルーチンが必要だということです。
◆スクロール制御の基本
Windowsでは、スクロールを制御する際、まずはSCROLLINFO構造体を使ってSetScrollInfo()関数でスクロールに関連する情報をシステム側に通知します。
これをやれば、スクロールバーの操作には勝手に反応してスクロール制御をやってくれるのか?といえば、そうではない。
スクロール関連のイベント(WM_VSCROLL/WM_HSCROLL&SB_LINEDOWN/SB_LINEUP/SB_PAGEDOWN/SB_PAGEUP/SB_THUMBPOSITION/SB_THUMBTRACK)は、個別にプログラム内でScrollWindow()/SetScrollPos()/UpdateWindow()等で処理してあげないといけない。
・ScrollWindow()
:スクロール対象のウインドウの中身の移動
(無効領域(今まで見えてなかった部分)の再描画動作は含まない。)
・SetScrollPos()
:スクロールバーの表示状態の変更
・UpdateWindow()
:ウィンドウ内容の再描画を促す
(無効領域(今まで見えてなかった部分)の描画)
なんで、こんなに面倒なの?と素朴な疑問を感じるのですが、そうなってるんです。
◆ローカルなスクロール情報
上記の制御をプログラム内で分かりやすく管理しようと思って以下のような、構造体(テーブル)を使ってます。
//----------------------------------------------
//スクロール関係
typedef struct _myscroll_inf {
INT fullh; //本来の表示の高さ
INT disph; //見えている部分の高さ
INT range; //表示されていない部分の高さ
INT pos; //現在の表示縦位置
INT dy; //移動量の単位
INT boxh; //スライダーのサイズ※実は・・・
} MYSCROLLINF, *PMYSCROLLINF;
//----------------------------------------------
MYSCROLLINF内にboxhという名前のメンバを用意してあります。
これは、システム側で準備しているSCROLLINFO内のnPageというメンバがあって、どこぞのサイトの説明を見ると「スライダーのサイズ」という説明があったので、それを単純に解釈して準備しました。
ただし、「サイズ」とは言うものの単位のある「サイズ」ではないということを理解できていませんでした。
実際のスライダーのサイズはコントロール側がSCROLLINFO内の他メンバとの計算で決めているようです。
なので、このboxhは(セットはしてるけど)使われてません。
もうちょっとさるの解釈を説明すると、
SCROLLINFOのnMin/nMaxは、nPosの取り得る範囲を示しています。
nPosはスライダーの位置を示します。
nPageは、nMin~nMaxの何個分を1ページと扱うかを示すもので、1ページとして見せるサイズです。
SCROLLINFOは、あくまでもスクロールバーの見せ方を指定するものであって、nMin、nMax、nPage、nPosの値に単位の概念はないと思ってください。
なので、実際のスクロールバーの稼動範囲の大きさがH(pixel)だとすれば、スライダーの実際の大きさHsはおそらく
Hs=H/((nMax-nMin+1)/nPage) だと予想します。
なので、スクロールバーのサイズを変えれば、スライダーのサイズは変わる。
バー全体に対する大きさの比率は変わらないと思ってます。(試してないので、予想です。)

前にも説明しましたが、実際のウインドウの内容のスクロールは別のAPIでpixel単位で制御しなくちゃならないので、
単位なしのSCROLLINFOと、同時に実際のpixel単位の実際の表示域で2系統の数値が出てくることになります。
それはちょっと混乱の元だと思ったので、SCROLLINFOにはどうせ単位の概念がないのだから、pixel単位の数値で指定することにしました。
それでは、処理サンプルです。
◆ウィンドウプロシジャ内の処理
//----------------------------------------------
case WM_INITDIALOG:
{
:
:
//ResetScrollInfo(・・・); //※1
:
return TRUE;
}
:
:
:
//****** スクロール関連
case WM_SIZE:
//lParam:上位がウィンドウの高さ
SetMyScrollInfo(hDlg, (INT) HIWORD(lParam), &g_ScEdit);
return TRUE;
case WM_VSCROLL:
//wParam:下位がスクロールタイプ、上位がスクロール位置
MoveMyVScroll(hDlg, LOWORD(wParam), HIWORD(wParam), &g_ScEdit);
return TRUE;
case WM_MOUSEWHEEL:
if ((SHORT) LOWORD(wParam) == MK_CONTROL) {
//**** ズーム処理
}
else {
//**** スクロール処理
if ((SHORT) HIWORD(wParam) > 0)
PostMessage(hDlg, WM_VSCROLL, SB_PAGEUP, 0);
else
PostMessage(hDlg, WM_VSCROLL, SB_PAGEDOWN, 0);
}
break;
:
:
:
//----------------------------------------------
※1:このブログの「VS2017-はじめの1/10歩(12):タブレット画面の回転への対応」で、RelocationControlles()という関数経由でコールする例を載せてあります。
それをご参照ください。
・ウィンドウのサイズが変更された場合(WM_SIZE発生)のSCROLLINFOの設定しなおしは、SetMyScrollInfo()関数
・スクロールバー操作等で発生するイベント(WM_VSCROLL)は、MoveMyVScroll()関数
・マウスホイール操作(WM_MOUSEWHEEL)イベントでは、WM_VSCROLLイベントを自分自身に発行するようにしています。
・g_ScEditというMYSCROLLINF型のテーブルを外部変数として確保しています。
複数のダイアログを同時制御するような場合は、ダイアログ毎にMYSCROLLINF型のテーブルを準備する必要があります。
(これも、本当はクラス化すれば、もっとスッキリするんですけど・・・。先送りです。)
WM_MOUSEWHEELイベントは、VS6の普通の状態ではサポートされていなかったようで、
以下の定義を共通ヘッダ等に入れる必要がありました。(昔から使ってたので、たぶん。)
//----------------------------------------------
//******************************************************************************
// マウスホイールサポート用(V6.0)
#ifndef _INC_WHEELMOUSE_H_
#define _INC_WHEELMOUSE_H_
#ifndef WM_MOUSEWHEEL
#include "zmouse.h"
#endif
#endif
//----------------------------------------------
実際の処理関数の中身は・・・
VS2017-はじめの1/10歩(14):ボタンに画像を貼付ける
プログラミング [2019/09/07]
VS2017を使うんだけど慣れてないからVS6でまずは作ってました。
Win32アプリとして実装した内容の備忘録です。
これまでも含めた内容は、
→ナレーション再生と音声認識を使う
→そのため音声データの作り方(多言語対応)
→ナレーション(.WAV)再生のサンプルコード
→音声認識のサンプルコード
→VS6で作ったC/C++コードをVS2017に持って行って.cppレベルで共通にする方法
→ダイアログベースのプログラム
→背景に画像(.BMP)を使う
→ラベルを透かす
→ボタンの色を変える
→Windowsタブレット上でピンチイン/アウト:拡大縮小
→タブレット画面の回転への対応
→カスタムなチェックボックス作成
→ボタンに画像を貼付ける←今回
となってます。
今回、要はアイコンをボタンにする話です。
至ってありふれた内容で、申し訳ないです。
さるの個人的備忘録が主目的なので、勘弁してやってください。m(__)m
ベースは、ボタンコントロールを使います。
まずは、ボタンを作成する際のスタイルに「オーナー描画」=BS_OWNERDRAW を指定します。
リソースエディタ上では、見た目フツーのキャプション入りのボタンコントロールです。
◆リソースの準備
まずは、アイコンを用意します。
VS2017のリソースエディタは、使えるんだか使えないだか・・・。
できなくて、追加で何かをインストールしたような気がします。(曖昧ですいません。)
現状のさるの環境では、リソースビューから追加/編集できるようになってました。
外部エディタ(ペイント)を呼び出すこともできました。
一方、VS6だとビットマップの編集が16色までしかできなくて、綺麗なアイコンを作るのは至難の業。
なので、外部のエディタ(GIMP)を使って256色のビットマップを作りました。
見た目四角じゃないボタンを作ろうとすると、最低2つ。
何かの機能のON/OFF状態を示すには、さらに1つのビットマップが必要です。
例えば、或る機能が有効(ON)なときと無効(OFF)のときの2種類の表示(ビットマップ)があって、
さらにそのときのアイコン(画像)を四角以外に見せるための・・・なんていうのかなー
謂わば「型」のビットマップを準備します。下右側のような感じ。

まずは、「型」(上の右側)で透ける(真白)の部分を決めて、ON/OFF用(左と真ん中)で「描く」部分(真黒以外)を指定してます。(たぶん)
それを、重ねて描くんです。
ビットマップを準備したら、リソースエディタ上でビットマップを定義します。
(詳細な操作方法は省略しちゃいます。すいません。)
.rc上だと以下のような行が追加されている状態になります。
※綺麗に見せるためには元のビットマップが結構重要なんだけど、
初めての方は試行錯誤してみてください。
◆ウィンドウプロシジャ内の処理
ざっくり説明すると、
ダイアログの初期化の時点で、アイコンボタンのウィンドウプロシジャを別のプロシジャに置き換えます。
置き換えられたプロシジャでは、WM_ERASEBKGND(背景描画)のときだけ「何もしない」処理に置き換えて、
その他のメッセージは、元の置換え前のプロシジャに処理させます。
コントロールの再描画が必要なときは、WM_DRAWITEMメッセージが来るので、そこで実際にビットマップを描画します。
「型」とON/OFF用のどっちか。
g_fHearingは、機能のON/OFFを示すグローバル変数です。(本来、クラス化するべきだとは思います。はい。)
描画等処理の中身は・・・
Win32アプリとして実装した内容の備忘録です。
これまでも含めた内容は、
→ナレーション再生と音声認識を使う
→そのため音声データの作り方(多言語対応)
→ナレーション(.WAV)再生のサンプルコード
→音声認識のサンプルコード
→VS6で作ったC/C++コードをVS2017に持って行って.cppレベルで共通にする方法
→ダイアログベースのプログラム
→背景に画像(.BMP)を使う
→ラベルを透かす
→ボタンの色を変える
→Windowsタブレット上でピンチイン/アウト:拡大縮小
→タブレット画面の回転への対応
→カスタムなチェックボックス作成
→ボタンに画像を貼付ける←今回
となってます。
今回、要はアイコンをボタンにする話です。
至ってありふれた内容で、申し訳ないです。
さるの個人的備忘録が主目的なので、勘弁してやってください。m(__)m
ベースは、ボタンコントロールを使います。
まずは、ボタンを作成する際のスタイルに「オーナー描画」=BS_OWNERDRAW を指定します。
リソースエディタ上では、見た目フツーのキャプション入りのボタンコントロールです。
◆リソースの準備
まずは、アイコンを用意します。
VS2017のリソースエディタは、使えるんだか使えないだか・・・。
できなくて、追加で何かをインストールしたような気がします。(曖昧ですいません。)
現状のさるの環境では、リソースビューから追加/編集できるようになってました。
外部エディタ(ペイント)を呼び出すこともできました。
一方、VS6だとビットマップの編集が16色までしかできなくて、綺麗なアイコンを作るのは至難の業。
なので、外部のエディタ(GIMP)を使って256色のビットマップを作りました。
見た目四角じゃないボタンを作ろうとすると、最低2つ。
何かの機能のON/OFF状態を示すには、さらに1つのビットマップが必要です。
例えば、或る機能が有効(ON)なときと無効(OFF)のときの2種類の表示(ビットマップ)があって、
さらにそのときのアイコン(画像)を四角以外に見せるための・・・なんていうのかなー
謂わば「型」のビットマップを準備します。下右側のような感じ。



まずは、「型」(上の右側)で透ける(真白)の部分を決めて、ON/OFF用(左と真ん中)で「描く」部分(真黒以外)を指定してます。(たぶん)
それを、重ねて描くんです。
ビットマップを準備したら、リソースエディタ上でビットマップを定義します。
(詳細な操作方法は省略しちゃいます。すいません。)
.rc上だと以下のような行が追加されている状態になります。
/////////////////////////////////////////////////////////////////////////////
//
// Bitmap
//
IDB_BMPSNDOFF BITMAP MOVEABLE PURE "mic256off.bmp"
IDB_BMPSNDON BITMAP MOVEABLE PURE "mic256on.bmp"
IDB_BMPCIRCALPH BITMAP MOVEABLE PURE "circ_alph256.bmp"
※綺麗に見せるためには元のビットマップが結構重要なんだけど、
初めての方は試行錯誤してみてください。
◆ウィンドウプロシジャ内の処理
//----------------------------------------------
case WM_INITDIALOG:
{
:
:
//アイコンボタンのプロシジャの変更
SwapBitmapButtonProc(hDlg, IDC_BTSOUND);
:
return TRUE;
}
:
:
:
//******* オーナードローボタン描画
case WM_DRAWITEM:
{
INT cid = LOWORD(wParam);
LPDRAWITEMSTRUCT podraw = (LPDRAWITEMSTRUCT) lParam;
switch (cid) {
:
:
//アイコンボタン
case IDC_BTSOUND: //g_fHearing
DrawBmpToButton(GetDlgItem(hDlg, IDC_BTSOUND), podraw->hDC, IDB_BMPSNDON, g_fHearing);
break;
:
:
}
return TRUE;
} //end WM_DRAWITEM
:
:
:
//****** ボタンクリック等
case WM_COMMAND:
switch (LOWORD(wParam)) {
:
:
:
//**** 音声入力ON/OFF
case IDC_BTSOUND:
if (!g_fHearing) {
g_fHearing = TRUE;
:
:
}
else {
g_fHearing = FALSE;
:
:
}
InvalidateRect(GetDlgItem(hDlg, LOWORD(wParam)), NULL, FALSE);
return TRUE;
:
:
:
} //end switch WM_COMMAND-lParam
break;
//----------------------------------------------
ざっくり説明すると、
ダイアログの初期化の時点で、アイコンボタンのウィンドウプロシジャを別のプロシジャに置き換えます。
置き換えられたプロシジャでは、WM_ERASEBKGND(背景描画)のときだけ「何もしない」処理に置き換えて、
その他のメッセージは、元の置換え前のプロシジャに処理させます。
コントロールの再描画が必要なときは、WM_DRAWITEMメッセージが来るので、そこで実際にビットマップを描画します。
「型」とON/OFF用のどっちか。
g_fHearingは、機能のON/OFFを示すグローバル変数です。(本来、クラス化するべきだとは思います。はい。)
描画等処理の中身は・・・
VS2017-はじめの1/10歩(13):カスタムなチェックボックス作成
プログラミング [2019/09/06]VS2017を使うんだけど慣れてないからVS6でまずは作ってました。
タブレットで使うので、それっぽいGUIをちょっとだけ目指してます。
これまでの、この備忘録の内容は、
→ナレーション再生と音声認識を使う
→そのため音声データの作り方(多言語対応)
→ナレーション(.WAV)再生のサンプルコード
→音声認識のサンプルコード
→VS6で作ったC/C++コードをVS2017に持って行って.cppレベルで共通にする方法
→ダイアログベースのプログラム
→背景に画像(.BMP)を使う
→ラベルを透かす
→ボタンの色を変える
→Windowsタブレット上でピンチイン/アウト:拡大縮小
→タブレット画面の回転への対応
→カスタムなチェックボックス作成←今回
前回、タブレット画面の回転動作に対応するためのコントロール類の拡縮の処理例を書きましたが、それでは、うまくいかないコントロールがありました。
ラジオボタンとチェックボックスです。(他にもあると思いますが、代表的なものという意味です。)
上記の2つは、ボタンコントロールの一種で、OwnerDrawができないものなんだそうです。
つまり、フォントやコントロールのサイズ、あるいはそれなりのサイズ指定の属性を持っていれば、前回の説明の類似で済むのですが、そうはいきませんでした。
※Win32 SDKの範囲内だけの話なのかもしれません。その辺をカスタマイズできるクラスとかがどっかにあるのかも。
ともかく、そうなると自分で描画するコントロールを作らないといけません。
そもそもがBUTTONコントロールの発展形みたいなものなので、ベースの動きはBUTTONクラスを利用して、足りない動き/描画の部分を個別に実装します。
幸い、ラジオボタンは利用してなかったので、サンプルはチェックボックスだけになります。
まずは、ボタンを作成する際のスタイルに「オーナー描画」=BS_OWNERDRAW を指定します。
リソースエディタ上では、見た目フツーのキャプション入りのボタンコントロールです。
◆ウィンドウプロシジャ内の処理
//----------------------------------------------
case WM_INITDIALOG:
{
:
:
//オーナードロー・ボタンのステート初期化
//切り替えは、WM_COMMANDで実施
g_fChkOpen = FALSE;
g_fChkPrint = FALSE;
:
return TRUE;
}
:
:
:
//******* オーナードローボタン描画
case WM_DRAWITEM:
{
INT cid = LOWORD(wParam);
LPDRAWITEMSTRUCT podraw = (LPDRAWITEMSTRUCT) lParam;
switch (cid) {
:
:
//チェックボックス風ボタン
//※※checkboxは文字サイズを大きくしても、ボックスの大きさが変わらない。
//かつ、BS_OWNERDRAWスタイルは、他のcheckbox、radiobuttonスタイルとは排他。
//よって、checkboxスタイルのままでオーナードローは不可。
//通常のbutton+オーナードローとし、ステートはフラグで保持する。
case IDC_CHOPEN: //g_fChkOpen
DrawCheckBoxCtrl(hDlg, podraw, g_fChkOpen);
break;
case IDC_CHPRINT: //g_fChkPrint
DrawCheckBoxCtrl(hDlg, podraw, g_fChkPrint);
break;
:
:
}
return TRUE;
} //end WM_DRAWITEM
:
:
:
//****** ボタンクリック等
case WM_COMMAND:
switch (LOWORD(wParam)) {
:
:
:
//**** チェック・ボックス風ボタン
case IDC_CHOPEN:
if (!g_fChkOpen) g_fChkOpen = TRUE;
else g_fChkOpen = FALSE;
InvalidateRect(GetDlgItem(hDlg, LOWORD(wParam)), NULL, FALSE);
return TRUE;
case IDC_CHPRINT:
if (!g_fChkPrint) g_fChkPrint = TRUE;
else g_fChkPrint = FALSE;
InvalidateRect(GetDlgItem(hDlg, LOWORD(wParam)), NULL, FALSE);
return TRUE;
:
:
:
} //end switch WM_COMMAND-lParam
break;
//----------------------------------------------
コアな描画処理は・・・
VS2017-はじめの1/10歩(12):タブレット画面の回転への対応
プログラミング [2019/09/05]
だいぶ間が空いてしまいましたが、ポツポツながら再開します。
VS2017を使うんだけど慣れてないからVS6でまずは作ってました。
→ナレーション再生と音声認識を使う
→そのため音声データの作り方(多言語対応)
→ナレーション(.WAV)再生のサンプルコード
→音声認識のサンプルコード
→VS6で作ったC/C++コードをVS2017に持って行って.cppレベルで共通にする方法
→ダイアログベースのプログラム
→背景に画像(.BMP)を使う
→ラベルを透かす
→ボタンの色を変える
→Windowsタブレット上でピンチイン/アウト:拡大縮小
→タブレット画面の回転への対応←今回
前回、ピンチイン/アウトによるウィンドウ内容の拡大/縮小は、プログラム内に処理を入れるまでもなく、フリーのユティリティを追加インストールして間に合わすことにしました。
もう一つタブレットらしい機能として、タブレットの向きを重力方向に対して、縦横回転させると画面の内容もそれに合わせて回転する機能があります。
作成するアプリが、「縦横回転してもウィンドウを移動すりゃいい」くらいのサイズなら何も気にする必要はないい話。
でも、PCとは言ってもタブレットの画面サイズは小さい。老眼の出始めたさるくらいになると、タブレットの小さい文字は辛い。
なので、大きい文字にしたい。
そこで、考えたデザインの方針は、
・ダイアログは、普通のシステムデフォルトの文字サイズで作って、ダイアログ内のコントロール/文字の配置をデザインする。
内容に可変部分がなければ、リソースエディタで作って済ますということ。
・表示内容の多い少ないはどうしても出てくるので、基本的にウィンドウ内の配置は内容に応じて縦に伸ばす。
・画面の方向が縦長/横長関わらず、横方向に合わせたフルサイズに拡大して、文字も拡大比率に合わせて大きくする。
・横フルサイズ表示、縦スクロール可能、ウィンドウの移動は不要とする。
結局、ピンチイン/アウト操作での拡縮は止めましたが、画面のサイズに応じての拡大縮小を実装することにしました。
まずは、基本的に画面配置の回転は誰がやってるのか?
→当然ですが、Windowsでした。
回転したときに、ウィンドウ(アプリ)側に何かイベントが来る?
→WM_DISPLAYCHANGEメッセージが来るらしい。
ということなので、ディスクトップサイズに合わせたアプリのウィンドウサイズ変更は、WM_INITDIALOGとWM_DISPLAYCHANGEのときにやればよい
ということになります。
※このあと、スクロール/スワイプで結構手間が掛かってますが、その詳細はまた別途説明するとして。
以下のようなコードでやりました。
◆ウィンドウプロシジャ内の処理
実効の処理は・・・
VS2017を使うんだけど慣れてないからVS6でまずは作ってました。
→ナレーション再生と音声認識を使う
→そのため音声データの作り方(多言語対応)
→ナレーション(.WAV)再生のサンプルコード
→音声認識のサンプルコード
→VS6で作ったC/C++コードをVS2017に持って行って.cppレベルで共通にする方法
→ダイアログベースのプログラム
→背景に画像(.BMP)を使う
→ラベルを透かす
→ボタンの色を変える
→Windowsタブレット上でピンチイン/アウト:拡大縮小
→タブレット画面の回転への対応←今回
前回、ピンチイン/アウトによるウィンドウ内容の拡大/縮小は、プログラム内に処理を入れるまでもなく、フリーのユティリティを追加インストールして間に合わすことにしました。
もう一つタブレットらしい機能として、タブレットの向きを重力方向に対して、縦横回転させると画面の内容もそれに合わせて回転する機能があります。
作成するアプリが、「縦横回転してもウィンドウを移動すりゃいい」くらいのサイズなら何も気にする必要はないい話。
でも、PCとは言ってもタブレットの画面サイズは小さい。老眼の出始めたさるくらいになると、タブレットの小さい文字は辛い。
なので、大きい文字にしたい。
そこで、考えたデザインの方針は、
・ダイアログは、普通のシステムデフォルトの文字サイズで作って、ダイアログ内のコントロール/文字の配置をデザインする。
内容に可変部分がなければ、リソースエディタで作って済ますということ。
・表示内容の多い少ないはどうしても出てくるので、基本的にウィンドウ内の配置は内容に応じて縦に伸ばす。
・画面の方向が縦長/横長関わらず、横方向に合わせたフルサイズに拡大して、文字も拡大比率に合わせて大きくする。
・横フルサイズ表示、縦スクロール可能、ウィンドウの移動は不要とする。
結局、ピンチイン/アウト操作での拡縮は止めましたが、画面のサイズに応じての拡大縮小を実装することにしました。
まずは、基本的に画面配置の回転は誰がやってるのか?
→当然ですが、Windowsでした。
回転したときに、ウィンドウ(アプリ)側に何かイベントが来る?
→WM_DISPLAYCHANGEメッセージが来るらしい。
ということなので、ディスクトップサイズに合わせたアプリのウィンドウサイズ変更は、WM_INITDIALOGとWM_DISPLAYCHANGEのときにやればよい
ということになります。
※このあと、スクロール/スワイプで結構手間が掛かってますが、その詳細はまた別途説明するとして。
以下のようなコードでやりました。
◆ウィンドウプロシジャ内の処理
//----------------------------------------------
case WM_INITDIALOG:
{
:
//可変のコントロール作成、リスト/コンボの内容設定など
:
//スクリーンサイズに合わせて、各コントロールの位置/サイズ/フォントの変更
//※可変項目が全部整ってからやる。
RelocationControlles(hDlg, RELO_INIT,
GetSystemMetrics(SM_CXSCREEN), GetSystemMetrics(SM_CYSCREEN),
&g_hFntEmpEdit, &g_ScEdit);
:
//その他、ウィンドウレイアウトに関係ない初期化
:
return TRUE;
}
case WM_DESTROY:
:
//拡大時フォントオブジェクトの廃棄
if (g_hFntEmpEdit != NULL) {
DeleteObject(g_hFntEmpEdit);
g_hFntEmpEdit = NULL;
}
:
break;
:
:
:
//******* 解像度変更(回転)時処理
case WM_DISPLAYCHANGE:
{
INT scrn_w = LOWORD(lParam);
INT scrn_h = HIWORD(lParam);
RelocationControlles(hDlg, RELO_REIN, scrn_w, scrn_h, &g_hFntEmpEdit, &g_ScEdit);
InvalidateRect(hDlg, NULL, FALSE);
break;
}
//----------------------------------------------
実効の処理は・・・