Hatena::Groupnadesiko

雪乃☆雫のなでしこ日和

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