Hatena::Groupnadesiko

雪乃☆雫のなでしこ日和

2016/11/27 (日)

いちおう完成~♪

| 18:07 | いちおう完成~♪ - 雪乃☆雫のなでしこ日和 を含むブックマーク はてなブックマーク - いちおう完成~♪ - 雪乃☆雫のなでしこ日和 いちおう完成~♪ - 雪乃☆雫のなでしこ日和 のブックマークコメント

 おかげさまで、結構ちゃんとスクリーンセーバーらしく出来ました☆

 プレビュー画面は、特に動かす必要は無かったんだけど、折角だからちょこっとだけ動くようにしてみました。

 で、とりあえず、こんな感じ~。

#-----------------------------------------------------------------------
# プログラミング講座?.nako
#-----------------------------------------------------------------------

#-----母艦--------------------------------------------------
!母艦設計=「母艦の可視はオフ母艦のタイトルは「ぷろぐらみんぐ講座?」
母艦のクライアント幅はデスクトップW母艦のクライアント高さはデスクトップH母艦のスタイルは「枠なし」
母艦の位置は「0,0」
母艦デスクトップ色画面クリア。
#------------------------------------------------------------

#-----宣言--------------------------------------------------
# INI
設定ファイル名とは文字列=「{母艦パス}ぷろぐらみんぐ講座?.ini」

# 設定
ナデシコパスとは文字列=「{PROGRAMFILESパス}nadesiko_lang\」  #なでしこのインストールフォルダ
科白表示隔とは整数=5
シナリオ隔とは整数=科白表示隔。
設定読み込み。

# 色指定
透明色とは整数=$00FF00。肌色とは整数=$FFDDCC。帽子とは整数=$EECC77。ネクタイとは整数=$FF6666。眼鏡とは整数=$CCDDEE。
うさぎとは整数=$EEBBCC。青服とは整数=$77BBBB。赤服とは整数=$EE7777。黄服とは整数=$EEDD77。橙服とは整数=$FF9966。緑服とは整数=$66CC99。

キャラ設定とは配列
キャラ設定=「{ナデシコパス}doc\kouza\sensei.gif,0/0/{透明色},0/80/{透明色},89/0/{透明色},89/80/{透明色},75/85/{透明色},50/25/{肌色},60/50/{肌色},60/80/{青服},40/35/{眼鏡},70/35/{眼鏡}
{ナデシコパス}doc\kouza\seito.gif,0/0/{透明色},80/80/{透明色},50/40/{肌色},50/80/{赤服}
{ナデシコパス}doc\kouza\game\usagi.gif,0/0/{透明色},45/45/{肌色},45/80/{うさぎ},50/30/{うさぎ},15/20/{うさぎ},80/20/{うさぎ}
{ナデシコパス}doc\kouza\game\ufo.gif,0/0/{透明色},50/40/{肌色},50/80/{黄服}
{ナデシコパス}doc\kouza\stereotype\jousi.gif,0/0/{透明色},89/0/{透明色},10/30/{肌色},40/30/{肌色},77/32/{肌色},40/65/{ネクタイ},40/80/{ネクタイ},30/80/{青服},50/80/{青服}
{ナデシコパス}doc\kouza\stereotype\buka.gif,0/0/{透明色},50/40/{肌色},50/80/{橙服}
{ナデシコパス}doc\kouza\gui\toolman.gif,0/0/{透明色},50/20/{帽子},50/40/{肌色},50/80/{緑服}」をCSV取得。

# 検索項目
追加検索項目とは配列=「class="code"{~}class="menuG"{~}.gif"{~}.png"」
キャラ名とは配列。
キャラ設定で反復。
 キャラ名に(それ¥0のファイル列挙し、「.」まで切り取ったもの)を配列追加追加検索項目で反復
  キャラ名にそれ配列追加。

# シナリオ
マニュアルとは配列=「{ナデシコパス}doc\kouza\*.htm」の全ファイル列挙。
シナリオとは配列。シナリオ行数とは整数。
HTMLとは配列。HTML行数とは整数。
Dとは整数。

# マスコット
キャラNoとは整数。
mxとは整数デスクトップW/2-115。
myとは整数デスクトップH/2-100。

# 吹き出し
吹出方向とは文字列。
fxとは整数。fyとは整数。
minWとは整数=150。minHとは整数=100。   #吹出し最小幅と高さ。
cxとは整数。cyとは整数。
#-----------------------------------------------------------

#-----GUI------------------------------------------------
#---コンフィグ画面用-----
ラベル1とはラベルの可視はオフ。
Eとはエディタの可視はオフフォルダ選択ボタンとはボタンの可視はオフラベル2とはラベルの可視はオフ。
Bとはバーの可視はオフバージョンボタンとはボタンの可視はオフ。
OKボタンとはボタンの可視はオフキャンセルボタンとはボタンの可視はオフラベル3とはラベルの可視はオフ。

#---マスコット作成-----
処理用とはイメージの可視はオフ。
*キャラ作成
  キャラ設定を反復
    Cとは整数。C=回数-1
    処理用の画像はそれ¥0
    処理用を32に画像ビット数変更。
    線色は透明色。
    もし、キャラ名\C=「jousi」ならば、
      処理用の18,89へ透明色を点描画。   #上司のみ
    違えばもし、キャラ名\C=「buka」ならば、
      処理用の32,87から58,87へ。    #部下のみ
    対象反復。
      色指定とは配列。色指定=それを「/」で区切ったもの。
      x=色指定\0。y=色指定\1。指定色=色指定\2
      処理用のx,yを指定色で塗る。
    マスコット[C]をフォームとして作成。
    マスコット[C]→スタイルは「枠なし」。
    マスコット[C]→画像は「処理用」。
    マスコット[C]→画像通り変形。
    マスコット[C]→ポケットは指定色。  #ふきだしの色になる。
    マスコット[C]→ドラッグ移動オフ。
    マスコット[C]→タイトルは「マスコット{C}」  #最前面にするのに必要。
    マスコット[C]→ダブルクリックした時は~終了。

  #---吹き出し作成-----
  2
    C=回数-1
    吹出[C]をフォームとして作成。
    吹出[C]→ドラッグ移動オフ
    吹出[C]→タイトルは「吹出{C}」。
  
  #---コード表示用-----
  コードをフォームとして作成。
  コードのスタイルは「枠なし」。
  コードのタイトルは「コード」。
  コードのドラッグ移動オフ。
#-----------------------------------------------------------

//設定画面開く
//メイン
#-----メイン------------------------------------------------
*メイン
  キャラ作成
  母艦最前面。
  母艦の可視はオン。
  乱数初期化。
  メインループ。

*メインループ
  ファイル名はマニュアル¥(マニュアルの要素数乱数)
  シナリオ作成。
  マスコット表示
  シナリオ解析
  (シナリオ隔*10)
    0.1秒待つ。
  メインループ。
#-----------------------------------------------------------

#-----シナリオ作成------------------------------------------
#マニュアルのHTMLから無理矢理系で科白を取得。
*シナリオ作成
  シナリオ=。D=0。
  HTMLにファイル名を開く。HTML=HTMLの「,」を「/;/」へ置換。
  HTMLからキャラ名の画像検索。
  シナリオの要素数
    シナリオ行数=(回数-1)-D。
    もし、シナリオ¥シナリオ行数,0=「code」ならば、
      HTML行数=シナリオ\シナリオ行数,1。
    違えば、
      HTML行数=(シナリオ\シナリオ行数,1)+1。
    シナリオ\シナリオ行数,1=。
    HTMLのHTML行数から科白抜き出し。
#-----------------------------------------------------------
*画像検索({参照渡し 配列=?}HTMLからキャラの)
  C1とは整数。C2とは整数。C3とは整数。C3=0
  HTML要素数
    C1=回数-1
    キャラで反復。
      C2=回数-1。
      HTML\C1で0から対象文字検索。
      もしそれが0でなければ、
        もし対象=「class="code"」ならば、シナリオ\C3,0=「code」。
        違えばもし対象=「class="menuG"」ならば、
          シナリオ\C3,0=「code」。HTML\(C1-1)に「」を追加。
        違えばもし対象=「.gif"」または対象=「.png"」でなければ、
          シナリオ\C3,0=C2。HTML\C1=HTML\C1の「.gif」を「」に置換。
        違えば、シナリオ\C3,0=「@」。
        シナリオ\C3,1=C1。   #HTML行数。
        C3=C3+1。

*科白抜き出し({参照渡し 配列=?}HTMLの{参照渡し 整数=?}行数から)
  一時とは文字列。一時=HTML\(行数)を空白除去。
  一時をシナリオ\シナリオ行数,1に追加。
  シナリオ\シナリオ行数,1=シナリオ\シナリオ行数,1の「
」を『/~/』へ置換。   もし、シナリオ\シナリオ行数,0=「code」でなければ、  # キャラ画像の横にコードがある場合     一時で0から「class="code"」を文字検索。     もしそれが0でなければ、シナリオのシナリオ行数配列削除。D=D+1。戻る。   一時で0から「/TD」を文字検索。   もしそれが0でなければ、     シナリオ\シナリオ行数,1=シナリオ\シナリオ行数,1のタグ削除。     もし、(それ=「上司」)または(それ=「部下」)または、   # キャラ画像の下に名前がある場合     (それ=「実行ボタン」)または(それ=「実行結果」)ならば、       シナリオ\シナリオ行数,1は。       HTML行数=HTML行数+1。       HTMLの(HTML行数)から科白抜き出し。戻る。   一時で0から「/TR」を文字検索。   もしそれが0でなければ、     シナリオ\シナリオ行数,1=シナリオ\シナリオ行数,1のタグ削除。       もし、(それ)または(それ=「/~/」)ならば、         シナリオのシナリオ行数配列削除。D=D+1。戻る。  #科白が無い場合   違えば、     HTML行数=HTML行数+1。     HTMLの(HTML行数)から科白抜き出し。 #----------------------------------------------------------- #-----マスコット表示---------------------------------------- *マスコット表示   シナリオの要素数     C=(回数-1)     もし、(シナリオ\C,0=「@」)または(シナリオ\C,0=「code」)でなければ、       キャラNo=シナリオ\C,0。抜ける。   マスコット[キャラNo]→位置は「{mx},{my+(100-自身→高さ)}」   もし、キャラNo=6でなければ、マスコット[キャラNo+1]→位置は「{mx+130},{my+(100-自身→高さ)}」   マスコット浮上。 *マスコット浮上   マスコット[キャラNo]→可視はオン。   「マスコット{キャラNo}」を窓最前面。   もし、キャラNo=6でなければ、     マスコット[キャラNo+1]→可視はオン。     「マスコット{キャラNo+1}」を窓最前面。 #----------------------------------------------------------- #-----科白表示---------------------------------------------- *シナリオ解析   Cとは整数。C=0。科白=   シナリオで反復     Noは対象¥0     科白は対象¥1の「/;/」を「,」へ置換したもの。     科白は科白を「/~/」で区切ったもの。     もし、No=「code」ならば、       科白は100で行揃え。       コード表示。吹出[0]→可視はオフ。吹出[1]→可視はオフ。     違えばもし、No%2=0ならば、       吹出方向=「左上」。塗り色=マスコット[No]→ポケット       科白は科白を46で行揃え。       0の吹出表示。吹出[1]→可視はオフ。コードの可視はオフ。     違えばもし、No%2=1ならば、       吹出方向=「右上」。塗り色=マスコット[No]→ポケット       科白は科白を46で行揃え。       1の吹出表示。吹出[0]→可視はオフ。コードの可視はオフ。     違えば、       吹出方向=「左上」。塗り色=マスコット[No]→ポケット       科白は科白を46で行揃え。       0の吹出表示。吹出[1]→可視はオフ。コードの可視はオフ。     科白=。C=C+1。     (科白表示隔*10)       0.1秒待つ。   マスコット[キャラNo]→可視はオフ。コードの可視はオフ。   吹出[0]→可視はオフ。吹出[1]→可視はオフ。   もし、キャラNo=6でなければ、マスコット[キャラNo+1]→可視はオフ。 #----------------------------------------------------------- #-----吹き出し---------------------------------------------- *吹出表示({整数}Noの)   吹出[No]に科白を吹出方向へminW,minHで吹出セリフ表示。   もし、No=0ならば、     fx=mx-吹出[No]→クライアント幅。     fy=my-吹出[No]→クライアント高さ。   違えば、     fx=mx+230     fy=my-吹出[No]→クライアント高さ。   もし、fy<0ならば、      # 吹き出しの上端がデスクトップからあふれる場合     もし、吹出方向=「左上」ならば、吹出方向=「左」。fx=fx-50     違えば、吹出方向=「右」。     fy=(デスクトップH-吹出[No]→クライアント高さ)/2-50。     吹出[No]に科白を吹出方向へminW,minHで吹出セリフ表示。   吹出[No]→位置は「{fx},{fy}」   吹出[No]→ドラッグ移動オフ。   吹出[No]→可視はオン。   「吹出{No}」を窓最前面。   マスコット浮上。 *コード表示   コードの可視はオフ。   Aとは文字列=。Bとは文字列=。   科白で反復     Bはそれ。     もし(Aの文字数)<(Bの文字数)ならば、A=B。   コードの幅=Aの文字幅取得+40*2。   コードの高さ=(科白の文字高さ取得)*(科白の要素数)+10*2   cx=(デスクトップW-コードの幅)/2   cy=デスクトップH/2+5。   コードを$009900で画面クリア。   塗り色は$FFFFCC。線色は$009900。線太さは2。   コードの2,2から(コードの幅-1),(コードの高さ-1)へ四角。   コードの可視はオン。   コードの位置は「{cx},{cy}」   コードの10,10へ科白を文字表示。   「コード」を窓最前面。   マスコット浮上。 #----------------------------------------------------------- #----------------------------------------------------------------------- ●吹出セリフ表示({グループ=?}FにSを{整数=100}minW,{整数=50}minHで{文字列=「」}方向へ)   Aとは文字列=「」。Bとは文字列=「」。   Sで反復     Bはそれ。     もし(Aの文字数)<(Bの文字数)ならば、A=B。   swとは整数=Aの文字幅取得shとは整数=(Sの文字高さ取得)*(Sの要素数)   fwとは整数=(Aの文字幅取得)*1.5。fhとは整数=(Sの文字高さ取得)*(Sの要素数)*1.8   もしfw<minWならば、fw=minW。</pp>   もし、fh<minHならば、fh=minH。</pp>   sxとは整数fw/2-sw/2-10   syとは整数=fh/2-sh/2   もし、方向=ならば、方向=F→ポケット。   もし、方向=ならば、方向=左上。   もし、方向=右ならば、sx=sx+fw/10  #矢印の長さ分   もし、方向=下ならば、sy=sy+fh/10   Fをfw,fhで方向へ吹出作成。   Fのsx,syへSを文字表示。 #----------------------------------------------------------- ●吹出作成({グループ=?}FをW,Hで方向へ)   xx=0。yy=0。ww=0。hh=0。   方向で条件分岐     右上ならば、  #矢印は左下       Fのポケットは「右上」       x1=0。y1=H。x2=W/8。y2=H/4*3。x3=W/4。y3=H/8*7。     右下ならば、  #矢印は左上       Fのポケットは「右下」       x1=0。y1=0。x2=W/4。y2=H/8。x3=W/8。y3=H/4。     左上ならば、  #矢印は右下(吹出し変形と同じ)       Fのポケットは「左上」       x1=W。y1=H。x2=W/4*3。y2=H/8*7。x3=W/8*7。y3=H/4*3。     左下ならば、  #矢印は右上       Fのポケットは「左下」       x1=W。y1=0。x2=W/4*3。y2=H/8。x3=W/8*7。y3=H/4。     上ならば、  #矢印は下向き       hh=H/10。Fのポケットは「上」       x1=W/2。y1=H+hh。x2=W/2-W/20。y2=H-H/100。x3=W/2+W/20。y3=H-H/100。     下ならば、  #矢印は上向き       hh=H/10。yy=hh。Fのポケットは「下」       x1=W/2。y1=0。x2=W/2-W/20。y2=hh+H/100。x3=W/2+W/20。y3=hh+H/100。     左ならば、  #矢印は右向き       ww=W/10。Fのポケットは「左」       x1=W+ww。y1=H/2。x2=W-W/100。y2=H/2-H/20。x3=W-W/100。y3=H/2+H/20。     右ならば、  #矢印は左向き       ww=W/10。xx=ww。Fのポケットは「右」       x1=0。y1=H/2。x2=ww+W/100。y2=H/2-H/20。x3=ww+W/100。y3=H/2+H/20。   Fの可視はオフ。   FのクライアントWはW+ww。FのクライアントHはH+hh。   Fを$00FF00で画面クリア。   線スタイルは透明。   Fのxx,yyからxx+W,yy+Hへ。1秒待つ。   Fの「{x1},{y1},{x2},{y2},{x3},{y3}」へ多角形。   F→画像通り変形。 //  Fの可視はオン。 #----------------------------------------------------------------------- #-----設定画面---------------------------------------------- *設定画面作成   母艦について     スタイルは「枠固定」。     タイトルは「{母艦のタイトル}の設定」     幅は300。高さは200。     オフに最小化ボタン有効変更。     オフに最大化ボタン有効変更。     閉じた時は~終わる。   母艦ウィンドウ背景色画面クリア。   母艦最前面。   ラベル1のテキストは「なでしこのインストールフォルダ:」   ラベル2のテキストは「セリフの表示隔:」   Eについて     幅は270。テキストはナデシコパス。   フォルダ選択ボタンについて     高さはEの高さ。幅は70。Xは210。Yは58     文字書体は「MS Pゴシック|9|」。テキストは「フォルダ選択」     クリックした時は~       ナデシコパスでフォルダ選択。       もしそれでなければ、Eのテキストはそれ。   Bについて     最小値は1。最大値は10。値は科白表示隔。     位置はラベル2の右側。幅は135。   ラベル3について     テキストは「短い             長い」     位置はBの下側。幅はBの幅。     文字書体は「MS Pゴシック|8|」。     文字位置は「中央」。   バージョンボタンについて     文字書体は「MS Pゴシック|10|」。     クリックした時は~       ダイアログタイトルは「ぷろぐらみんぐ講座?」       「{二重カッコ}ぷろぐらみんぐ講座?{改行} スクリーンセーバー二重カッコ閉じ}{改行}   Version 2.00{改行}{改行}   by 雪乃☆雫」と言う。   OKボタンについて     Xは130。YはバージョンボタンのY。     クリックした時は~       ナデシコパスはEのテキスト。       科白表示隔はBの値。       設定記録。       終わる。   キャンセルボタンについて     文字書体は「MS Pゴシック|10|」。     位置はOKボタンの右側。     クリックした時は~終わる。   ラベル1の可視はオンラベル2の可視はオンラベル3の可視はオン。   Eの可視はオン。Bの可視はオンフォルダ選択ボタンの可視はオン。   OKボタンの可視はオンキャンセルボタンの可視はオンバージョンボタンの可視はオン。 *設定画面開く   設定画面作成。   母艦のXは((デスクトップW)-(母艦の幅))/2   母艦のYは((デスクトップH)-(母艦の高さ))/2   母艦の可視はオン。 #----------------------------------------------------------- *設定読み込み   もし、設定ファイル名が存在するならば     設定ファイル名のINI開いて設定に代入。     設定で「スクリーンセーバーの設定」の「なでしこパス」をINI読んでナデシコパスに代入。     設定で「スクリーンセーバーの設定」の「科白表示隔」をINI読んで科白表示隔に代入。     シナリオ隔=科白表示隔。     設定のINI閉じる。   違えば、設定記録。 *設定記録   設定ファイル名のINI開いて設定に代入。   設定で「スクリーンセーバーの設定」の「なでしこパス」にナデシコパスをINI書く。   設定で「スクリーンセーバーの設定」の「科白表示隔」に科白表示隔をINI書く。   設定のINI閉じる。 #----------------------------------------------------------- #----------------------------------------------------------------------- # スクリーンセーバーの雛形.nako #----------------------------------------------------------------------- !母艦設計=「母艦の可視はオフ」 //!「ぷろぐらみんぐ講座?.nako」を取り込む。 #別ファイルにする時はコメントを外す。 #-----テスト用---------------------------------------------- //コマンドライン¥1は「/S」。 //コマンドライン言う。 #-----宣言-------------------------------------------------- OPとは文字列。        #起動オプション。 PWHとは整数。        #プレビューウィンドウのウィンドウハンドル。 Sxとは整数。Syとは整数。Swとは整数。Shとは整数。 #「スクリーン セーバーの設定」画面の位置サイズ。 Tとはタイマーの値は10。 裏画面とはイメージの可視はオフ。 初期マウスXとは整数=-1。初期マウスYとは整数=-1。 #----------------------------------------------------------- #コマンドラインで取得した起動オプションで、動作を選択。 #----------------------------------------------------------- OP=コマンドライン¥1の2文字左部分。  #起動オプション もし、OP=「/p」または、OP=「/P」ならば、              #プレビュー(ミニ画面)   PWH=コマンドライン¥2       #プレビューウィンドウのウィンドウハンドル   プレビュー。 違えばもし、OP=「/c」または、OP=「/C」ならば、コンフィグ。    #コンフィグ(設定画面) 違えばもし、OP=「/s」または、OP=「/S」ならば、フルスクリーン。  #フルスクリーン(本体) 違えば終わる。 #----------------------------------------------------------- #----------------------------------------------------------- *プレビュー   HDCとは整数=PWHのDC取得。   #「スクリーン セーバーの設定」画面内のプレビューウィンドウ(ミニ画面)の情報を取得。   PSとは配列=PWHの窓ハンドル内サイズ取得。   #描画用のイメージにプレビューウィンドウのサイズを設定。   裏画面の幅はPS¥0,2。   裏画面の高さはPS¥0,3。   #プレビューウィンドウの表示。   処理用の画像はキャラ設定¥0,0   処理用を32に画像ビット数変更。   (キャラ設定¥0)を反復。     色指定とは配列。色指定=それを「/」で区切ったもの。     x=色指定\0。y=色指定\1。指定色=色指定\2     処理用のx,yを指定色で塗る。   処理用の透明色をデスクトップ色画像色置換。   文字色白色文字書体は「MS ゴシック|10|太字」。   x=裏画面の幅。   PWHの窓ハンドル表示状態!=オフ     もし、x+(「ぷろぐらみんぐ講座?」の文字幅取得)<0ならば、       x=裏画面の幅。     裏画面をデスクトップ色画面クリア。     「ぷろぐらみんぐ講座?」を裏画面のx,0へ文字描画。     処理用を裏画面の((裏画面の幅-処理用の幅)/2),(裏画面の高さ-処理用の高さ)へ画像コピー。     (裏画面のハンドル)をHDCへ窓ハンドル画像転送。     x=x-3     0.05秒待つ。   終わる #----------------------------------------------------------- # 指定されたウィンドウのクライアント領域または画面全体を表すディスプレイデバイスコンテキストのハンドルを取得します。 # https://msdn.microsoft.com/ja-jp/library/cc428664.aspx ●DC取得(ハンドルの)=DLL("user32.dll", "HDC GetDC( HWND hWnd // ウィンドウのハンドル )") #----------------------------------------------------------- # デバイスコンテキストを解放し、他のアプリケーションからつかえるようにします。 # https://msdn.microsoft.com/ja-jp/library/cc410542.aspx ●DC解放(hWnd,hDC)=DLL("user32.dll", "int ReleaseDC( HWND hWnd, // ウィンドウのハンドル HDC hDC // デバイスコンテキストのハンドル )") #----------------------------------------------------------- # 指定されたウィンドウの表示状態を調べ、0かそれ以外を返す。 # https://msdn.microsoft.com/ja-jp/library/cc364819.aspx ●窓ハンドル表示状態(ハンドルの)=DLL("user32.dll", "BOOL IsWindowVisible( HWND hWnd // ウィンドウのハンドル )") #----------------------------------------------------------- # ビットブロック転送を行います。 # コピー元からコピー先のデバイスコンテキストへ、 # 指定された長方形内の各ピクセルの色データをコピーします。 # https://msdn.microsoft.com/ja-jp/library/cc428944.aspxBitBlt(hdcDest,nXDest,nYDest,nWidth,nHeight,hdcSrc,nXSrc,nYSrc,dwRop)=DLL("gdi32.dll", "BOOL BitBlt( HDC hdcDest, // コピー先デバイスコンテキストのハンドル int nXDest, // コピー先長方形の左上隅の x 座標 int nYDest, // コピー先長方形の左上隅の y 座標 int nWidth, // コピー先長方形の幅 int nHeight, // コピー先長方形の高さ HDC hdcSrc, // コピー元デバイスコンテキストのハンドル int nXSrc, // コピー元長方形の左上隅の x 座標 int nYSrc, // コピー元長方形の左上隅の y 座標 DWORD dwRop // ラスタオペレーションコード )") ●窓ハンドル画像転送({整数}コピー元ハンドルを{整数}コピー先ハンドルへ)   WHとは配列コピー先ハンドルの窓ハンドル内サイズ取得。   Wとは整数WH\0,2。Hとは整数WH\0,3。   BitBlt(コピー先ハンドル,0,0,W,H,コピー元ハンドル,0,0,$00CC0020) #----------------------------------------------------------- #----------------------------------------------------------- *コンフィグ   #「スクリーン セーバーの設定」画面の情報取得。   SWHとは整数=「スクリーン セーバーの設定」の窓ハンドル検索。   SSとは配列=SWHの窓ハンドル内サイズ取得。   Sw=SS¥0,2。Sh=SS¥0,3。   Sxyとは配列=SWHの0,0を窓ハンドル画面座標計算。   Sx=Sxy¥0,0。Sy=Sxy¥0,1。 //  母艦のクライアント幅はSw。 //  母艦のクライアント高さはSh。 //  母艦の位置は「{Sx},{Sy}」。 #---------------------------------------*/   設定画面作成。   母艦のXは(Sx)+((Sw)-(母艦の幅))/2   母艦のYは(Sy)+((Sh)-(母艦の高さ))/2   母艦の可視はオン #----------------------------------------------------------- #----------------------------------------------------------- *フルスクリーン   母艦について     スタイルは「枠なし」     クライアント幅はデスクトップW。     クライアント高さはデスクトップH。     位置は「{0},{0}」。     キー押した時は~終わる。     クリックした時は~終わる。     マウス移動した時は~       もし、(初期マウスX=-1)かつ(初期マウスY=-1)ならば、         初期マウスX=母艦のマウスX。初期マウスY=母艦のマウスY。       違えば、(初期マウスX=母艦のマウスX)または       (初期マウスY=母艦のマウスY)でなければ、終わる   オフにマウスカーソル表示設定。  #マウスカーソルオフ #---------------------------------------   メイン。 #----------------------------------------------------------- # マウスカーソルを消したり出したり出来る。 # 「A」= オンorオフ # なでしこライブラリ~ http://www26.atwiki.jp/isoroku_be/pages/122.html ●マウスカーソル表示設定(Aに)=DLL("user32.dll","int ShowCursor(BOOL bShow)") #-----------------------------------------------------------

 万一、試してみようとゆう奇特な方がいたらですけど、ただコピペして実行しても動きません。

 一度実行ファイルにして、拡張子をscrにリネームして、右クリックでインストールです(Win7の場合)

 

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

2016/11/25 (金)

コンフィグも作るよ!

| 02:35 | コンフィグも作るよ! - 雪乃☆雫のなでしこ日和 を含むブックマーク はてなブックマーク - コンフィグも作るよ! - 雪乃☆雫のなでしこ日和 コンフィグも作るよ! - 雪乃☆雫のなでしこ日和 のブックマークコメント

 さてさて、本体プログラムの方は、PやCでは必要の無いキャラの作成を、Sの時だけ実行するようサブルーチンにして、さくっとスクリーンセーバー側から呼び出すようにすればOK~・・・と思ったら、思わぬ事態。

 これまで、作ったモノを実行ファイルになんかしたこと無かったから、考えたことも無かったんだけど、実行ファイルにしたら、ランタイムパスは使えないんだよね。

 いや、使えるんだけど、場所が変わってしまうとゆうか。

 いままでずっと、ランタイムパスを、なでしこのインストールフォルダのよーに扱ってきたけど、実際にはvnako.exeの場所だったわけで、実行ファイルにしたらこっから起動するわけじゃなくなるもね~。

 スクリーンセーバーとして実際に使用するためには、どうしたって実行ファイルにしなくちゃならないんで、「{PROGRAMFILESパス}nadesiko_lang\」に変更。

 インストール先のフォルダを変更していたり、ZIP解凍してのまま使っていたりすると、これじゃダメだけどね。

 ・・・というわけで、やっぱりコンフィグで、フォルダの選択が出来るようにすることにした。

 ついでに、セリフの表示隔も変えれるようにしようかねー。



 なでしこのGUIに、トラックバーないのかな?

 まあ、バーでいいけど。

 母艦のX、Yの指定は、最小化ボタンや最大化ボタンの有効変更の後に行わないと、反映されないっぽい。これは、仕様と思っておいた方がいいのかね~?

 近頃、位置の指定が上手くいかないではまるコトばっかりだぁ・・・

 あとは、iniファイルの読み書きも、なでこらでやったとうりで、特筆するようなことはナイ・・・と思っていたんだけど・・・

#-----------------------------------------------------------------------
# INI
設定ファイル名とは文字列=「{母艦パス}ぷろぐらみんぐ講座?.ini」

# 設定
ナデシコパスとは文字列=「{PROGRAMFILESパス}nadesiko_lang\」  #なでしこのインストールフォルダ
科白表示隔とは整数=5
シナリオ隔とは整数=科白表示隔。
設定読み込み。

# 色指定
透明色とは整数=$00FF00。肌色とは整数=$FFDDCC。帽子とは整数=$EECC77。ネクタイとは整数=$FF6666。眼鏡とは整数=$CCDDEE。
うさぎとは整数=$EEBBCC。青服とは整数=$77BBBB。赤服とは整数=$EE7777。黄服とは整数=$EEDD77。橙服とは整数=$FF9966。緑服とは整数=$66CC99。

キャラ設定とは配列=「{ナデシコパス}doc\kouza\sensei.gif,0/0/{透明色},0/80/{透明色},89/0/{透明色},89/80/{透明色},75/85/{透明色},50/25/{肌色},60/50/{肌色},60/80/{青服},40/35/{眼鏡},70/35/{眼鏡}
  ・
  ・中略
  ・
{ナデシコパス}doc\kouza\gui\toolman.gif,0/0/{透明色},50/20/{帽子},50/40/{肌色},50/80/{緑服}」
#-----------------------------------------------------------------------

#-----------------------------------------------------------
*設定読み込み
  もし、設定ファイル名が存在するならば
    設定ファイル名のINI開いて設定に代入。
    設定で「スクリーンセーバーの設定」の「なでしこパス」をINI読んでナデシコパスに代入。
    設定で「スクリーンセーバーの設定」の「科白表示隔」をINI読んで科白表示隔に代入。
    シナリオ隔=科白表示隔。
    設定のINI閉じる。
  違えば、設定記録。

*設定記録
  設定ファイル名のINI開いて設定に代入。
  設定で「スクリーンセーバーの設定」の「なでしこパス」にナデシコパスをINI書く。
  設定で「スクリーンセーバーの設定」の「科白表示隔」に科白表示隔をINI書く。
  設定のINI閉じる。
#-----------------------------------------------------------

 これでいけるかと思ったら、「ナデシコパス」に「設定読み込み」でiniファイルを読んだ内容が反映されない

 宣言と同時に値を与えてしまうと、プログラムが走る前に、設定されてしまうのかなあ?

 それで、試しに宣言の部分を、

#-----------------------------------------------------------
キャラ設定とは配列。
キャラ設定=「{ナデシコパス}doc\kouza\seito.gif,~~~~」
#-----------------------------------------------------------

 のようにしてみたら、無事反映されたんだけど・・・

 度はコンフィグとは全然関係ないトコで、いきなりバグりました(*_*;

 うえぇ~、なんでだ~~~・・・と思っていろいろ確認していたら、どうやら入ってる物は一見同じなのに、反復した時の「それ対象)」の中身が違うんですよ。

#-----------------------------------------------------------
Aとは配列=「A,123,いろは」
Aを言う。
Aを反復
  それ言う。
「A」の変数確認して言う。

Bとは配列
B=「B,123,いろは」
Bを言う。
Bを反復
  それ言う。
「B」の変数確認して言う。
#-----------------------------------------------------------

 変数確認してみたところ、Bの場合は、先に「配列」と宣言してあっても、代入した時点で「文字列」ってことになっちゃってる。

 して、同じように反復しても、二次配列の場合「それ」は、「,」で区切られた配列として返ってくるけど、文字列の場合は「,」も込みでふつーに文字列として返ってくるんだね。

 う~ん、までんなこととは知らなんだ;;;

 二次配列の場合だけなのかな?

 まぁ、文字列だってんなら「,」で区切って配列にしちゃえばいいだけなんだけども・・・

 何か、ワタシの代入のしかた、あるいは宣言のしかたに違いがあるのかね?

 ものすごく初歩的なことのよーな気がするけど、なんかよく分からん;

 むむむー(@_@)



 ここでもまた、思わぬコトではまって、今日もまた完成させ切れなかった・・・orz

うぇいくうぇいく2016/11/26 18:45なでしこでの変数への代入は、型の変更もふくんでるので、変数宣言時の型指定はあまり活用できません。
基本的に、正しい型に変換したものを代入するしかないです。
----
Aとは変数
# 一次元。要素n=3の配列
A=「1,2,3」を","で区切る
Aを言う
# 二次元。要素(n,m)=(5,3)の配列
A=「1,2,3,4,5
4,5,6,7,8
7,8,9,10,11
」をCSV取得
A[2]を言う
# 一次元のつもりの,区切りの文字列にCSV取得すると結果は2次元配列(n,1)になるのでちゅうい。
----
ある程度慣れてきて、プログラムでいろいろ複雑なことをやろうとし始めると、型が勝手に切り替わってそれなりに動作するより、明示した型が強制されて整合が取れないならエラーとなった方が便利になるんですけどね。

雪乃☆雫雪乃☆雫2016/11/26 23:19 うぇいくさま、またまたありがとうございます!
 なるほど、やっぱり変わってしまう物なんですね。
 intだのstrだのと怒られない代わりに、こうゆうことも起こるということですね。
 ワタシなんかにとっては、意識しなくてもそれなりに判断して動作してくれるのはとってもありがたいことではあるんですけれど、知っておかないと飛んだ落とし穴にはまりますね~><
 そう言えば以前にも、整数で宣言してても文字列になっちゃう事件があって、整数変換したのでしたが、整数変換や文字列変換やハッシュ変換まであるのに、配列変換は無いのか~?と思っていましたが、後から区切らなくても、代入時に区切ったりCSV取得しちゃえば正しく判別されて代入されるんだったんですね!(.. )ψメモメモ

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

2016/11/24 (木)

とりあえずこんな感じ?

| 22:11 | とりあえずこんな感じ? - 雪乃☆雫のなでしこ日和 を含むブックマーク はてなブックマーク - とりあえずこんな感じ? - 雪乃☆雫のなでしこ日和 とりあえずこんな感じ? - 雪乃☆雫のなでしこ日和 のブックマークコメント

 さて・・・

 とりあえず、確保やぽいんたあには目をつぶる(えっ;)

 だって、説明見ても何の例もないし、よくわかんないもねー;;;

 なにより、GetWindowRectは、プレビューウィンドウの幅と高さを得るために使っているだけっぽいので、「窓ハンドル内サイズ取得」でも良さそうだったから。

 肝心なのは、GetDCなんだろうね。でばいすこんてきすとってなんすか;;;;

 とりあえず、それを取得すると、の後、GDI 関数を使って、返されたデバイスコンテキスト内で描画を行え・・・るラシイ。

 取得したいウィンドウのハンドルを引数にすれば、ハンドルが返ってくるので、取得するだけは、カンタン。

 ReleaseDCは、取得したら最後はちゃんと解放して終了してねってだけのこったろう。

 BitBltは、ハンドルからハンドルへ画像コピーが出来る的な?

 のデバイスコンテキストとやらに直接なでしこの命令で何かを描くことは出来ないから、イメージ部品に描いて置いて、コピーするってコトだね。

 これがまた、母艦じゃダメなんだよね。イメージ部品じゃないと。

 たしか、なでしこの画像合成そうだったね。



 んなこんなで、いろいろやって、こうなった。

#-----------------------------------------------------------
*プレビュー
  HDCはPWHのDC取得。

  #「スクリーン セーバーの設定」画面内のプレビューウィンドウ(ミニ画面)の情報を取得。
  PSとは配列=PWHの窓ハンドル内サイズ取得。

  #描画用のイメージにプレビューウィンドウのサイズを設定。
  裏画面の幅はPS¥0,2。
  裏画面の高さはPS¥0,3。

  #プレビューウィンドウの表示状態が0になったら、終了させる。
  Tの時満ちた時は~
    もし、PWHの窓ハンドル表示状態がオフならば、
      DC解放(PWH,HDC)。終わる。

  #タイマーを開始
  Tを開始。

#-----------------------------------------------------------
#プレビューウィンドウに実際に表示するもの
#-----------------------------------------------------------
  裏画面をデスクトップ色画面クリア。
  「プレビュー」を裏画面の10,10へ文字表示。
  (裏画面のハンドル)をHDCへ窓ハンドル画像転送。

#-----------------------------------------------------------
# 指定されたウィンドウのクライアント領域または画面全体を表すディスプレイデバイスコンテキストのハンドルを取得します。
# https://msdn.microsoft.com/ja-jp/library/cc428664.aspx
●DC取得(ハンドルの)=DLL("user32.dll",
"HDC GetDC(
HWND hWnd // ウィンドウのハンドル
)")
#-----------------------------------------------------------
# デバイスコンテキストを解放し、他のアプリケーションからつかえるようにします。
# https://msdn.microsoft.com/ja-jp/library/cc410542.aspx
●DC解放(hWnd,hDC)=DLL("user32.dll",
"int ReleaseDC(
HWND hWnd, // ウィンドウのハンドル
HDC hDC // デバイスコンテキストのハンドル
)")
#-----------------------------------------------------------
# 指定されたウィンドウの表示状態を調べ、0かそれ以外を返す。
# https://msdn.microsoft.com/ja-jp/library/cc364819.aspx
●窓ハンドル表示状態(ハンドルの)=DLL("user32.dll",
"BOOL IsWindowVisible(
HWND hWnd // ウィンドウのハンドル
)")
#-----------------------------------------------------------
# ビットブロック転送を行います。
# コピー元からコピー先のデバイスコンテキストへ、
# 指定された長方形内の各ピクセルの色データをコピーします。
# https://msdn.microsoft.com/ja-jp/library/cc428944.aspxBitBlt(hdcDest,nXDest,nYDest,nWidth,nHeight,hdcSrc,nXSrc,nYSrc,dwRop)=DLL("gdi32.dll",
"BOOL BitBlt(
HDC hdcDest, // コピー先デバイスコンテキストのハンドル
int nXDest, // コピー先長方形の左上隅の x 座標
int nYDest, // コピー先長方形の左上隅の y 座標
int nWidth, // コピー先長方形の幅
int nHeight, // コピー先長方形の高さ
HDC hdcSrc, // コピー元デバイスコンテキストのハンドル
int nXSrc, // コピー元長方形の左上隅の x 座標
int nYSrc, // コピー元長方形の左上隅の y 座標
DWORD dwRop // ラスタオペレーションコード
)")
●窓ハンドル画像転送({整数}コピー元ハンドルを{整数}コピー先ハンドルへ)
  WHとは配列コピー先ハンドルの窓ハンドル内サイズ取得。
  Wとは整数WH\0,2。Hとは整数WH\0,3。
  BitBlt(コピー先ハンドル,0,0,W,H,コピー元ハンドル,0,0,$00CC0020)
#-----------------------------------------------------------

 本来なら、プレビューウィンドウに実際に表示するものは、スクリーンセーバー本体と同じようなのを動かしておくものだけど、は単に表示するだけのモノにしてある

 だって、もともとデスクトップマスコットにでもしてみようってんで作り始めたものだもんで、キャラもセリフもみんなフォームだしねぇ~;

 だいたい、吹き出しに文字が出るってだけで、実際の動きはほとんどないから、ミニ画面にしてしまったら何が何だか分からないもね~;;

 本来の役割だったハズの、焼き付き防止の役には全く立たない

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

2016/11/23 (水)

WindowsAPI・・・(@_@)

| 14:29 | WindowsAPI・・・(@_@) - 雪乃☆雫のなでしこ日和 を含むブックマーク はてなブックマーク - WindowsAPI・・・(@_@) - 雪乃☆雫のなでしこ日和 WindowsAPI・・・(@_@) - 雪乃☆雫のなでしこ日和 のブックマークコメント

 うぇいくさまに教えを頂いて、昨日一日、散々なんだかんだした件は、WindowsAPIを使えば、どうしたらいいのか全く閃かないから保留と言ってた件も含めて、たった一行であっさり解決。すばらしい!

 でも、昨日のワタシの一日って一体・・・しくしくしく。

#-----------------------------------------------------------
  #プレビューウィンドウの表示状態が0になったら、終了させる。
  Tの時満ちた時は~
    もし、PWHの窓ハンドル表示状態がオフならば終わる。
#-----------------------------------------------------------
# 指定されたウィンドウの表示状態を調べ、0かそれ以外を返す。
# https://msdn.microsoft.com/ja-jp/library/cc364819.aspx
●窓ハンドル表示状態(ハンドルの)=DLL("user32.dll",
"BOOL IsWindowVisible(
HWND hWnd // ウィンドウのハンドル
)")
#-----------------------------------------------------------

 やっぱり、APIってのは知るべきモノなんだね。

 しか~し、むむむ無理っすぅ。よよよ。

 お熱が出そう・・・(+_+)


 現状でも、とりあえずは当初ワタシが目指した希望の動作までは持っていけました。

 でも、実はこれまでも気付いていたけど、別に困らないんで気付かないふりしてスルーしようとしてたんだけど、現状の、プレビューウィンドウを母艦の親に設定する方法だと、ミニ画面の部分をクリックしたりすると、っちがアクティブになるもんで、「スクリーンセーバーの設定」ウィンドウのタイトルバーが灰色になっちゃう。

 他のスクリーンセーバーでは、ーゆうことは起こらない

 つまり、やっぱりこれは本来の方法じゃなかったってコトなんだよね。


 ちなみに、うぇいくさまがコメントにUPしてくださったヤツは、scrにしてインストールすると、ちゃんと赤いプレビュー画面が表示されて、してちゃんと上記のような現象にはならない

 うーん、すごいな。

 これをやっつけでコピペしても出来そう感はあるんだけど、いっこも意味わかんないままじゃ面白くないでしょ。(べつに何らかの必要に迫られて作ってるんでは無くて、どっちかっていうと作る過程が遊びなんでw)

 せめて、IsWindowVisibleくらいにまでは、何してるもんだか分からないと。

 しかしそれも、Visibleの意味を辞書で調べるところからだったのは内緒!(バカ…;)

 でも・・・API以前に、かくほ? ばいなりしゅとく? ぽいんたあ?

 なでしこの命令からして、んなのがあったことすら知らないよ!

 め・・・・

うぇいくうぇいく2016/11/24 00:20実は、Delphiで実行ファイル型のスクリーンセーバーを作る際の情報を検索して、出てきたソースのロジックをほぼそのまま使いました。
各処理ごとに、解説がついた状態でサイトに掲載されていたので、英語と点を除けば移植しやすかったです。

マイナー気味のプログラム言語で、サンプルソースや解説記事を探すコツは、「検索キーワードを英語のみにして英語サイトもヒットさせること」のようです(日本語プログラミング言語を除く)

雪乃☆雫雪乃☆雫2016/11/24 22:30 英語ばっかりのページが開いた途端、ぎゃーと言って速攻閉じちゃうような人間です~(>_<)
 翻訳ソフトってものもあるんだし、本来はそこまでアレルギー的反応をしなくったって良いようなモノなんですけれどね。
 ともかく、Releaseを調べて、「ほっほぅ~、リリースか。リリースって魚だけのことじゃないんだぁ~・・・」とか感心しているレベル;
 なので、なでしこは本当にありがたい物です☆

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

2016/11/22 (火)

昨日の課題を解決・・・?

| 02:03 | 昨日の課題を解決・・・? - 雪乃☆雫のなでしこ日和 を含むブックマーク はてなブックマーク - 昨日の課題を解決・・・? - 雪乃☆雫のなでしこ日和 昨日の課題を解決・・・? - 雪乃☆雫のなでしこ日和 のブックマークコメント

 まず、昨日、最大化させたらうまくいくって思ったんだけど、それだけじゃダメで、位置の指定も必要もしない

 しかも、なでしこの通常の命令の場合は、親を設定したら、位置の指定は親の中での座標を指定するんだったと思う(親の画面いっぱいなら0,0みたいな?)

 でも、APIの窓ハンドル親設定で、なでしこで作ったヤツじゃ無いものを親とした場合は、「窓ハンドル画面座標計算」で取得した、デスクトップ上の座標を入れないとダメなのかもしない。(たぶん)


 して、昨日保留にした件は、あんまり知恵のある方法とも思えないけど、ほかに良い方法が思いつかないので、タイマーで、定期的に「スクリーン セーバーの設定」の窓ハンドルを監視して、見つからなかったら画面が閉じたってコトなんで、終了させるようにした。

 それで、ほんとうに一応完成したかなあと思っていたんだけど、やっぱりまだでした(涙)

 コンボボックスで、他のスクリーンセーバーを選択した場合に終了ないんだよね。

 別なスクリーンセーバーのプレビュー画面は母艦より上に描画されるし、もう一度自分を選んだ時には二重起動ないようにしてあるから一見問題なく動いてる風味なんだけど、別のスクリーンセーバーから、別のスクリーンセーバーに移る瞬、ちらっと見えたり、ウィンドウズ標準の「ブランク」なんかを選んだら、堂々と表に出てきちゃう(--;

 やっぱり、次に起動する時に二重起動させないんじゃなくて、ちゃんと一終わらせないとダメなんだよね。

 「窓ハンドル内列挙」で、ハンドルの中の子ハンドルを列挙させることが出来るので、試しに「PWHの窓ハンドル内列挙」を言わせてみると、やはり子に設定した母艦のハンドルがあるんだけど、別のスクリーンセーバーの場合もやっぱり同じように、選択されてミニ画面を表示する時には、PWHの子ハンドルとして出てくるんです。

 なので、PWHの子ハンドルをタイマーで監視して、二個以上になった時には終わらせるようにしてみました。

 これで、一応は気分良くコンボボックスのスクリーンセーバーを選ぶことが出来ます。

 してこれに伴い、当初作った二重起動の防止は不要になったかに思えます。二重起動した際も、PWHの子ハンドルに自分が二つということになるので、終了するからね。

 でも・・・最初にお試しで作った時のように、「/p」オプションはスルーで終了させて、ミニ画面には何も表示させないようなスクリーンセーバーがあった場合には終了ないよね。本来ブランクになる筈のところに、このスクリーンセーバーの画面が出てしまうってだけで、他のスクリーンセーバーに移ったり、再び自分を選択した時には終了するから、んなに実害はないけど・・・

 どーしたら良いのか、全くひらめかんorz

 ・・・これは後日の課題とゆうことにして、のうちまた何か天啓が閃いたら直すこととして、取りあえずはまあいいやってことにするかな~;;;



 あと、設定画面中のミニ画面なのに、タスクバーに出てくるってのは、変だよね~?

 いや、実験中は、終了させるのには出てきてくれていた方が、便利だったんだけども;

 そう思って調べていたら、タスクバー表示させずにフォーム表示する術を、ここで発見したので、タスクバー表示させないことにしてみました。

http://nadesi.com/cgi/bug/mbbs.php?m=thread&threadid=424



 でっ、現状はこんな感じ。

#-----------------------------------------------------------
!母艦設計=「母艦の可視はオフ母艦のタイトルは「スクリーンセーバー」

#-----テスト用----------------------------------------------
//コマンドライン¥1は「/S」。
//コマンドライン言う。
#-----宣言--------------------------------------------------
OPとは文字列。        #起動オプション。
PWHとは文字列。       #プレビューウィンドウのウィンドウハンドル。
PSとは配列。         #プレビューウィンドウのサイズ。
Pxyとは配列。        #プレビューウィンドウの位置。
SWHとは文字列        #「スクリーン セーバーの設定」のウィンドウハンドル。
SSとは配列。         #「スクリーン セーバーの設定」のサイズ。
Sxyとは配列。        #「スクリーン セーバーの設定」の位置。
Tとはタイマーの値は100。
初期マウスXとは整数=-1。初期マウスYとは整数=-1。
#-----------------------------------------------------------
#コマンドラインで取得した起動オプションで、動作を選択。
#-----------------------------------------------------------
OP=コマンドライン¥1の2文字左部分。  #起動オプション
もし、OP=「/p」または、OP=「/P」ならば、              #プレビュー(ミニ画面)
  PWH=コマンドライン¥2       #プレビューウィンドウのウィンドウハンドル
  プレビュー。
違えばもし、OP=「/c」または、OP=「/C」ならば、コンフィグ。    #コンフィグ(設定画面)
違えばもし、OP=「/s」または、OP=「/S」ならば、フルスクリーン。  #フルスクリーン(本体)
違えば終わる。
#-----------------------------------------------------------

#-----------------------------------------------------------
*プレビュー
  #「スクリーン セーバーの設定」画面内のプレビューウィンドウ(ミニ画面)の情報を取得。
  PS=PWHの窓ハンドル内サイズ取得。
  Pxy=PWHの0,0を窓ハンドル画面座標計算。

  #母艦にプレビューウィンドウの位置サイズを設定し、子ウィンドウに設定。
  母艦のスタイルは「枠なし」
  母艦のクライアント幅はPS¥0,2。
  母艦のクライアント高さはPS¥0,3。
  母艦のハンドルをPWHに窓ハンドル親設定。  #プレビューウィンドウを親部品にする。
  母艦の位置は「{Pxy¥0,0},{Pxy¥0,1}」
  母艦を最大化。

  #「スクリーン セーバーの設定」画面が閉じたら、終了させる。
  SWH=「スクリーン セーバーの設定」の窓ハンドル検索。
  Tの時満ちた時は~
    窓列挙。一時=それ。
    一時の0でSWHを0から表検索。
    もしそれ=-1ならば終わる。

    #PHW内のハンドルが2つになったら、別のスクリーンセーバーが選択されたか、
    #二重起動したといういうことなので、自身終了させる。
    PWHの窓ハンドル内列挙。
    もしそれ要素数>1ならば終わる。

  #タイマーを開始
  Tを開始。
#-----------------------------------------------------------
#プレビューウィンドウに実際に表示するもの
#-----------------------------------------------------------
  母艦デスクトップ色画面クリア。
  「プレビュー」を表示。
  母艦のハンドルを1でウィンドウ表示。  #プレビュー画面はタスクバー表示ない
#-----------------------------------------------------------
# なでしこで作ったヤツじゃ無いウィンドウを親部品にしたり、子部品にしたりできる。
# なでしこライブラリ~ http://www26.atwiki.jp/isoroku_be/pages/66.html
●窓ハンドル親設定(子ハンドルを親ハンドルに)=DLL("user32.dll","DWORD SetParent(DWORD, DWORD)")
#-----------------------------------------------------------
# タスクバーには表示ないで、フォーム表示出来る。
# 「No」= 0:オフ、1:通常、2:最小化、3:最大化、4:非アクティブ
#「なでしこ」バグ要望掲示板 http://nadesi.com/cgi/bug/mbbs.php?m=thread&threadid=424
●ウィンドウ表示(ハンドルをNoで)=DLL("user32.dll","BOOL ShowWindow(HWND hWnd,int nCmdShow)")
#-----------------------------------------------------------

#-----------------------------------------------------------
*コンフィグ
  #ダイアログを「スクリーン セーバーの設定」の中央に表示させるための設定。
  #設定用のフォームを作る場合は、別途調整が必要。
  SWH=「スクリーン セーバーの設定」の窓ハンドル検索。
  SS=SWHの窓ハンドル内サイズ取得。
  Sxy=SWHの0,0を窓ハンドル画面座標計算。
  母艦のクライアント幅はSS¥0,2。
  母艦のクライアント高さはSS¥0,3。
  母艦の位置は「{Sxy¥0,0},{Sxy¥0,1}」。

  ダイアログタイトルは「バージョン情報」
  「{二重カッコ}スクリーンセーバー{改行}   ~雛形~{二重カッコ閉じ}{改行}   Version 1.00{改行}{改行}   by 雪乃☆雫」と言う。
  終わる。
#-----------------------------------------------------------------------

#-----------------------------------------------------------
*フルスクリーン
  母艦について
    スタイルは「枠なし」
    クライアント幅はデスクトップW。
    クライアント高さはデスクトップH。
    位置は「{0},{0}」。
    キー押した時は~終わる。
    クリックした時は~終わる。
    マウス移動した時は~
      もし、(初期マウスX=-1)かつ(初期マウスY=-1)ならば、
        初期マウスX=母艦のマウスX。初期マウスY=母艦のマウスY。
      違えば、(初期マウスX=母艦のマウスX)または
      (初期マウスY=母艦のマウスY)でなければ、終わる

  オフにマウスカーソル表示設定。  #マウスカーソルオフ
#-----------------------------------------------------------
#スクリーンセーバーの本体プログラム。
#-----------------------------------------------------------
  メイン
#-----------------------------------------------------------
# マウスカーソルを消したり出したり出来る。
# 「A」= オンorオフ
# なでしこライブラリ~ http://www26.atwiki.jp/isoroku_be/pages/122.html
●マウスカーソル表示設定(Aに)=DLL("user32.dll","int ShowCursor(BOOL bShow)")
#-----------------------------------------------------------

#-----スクリーンセーバーの本体------------------------------
*メイン
  母艦デスクトップ色画面クリア。
  母艦の可視はオン
#-----------------------------------------------------------

 一応なんか、それっぽく動くようになってきたとは思うんだけど・・・

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

2016/11/21 (月)

一応解決・・・なのか??

| 04:02 | 一応解決・・・なのか?? - 雪乃☆雫のなでしこ日和 を含むブックマーク はてなブックマーク - 一応解決・・・なのか?? - 雪乃☆雫のなでしこ日和 一応解決・・・なのか?? - 雪乃☆雫のなでしこ日和 のブックマークコメント

 謎は解明しないけど、とりあえず親部品設定した後に、子ウィンドウを最大化すると、上手くいくようです。

 これはもちろん、位置の指定がってことではなく、ミニ画面にぴったり合わせて母艦表示できるようになったってだけのコトです。

#-----------------------------------------------------------
#窓ハンドル親設定の実験
テストとはフォーム母艦のタイトル=「親ウィンドウ」。
テストのタイトル=「子ウィンドウ」。
母艦の幅は200。母艦の高さは200。
テストの幅は200。テストの高さは200。
テストのスタイルは「枠なし」
窓ハンドル親設定((テストのハンドル),(母艦のハンドル))。
テストのXは0。テストのYは0。    # Xの位置がずれます
//テストを最大化。
母艦の可視はオン。テストの可視はオン。
テストのハンドルを窓ハンドルアクティブ。
テストを赤色画面クリア

●窓ハンドル親設定(子ハンドル,親ハンドル)=DLL("user32.dll","DWORD SetParent(DWORD, DWORD)")
#-----------------------------------------------------------

 というわけで、現状はこんな感じで、一応ミニ画面のところに母艦表示されるようになって、ちゃんとスクリーンセーバーの設定画面と連動して動くようにもなりました。

*プレビュー
  #二重起動の防止。
  プレビュータイトルとは文字列=「スクリーンセーバーサンプルのぷれびゅー画面」 #他とは容易にかぶらなそうなタイトルを指定のこと。
  窓列挙。一時=それ。
  一時の2で0からプレビュータイトルを表検索。
  もしそれ=-1でなければ、終わる。
  母艦のタイトルはプレビュータイトル

  #「スクリーン セーバーの設定」画面内のプレビューウィンドウ(ミニ画面)の情報を取得。
  PS=PWHの窓ハンドル内サイズ取得。
  Pxy=PWHの0,0を窓ハンドル画面座標計算。

  #母艦にプレビューウィンドウの位置サイズを設定
  母艦のスタイルは「枠なし」
  母艦のクライアント幅はPS¥0,2。
  母艦のクライアント高さはPS¥0,3。
  母艦のハンドルをPWHに窓ハンドル親設定。
  母艦を最大化。

  #プレビューウィンドウに実際に表示するもの
  母艦デスクトップ色画面クリア。
  「プレビュー」を表示。
  母艦の可視はオン
#-----------------------------------------------------------
# なでしこで作ったヤツじゃ無いウィンドウを親部品にしたり、子部品にしたりできる。
# なでしこライブラリ~ http://www26.atwiki.jp/isoroku_be/pages/66.html
●窓ハンドル親設定(子ハンドルを親ハンドルに)=DLL("user32.dll","DWORD SetParent(DWORD, DWORD)")
#-----------------------------------------------------------

 がっ・・・

 やっぱりこれだけじゃダメだったんです。

 子ウィンドウにしたら、「スクリーン セーバーの設定」画面が閉じて、母艦の親部品も無くなったら終了するかと思ったら、しなかった。

 最初の実験で、母艦を閉じたらテストも終了するのは母艦を閉じてるからであって、試しにメモ帳の子部品に母艦を設定してみたら、やっぱり終了しなかった。

 ・・・りゃそうだ;;;

 現状だと、ふつーに正しく「スクリーン セーバーの設定」をOKで終わらせても、表面上は見えなくなってもこっりとタスクに残っている。これはよろしくありません。

 「スクリーン セーバーの設定」ウィンドウが閉じたら、スクリーンセーバー終了させるようにしないとならないんだよね。

 しかし、力尽きたので今日のところはこれまで~;;;



 それにしても・・・

 「/s」と「/c」は、プログラムの最初に、コマンドライン¥1を設定することで、なでしこエディタだけで動作テストが出来るけど、プレビューだけは、スクリーンセーバーの設定の画面にインストールしないとお試し出来ないから、めんどくさー。

 実行ファイルつくって、.scrにリネームして、インストールして・・・って一連の動作を、なでしこさんにやってもらうようプログラムを作れば良いんだろうけど、なんかもう、それ自体が面倒なんだよぉ~(ダメダメ;;;)

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

2016/11/20 (日)

プレビューは難しいよ!

| 22:44 | プレビューは難しいよ! - 雪乃☆雫のなでしこ日和 を含むブックマーク はてなブックマーク - プレビューは難しいよ! - 雪乃☆雫のなでしこ日和 プレビューは難しいよ! - 雪乃☆雫のなでしこ日和 のブックマークコメント

 引き続き、スクリーンセーバーです。

 コンフィグで設定するほどのことは別に何も無いのだけど、設定ボタンを押しても何も動かないとゆうのはちょっとあれなんで、いつものバージョン情報でも表示させておくことにするw

#-----------------------------------------------------------
*コンフィグ
  ダイアログタイトルは「スクリーンセーバーサンプル」
  「{二重カッコ}スクリーンセーバー{改行}    ~実験中~{二重カッコ閉じ}{改行}   Version 0.00{改行}{改行}   by 雪乃☆雫」と言う。
  終わる。
#-----------------------------------------------------------

 忘れず最後は「終わる」で終わらせないと、単にOKを押してダイアログが消えても、プログラムは終わってないんで、スクリーンセーバーの設定ウィンドウの、ボタンの有効がオフになったような状態で止まってしまう。

 ふつーのアプリと違って、設定画面で何か設定したとしても、の後プログラム自体を終了させて、スクリーンセーバーは「/s」で再起動ってことになってるから、設定の内容はの都度iniか何かに保存しておかないとダメらしい。



 次に、プレビューのミニ画面なんですが、これがまあ、とんでもない曲者でした。

 HSPじゃ、何も考えずに出来たよーに思うんだけど・・・

 あれは、HSPのなかで、なんか勝手にどうにかしてくれることになっているんだろうね???

 取りあえず、いろいろ調べて分かったのは、起動オプション「/p」で起動する時は、「コマンドライン¥2」に、あのミニ画面のハンドルがはいるとゆうこと。

 なるほど、あのナゾの数字は、ーゆうことだったのね。

 のハンドルの、「窓ハンドル内サイズ取得」と「窓ハンドル画面座標計算」で、いちおうミニ画面のサイズと位置は取得できるんだけど・・・

 の前にっ! 絶対やらなきゃいけないことがありました。

 こいつ、「スクリーンセーバーの設定」画面が開く時に起動するだけじゃ無いんです。

 設定ボタンを押した時、プレビューボタンを押した時、それから、コンボボックスで別のスクリーンセーバーを選んだ時、いちいち終わらせるようにしないことには、次に復帰する時に、また「/p」オプションでスクリーンセーバーを再起動しやがるのです!

 「終わる」だけを入れてた時は良かったんだけど・・・あっというに沢山のスクリーンセーバーが密かに起動してて、「システムリソースがありません」かなんか怒られてしまった><

 こは、取りあえずこんな感じに。

#-----------------------------------------------------------
  #二重起動の防止。
  プレビュータイトルとは文字列=「スクリーンセーバーサンプルのぷれびゅー画面」 #他とは容易にかぶらなそうなタイトルを指定のこと。
  窓列挙。一時=それ。
  一時の2で0からプレビュータイトルを表検索。
  もしそれ=-1でなければ、終わる。
  母艦のタイトルはプレビュータイトル
#-----------------------------------------------------------

 起動してるヤツを終わらせると言うより、新しく起動した時に、自分と同じタイトルの窓が既にあったら、もう起動してると判断して起動ないことにする的な感じ。

 でも、なんかそれだけじゃダメな気がする・・・けど、一応エラーは出なくなった。


 さて・・・

#-----------------------------------------------------------
  #「スクリーン セーバーの設定」画面内のプレビューウィンドウ(ミニ画面)の情報を取得。
  PS=PWHの窓ハンドル内サイズ取得。
  Pxy=PWHの0,0を窓ハンドル画面座標計算。

  #母艦にプレビューウィンドウの位置サイズを設定
  母艦のスタイルは「枠なし」
  母艦のクライアント幅はPS¥0,2。
  母艦のクライアント高さはPS¥0,3。
  母艦の位置は「{Pxy¥0,0},{Pxy¥0,1}」

  #プレビューウィンドウに実際に表示するもの
  母艦デスクトップ色画面クリア。
  「プレビュー」を表示。
  母艦の可視はオン
#-----------------------------------------------------------

 こんなふうに、サイズと位置をミニ画面に合わせてつくってみたんだけど・・・

 ばっちり希望の場所に、小さい画面が表示されることはされるんだけど、よく考えたらこれでは全くダメで、スクリーンセーバーの設定画面が動いたり、他のウィンドウの下に隠れたりしたら、このちっちゃい母艦のままの場所に残ってしうまうのですよ~(´д`;

 親部品に設定出来るのは、なでしこで作ったヤツだけだしなー・・・と思っていたら、

http://www26.atwiki.jp/isoroku_be/pages/66.html

 ここに、なでしこで作ったヤツじゃ無いウィンドウを親部品にしたり、子部品にしたりする術がありました!

 素晴らしい!!!


 ところが・・・

 どーゆうわけか、位置の設定が上手くいかないんです。

 色々位置を言わせてみるとどうやら、Xの位置だけを設定した時はいいんですが、Yの位置を設定すると、反映されるのはYの位置だけで、Xの位置があらぬところにずれてしまう。

 これは一体!?!?

 むむむむぅ・・・

うぇいくうぇいく2016/11/21 20:37なでしこの部品の場合、内部でいろいろ情報持っていたり補正したりしているので、単純に親を設定してもうまくゆかない可能性が高いです。部品とAPIと併用するのは結構高難易度になります。
なでしこ内部・・・というより、その実行言語であるDelphiのライブラリのソースを読んで原因を探るぐらいじゃないと厳しいかと思います(なぜか、Delphiは製品にライブラリのソースが付属している。)
ライブラリも一応の考慮はされているので、うまくゆく時もあるので、その時は、それに乗ってしまうのも手ですが、うまくゆかないときは厳しいです。

スクリーンセーバー作成のpluginがあってもよさそうですが、なでしこの場合、フォルダに置いてあると必ず読み込まれちゃうんですよね・・・

雪乃☆雫雪乃☆雫2016/11/22 02:51うぇいくさま、ありがとうございます!
やはり、なかなか難しいことなのですね。
なにしろ、APIも借り物で、Delphiなんてとてもとても~>< ・・・という頭脳なので;;;
しかし、とりあえず、位置の指定ではなく全画面にすることで、なんとなくうまくいきそうな気配です☆

スクリーンセーバー作成のpluginがあったら嬉しかったですが、今となっては、スクリーンセーバー自体がもう、今さらな感じですもねー。
このミニ画面は、スクリーンセーバー的には一番どーでもよい機能なのですが、出来そう感が出てきたので、もう少し捨てずに粘ってみます・・

うぇいくうぇいく2016/11/22 23:39非常に長くて、大変申し訳ないのですが、以下のような感じで試してました。
よくわからないのですが、書かれている構成に似せて2ファイル構成です。

プレビュー時は、もらったハンドルが無効になるか非表示になったら終われば良い模様(それまでは本来の動作のようにアニメーションを繰り返しておく)

・・・あれ?プロセスを跨ぐとハンドル類は無効になったような気がするので、ドライバ側の実装は間違えているかも?(別プロセスに渡す場合は、相手プロセス用のハンドルを生成しないといけなかったような )

スクリーンセーバーテストドライバ.nako
--------------
'スクリーンセーバーテストドライバ

#窓ハンドル親設定の実験
プレビューエリアとはパネル。

母艦のタイトル=「親ウィンドウ」。
母艦の幅は300。母艦の高さは300。
プレビューエリアの幅は200。プレビューエリアの高さは200。
プレビューエリアのXは10。プレビューエリアのYは10。
母艦の可視はオン。プレビューエリアの可視はオフ。


プレビューボタンオンとはボタン
プレビューボタンオンの親部品は母艦
プレビューボタンオンのXは10
プレビューボタンオンのYは220
プレビューボタンオンのWは120
プレビューボタンオンのテキストは「プレビュー表示」
プレビューボタンオンのクリックした時は~
 プレビューエリアの可視はオン。
 「vnako.exe スクリーンセーバー.nako /p {プレビューエリアのハンドル}」を起動

プレビューボタンオフとはボタン
プレビューボタンオフの親部品は母艦
プレビューボタンオフのXは150
プレビューボタンオフのYは220
プレビューボタンオフのWは120
プレビューボタンオフのテキストは「プレビュー非表示」
プレビューボタンオフのクリックした時は~
 プレビューエリアの可視はオフ。
---------------------

スクリーンセーバー.nako
---------------------
'スクリーンセーバー
!変数宣言は必要
!変数初期化は必要

#-----------------------------------------------------------
●母艦設計
 母艦のタイトル=「親ウィンドウ」。
 母艦の可視はオフ

一時描画エリアとはイメージ
一時描画エリアの可視はオフ

プレビューハンドルとは整数
プレビューハンドルはコマンドライン¥2

HDCとは整数
HDCはGetDC(プレビューハンドル)

Sとは文字列
プレビュー幅とは整数
プレビュー高さとは整数
Sに16を確保
// 結果はSにLEFT,TOP,RIGHT,BOTTOMの構造体(全部long型)の内容が入る
GetWindowRect(プレビューハンドル, POINTER(S))
プレビュー幅は(Sの9を`LONG`でバイナリ取得)-(Sの1を`LONG`でバイナリ取得)
プレビュー高さは(Sの13を`LONG`でバイナリ取得)-(Sの5を`LONG`でバイナリ取得)

一時描画エリアの幅はプレビュー幅
一時描画エリアの高さはプレビュー高さ

(IsWindowVisible(プレビューハンドル)!=0)の間、
 // 一時描画エリアに描画する
 スクリーン描画(一時描画エリア)
 // 一時描画エリアの内容をプレビューのエリアに転写する
 // SRCCOPY=$00CC0020 元から先へ上書きコピー
 BitBlt(HDC,0,0,プレビュー幅,プレビュー高さ,一時描画エリアのハンドル,0,0,$00CC0020)
 0.05秒待つ

ReleaseDC(プレビューハンドル,HDC)

終わり

●スクリーン描画({グループ}描画対象)
 描画対象を赤色で画面クリア

●ReleaseDC(hWnd,hDC)=DLL("user32.dll",
"int ReleaseDC(
HWND hWnd, // ウィンドウのハンドル
HDC hDC // デバイスコンテキストのハンドル
)")

●IsWindowVisible(hWnd)=DLL("user32.dll",
"BOOL IsWindowVisible(
HWND hWnd // ウィンドウのハンドル
)")

●GetWindowRect(hWnd,lpRect)=DLL("user32.dll",
"BOOL GetWindowRect(
HWND hWnd,
LPRECT lpRect
)")

●BitBlt(hdcDest,nXDest,nYDest,nWidth,nHeight,hdcSrc,nXSrc,nYSrc,dwRop)=DLL("gdi32.dll",
"BOOL BitBlt(
HDC hdcDest, // コピー先デバイスコンテキストのハンドル
int nXDest, // コピー先長方形の左上隅の x 座標
int nYDest, // コピー先長方形の左上隅の y 座標
int nWidth, // コピー先長方形の幅
int nHeight, // コピー先長方形の高さ
HDC hdcSrc, // コピー元デバイスコンテキストのハンドル
int nXSrc, // コピー元長方形の左上隅の x 座標
int nYSrc, // コピー元長方形の左上隅の y 座標
DWORD dwRop // ラスタオペレーションコード
)")

●GetDC(hWnd)=DLL("user32.dll",
"HDC GetDC(
HWND hWnd // ウィンドウのハンドル
)")
----------------

雪乃☆雫雪乃☆雫2016/11/23 03:02はわわわわわ・・・
一人で勝手に騒いでいるだけでしたのに、こんなにまでして頂いて、本当にありがとうございます!!!
しかし~、今のところ中身が全く分からない~(泣)
MSDNながめて、目が回る~~~(@_@)
でも、今日苦労してなんだかんだした件や、どうしたら良いのか全く分からんと放置した一件が、IsWindowVisibleを使ったら、あっさり解決しそうということだけは閃きました;
こんなにAPIを使いまくらないとならないとは、プレビュー画面恐るべし・・・
ちょっとまた考え直してみます~。

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

2016/11/15 (火)

スクリーンセーバーにするよ!

| 16:48 | スクリーンセーバーにするよ! - 雪乃☆雫のなでしこ日和 を含むブックマーク はてなブックマーク - スクリーンセーバーにするよ! - 雪乃☆雫のなでしこ日和 スクリーンセーバーにするよ! - 雪乃☆雫のなでしこ日和 のブックマークコメント

 ・・・とゆうわけで、スクリーンセーバー

 スクリーンセーバーは、「/s」「/c」「/p」の三つの起動オプションで制御されていて、「/s」の時に、ふつーのスクリーンセーバーとして起動します。

 「/p」は、スクリーンセーバーの設定の中の、ちっちゃこいプレビュー画面を表示するためのもので、「/c」は、設定を押したら開くヤツだから、取りあえず無視することも可能。

 「/s」で起動する本体部分は、「枠なし」のフォームデスクトップいっぱいに表示して、マウスやキーのイベントで終わらすように設計すれば、OK。

#-----テスト用----------------------------------------------
//コマンドライン¥1は「/S」。
//コマンドライン言う。

#-----宣言--------------------------------------------------
OPとは文字列。        #起動オプション。

#-----------------------------------------------------------
#コマンドラインで取得した起動オプションで、動作を選択。
#-----------------------------------------------------------
OP=コマンドライン¥1の2文字左部分。  #起動オプション
もし、OP=「/p」または、OP=「/P」ならば、プレビュー。        #プレビュー(ミニ画面)
違えばもし、OP=「/c」または、OP=「/C」ならば、コンフィグ。    #コンフィグ(設定画面)
違えばもし、OP=「/s」または、OP=「/S」ならば、フルスクリーン。  #フルスクリーン(本体)
違えば終わる。
#-----------------------------------------------------------

*プレビュー
 終わる。

*コンフィグ
 終わる。

*フルスクリーン
  母艦について
    スタイルは「枠なし」
    クライアント幅はデスクトップW。
    クライアント高さはデスクトップH。
    位置は「{0},{0}」。
    キー押した時は~終わる。
    クリックした時は~終わる。
#-----------------------------------------------------------
#スクリーンセーバーの本体プログラム。
#-----------------------------------------------------------
  母艦デスクトップ色画面クリア。
  母艦の可視はオン
#-----------------------------------------------------------

 取りあえずこんな感じ?

 起動する場所によって、コマンドライン起動オプションが、大文字だったり小文字だったりするのはやめて欲しい・・・

 こにきづくまで、無駄に頭を悩ませてしまった(涙)

 でもこれで、本体部分を書き換えたら、それっぽく動くっぽい~♪


 だけど、ホントはスクリーンセーバーって、マウスクリックじゃなくって、マウスをチョコット動かしても復帰するものだよね。

 「マウス移動した時」のイベントがあるんだけど、これ終わるを設定すると、どんなにマウスを動かさないよう気をつけても、ってか、マウスには触れずに[F5]で起動させても、っこーで終了してしまうんだよね。

 どうやらこのイベントは、マウスの移動を検出するんじゃなくて、マウスがの部品の上にある中発生し続けているイベントらしい~。むむむ。

 ・・・いろいろ考えた結果、

#-----------------------------------------------------------
#宣言
初期マウスXとは整数=-1。初期マウスYとは整数=-1。
#-----------------------------------------------------------
#母艦について
    マウス移動した時は~
      もし、(初期マウスX=-1)かつ(初期マウスY=-1)ならば、
        初期マウスX=母艦のマウスX。初期マウスY=母艦のマウスY。
      違えば、(初期マウスX=母艦のマウスX)または
      (初期マウスY=母艦のマウスY)でなければ、終わる。
#-----------------------------------------------------------

 こうなった。

 画面の座標は、0,0から始まるので、しょっぱな変数の範囲外のマイナスの値を与えておけば、いっとう最初にイベントが呼ばれた時が分かるので、それにマウス位置の初期値を記憶し、2目以降からはの値と比較して、起動時とマウスの位置が変わったかを判定する。


 それから、マウスカーソルを消す術が、

http://www26.atwiki.jp/isoroku_be/pages/122.html

 ここにありました!

 いや~、世の中の賢い方々のおかげでWindowsAPIも使えて、ありがたや~。

 引用元を見ると、過去にもスクリーンセーバーを作りたい人がいたっぽいケド、もうリンクが切れてる(´・ω・`)


 だいたい、時はもう、スクリーンセーバーは流行らないよね。も液晶、焼き付かないし(爆)

 省エネで、スクリーンセーバーなんか表示するよか、画面暗くしたりスリープにしたりする時代だもね~。

 ワタシは、結構好きなのにさー。

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