Hatena::Groupnadesiko

雪乃☆雫のなでしこ日和

2016-12-26

フォント名、フォントサイズ、フォントスタイルを一括で指定するよ!

| 07:50

 通常時は、人様のお役に立つことなんか一切考えずに、ムシロ人様のめーわくも省みずに一人で勝手にバカバカしく大騒ぎを繰り広げ、それを書き散らしているわけですが・・・

 たまには、少しは世の人のためになるかもしないよーなTipsなどを書いてみようと思う。


 以前、「文字書体」命令で、フォントスタイルの指定も出来る事を知ったときには、世紀の大発見をしたような気になったもんでした;

https://nadesiko.g.hatena.ne.jp/snowdrops89/20090524/1243170894

 当時の記事は読み返すと、バカだな自分;;;って感じですが(んなに変わってない!)


 しかし、この機能は、もなお、あんまり周知されてないみたいなんですよね。

 なにしろ、マニュアルの命令一覧なんかを見ても、用例どころか、フォント名の事しか書かれてないんです。なんでだ。


 「文字書体」は、実はフォント名だけではなく、「|」で区切って、

文字書体は「フォント名|フォントサイズ|フォントスタイル」

 のように、三ついっぺんに設定できるんですよね~。

 ワタシのプログラムコードの中では多用してるんだけど、これは広めていきたい便利機能なので、単独の記事としてUPしてみるるる~。

 こんな感じ。

文字書体は「MS 明朝|20|太字」
「いろはにほへと」を表示

 カンタンですね♪

・フォント名は一応省略可能で、省略すれば、それまでのフォント名が引き継がれます。

・フォントサイズは、「文字サイズ」命令と同様の機能ですが、ここを変更しても、「文字サイズ」の値は変わらないので、もし文字サイズの値を参照してなんかかんかしようとしてる場合は注意が必要です。

 ここの値だけは、省略すると何故かそれまでのサイズが引き継がれず、標準(10)に戻ってしまうのも要注意です。

 さらに、この形式で文字書体を設定した場合、たとえここを省略しても、以降の「文字サイズ」命令が無視されてしまいます。(りゃー、これでいっぺんに設定出来るんだから、もはや文字サイズ命令はいないくらいなもんだけど、これってやっぱりバグと言って過言じゃないんじゃないかと思う今日この頃; でも、マニュアルに記載されてない機能だから、考慮されてないのかな?

※うぇいく様に教えを頂き、これは、フォントを実際に使うときに値を参照し設定するようになっているためである事が分かりました(コメント欄参照)

 いや~、マニュアルにの辺りの優先順位などの記載があれば、いうモノと思って使うので問題なかったのですが・・・最初に文字書体で全部設定した後、後の方で文字サイズだけ変えようと思ったら反映されなくて延々はまった事が!><

 基本的には、「文字書体」でスタイルやサイズの指定を行う場合は、「文字サイズ」は使わない方が良いようです。

・フォントスタイルに設定できるのは、「太字」「斜体」「下」「打消」の4種類で、「太字斜体」みたいに複数指定できます。(ワタシは続けて書いていましたが、この単語が入ってさえいればOKで、どんな区切り文字も使えるそうです!)

 省略するとそれまでのスタイルが引き継がれます。

 上記四種類の単語がいっこも入ってない文字列は全て、標準に戻るようなんですが、意図的に戻す場合はやっぱり無難に「標準」とでもしておくのがイイと思います。(では省略扱いになり、それまでのスタイルが引き継がれるので、標準に戻りません)


 ・・・とりあえず、こんなところ?

うぇいくうぇいく2016/12/28 01:33これは、「文字なんとか」に値を設定した時ではなく、それを使おうとしたときにそれぞれの変数の内容を参照して使うフォントを決定しているためで、「変数を設定した順序」によらず、値の組み合わせが同じならば、同じ結果になるというメリット(動作の明確さ)もあります。
その、実際にフォントを参照するときの処理順序は、以下です。
・文字書体のフォント名
・文字サイズのサイズ
・文字書体のサイズ(欄があれば。空欄は10)
・文字書体のスタイル(欄があれば。)
そうしないと、サイズは常に文字サイズの設定で上書きされてしまい、フォント名へのサイズ指定が有効にならないので、難しいところですね。
(文字スタイルの変数が無いのはなぜなんだろう)

スタイルについては、欄がある場合、標準の状態を基準に、それぞれの単語が含まれていたら、含まれている単語の属性を付加して組み合わせてゆく という動作をするため、どの単語もない=基準の標準のまま という感じになります。

雪乃☆雫雪乃☆雫2017/01/03 16:36あけましておめでとうございます。
いつもありがとううございます☆
なるほど~、使うときに参照しているから、順番は関係なかったんですね(.. )ψメモメモ
なんでこんなことがおこるのか、ようく分かりました!
この情報も広めていきたいですね!!

トラックバック - http://nadesiko.g.hatena.ne.jp/snowdrops89/20161226

2016-12-11

フェードアウトも出来たっぽい~

| 19:07

 うぇいくさまに教えを頂き、取りあえずここをのぞいてみたところ・・・

https://msdn.microsoft.com/ja-jp/library/windows/desktop/ms632669(v=vs.85).aspx

 なんてこった。どこで調べたらいいか分からんと言っていた、オプションの値の数値が、ふつーにちゃんと書いてあるじゃん!

 して、ぐーぐる翻訳さまの力を借りて内容を確認してみると・・・

値の意味

AW_ACTIVATE
0x00020000
ウィンドウをアクティブにします。 AW_HIDEでこの値を使用しないでください。

AW_BLEND
0x00080000
フェード効果を使用します。このフラグは、hwndがトップレベルのウィンドウである場合にのみ使用できます。

AW_CENTER
0x00000010
AW_HIDEが使用されている場合はウィンドウを内側に折りたたんで表示し、AW_HIDEを使用しない場合は外側に展開するようにします。さまざまな方向フラグは効果がありません。

AW_HIDE
0x00010000
ウィンドウを隠す。デフォルトでは、ウィンドウが表示されます。

AW_HOR_POSITIVE
0x00000001
ウィンドウを左から右にアニメーション表示します。このフラグは、ロールアニメーションまたはスライドアニメーションで使用できます。 AW_CENTERまたはAW_BLENDとともに使用すると無視されます。

AW_HOR_NEGATIVE
0x00000002
ウィンドウを右から左にアニメーション表示します。このフラグは、ロールアニメーションまたはスライドアニメーションで使用できます。 AW_CENTERまたはAW_BLENDとともに使用すると無視されます。

AW_SLIDE
0x00040000
スライドアニメーションを使用します。デフォルトでは、ロールアニメーションが使用されます。このフラグは、AW_CENTERとともに使用する場合は無視されます。

AW_VER_POSITIVE
0x00000004
ウィンドウを上から下にアニメーション表示します。このフラグは、ロールアニメーションまたはスライドアニメーションで使用できます。 AW_CENTERまたはAW_BLENDとともに使用すると無視されます。

AW_VER_NEGATIVE
0x00000008
ウィンドウを下から上にアニメーション表示します。このフラグは、ロールアニメーションまたはスライドアニメーションで使用できます。 AW_CENTERまたはAW_BLENDとともに使用すると無視されます。

 こんな感じ。

 あれれ~? AW_BLENDの所、別にAW_HIDE フラグと同時にセットするなとは書いてない~。

 して、代わりに「hwndがトップレベルのウィンドウである場合にのみ使用できます」と書いてるるる。要するに、親ウィンドウにしか使えない的な?

 ってことは、フェードが使えるのはメインのフォームのみで、ボタンなどには使えなさそう

 試してみると、確かに、ボタンのロールイン、スライドインは出来ましたが、フェードインは利かず、パッと現れます。

 んなコト日本語のページには書いてなかったよ!

 ……というわけで、やっぱりこっちの情報が正しそう

 それなら!というわけで、恐る恐る窓フェードアウトも作ってみた。(やるなと言われたら、素直にやらない、ビビリなのです;)

 ちなみに前の窓フェードインは、アクティブにするのを忘れていたので、オプションを追加した。

#-----------------------------------------------------------
●窓フェードイン({グループ=?}OBJを{整数=500}Timeで)
  ハンドルはOBJ→ハンドル。
  AniWin(ハンドル,Time,$80000||$20000)
  OBJ→可視はオン。

●窓フェードアウト({グループ=?}OBJを{整数=500}Timeで)
  ハンドルはOBJ→ハンドル。
  AniWin(ハンドル,Time,$80000||$10000)
  OBJ→可視はオフ。
#-----------------------------------------------------------
●窓アニメーション({グループ=?}OBJ,Time,A,OffOn,Slide)
  もし、(A=「左から右」)ならば、Flag=$1
  違えばもし、(A=「右から左」)ならば、Flag=$2
  違えばもし、(A=「上から下」)ならば、Flag=$4
  違えばもし、(A=「下から上」)ならば、Flag=$8
  違えばもし、(A=「中央」)ならば、Flag=$10
  違えばもし、(A=「左上から右下」)ならば、Flag=$1||4
  違えばもし、(A=「右上から左下」)ならば、Flag=$2||4
  違えばもし、(A=「左下から右上」)ならば、Flag=$1||$8
  違えばもし、(A=「右下から左上」)ならば、Flag=$2||$8
  違えば、Flag=$1
  もし、OffOn=オフならば、Flag=Flag||$10000
  違えば、Flag=Flag||$20000
  もし、Slide=オンならば、Flag=Flag||$40000

  ハンドルはOBJ→ハンドル。
  AniWin(ハンドル,Time,Flag)
  OBJ→可視はオン。
#-----------------------------------------------------------
●AniWin(hwnd,dwTime,dwFlags) =DLL("user32.dll",
"BOOL AnimateWindow(
  HWND hwnd,     // アニメーション化するウィンドウのハンドル
  DWORD dwTime,  // アニメーションの時
  DWORD dwFlags  // アニメーションの種類
)")
#-----------------------------------------------------------
#以下はテスト
!母艦設計=『母艦の可視はオフ』

0.5秒待つ
文字サイズは25

母艦白色画面クリア基本Xは10。基本Yは10。
『フェードイン・アウトの実験』と表示母艦を1000で窓フェードイン。
2秒待つ母艦を1000で窓フェードアウト。
2秒待つ終わる。
#-----------------------------------------------------------

 とりあえず、できた~♪

 ・・・のですが、母艦ボタンなどの部品が乗ってた場合、ボタンなどはフェードせず、母艦表示されてからパッと出てくるみたい。(フェードアウトの時は、母艦と一緒にじわじわ消えてく)

 これはおらく仕様で、しょうが無いんだろうと思う。

 それはまあいいんだけど、母艦を(どの方法ででも)アウトした後、再びフェードインすると、ボタンが消えたまま出てこないんだよね~。(ロールやスライドでは無問題)

 なんでだ;

chocochoco2016/12/11 22:13WindowsAPIを調べるのは大変ですが、ぜひ頑張ってください。
私も今、Windows終了時に更新プログラムを入れて終了させる所で唸ってます(

気が付いたら、もうクリスマスがあって、新年ですねぇ。
来年もよろしくお願いします!

雪乃☆雫雪乃☆雫2016/12/12 17:30choco さま、コメントありがとうございます☆
なんかもう一年があっという間ですね~><
しかし、今年は、みなさまのお影で急に賢くなった一年でした♪
来年もよろしくお願いします~!!

トラックバック - http://nadesiko.g.hatena.ne.jp/snowdrops89/20161211

2016-12-09

WindowsAPI・・・!!

| 14:36

 ちょこっと現実逃避のつもりで、軽いノリで着手したスクリーンセーバーでしたが、WindowsAPIを使ってなんだかんだしなきゃないいう、予想外に手強いシロモノでした;

 しかも、久々に熱中して毎日更新して、なんか疲れた(^▽^;

 がっ、の結果、WindowsAPIなんてムリ~・・・っと思っていたワタシですが、色々とひらめいてきましたよ~!

 だいぶ、賢くなったんじゃないですか?

 必要は、ひらめきの母!!(なんか違;)

 とっ、とにかく、なんか自分で出来そうな気がしてきた!


 ・・・さて、んな中、発見したのがAnimateWindowって関数

 これは、文字通りウィンドウをアニメーション効果付きで出したり消したり出来るというヤツです。

 なにかの役に立つのかといえばそうでも無いケド、見た目ちょっと面白いとゆう、バカバカしいモノが大好きなワタシに最適じゃないですか?w

 こーいった無駄な小技を利かせると、ゲームっぽさがUPするのですよ~♪

 ちょっとこれを、使えるようにしてみたいと思います。

 っていうか、エディタの左っかわの行動タブの中に、WindowsAPI利用支援とゆうのがあって、MSDNからコピペしただけで、なでしこで使える関数に変換してくれるのですよ。すばらしい☆

 ってわけで、こんだけ。

●AniWin(hwnd,dwTime,dwFlags) =DLL("user32.dll",
"BOOL AnimateWindow(
  HWND hwnd,     // アニメーション化するウィンドウのハンドル
  DWORD dwTime,  // アニメーションの時
  DWORD dwFlags  // アニメーションの種類
)")

 しか~し、本当の問題は、パラメーターの意味やらオプションの意味やら、日本語で書いてあってさえ読解不能な頭の悪さを誇るワタシなのです(ーー;

 でもまあ、これはパラメーターも3つだけだし、んなにややこやしくはないですね。

 して次なる問題は、オプションの値の実際の数値がよく分からんってコト。

 BitBltのらすたおぺれーしょん(?)とか、ShowWindowの表示状態とかもね。

 いったい何で調べるのが正解なんだろう;;;


 とりあえず実験したり、検索しまくったりした結果、アニメーションの種類はこういうことになっています。

 順番通りじゃ無いってのがまたなんともヤな感じ~w

AW_SLIDE       =$40000  #スライドアニメーションを使う。規定値はロールアニメーション。
AW_ACTIVATE    =$20000  #ウィンドウをアクティブにする。※AW_HIDEと同時不可
AW_BLEND       =$80000  #フェードイン。※AW_HIDEと同時不可
AW_HIDE        =$10000  #ウィンドウを隠す。※AW_ACTIVATEとAW_BLENDは同時不可。
AW_CENTER      =$00010  #中心から広がる。AW_HIDEの時は中心へ向けて折り畳む。
AW_HOR_POSITIVE=$00001  #左から右。
AW_HOR_NEGATIVE=$00002  #右から左。
AW_VER_POSITIVE=$00004  #上から下。
AW_VER_NEGATIVE=$00008  #下から上。

 AW_BLENDがAW_HIDEと同時にセット不可ってことは、フェードインは出来てもフェードアウトはできんとゆうことなのかね? なんでだ。


 さて、賢い方々なら、あとはこんな感じ・・・

#AnimateWindowの実験
#-----------------------------------------------------------
!母艦設計=『母艦の可視はオフ文字サイズは30
「AnimateWindowの実験」と表示。

AniWin(母艦ハンドル,500,$1)
2秒待つ。
AniWin(母艦ハンドル,200,$10001)
終わる。
#-----------------------------------------------------------
●AniWin(hwnd,dwTime,dwFlags) =DLL("user32.dll",
"BOOL AnimateWindow(
  HWND hwnd,     // アニメーション化するウィンドウのハンドル
  DWORD dwTime,  // アニメーションの時
  DWORD dwFlags  // アニメーションの種類
)")
#-----------------------------------------------------------

 ・・・でふつーに使っていけるのでしょうが、何しろワタシは、なでしこ的にラクに書けないとダメな人だから!


 とゆうわけで、ムダに行数使いまくって、こんなふうにしてみた。

#窓アニメーション
#-----------------------------------------------------------
# AnimateWindow
# ウィンドウを表示したり隠したりするとき、アニメーションを使った特殊効果を出すことができます。
# アニメーションには、ロール(巻き取り)アニメーションとスライドアニメーションの 2 種類があります。
# https://msdn.microsoft.com/ja-jp/library/cc430257.aspx
#-----------------------------------------------------------
# Aは(左から右|右から左|上から下|下から上|左上から右下|右上から左下|左下から右上|右下から左上|中央)
#-----------------------------------------------------------
●窓ロールイン({グループ=?}OBJを{整数=500}Timeで{文字列=「」}Aへ)
  窓アニメーション(OBJ,Time,A,オン,オフ)

●窓ロールアウト({グループ=?}OBJを{整数=500}Timeで{文字列=「」}Aへ)
  窓アニメーション(OBJ,Time,A,アウト,オフ)

●窓スライドイン({グループ=?}OBJを{整数=500}Timeで{文字列=「」}Aへ)
  窓アニメーション(OBJ,Time,A,オン,オン)

●窓スライドアウト({グループ=?}OBJを{整数=500}Timeで{文字列=「」}Aへ)
  窓アニメーション(OBJ,Time,A,アウト,オン)

●窓フェードイン({グループ=?}OBJを{整数=500}Timeで)
  ハンドルはOBJ→ハンドル。
  AniWin(ハンドル,Time,$80000)
  OBJ→可視はオン。
#-----------------------------------------------------------
●窓アニメーション({グループ=?}OBJ,Time,A,OffOn,Slide)
  もし、(A=「左から右」)ならば、Flag=$1
  違えばもし、(A=「右から左」)ならば、Flag=$2
  違えばもし、(A=「上から下」)ならば、Flag=$4
  違えばもし、(A=「下から上」)ならば、Flag=$8
  違えばもし、(A=「中央」)ならば、Flag=$10
  違えばもし、(A=「左上から右下」)ならば、Flag=$1||4
  違えばもし、(A=「右上から左下」)ならば、Flag=$2||4
  違えばもし、(A=「左下から右上」)ならば、Flag=$1||$8
  違えばもし、(A=「右下から左上」)ならば、Flag=$2||$8
  違えば、Flag=$1
  もし、OffOn=オフならば、Flag=Flag||$10000
  違えば、Flag=Flag||$20000
  もし、Slide=オンならば、Flag=Flag||$40000

  ハンドルはOBJ→ハンドル。
  AniWin(ハンドル,Time,Flag)
  OBJ→可視はオン。
#-----------------------------------------------------------
●AniWin(hwnd,dwTime,dwFlags) =DLL("user32.dll",
"BOOL AnimateWindow(
  HWND hwnd,     // アニメーション化するウィンドウのハンドル
  DWORD dwTime,  // アニメーションの時
  DWORD dwFlags  // アニメーションの種類
)")
#-----------------------------------------------------------
#以下はテスト

!母艦設計=『母艦の可視はオフ文字サイズは25

母艦白色画面クリア基本Xは10。基本Yは10。
『「右から左」へ窓ロールイン。
「右から左」へ窓ロールアウト。』と表示母艦を「右から左」へ窓ロールイン。
2秒待つ母艦を「右から左」へ窓ロールアウト。
2秒待つ母艦白色画面クリア基本Xは10。基本Yは10。
『「上から下」へ窓ロールイン。
「下から上」へ窓ロールアウト。』と表示母艦を「上から下」へ窓ロールイン。
2秒待つ母艦を「下から上」へ窓ロールアウト。
2秒待つ母艦白色画面クリア基本Xは10。基本Yは10。
『「左上から右下」へ窓ロールイン。
「右下から左上」へ窓ロールアウト。』と表示母艦を「左上から右下」へ窓ロールイン
2秒待つ母艦を「右下から左上」へ窓ロールアウト
2秒待つ母艦白色画面クリア基本Xは10。基本Yは10。
『「左から右」へ窓スライドイン。
「左から右」へ窓スライドアウト。』と表示母艦を「左から右」へ窓スライドイン。
2秒待つ母艦を「左から右」へ窓スライドアウト。
2秒待つ母艦白色画面クリア基本Xは10。基本Yは10。
『「中央」へ窓ロールイン。
「中央」へ窓ロールアウト。』と表示母艦を「中央」へ窓ロールイン。
2秒待つ母艦を「中央」へ窓ロールアウト。
終わる。
#-----------------------------------------------------------

 これは、母艦フォームだけじゃ無く、ボタンとか、ウィンドウハンドルを持つヤツにはみんな使えるっぽいです(ボタンしか試してないけど;)

 色々と、面白いコトができそうな予感?

うぇいくうぇいく2016/12/09 23:23msdnでの、AnimateWindowのapiの説明、日本語と英語で結構食い違っている気がします。
どうも、普通に検索すると、異なるバージョンのページにたどり着くようです。
当方がたどり着いた日本語のページでコンテンツを上位にたどるとWindows2000相当のページでした。英語の方は最新っぽい感じです。
なので、1度、英語のページで制限やエラーとなる条件を確認してみてください。
フラグの種類は一緒(9種)でした。

雪乃☆雫雪乃☆雫2016/12/11 00:47うぇいくさま、いつもありがとうございます☆
なななんと、そんなことが・・・
またまた英語ですね~(*_*)
やはり、英語からは逃れられないんですかね~(/ω\)
まいくろそふとさまが日本の企業で無い以上、致し方ないのでしょうね。
またちょっと、がんばってみます~!

トラックバック - http://nadesiko.g.hatena.ne.jp/snowdrops89/20161209