人生投げてます?な日記 in March, 2005

さいととっぷへごー!

<< < 2005-03 >
Su Mo Tu We Th Fr Sa
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31
TOPIC-LIST
15(Tuesday)
お仕事[WORK]
animatewindow.lその2
14(Monday)
お仕事[WORK]
xyzzyでAnimateWindow
13(Sunday)
お買い物[Shopping]
12(Saturday)
NotifyIcon
NotifyIconその2
秋色恋華
11(Friday)
お仕事[WORK]
NotifyIcon
10(Thursday)
お仕事[WORK]
う、うごかねー
9(Wednesday)
お仕事[WORK]
8(Tuesday)
お仕事[WORK]
svn-modeのドキュメントの整備
秋色恋華
7(Monday)
お仕事[WORK]
6(Sunday)
minibufferでの補完のあれこれ
svn-mode0.0.1.8
お買い物[Shopping]
5(Saturday)
svn-mode0.0.1.7
お買い物[Shopping]
4(Friday)
お仕事[WORK]
3(Thursday)
お仕事[WORK]
Firefox1.0.1
秋色恋華
2(Wednesday)
お仕事[WORK]
秋色恋華
1(Tuesday)
お仕事[WORK]
xyzzyの本が...
Generated by nDiary version 0.9.4

2005.03.01 (Tue)

1 おはようございます
6:00、起床。んー、寒いなぁ
外は今日も雪模様。3月だというのにー
コーヒー飲んで、Web廻って、Mailcheck♪
LKPTeam「ホント、3月だというのに何でこんなに雪がありますか」
カレン「しょうがないでしょう」
カレン「今冬はすごーく雪が多かったんだから」
LKPTeam「うー」
カレン「ほらほら、3月になったんだから気持ち切り替えて」
LKPTeam「うー、雪がこんなになかったら切り替わったんですけどねー」
カレン「雪の所為にしないの(^^;」
LKPTeam「あぅー」
2 お仕事...とか[WORK]
まさか3月に入ってからも雪かきをしようとは夢にも思わなかった……とは言い過ぎだけど、さすがに3月に入ってからの大量の雪は珍しいかも、とか
おかげで午前中は雪かきをする羽目に。午後からなんとかのらりくらりと自分の仕事。そしてとうとう社内向けアプリが完成間近に。あとはひと月ほど運用テストをしてもらって、本格運用かな
3 xyzzyの本が...
ようやく出る様子。3月末っぽい。んー、どうしようかなぁー。内容見てから決めようかな
$Date: 2005-03-02 00:26:28 +0900 (Wed, 02 Mar 2005) $ $HeadURL: file:///G:/repo/ndiary_log/2005/03/20050301.diary $
ぺーじとっぷへごー

2005.03.02 (Wed)

1 おはようございます
6:00、起床。うう、眠い
外は晴れ模様。そして今日も寒いです……うぅ
コーヒー飲んで、Web廻って、Mailcheck♪
LKPTeam「xyzzyの本がようやく出るようで」
カレン「そうみたいね」
カレン「買うの?」
LKPTeam「んー、微妙?」
カレン「あれ?買うんじゃなかったの?」
LKPTeam「私としてはもっとこう……リファレンスっぽいものを期待してたんですけどね」
LKPTeam「どうも章の見出しを見てみるとそういう雰囲気じゃないっぽいんですよね」
カレン「あー、まぁね」
カレン「というか、本のタイトルからして違うわよね」
LKPTeam「確かに(^^;」
カレン「でも手元にあったほうがいいかもしれないでしょう?」
LKPTeam「だから様子見ですね」
カレン「ふーん」
LKPTeam「っと、そうこうしてるうちに時間ですね」
カレン「あ、そうね。じゃ準備しないとね」
LKPTeam「あーい」
2 お仕事...とか[WORK]
今日は朝から晩までずっと書類の作成でした、まる。うー、疲れた……
3 秋色恋華...とか[GAME]
香澄エンド。んー、最後は意外だった(^^;。でも、悪くない悪くない
$Date: 2005-03-03 01:09:02 +0900 (Thu, 03 Mar 2005) $ $HeadURL: file:///G:/repo/ndiary_log/2005/03/20050302.diary $
ぺーじとっぷへごー

2005.03.03 (Thu)

1 おはようございます
6:00、起床。んー、ぐっすり……とはほど遠い目覚めだな(^^;
外は晴れ模様。寒さが一段と厳しいです。3月なのにー
コーヒー飲んで、Web廻って、Mailcheck♪
LKPTeam「今日も眠いですー」
カレン「眠くても仕事はしないとね」
LKPTeam「うー、たまには休みたい」
カレン「ずる休みはダメよ?(^^;」
LKPTeam「うーい」
たまにはいいと思うんだけどなぁ(^^;
2 お仕事...とか[WORK]
同じ部署の人が風邪でだいぶ参っている様子で早退するとのこと。むー、インフルエンザじゃなければいいけど、どうなんだろ
社内アプリも一段落したので、自分用に一つ組んでみるかな、とか。……ISOの書類作成とか改正育児・介護休業うんぬんでそんな暇はないんだけど、現実逃避ってことで^^;
3 Firefox1.0.1 ...とか[PC]
アップデートしてみる。うん、簡単簡単
4 秋色恋華...とか[GAME]
……なんでまた伊吹ルートやってますか私は(^^;
$Date: 2005-03-04 01:00:56 +0900 (Fri, 04 Mar 2005) $ $HeadURL: file:///G:/repo/ndiary_log/2005/03/20050303.diary $
ぺーじとっぷへごー

2005.03.04 (Fri)

1 おはようございます
6:00、起床。んー、今日も眠い。そして寒い
外は曇り空。未だ冬っぽい空。普通はそろそろ春っぽくなってくるんだけどなぁ
コーヒー飲んで、Web廻って、Mailcheck♪
LKPTeam「さて、今週も今日で最後ですね」
カレン「……仕事の日はね」
LKPTeam「です」
カレン「で、週末の予定は?」
LKPTeam「いやもうさっぱり」
カレン「お金、ないもんね(^^;」
LKPTeam「あはは、はは……」
カレン「せっかくの連休なのにもったいないわね」
LKPTeam「仕方がないですよ」
LKPTeam「お金がないんですから」
カレン「やっぱりいらない本なんか買うからじゃない?」
LKPTeam「えー、どの本ですか?」
カレン「んー、どの本が、とは言えないけど」
LKPTeam「……」
LKPTeam「それじゃあ分からないです」
カレン「察しなさい(^^;」
LKPTeam「ぐは(^^;」
2 お仕事...とか[WORK]
のらりくらりとお仕事。そして今日もインフルエンザで休んでる人が。んー、体調には気をつけよう
3 夜...とか
うぅ、誰かC#でSystem.Data.OleDBあたりを使って新規にMDBファイルを作成、データベースを作る方法を教えてくれー(^^;
やっぱりADOX使うしかないのかなぁ
$Date: 2005-03-05 00:48:24 +0900 (Sat, 05 Mar 2005) $ $HeadURL: file:///G:/repo/ndiary_log/2005/03/20050304.diary $
ぺーじとっぷへごー

2005.03.05 (Sat)

1 おはようございます
9:00、起床。うーん、ぐっすり
外は晴れ模様。さっさと雪を融かしてくれ(^^;
コーヒー飲んで、Web廻って、Mailcheck♪
LKPTeam「というわけで、連休です」
カレン「はいはい」
LKPTeam「とりあえず、ぼーっとしましょうか?」
カレン「それ、連休にすることなの?(^^;」
LKPTeam「いいんですよぅ(^^;」
LKPTeam「さて、さっそく」
カレン「はーい」
ぼーっとしますか!
2 svn-mode0.0.1.7 ...とか[xyzzy]
ヒストリ変数絡みのバグを修正したつもり……なんだけど、多分まだあるだろうなぁ……
そういった場合は、該当箇所を
(or *svn-dst-files-history* nil)
といった風にしてもらえるとうまく動くかもしれません。とりあえず見つけたらその都度修正ってことで。しかしそうなると見つかった度にバージョンを上げないといけないのか?それもまた面倒だなぁ(^^;
で、バグ修正のついでに機能を拡張しようとしていろいろ悩んでるんだけど、ダメだなぁ
svn exportなんかでエクスポート先のディレクトリをミニバッファで指定しているんだけど、つまりはそのディレクトリを補完したいと。しかしミニバッファで補完する方法がよく分からん。単純に存在するディレクトリだけを入力するのならread-directory-nameなんかを使えば補完は出来るけど、それだとエクスポート先のディレクトリが存在するディレクトリだけに固定されてしまうのでちょっと困る。例えばsvn exportでC:/tmpにsvn-modeをエクスポートしようとするとき、
svn export repository:/path/to/svn-mode/trunk c:/tmp/svn
とする。このとき、C:/tmp/svnディレクトリは存在せず、exportサブコマンドで新規に作成する場合に、read-directory-nameは使えない。なので別の方法を考える必要があるわけなんだけど、……思いつかん(笑)
で、ぼーっとしつつしばらく考えていたんだけど、とりあえずはread-stringで初期値として現在のディレクトリを渡して、minibuffer-local-mapのTABキーに、*do-completionなんかでディレクトリ名の補完リストを引数にしてpopup-listに渡すような関数をバインドするような形にすればいいのではないかな、とぼんやり思う
(let ((dst (prog2
  (define-key minibuffer-local-map #\TAB 'custom-completion)
  (read-string "DST: "
               :default (merge-pathnames (default-directory))
               :history (or *svn-dst-files-history* nil))
  (undefine-key minibuffer-local-map #\TAB))))
イメージとしてはこんな感じ?動くかどうかは知らんけど
実装するのは……また別の機会にということで(笑)
あ、そういえば以前どこかのサイトでctl-x-mapの話が書かれててるのを見て、svn-modeもいっそのことctl-x-mapを使おうと思ったんだけど、でもそれもアレでソレなので(何が?)、
(export '( .... *svn-mode-prefix-key* ... ))
 ...
(defvar *svn-mode-prefix-key* '(#\C-c))
という風になっていますので、~/.xyzzyとかsiteinit.lで指定できるようにしてあります。前は決め打ちだったから、設定の手間はあるけどちょっとだけ便利になったかも
3 お買い物...とか[Shopping]
Justsystem / ATOK2005
インストールしてみたけど旧バージョンとの違いが分からん……(笑)。ま、そのうちに分かってくるでしょう
$Date: 2005-03-06 01:30:14 +0900 (Sun, 06 Mar 2005) $ $HeadURL: file:///G:/repo/ndiary_log/2005/03/20050305.diary $
ぺーじとっぷへごー

2005.03.06 (Sun)

1 おはようございます
10:00、起床。うーん、よく寝た(^^;
外は晴れ模様。やはり3月はこうでなくてはな(^^;
コーヒー飲んで、Web廻って、Mailcheck♪
LKPTeam「ATOK2005を買った所為でお金がありません」
カレン「自業自得ね、それは(^^;」
LKPTeam「あぅ」
LKPTeam「しかしいまだに旧バージョンとの違いがよく分からないですよ?」
カレン「そりゃあ、まだそんな違いが分かるほど使ってないからじゃないの?」
LKPTeam「まぁたしかに。まだ1日も使ってませんからね」
カレン「もうしばらく様子を見なさいな」
LKPTeam「あーい」
2 minibufferでの補完のあれこれ...とか[xyzzy]
昨日の続き。ということで簡単に関数を作ってみる
(defun custom-completion ()
  (interactive)
  (let ((from (point-min))
        (to (point-max)))
    (goto-eol)
    (do-completion from to :directory-name)))
まずはminibuffer内でディレクトリを補完する関数
(defun test-svn-export ()
  (interactive)
  (let ((dst nil)
        (src nil)
        (obind (lookup-keymap minibuffer-local-map #\TAB)))
    (setq src "svn")
    (setq dst (progn
                (define-key minibuffer-local-map #\TAB 'custom-completion)
                (read-string "(export)Local Path: "
                             :default (default-directory)
                             :history (or *svn-dst-files-history* nil))))
    (if obind
        `(define-key minibuffer-local-map #\TAB ',obind)
      (undefine-key minibuffer-local-map #\TAB))
    (insert dst)
    (refresh-screen)))
で、こんな感じで。これだとread-stringでディレクトリ名を取得する際にminibuffer内で入力途中のディレクトリも補完できるし、存在しないディレクトリ名も受け取れるかな
3 svn-mode0.0.1.8 ...とか[xyzzy]
ということでsvn checkout、svn exportサブコマンドでローカルパスの指定時に補完が効くようになりました。あとヒストリ変数絡みのバグを再度修正。これで全部だといいなぁ……
4 お買い物...とか[Shopping]
機工魔術士 7巻 スクウェア・エニックス ISBN4-7575-1372-0
Magical×Miracle 4巻 スタジオDNA ISBN4-7580-5124-0
$Date: 2005-03-06 22:12:27 +0900 (Sun, 06 Mar 2005) $ $HeadURL: file:///G:/repo/ndiary_log/2005/03/20050306.diary $
ぺーじとっぷへごー

2005.03.07 (Mon)

1 おはようございます
6:00、起床。うーん、よく寝た(^^;
外は曇り空。微妙な空模様ですな
コーヒー飲んで、Web廻って、Mailcheck♪
LKPTeam「昨日は何ヶ月ぶりに24:00前に寝ましたよ」
カレン「頭痛がひどかったからね」
LKPTeam「うぃ」
LKPTeam「風邪だとは思うんですけど、それも昨日就寝前に薬を飲みましたから大丈夫です」
カレン「じゃあ仕事も一生懸命出来るって事ね」
LKPTeam「う……」
カレン「出来ないの?」
LKPTeam「それとこれとは違うような」
カレン「違わない」
LKPTeam「うーあー」
2 お仕事...とか[WORK]
ふぃー、休み明けなのに何でこんなに忙しいですカー。おかげで自分のアプリを作る時間がほとんどなかったですよですよ?
svn-mode for xyzzyのページを少し更新。オプションスイッチのことを追記しました。というか書き忘れてたのかよ……そりゃ分からない人も出るはずだよ(笑)
$Date: 2005-03-08 00:52:39 +0900 (Tue, 08 Mar 2005) $ $HeadURL: file:///G:/repo/ndiary_log/2005/03/20050307.diary $
ぺーじとっぷへごー

2005.03.08 (Tue)

1 おはようございます
6:00、起床。うーん、眠いー
外は雨模様。雪じゃなくてよかった……(^^;
コーヒー飲んで、Web廻って、Mailcheck♪
LKPTeam「今日はそんなには寒くないですね」
カレン「やっぱり春が近づいてるからかしらね」
LKPTeam「ですねー」
LKPTeam「いいことですよ」
カレン「もうちょっと先だろうけどね」
LKPTeam「待ち遠しいです」
カレン「もうしばらくの我慢我慢」
LKPTeam「うーい」
2 お仕事...とか[WORK]
のらりくらりとお仕事。しかし今日はだいぶ暖かいですな。……かといって仕事がはかどるわけではないのですが(笑)
3 svn-modeのドキュメントの整備...とか[xyzzy]
ほんの少しだけど。昨日http://www5d.biglobe.ne.jp/~lostland/xyzzy/svn-mode.htmlに手を入れたんだけど、やっぱりもうちょっとだけ新しくしようかな、とか思って。内容はそんなには変わってないけれど、画面の画像を追加してみました。あとせっかくsvn-modeの説明をするんだから、ドキュメントもSubversionを使って管理しようかな、とか(^^;
新しいドキュメントはhttp://www5d.biglobe.ne.jp/~lostland/xyzzy/svn-mode/svn-mode.htmlになります。……サブディレクトリ作っただけかよ!(笑)
4 秋色恋華...とか[GAME]
真由ルートクリア。まぁ先日からちまちまとやってたんですが、ようやく。最後のを除けばよさげでした
$Date: 2005-03-09 00:21:18 +0900 (Wed, 09 Mar 2005) $ $HeadURL: file:///G:/repo/ndiary_log/2005/03/20050308.diary $
ぺーじとっぷへごー

2005.03.09 (Wed)

1 おはようございます
6:00、起床。んー、眠い
外は雪模様。うーむ、昨日は結構暖かかったのになぁ
コーヒー飲んで、Web廻って、Mailcheck♪
LKPTeam「というわけで早くも週の半ばですよ」
カレン「まぁ、今週も土曜日が休みだからね」
LKPTeam「いえーい」
カレン「その分、仕事はしっかりやらないとね」
LKPTeam「……ぃぇーぃ」
カレン「声が小さいわよ!(^^;」
LKPTeam「あぅあぅあぅ」
仕事は……ほら、ねぇ?<分からんってば(^^;
2 お仕事...とか[WORK]
今明かされる衝撃の事実!
LKPTeam「Apache FOPは現状だとborder-styleプロパティでsolidしかサポートしていなかったんですよ!」
カレン「……ググればたくさん出てくるけど?(^^;」
LKPTeam「うーあー、なんてことですかー」
もうどうしよー(笑)。書類をパソコン上で作成してそれをfoファイルに落としてFOPでPDFに変換しようとしてたんだけど、だけどー(笑)
くそぅ、出力は後回しにしてたのが災いしたかー……うーむ、本当にどうしよう(^^;
……とりあえず線の色を薄くしてごまかすかー<安易すぎ(^^;
$Date: 2005-03-10 01:21:43 +0900 (Thu, 10 Mar 2005) $ $HeadURL: file:///G:/repo/ndiary_log/2005/03/20050309.diary $
ぺーじとっぷへごー

2005.03.10 (Thu)

1 おはようございます
6:00、起床。うーん、今日も眠い
外は曇り空。気温、あまり上がらないのかなぁ……
コーヒー飲んで、Web廻って、Mailcheck♪
LKPTeam「今日も仕事かー」
カレン「明日も仕事よ?」
カレン「明後日は休みだけど」
LKPTeam「明日まで頑張らないと、ですね」
カレン「そうね」
カレン「そういうわけだから、今日もがんばりなさいな」
LKPTeam「あーい」
今日も頑張るかー
2 お仕事...とか[WORK]
今日は頑張れませんでしたー(笑)
予防措置ってなにをすればいいんだよぅ。作ってたアプリが結局使わないことに。もうほとんど出来上がってたのに(^^;
はぅ、疲れたよぅ……
3 う、うごかねー[xyzzy]
書き殴りなlispのコードがうまく動きません。まぁ書き殴りだから当然なんだけど
LKPTeam「つまりこれが『つかえねー』なわけですね」
ポン太さん「伊吹ちゃんの台詞だねー」
LKPTeam「うぃうぃ」
カレン「いや、動かない時点でダメでしょう?(^^;」
LKPTeam「うーあー(笑)」
まぁそうなんだけどね。もうちょっと考えてみるか
$Date: 2005-03-11 01:15:05 +0900 (Fri, 11 Mar 2005) $ $HeadURL: file:///G:/repo/ndiary_log/2005/03/20050310.diary $
ぺーじとっぷへごー

2005.03.11 (Fri)

1 おはようございます
6:00、起床。んー、眠いよー
外は雨模様。あめーあめー
コーヒー飲んで、Web廻って、Mailcheck♪
LKPTeam「雨模様とは珍しいですな」
カレン「それだけ春が近づいてるって事でしょう?」
LKPTeam「そうですね」
LKPTeam「この雨で雪解けも結構進むのではないかと」
カレン「さっさと溶けて欲しいわねー」
LKPTeam「いやまったく(^^;」
2 お仕事...とか[WORK]
うーあー、予防処置報告書ってなんだよー<初めて作るものだからあたふたしてる(笑)
3 NotifyIcon...とか[xyzzy]
ぎ、ギブアップ……(^^;
(eval-when (:compile-toplevel :load-toplevel :execute)
  (require "foreign")
  (require "wip/winapi"))
 
(require "api")
(in-package "win-user")
 
(provide "notifyicon")
 
(*define WM_NOTIFYICON (+ WM_APP 100))
 
(*define NIF_MESSAGE    #x00000001)
(*define NIF_ICON       #x00000002)
(*define NIF_TIP        #x00000004)
(*define NIF_STATE      #x00000008)
(*define NIF_INFO       #x00000010)
(*define NIF_GUID       #x00000020)
 
(*define NIM_ADD        #x00000000)
(*define NIM_MODIFY     #x00000001)
(*define NIM_DELETE     #x00000002)
(*define NIM_SETFOCUS   #x00000003)
(*define NIM_SETVERSION #x00000004)
 
(*define IDC_BUTTON     3001)
 
(*define-c-struct WNDCLASSEX
   (UINT cbSize)
   (UINT style)
   (WNDPROC lpfnWndProc)
   (int cbClsExtra)
   (int cbWndExtra)
   (HINSTANCE hInstance)
   (HICON hIcon)
   (HCURSOR hCursor)
   (HBRUSH hbrBackground)
   (LPCSTR lpszMenuName)
   (LPCSTR lpszClassName)
   (HICON hIconSm))
 
(*define-c-struct GUID
   (u_long Data1)
   (u_short Data2)
   (u_short Data3)
   (u_char Data4 8))
                   
(*define-c-struct
   NOTIFYICONDATA
   (DWORD cbSize)
   (HWND hWnd)
   (UINT uID)
   (UINT uFlags)
   (UINT uCallbackMessage)
   (HICON hIcon)
   (LPCSTR szTip) ;?
   (DWORD dwState)
   (DWORD dwStateMask)
   (LPCSTR szInfo)
   (UINT uTimeout) ;?
   (LPCSTR szInfoTitle)
   (DWORD dwInfoFlags)
   (GUID guidItem))
 
(unless (boundp 'Shell_NotifyIconW)
  (define-dll-entry BOOL Shell_NotifyIcon (DWORD (NOTIFYICONDATA *)) "shell32" "Shell_NotifyIconA"))
(unless (boundp 'PostQuitMessage)
  (define-dll-entry void PostQuitMessage (int) "user32.dll"))
(unless (boundp 'RegisterClassEx)
  (define-dll-entry ATOM RegisterClassEx ((WNDCLASSEX *)) "user32" "RegisterClassExA"))
 
(setq *window-class-name* "myNotification")
(defvar *gInstance* nil)
 
(unless (fboundp 'window-wndproc)
  (defun-c-callable
     LRESULT window-wndproc
     ((HWND hwnd) (UINT msg) (WPARAM wparam) (LPARAM lparam))
     (let ((nid nil))
       (cond
          ((= msg WM_CREATE)
           (setq nid (create-notifyicondata hwnd))
           (Shell_NotifyIcon NIM_ADD nid)
           (CreateWindow
              (si:make-string-chunk "BUTTON")
              (si:make-string-chunk "Ballon")
              (logior WS_CHILD WS_VISIBLE)
              0 0
              100 100
              hwnd 0
              (GetModuleHandle 0)
              0)
           (return-from window-wndproc 0))
          ((= msg WM_COMMAND)
           (setq nid (create-notifyicondata hwnd))
           (setf (NOTIFYICONDATA-szInfoTitle nid)
                 (si:make-string-chunk "myNotifyIcon Balloon tip"))
           (setf (NOTIFYICONDATA-szInfo nid)
                 (si:make-string-chunk "test"))
           (setf (NOTIFYICONDATA-uFlags nid) NIF_INFO)
           (setf (NOTIFYICONDATA-dwInfoFlags nid) 3)
           (Shell_NotifyIcon NIM_MODIFY nid)
           (return-from window-wndproc 0))
          ((= msg WM_NOTIFYICON)
           (return-from window-wndproc 0))
          ((= msg WM_CLOSE)
           (setq nid (create-notifyicondata hwnd))
           (Shell_NotifyIcon NIM_DELETE nid)
           (DestroyWindow hwnd)
           (return-from window-wndproc 0))
          ((= msg WM_NCDESTROY)
           (PostQuitMessage 0)
           (return-from window-wndproc 1)
           ))
       (DefWindowProc hwnd msg wparam lparam))))
 
(defun initialize-window ()
  (let ((hwnd nil)
        (wc (make-WNDCLASSEX)))
    (setf (WNDCLASSEX-cbSize wc) (c::c-struct-size-of WNDCLASSEX))
    (setf (WNDCLASSEX-style wc) 0)
    (setf (WNDCLASSEX-lpfnWndProc wc) #'window-wndproc)
    (setf (WNDCLASSEX-cbClsExtra wc) 0)
    (setf (WNDCLASSEX-cbWndExtra wc) 0)
    (setf (WNDCLASSEX-hInstance wc) (GetModuleHandle 0))
    (setf (WNDCLASSEX-hIcon wc) 0)
    (setf (WNDCLASSEX-hCursor wc)
          (LoadCursor 0 (MAKEINTRESOURCE IDC_ARROW)))
    (setf (WNDCLASSEX-hbrBackground wc) 6) ;?
    (setf (WNDCLASSEX-lpszMenuName wc) 0)
    (setf (WNDCLASSEX-lpszClassName wc)
          (si:make-string-chunk *window-class-name*))
    (setf (WNDCLASSEX-hIconSm wc) 0)
    (RegisterClassEx wc)
    (setq hwnd (CreateWindowEx
                  WS_EX_TOOLWINDOW
                  (si:make-string-chunk *window-class-name*)
                  (si:make-string-chunk *window-class-name*)
                  (logior WS_OVERLAPPEDWINDOW #x40 #x01 #x02 WS_POPUP)
                  CW_USEDEFAULT
                  CW_USEDEFAULT
                  CW_USEDEFAULT
                  CW_USEDEFAULT
                  (ed::get-window-handle)
                  0
                  (GetModuleHandle 0)
                  0))
    (SendMessage hwnd (+ #x0400 24) 0 200)
    (SendMessage hwnd (+ #x0400 32) 1 (si::address-of (si:make-string-chunk "myNotifyIconTest")))
    (ShowWindow hwnd SW_SHOW)
    (UpdateWindow hwnd)
    hwnd))
 
(defun create-notifyicondata (hwnd)
  (let ((nid (make-NOTIFYICONDATA)))
    (setf (NOTIFYICONDATA-cbSize nid)
          (c::c-struct-size-of NOTIFYICONDATA))
    (setf (NOTIFYICONDATA-hWnd nid) hwnd)
    (setf (NOTIFYICONDATA-uID nid) 0)
    (setf (NOTIFYICONDATA-uFlags nid)
          (logior NIF_ICON NIF_MESSAGE NIF_TIP))
    (setf (NOTIFYICONDATA-uCallbackMessage nid) WM_NOTIFYICON)
    (setf (NOTIFYICONDATA-hIcon nid)
          (LoadIcon 0 (MAKEINTRESOURCE IDI_APPLICATION)))
    (setf (NOTIFYICONDATA-szTip nid)
          (si:make-string-chunk "myNotifyIcon help"))
    nid))
 
(defun user::notify-main ()
    (setq *gInstance* (win-user::initialize-window)))
タスクトレイにアイコンを出すところまでは終わってるんだけど、バルーンメッセージの出し方が分からん(笑)
上手くいったらKaMailで自動メール受信に連動させて受信メッセージを出そうと思ってたのに、おじゃんだよー(^^;
$Date: 2005-03-12 01:36:00 +0900 (Sat, 12 Mar 2005) $ $HeadURL: file:///G:/repo/ndiary_log/2005/03/20050311.diary $
ぺーじとっぷへごー

2005.03.12 (Sat)

1 おはようございます
8:00、起床。んー、もう少し寝ていたかったかも
外は晴れ模様。いい天気になりそうです
コーヒー飲んで、Web廻って、Mailcheck♪
LKPTeam「昨日のアレ、よく考えたらあんな事しなくてもタスクトレイにアイコンは表示できたんですね?」
カレン「気付くの遅い(^^;」
LKPTeam「うわーん」
2 NotifyIcon...とか[xyzzy]
いらんウィンドウとか作らなくてもNOTIFYICONDATA構造体を定義してShell_NotifyIcon関数を使えばあっさり登録できるじゃん。というか今やってみたら登録できたよ!(笑)
……昨日のあの努力は一体……
カレン「無駄って事ね」
LKPTeam「あーあーあーあー、きーこーえーなーいー」
カレン「自分で気付いてるんだから意味ないのに(^^;」
うぅ……はずかしー(^^;
でも昨日のNotifyIcon構造体の定義だとちょっと上手くいかないことも確認。やっぱりUNIONとかがダメなのかなぁ、NOTIFYICONDATA-szTipに入れる文字列がどうしても化ける。
道は遠いなぁ……
3 NotifyIconその2...とか[xyzzy]
ということで、雪辱戦。
// mynotifyicon.h
#define DLLEXPORT extern "C" __declspec(dllexport)
DLLEXPORT int createballoon(HWND hwnd, LPCSTR msg);
DLLEXPORT int modifyballoon(HWND hwnd,
                            LPCSTR title,
                            LPCSTR msg,
                            int IconStyle,
                            long Timeout);
DLLEXPORT int deleteballoon(HWND hwnd);
// mynotifyicon.cpp
#include <windows.h>
#include <shellapi.h>
#include "mynotifyicon.h"
#define WM_USER_TRAY (WM_APP + 100)
 
DLLEXPORT BOOL APIENTRY DllMain(HINSTANCE hinst, DWORD ul_reason_for_call, LPVOID pParam)
{
  switch (ul_reason_for_call) {
  case DLL_PROCESS_ATTACH:
    break;
  case DLL_PROCESS_DETACH:
    break;
  case DLL_THREAD_ATTACH:
    break;
  case DLL_THREAD_DETACH:
    break;
  }
  return TRUE;
}
 
DLLEXPORT int createballoon(HWND hwnd, LPCSTR msg)
{
  NOTIFYICONDATA nid;
  ZeroMemory(&nid, sizeof(NOTIFYICONDATA));
  nid.cbSize = sizeof(NOTIFYICONDATA);
  nid.hWnd = hwnd;
  nid.uID = 0;
  nid.uFlags = NIF_ICON | NIF_MESSAGE | NIF_TIP;
  nid.uCallbackMessage = WM_USER_TRAY;
  nid.hIcon = NULL;
  lstrcpy(nid.szTip, msg);
  Shell_NotifyIcon(NIM_ADD, &nid);
  return TRUE;
}
 
DLLEXPORT int modifyballoon(HWND hwnd,
                            LPCSTR title,
                            LPCSTR msg,
                            int IconStyle = 0,
                            long Timeout = 10000)
{
  NOTIFYICONDATA nid;
  ZeroMemory(&nid, sizeof(NOTIFYICONDATA));
  nid.cbSize = sizeof(NOTIFYICONDATA);
  nid.uFlags = NIF_INFO;
  nid.hWnd = hwnd;
  strcpy(nid.szInfoTitle, title);
  strcpy(nid.szInfo, msg);
  nid.dwInfoFlags = IconStyle;
  nid.uTimeout = Timeout;
  Shell_NotifyIcon(NIM_MODIFY, &nid);
  return TRUE;
}
 
DLLEXPORT int deleteballoon(HWND hwnd)
{
  NOTIFYICONDATA nid;
  ZeroMemory(&nid, sizeof(NOTIFYICONDATA));
  nid.cbSize = sizeof(NOTIFYICONDATA);
  nid.hWnd = hwnd;
  Shell_NotifyIcon(NIM_DELETE, &nid);  
  return TRUE;
}
bcc32でターゲットをDynamic Link Libraryにしてコンパイル。出来たDLLを$XYZZYHOMEに置いて、*scratch*バッファで
(c::define-dll-entry c::int deleteballoon (winapi::HWND) "mynotifyicon.dll")
(c::define-dll-entry c::int createballoon (winapi::HWND winapi::LPCSTR) "mynotifyicon.dll")
(c::define-dll-entry c::int modifyballoon
  (
     winapi::HWND
     winapi::LPCSTR
     winapi::LPCSTR
     c::int
     c::long) "mynotifyicon.dll")
を評価。そしておもむろに
(progn
  (createballoon (get-window-handle) (si:make-string-chunk "Balloon test."))
  (modifyballoon (get-window-handle)
                 (si:make-string-chunk "バルーンテスト")
                 (si:make-string-chunk "バルーンをテスト!")
                 1
                 50000
                 ))
とか。表示されたかな?一応I.Eのバージョンが5以上だと大丈夫だと思うんだけど。あと95、98とか多分ダメかも。コンパイル環境がない人のためにバイナリをここに置いておこう。そんなかさばるものじゃないしね
いろいろいじって遊べるかなぁ、とか。xyzzyのウィンドウ左上にあるアイコンを表示させたりも出来るはずだ……多分(^^;
これでKaMailでメールを受信したときに設定できるギミックが増えたー<それが目的かよ(^^;
4 秋色恋華...とか[GAME]
どうにかこうにか眼鏡、もとい……あー、名前が思い出せん(笑)。とにかく幼馴染みで眼鏡な先生を攻略(^^;。んー、いまいちな気もしないでもない
ということで、これでフルコンプリート、っと。目新しい箇所はあまりないかも。キャラクターは好きですが。でもまぁ楽しいからいいかな、といつも通りの結論(笑)
$Date: 2005-03-12 22:06:39 +0900 (Sat, 12 Mar 2005) $ $HeadURL: file:///G:/repo/ndiary_log/2005/03/20050312.diary $
ぺーじとっぷへごー

2005.03.13 (Sun)

1 おはようございます
8:00、起床。むー、どうしたことだ、何でこんなに早く目が覚めるんだよぅ
外は雪模様。うぐぅ、また雪かよぅ
コーヒー飲んで、Web廻って、Mailcheck♪
LKPTeam「昨日はだいぶ遅くまで起きてたんですけどねぇ」
カレン「やっぱり習慣だからじゃないの?」
LKPTeam「うぅ、嫌な習慣だ(^^;」
それはそうと昨日一生懸命作ったバルーンだけど、どうも家の環境だと他のウィンドウの後ろにバルーンが表示されてしまっていまいち効果が薄い気がするんだよなぁ(^^;
やっぱり別の方法を考えるかなぁ
2 お買い物...とか[Shopping]
今日のお買い物は……
ファイブスター物語U 2005 EDITION 角川書店 ISBN4-04-853822-5
暗黒館の殺人 上巻 講談社ISBN4-06-182388-4
……でしたっ
LKPTeam「しかしファイブスターは高すぎやしませんか?」
カレン「というか2巻は持ってるんじゃないの?」
LKPTeam「いやほら、2005 EDITIONなんて持ってませんよ?」
カレン「どこが違うのかしらね」
LKPTeam「巻末にファティマについての説明とかが追加されてるようです」
カレン「本編の内容は?」
LKPTeam「……一部、語句が新しくなってたりとか?」
カレン「後は誤字脱字の修正?」
LKPTeam「かと思います」
カレン「買う必要、あったの?」
LKPTeam「おおありですよ!」
カレン「そうかなぁ……」
LKPTeam「あぅあぅ」
……自分でも1,400は後ろのファティマについての追加分に出したとしか思ってないところがあるから……とか(笑)
暗黒館の殺人は下巻を買い忘れるという暴挙が(^^;。来週にでも下巻を買って、それから読み始めよう
$Date: 2005-03-14 00:35:59 +0900 (Mon, 14 Mar 2005) $ $HeadURL: file:///G:/repo/ndiary_log/2005/03/20050313.diary $
ぺーじとっぷへごー

2005.03.14 (Mon)

1 おはようございます
6:00、起床。うー、寒いよぅ
外は晴れ模様。でも冷え込みが、冷え込みがー
コーヒー飲んで、Web廻って、Mailcheck♪
LKPTeam「うー、3月も中旬に差し掛かろうというのに、この冷え込みようは一体……」
カレン「しょうがないでしょう?」
カレン「というかこのくらい、我慢しなさいよ」
LKPTeam「うーあー、無理デスよぅ」
カレン「根性がないわねぇ」
LKPTeam「あぅー」
カレン「でもまぁ、いつもの時間に起きたって事は仕事には行くって事よね」
LKPTeam「そりゃあ、まぁ……」
カレン「よしよし、感心感心」
LKPTeam「こんな事で感心されても(^^;」
カレン「ほらほら、さっさと準備しないと」
LKPTeam「あーい」
2 お仕事...とか[WORK]
先週からやってるISOの予防処置の書類をのらりくらりと作成したり、ぼーっとISO14001のWebサイトを眺めたり。……休み明けだもん、仕事はあまりやりたくないよね(笑)
3 xyzzyでAnimateWindow...とか[xyzzy]
Mozilla Firefoxのダウンロードが完了したときに画面右下に出るアレとか、Norton Internet Security 2005でアウトブレーク警告の時に出るアレとか。ようするにアレをxyzzyから使おうというわけでありますよ
初めはNotifyIconの時のようにDLLでやってたんだけど、WNDCLASSEX構造体ならxyzzyからでも問題なく作れるし、それにDLLだとちょっとKaMailから呼び出したときに、SetTimer関数で指定秒数後にウィンドウを壊す処理の前に呼び出し元のKaMailの関数が終了したときに画面が更新されない問題にぶつかって解決策が見いだせなかったためにやむなくというか、ならxyzzyから制御してやるぅ、とか(笑)<なげぇよ
ということで、animatewindow.l
;;; -*- Mode: Lisp; Package: WIN-USER -*-
 
(eval-when (:compile-toplevel :load-toplevel :execute)
  (require "wip/winapi"))
 
(require "api")
 
(in-package "win-user")
 
(defconstant animate-window-class "Animate-Window-Class")
 
(*define-c-struct WNDCLASSEX
   (UINT cbSize)
   (UINT style)
   (WNDPROC lpfnWndProc)
   (int cbClsExtra)
   (int cbWndExtra)
   (HINSTANCE hInstance)
   (HICON hIcon)
   (HCURSOR hCursor)
   (HBRUSH hbrBackground)
   (LPCSTR lpszMenuName)
   (LPCSTR lpszClassName)
   (HICON hIconSm))
 
(c::define-dll-entry BOOL AnimateWindow (HWND DWORD DWORD) "user32")
(c::define-dll-entry ATOM RegisterClassEx ((WNDCLASSEX *)) "user32" "RegisterClassExA")
(c::define-dll-entry BOOL SystemParametersInfo (UINT UINT PVOID UINT) "user32" "SystemParametersInfoA")
(*define-c-macro RGB (r g b) (logior (logior (ash r 0) (ash g 8)) (ash b 16)))
(c::define-dll-entry HBRUSH CreateSolidBrush (COLORREF) "gdi32")
(c::define-dll-entry int SetBkMode (HDC int) "gdi32")
(*define TRANSPARENT 1)
(*define OPAQUE 2)
(*define BKMODE_LAST 2)
(*define SPI_GETWORKAREA 48)
(*define SS_CENTER #x00000001)
 
(unless (fboundp 'animate-window-wndproc)
  (defun-c-callable LRESULT animate-window-wndproc
     ((HWND hWnd) (UINT msg) (WPARAM wparam) (LPARAM lparam))
                    (cond
                       ((= msg WM_NCDESTROY)
                        (return-from animate-window-wndproc 0)
                        )
                       ((= msg WM_CTLCOLORSTATIC)
                        (SetBkMode wparam TRANSPARENT)
                        (return-from animate-window-wndproc
                          (CreateSolidBrush (RGB 224 255 255))))
                       ((= msg WM_CREATE)
                        (return-from animate-window-wndproc 0)
                        ))
                    (DefWindowProc hWnd msg wparam lparam)))
 
(defun delete-animate-window (hWnd)
  (AnimateWindow hWnd
                 200
                 (logior AW_HIDE AW_SLIDE AW_VER_POSITIVE))
  (DestroyWindow hWnd))
 
(defun create-animate-window ()
  (let ((wc (make-WNDCLASSEX)))
    (setf (WNDCLASSEX-cbSize wc) (c-struct-size-of WNDCLASSEX)) 
    (setf (WNDCLASSEX-style wc) (logior CS_HREDRAW CS_VREDRAW))
    (setf (WNDCLASSEX-lpfnWndProc wc) #'animate-window-wndproc)
    (setf (WNDCLASSEX-cbClsExtra wc) 0)
    (setf (WNDCLASSEX-cbWndExtra wc) 0)
    (setf (WNDCLASSEX-hInstance wc) (GetModuleHandle 0))
    (setf (WNDCLASSEX-hIcon wc) (LoadIcon 0 (MAKEINTRESOURCE IDI_APPLICATION)))
    (setf (WNDCLASSEX-hCursor wc) (LoadCursor 0 (MAKEINTRESOURCE IDC_ARROW)))
    (setf (WNDCLASSEX-hbrBackground wc) (CreateSolidBrush (RGB 224 255 255)))
    (setf (WNDCLASSEX-lpszMenuName wc) 0)
    (setf (WNDCLASSEX-lpszClassName wc)
          (si:make-string-chunk animate-window-class))
    (setf (WNDCLASSEX-hIconSm wc) 0)
    (RegisterClassEx wc))
  (let* ((rect (make-RECT)))
    (SystemParametersInfo SPI_GETWORKAREA 0 rect 0)
    (let ((hWnd (CreateWindowEx
                   (logior WS_EX_TOOLWINDOW WS_EX_TOPMOST)
                   (si:make-string-chunk animate-window-class)
                   (si:make-string-chunk "Animate-Window")
                   (logior WS_THICKFRAME WS_POPUP)
                   (- (RECT-right rect) 205)
                   (- (RECT-bottom rect) 105)
                   200 100
                   0 0
                   (GetModuleHandle 0) 0))
          (clientrect (make-RECT)))
      (GetClientRect hWnd clientrect)
      (CreateWindowEx
         0
         (si:make-string-chunk "Static")
         (si:make-string-chunk "*Animate Window*")
         (logior WS_CHILD WS_VISIBLE SS_CENTER)
         (+ (RECT-left clientrect) 5 #|margin x|#)
         (+ (RECT-top clientrect) 5 #|margin y|#)
         (- (- (RECT-right clientrect) (RECT-left clientrect)) 5 #|width|#)
         30 #|height|#
         hWnd
         0
         (GetModuleHandle 0) 0)
      (CreateWindowEx
         0
         (si:make-string-chunk "Static")
         (si:make-string-chunk "動きますぅ〜")
         (logior WS_CHILD WS_VISIBLE SS_CENTER)
         (+ (RECT-top clientrect) 5 #|margin x|#)
         (+ (+ (RECT-top clientrect) 30) 5 #|margin y|#)
         (- (- (RECT-right clientrect) (RECT-left clientrect)) 5 #|width|#)
         70 #|parent window(100) - static[title](30)|#
         hWnd
         0
         (GetModuleHandle 0)
         0)
         
      (AnimateWindow hWnd
                     200
                     (logior AW_SLIDE AW_VER_NEGATIVE))
      (ed::start-timer 5 #'(lambda () (funcall 'delete-animate-window hWnd)) t)
                     hWnd)))
↑を$XYZZYHOME/site-lisp/以下に放り込んで、また例によって*scratch*バッファで
(progn
  (require "animatewindow")
  (win-user::create-animate-window))
とか。とりあえずは右下固定、アニメーションの秒数は200ミリ秒、5秒後にウィンドウを消す設定で。どこをどういじれば変更できるかは説明が面倒なのでしませんが、コードを見れば分かるでしょう。あまり洗練されてませんが、もう少し手を入れればアニメーションの秒数指定とか何秒後に消す設定にするとか、画面右下だけじゃなくて四隅からウィンドウを出したりとかも出来るでしょう。まぁその変は気が向いたらやるって事で
ということで、KaMailからウィンドウを呼び出した図とか。……KaMailから呼び出したのが分からんじゃないかっ(笑)
うーむ、最近色物ばっかりだな(笑)
$Date: 2005-03-14 23:27:44 +0900 (Mon, 14 Mar 2005) $ $HeadURL: file:///G:/repo/ndiary_log/2005/03/20050314.diary $
ぺーじとっぷへごー

2005.03.15 (Tue)

1 おはようございます
6:00、起床。んー、眠いー
外は曇り空。まぁまぁ暖かい、カナかな。……うぅ、ATOKめぇ、なんて変換するんだよ<逆恨み(笑)
コーヒー飲んで、Web廻って、Mailcheck♪
LKPTeam「どうやらxyzzyの本、買いそうな予感です」
カレン「「入門xyzzy」だっけ?」
LKPTeam「うぃ」
LKPTeam「付録としてxyzzylispの解説が付いてくるらしいんですよ」
カレン「へぇ」
LKPTeam「これでまだ使ってない関数の機能とか簡単に分かりますね」
カレン「そういうのがなくてもdescribe-functionとかで分かるんじゃない?」
LKPTeam「確かに。でもアレは説明とかないでしょう?」
カレン「出るときもあるじゃない」
LKPTeam「あれはこっちでいろいろやってるから出るんですよ(^^;」
LKPTeam「本来なら関数の説明なんて出ませんよ」
カレン「ふーん」
LKPTeam「そういうわけで、ちょっと買う気になってるかも、デス」
カレン「なんで語尾がデス?(^^;」
LKPTeam「特に意味はありません(^^;」
本の表紙はxyzzy wikiの入門xyzzyのページにあります。やはり亀か……
さて、仕事に行くかー
2 お仕事...とか[WORK]
のらりくらりと……仕事をするふりをしつつ昨日のanimatewindowをいじってたり(笑)。いや、ちゃんと仕事もしたよ?……ホントだよ(^^;
3 animatewindow.lその2...とか[xyzzy]
ということで、今日の成果
;;; -*- Mode: Lisp; Package: WIN-USER -*-
  
(eval-when (:compile-toplevel :load-toplevel :execute)
  (require "wip/winapi"))
 
(require "api")
 
(in-package "win-user")
 
(export
   '(*animatewindow-after-parentwindow-hook*))
 
(defvar *animatewindow-after-parentwindow-hook* nil)
 
(defconstant animate-window-class "Animate-Window-Class")
 
(*define-c-struct WNDCLASSEX
   (UINT cbSize)
   (UINT style)
   (WNDPROC lpfnWndProc)
   (int cbClsExtra)
   (int cbWndExtra)
   (HINSTANCE hInstance)
   (HICON hIcon)
   (HCURSOR hCursor)
   (HBRUSH hbrBackground)
   (LPCSTR lpszMenuName)
   (LPCSTR lpszClassName)
   (HICON hIconSm))
  
(c::define-dll-entry BOOL AnimateWindow (HWND DWORD DWORD) "user32")
(c::define-dll-entry ATOM RegisterClassEx ((WNDCLASSEX *)) "user32" "RegisterClassExA")
(c::define-dll-entry BOOL SystemParametersInfo (UINT UINT PVOID UINT) "user32" "SystemParametersInfoA")
(*define-c-macro RGB (r g b) (logior (logior (ash r 0) (ash g 8)) (ash b 16)))
(c::define-dll-entry HBRUSH CreateSolidBrush (COLORREF) "gdi32")
(c::define-dll-entry int SetBkMode (HDC int) "gdi32")
(*define TRANSPARENT 1)
(*define OPAQUE 2)
(*define BKMODE_LAST 2)
(*define SPI_GETWORKAREA 48)
(*define SS_LEFT             #x00000000)
(*define SS_CENTER           #x00000001)
(*define SS_RIGHT            #x00000002)
(*define SS_ICON             #x00000003)
(*define SS_BLACKRECT        #x00000004)
(*define SS_GRAYRECT         #x00000005)
(*define SS_WHITERECT        #x00000006)
(*define SS_BLACKFRAME       #x00000007)
(*define SS_GRAYFRAME        #x00000008)
(*define SS_WHITEFRAME       #x00000009)
(*define SS_USERITEM         #x0000000A)
(*define SS_SIMPLE           #x0000000B)
(*define SS_LEFTNOWORDWRAP   #x0000000C)
(*define SS_OWNERDRAW        #x0000000D)
(*define SS_BITMAP           #x0000000E)
(*define SS_ENHMETAFILE      #x0000000F)
(*define SS_ETCHEDHORZ       #x00000010)
(*define SS_ETCHEDVERT       #x00000011)
(*define SS_ETCHEDFRAME      #x00000012)
(*define SS_TYPEMASK         #x0000001F)
(*define SS_NOPREFIX         #x00000080)
(*define SS_NOTIFY           #x00000100)
(*define SS_CENTERIMAGE      #x00000200)
(*define SS_RIGHTJUST        #x00000400)
(*define SS_REALSIZEIMAGE    #x00000800)
(*define SS_SUNKEN           #x00001000)
(*define SS_ENDELLIPSIS      #x00004000)
(*define SS_PATHELLIPSIS     #x00008000)
(*define SS_WORDELLIPSIS     #x0000C000)
(*define SS_ELLIPSISMASK     #x0000C000)
(*define STM_SETICON         #x0170)
(*define STM_GETICON         #x0171)
(*define STM_SETIMAGE        #x0172)
(*define STM_GETIMAGE        #x0173)
(*define STN_CLICKED         0)
(*define STN_DBLCLK          1)
(*define STN_ENABLE          2)
(*define STN_DISABLE         3)
(*define STM_MSGMAX          #x0174)
 
(unless (fboundp 'animate-window-wndproc)
  (defun-c-callable LRESULT animate-window-wndproc
     ((HWND hWnd) (UINT msg) (WPARAM wparam) (LPARAM lparam))
                    (cond
                       ((= msg WM_NCDESTROY)
                        (return-from animate-window-wndproc 0)
                        )
                       ((= msg WM_CTLCOLORSTATIC)
                        (SetBkMode wparam TRANSPARENT)
                        (return-from animate-window-wndproc
                          (CreateSolidBrush (RGB 224 255 255))))
                       ((= msg WM_CREATE)
                        (return-from animate-window-wndproc 0)
                        ))
                    (DefWindowProc hWnd msg wparam lparam)))
 
(defun delete-animate-window (hWnd &optional acount hide-style)
  (let ((animate-count (or acount 200))
        (style (or hide-style (logior AW_HIDE AW_SLIDE AW_NEGATIVE))))
  (AnimateWindow hWnd
                 animate-count
                 style)
    (DestroyWindow hWnd)))
 
(defun user::create-animate-window
  (&key window-width window-height window-margin-x window-margin-y
             window-position-x-flag window-position-x
             window-position-y-flag window-position-y
             window-show-style window-hide-style
             animate-count wait)
  "Create Animatation Window
オプション名: 説明 {指定できる値} [初期値]
WINDOW-WIDTH: 作成するウィンドウの幅を指定します {数値} [200]
WINDOW-HEIGHT: 作成するウィンドウの高さを指定します {数値} [100]
WINDOW-MARGIN-X: ウィンドウ外枠からのX軸マージンを指定します {数値} [5]
WINDOW-MARGIN-Y: ウィンドウ外枠からのY軸マージンを指定します {数値} [5]
WINDOW-POSITION-X-FLAG: ウィンドウのX軸の場所について画面左側からの
                        値か、画面右側からの値かを指定します
                        {:left|:right} [:left]
WINDOW-POSITION-X: ウィンドウX軸の場所を指定します {数値} [0]
WINDOW-POSITION-Y-FLAG: ウィンドウのY軸の場所について画面上部からの
                        値か、画面下部からの値かを指定します
                        {:top|:bottom} [:top]
WINDOW-POSITOIN-Y: ウィンドウY軸の場所を指定します {数値} [0]
WINDOW-SHOW-STYLE: 表示方法を指定します。
                   {数値、あるいは(logior 数値 数値 ... 数値)}
                   [(logior AW_SLIDE AW_VER_POSITIVE)]
WINDOW-HIDE-STYLE: 非表示の方法を指定します
                   {数値、あるいは(logior 数値 数値 ... 数値)}
                   [(logior AW_HIDE AW_SLIDE AW_NEGATIVE)]
ANIMATE-COUNT: アニメーションする時間をミリ秒単位で指定します
               {数値} [200]
WAIT: 表示してから、非表示にするまでの待機時間を秒単位で指定します
      {数値} [5]
 
WINDOW-SHOW-STYLE,WINDOW-HIDE-STYLEで指定できる値:
winapi::AW_HOR_POSITIVE
winapi::AW_HOR_NEGATIVE
winapi::AW_VER_POSITIVE
winapi::AW_VER_NEGATIVE
winapi::AW_CENTER
winapi::AW_HIDE
winapi::AW_ACTIVATE
winapi::AW_SLIDE
winapi::AW_BLEND
"
  (let ((rect (make-RECT)))
    (SystemParametersInfo SPI_GETWORKAREA 0 rect 0)
    (let* ((width (or window-width 200))
           (height (or window-height 100))
           (margin-x (or window-margin-x 5))
           (margin-y (or window-margin-y 5))
           (position-x-flag (or window-position-x-flag :left))
           (position-x (or window-position-x 0))
           (position-y-flag (or window-position-y-flag :top))
           (position-y (or window-position-y 0))
           (show-style (or window-show-style
                           (logior AW_SLIDE AW_VER_POSITIVE)))
           (hide-style (or window-hide-style
                           (logior AW_HIDE AW_SLIDE AW_VER_NEGATIVE)))
           (animation-count (or animate-count 200))
           (wait-count (or wait 5)))
      (let ((wc (make-WNDCLASSEX)))
        (setf (WNDCLASSEX-cbSize wc) (c-struct-size-of WNDCLASSEX)) 
        (setf (WNDCLASSEX-style wc) (logior CS_HREDRAW CS_VREDRAW))
        (setf (WNDCLASSEX-lpfnWndProc wc) #'animate-window-wndproc)
        (setf (WNDCLASSEX-cbClsExtra wc) 0)
        (setf (WNDCLASSEX-cbWndExtra wc) 0)
        (setf (WNDCLASSEX-hInstance wc) (GetModuleHandle 0))
        (setf (WNDCLASSEX-hIcon wc) (LoadIcon 0 (MAKEINTRESOURCE IDI_APPLICATION)))
        (setf (WNDCLASSEX-hCursor wc) (LoadCursor 0 (MAKEINTRESOURCE IDC_ARROW)))
        (setf (WNDCLASSEX-hbrBackground wc) (CreateSolidBrush (RGB 224 255 255)))
        (setf (WNDCLASSEX-lpszMenuName wc) 0)
        (setf (WNDCLASSEX-lpszClassName wc)
              (si:make-string-chunk animate-window-class))
        (setf (WNDCLASSEX-hIconSm wc) 0)
        (RegisterClassEx wc))
      (let ((hWnd (CreateWindowEx
                     (logior WS_EX_TOOLWINDOW WS_EX_TOPMOST)
                     (si:make-string-chunk animate-window-class)
                     (si:make-string-chunk "Animate-Window")
                     (logior WS_THICKFRAME WS_POPUP)
                     ;;; position-x
                     (cond ((eql position-x-flag :left)
                            (+ (RECT-left rect) position-x)
                            )
                           ((eql position-x-flag :right)
                            (- (RECT-right rect) position-x)
                            ))
                     ;;; position-y
                     (cond ((eql position-y-flag :top)
                            (+ (RECT-top rect) position-y)
                            )
                           ((eql position-y-flag :bottom)
                            (- (RECT-bottom rect) position-y)
                            ))
                     width height
                     0 0
                     (GetModuleHandle 0) 0))
            (clientrect (make-RECT)))
        (GetClientRect hWnd clientrect)
        (ed::run-hook-with-args '*animatewindow-after-parentwindow-hook* hWnd clientrect)
        (AnimateWindow hWnd animation-count show-style)
        (ed::start-timer wait-count #'(lambda ()
                               (funcall 'delete-animate-window
                                        hWnd animation-count hide-style)) t)
        hWnd))))
 
(ed::add-hook '*animatewindow-after-parentwindow-hook*
              'create-child-window)
 
(defun create-child-window (hWnd clientrect)
  (CreateWindowEx
     0
     (si:make-string-chunk "Static")
     (si:make-string-chunk "*Animate Window*")
     (logior WS_BORDER WS_CHILD WS_VISIBLE SS_CENTER)
     (+ (RECT-left clientrect) 5 #|margin x|#)
     (+ (RECT-top clientrect) 5 #|margin y|#)
     (- (- (RECT-right clientrect) (RECT-left clientrect)) 10 #|width|#)
     20 #|height|#
     hWnd
     0
     (GetModuleHandle 0) 0)
  (CreateWindowEx
     0
     (si:make-string-chunk "Static")
     (si:make-string-chunk "動きますぅ〜")
     (logior WS_CHILD WS_VISIBLE SS_CENTER)
     (+ (RECT-top clientrect) 5 #|margin x|#)
     (+ (+ (RECT-top clientrect) 30) 5 #|margin y|#)
     (- (- (RECT-right clientrect) (RECT-left clientrect)) 10 #|width|#)
     60 #|parent window(100) - static[title](30)|#
     hWnd
     0
     (GetModuleHandle 0) 0))
フック関数が出来ました。それとオプションの設定も出来るように。フック関数の方は、一応初期値としてcreate-child-windowが設定されてます。これは必要ないならdelete-hookで削除して、一から子ウィンドウを作成することも可能になってます。例えば次のように
(require "animatewindow")
(delete-hook 'win-user::*animatewindow-after-parentwindow-hook*
             'win-user::create-child-window)
(add-hook 'win-user::*animatewindow-after-parentwindow-hook*
          #'(lambda (hWnd clientrect)
              (let ((height 20) (margin-x 5) (margin-y 5))
              (winapi::CreateWindowEx
                 0
                 (si:make-string-chunk "Static")
                 (si:make-string-chunk "新規文字列〜")
                 (logior winapi::WS_BORDER
                         winapi::WS_CHILD
                         winapi::WS_VISIBLE
                         win-user::SS_RIGHT)
                 (+ (winapi::RECT-left clientrect) margin-x)
                 (- (winapi::RECT-bottom clientrect) (+ height margin-y))
                 (- (- (winapi::RECT-right clientrect)
                       (winapi::RECT-left clientrect)) (* 2 margin-x))
                 height
                 hWnd
                 0
                 (winapi::GetModuleHandle 0)
                 0))))
(create-animate-window
   :window-height 140
   :window-show-style (logior winapi::AW_SLIDE winapi::AW_HOR_POSITIVE)
   :window-hide-style (logior winapi::AW_HIDE winapi::AW_CENTER winapi::AW_BLEND)
   )
という風にすれば、初期値のcreate-child-window関数を削除して、新しく無名関数として子ウィンドウを作成する関数をフック関数に設定して、ウィンドウの高さを140、表示スタイルを画面左側からのスライドアニメーション、非表示のスタイルを徐々に透過する設定にしてウィンドウを表示させる、といったことも可能です。……すんごいめんどうだけど(^^;
はっきり言えばxyzzyからダイアログ作ってた方が楽だよ(笑)<……まぁ、こういう無駄なことは大好きだから私は構わないけど(^^;
$Date: 2005-03-16 00:47:15 +0900 (Wed, 16 Mar 2005) $ $HeadURL: file:///G:/repo/ndiary_log/2005/03/20050315.diary $
ぺーじとっぷへごー

つっこみ

LKPTeam / ykaltenative@mue.biglobe.ne.jp
さいととっぷへごー!