<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
    <title>日記 - エドルフ族</title>
    <link rel="alternate" type="text/html" href="http://www.edolfzoku.com/diary/" />
    <link rel="self" type="application/atom+xml" href="http://www.edolfzoku.com/diary/atom.xml" />
   <id>tag:www.edolfzoku.com,2008:/diary//1</id>
    <link rel="service.post" type="application/atom+xml" href="http://www.edolfzoku.com/diary/mt-atom.cgi/weblog/blog_id=1" title="日記 - エドルフ族" />
    <updated>2008-07-20T14:36:39Z</updated>
    <subtitle>エドルフ族では、フリーソフトの開発・公開、吉里吉里/KAG 関連など、管理人・タロの興味のあることを気ままに扱っていきます。</subtitle>
    <generator uri="http://www.sixapart.com/movabletype/">Movable Type  3.2-ja-2</generator>
 
<entry>
    <title>ろくろ</title>
    <link rel="alternate" type="text/html" href="http://www.edolfzoku.com/diary/2008/07/post_121.html" />
    <link rel="service.edit" type="application/atom+xml" href="http://www.edolfzoku.com/diary/mt-atom.cgi/weblog/blog_id=1/entry_id=183" title="ろくろ" />
    <id>tag:www.edolfzoku.com,2008:/diary//1.183</id>
    
    <published>2008-07-20T14:33:52Z</published>
    <updated>2008-07-20T14:36:39Z</updated>
    
    <summary>こないだ、職場の同僚とろくろに行った。 初めてろくろ体験をしたんだけど、なかなか...</summary>
    <author>
        <name>タロ</name>
        <uri>http://www.edolfzoku.com/</uri>
    </author>
            <category term="雑記" />
    
    <content type="html" xml:lang="ja" xml:base="http://www.edolfzoku.com/diary/">
        <![CDATA[こないだ、職場の同僚とろくろに行った。

初めてろくろ体験をしたんだけど、なかなか楽しかった。

で、作ったのがコレ。

<a href="http://www.edolfzoku.com/diary/cat.jpg"><img alt="ネコ" src="http://www.edolfzoku.com/diary/cat.jpg" width="240" height="320" /></a>]]>
        
    </content>
</entry>
<entry>
    <title>目覚まし</title>
    <link rel="alternate" type="text/html" href="http://www.edolfzoku.com/diary/2008/06/post_120.html" />
    <link rel="service.edit" type="application/atom+xml" href="http://www.edolfzoku.com/diary/mt-atom.cgi/weblog/blog_id=1/entry_id=181" title="目覚まし" />
    <id>tag:www.edolfzoku.com,2008:/diary//1.181</id>
    
    <published>2008-06-22T06:47:04Z</published>
    <updated>2008-07-20T15:31:41Z</updated>
    
    <summary>聞々ハヤえもんに目覚まし機能（タイマー再生）をつけた。 さて、明日の朝はこれで起...</summary>
    <author>
        <name>タロ</name>
        <uri>http://www.edolfzoku.com/</uri>
    </author>
            <category term="フリーソフト" />
    
    <content type="html" xml:lang="ja" xml:base="http://www.edolfzoku.com/diary/">
        <![CDATA[聞々ハヤえもんに目覚まし機能（タイマー再生）をつけた。

さて、明日の朝はこれで起きてみようかな。

……もし、鳴らなかったらどうしようとか考え出したら、寝つけなくなりそうだ(笑)

○<a href="http://soft.edolfzoku.com/hayaemon2/">聞々ハヤえもん - 再生速度・再生周波数・音程を自由に変更できるMP3プレーヤ</a>]]>
        
    </content>
</entry>
<entry>
    <title>別れの曲</title>
    <link rel="alternate" type="text/html" href="http://www.edolfzoku.com/diary/2008/06/post_119.html" />
    <link rel="service.edit" type="application/atom+xml" href="http://www.edolfzoku.com/diary/mt-atom.cgi/weblog/blog_id=1/entry_id=179" title="別れの曲" />
    <id>tag:www.edolfzoku.com,2008:/diary//1.179</id>
    
    <published>2008-06-15T15:54:29Z</published>
    <updated>2008-06-22T06:54:00Z</updated>
    
    <summary>久々に「ファミコンクラシック」を更新した。 今回アップしたのは、ショパンの「別れ...</summary>
    <author>
        <name>タロ</name>
        <uri>http://www.edolfzoku.com/</uri>
    </author>
            <category term="音楽" />
    
    <content type="html" xml:lang="ja" xml:base="http://www.edolfzoku.com/diary/">
        <![CDATA[久々に「ファミコンクラシック」を更新した。

今回アップしたのは、ショパンの「別れの曲」。えぇ、ショパン好きですよ。

それにしても、スローテンポの曲はファミコンの音にしてもあんまり良くならないなぁ。ピアノには勝てない。

○<a href="http://fami.edolfzoku.com/">ファミコンクラシック - クラシック曲をファミコン音で再現｜MP3フリー素材</a>]]>
        
    </content>
</entry>
<entry>
    <title>励み</title>
    <link rel="alternate" type="text/html" href="http://www.edolfzoku.com/diary/2008/03/post_118.html" />
    <link rel="service.edit" type="application/atom+xml" href="http://www.edolfzoku.com/diary/mt-atom.cgi/weblog/blog_id=1/entry_id=178" title="励み" />
    <id>tag:www.edolfzoku.com,2008:/diary//1.178</id>
    
    <published>2008-03-09T13:13:55Z</published>
    <updated>2008-03-09T13:46:56Z</updated>
    
    <summary>聞々ハヤえもんが、Vectorで紹介された。 聞々ハヤえもん - ベクターソフト...</summary>
    <author>
        <name>タロ</name>
        <uri>http://www.edolfzoku.com/</uri>
    </author>
            <category term="フリーソフト" />
    
    <content type="html" xml:lang="ja" xml:base="http://www.edolfzoku.com/diary/">
        <![CDATA[聞々ハヤえもんが、Vectorで紹介された。

聞々ハヤえもん - ベクターソフトニュース：<a href="http://www.vector.co.jp/magazine/softnews/080223/n0802231.html">http://www.vector.co.jp/magazine/softnews/080223/n0802231.html</a>

こんな風に冷静な文章で評価されるってのも嬉しいもんだ。励みになる。

はてさて、聞々ハヤえもんは一体どこまで辿り着けるんだろうか。楽しみだ。ちょっと他人事っぽいかな。]]>
        
    </content>
</entry>
<entry>
    <title>聞々ハヤえもん</title>
    <link rel="alternate" type="text/html" href="http://www.edolfzoku.com/diary/2008/02/post_117.html" />
    <link rel="service.edit" type="application/atom+xml" href="http://www.edolfzoku.com/diary/mt-atom.cgi/weblog/blog_id=1/entry_id=177" title="聞々ハヤえもん" />
    <id>tag:www.edolfzoku.com,2008:/diary//1.177</id>
    
    <published>2008-02-17T13:43:26Z</published>
    <updated>2008-02-17T13:55:23Z</updated>
    
    <summary>聞々ハヤえもんが、「Vector」の新着ソフトレビューで紹介されることになった。...</summary>
    <author>
        <name>タロ</name>
        <uri>http://www.edolfzoku.com/</uri>
    </author>
            <category term="フリーソフト" />
    
    <content type="html" xml:lang="ja" xml:base="http://www.edolfzoku.com/diary/">
        <![CDATA[聞々ハヤえもんが、「Vector」の新着ソフトレビューで紹介されることになった。そこで、「ソフト作者からひとこと」というコーナーの原稿執筆を依頼された。

あらためて考えてみると、「聞々ハヤえもん」というソフト名の由来をどこにも書いたことがなかったことに気づく。原稿の中で、ソフト名に関して書いておいたので、ここに引用しておく。

<blockquote>まず何よりも初めに考えたのが、ソフト名。なるべく覚えやすく、親しみの持てる名前という事で、考えに考え抜いた結果、「聞々ハヤえもん（ぶんぶんはやえもん）」という名前をつけました。「聞々（ぶんぶん）」というのは再生速度を変更できる事にちなんで、スピード感を擬音語で表しつつ、「聞く」という漢字を用いる事によりサウンドプレーヤだという事をアピールしています。</blockquote>

聞々ハヤえもんの紹介記事は、下記ページに２月２３日（土）より掲載されるらしい。

「Vector」の新着ソフトレビュー：<a href="http://www.vector.co.jp/magazine/softnews/">http://www.vector.co.jp/magazine/softnews/</a>

○<a href="http://soft.edolfzoku.com/hayaemon2/">聞々ハヤえもん - 再生速度・再生周波数・音程を自由に変更できるMP3プレーヤ</a>]]>
        
    </content>
</entry>
<entry>
    <title>ターンテーブルコントロール</title>
    <link rel="alternate" type="text/html" href="http://www.edolfzoku.com/diary/2008/02/post_116.html" />
    <link rel="service.edit" type="application/atom+xml" href="http://www.edolfzoku.com/diary/mt-atom.cgi/weblog/blog_id=1/entry_id=176" title="ターンテーブルコントロール" />
    <id>tag:www.edolfzoku.com,2008:/diary//1.176</id>
    
    <published>2008-02-05T05:33:18Z</published>
    <updated>2008-02-05T05:39:06Z</updated>
    
    <summary>聞々ハヤえもんに「ターンテーブルコントロール」という機能をつけるべく、開発中。 ...</summary>
    <author>
        <name>タロ</name>
        <uri>http://www.edolfzoku.com/</uri>
    </author>
    
    <content type="html" xml:lang="ja" xml:base="http://www.edolfzoku.com/diary/">
        <![CDATA[聞々ハヤえもんに「ターンテーブルコントロール」という機能をつけるべく、開発中。

表示→ターンテーブルコントロールを選ぶと、レコードプレーヤーが表示されて、そこをマウスでドラッグすると、DJのようにきゅるきゅるとスクラッチができる機能。

<a href="http://www.edolfzoku.com/diary/TurnTableCtrl.png"><img alt="ターンテーブルコントロール" src="http://www.edolfzoku.com/diary/TurnTableCtrl.png" width="392" height="310" /></a>

見た目、しょぼっ(笑)

○<a href="http://soft.edolfzoku.com/hayaemon2/">聞々ハヤえもん - 再生速度・再生周波数・音程を自由に変更できるMP3プレーヤ</a>]]>
        
    </content>
</entry>
<entry>
    <title>コメント</title>
    <link rel="alternate" type="text/html" href="http://www.edolfzoku.com/diary/2008/01/post_115.html" />
    <link rel="service.edit" type="application/atom+xml" href="http://www.edolfzoku.com/diary/mt-atom.cgi/weblog/blog_id=1/entry_id=175" title="コメント" />
    <id>tag:www.edolfzoku.com,2008:/diary//1.175</id>
    
    <published>2008-01-27T05:09:51Z</published>
    <updated>2008-01-27T05:13:25Z</updated>
    
    <summary>昨日の22時頃、web拍手でコメントをくれた方。 「プレイリストの曲をクリックし...</summary>
    <author>
        <name>タロ</name>
        <uri>http://www.edolfzoku.com/</uri>
    </author>
            <category term="フリーソフト" />
    
    <content type="html" xml:lang="ja" xml:base="http://www.edolfzoku.com/diary/">
        昨日の22時頃、web拍手でコメントをくれた方。

「プレイリストの曲をクリックした時音が鳴るのは何とかできないでしょうか」

というコメントだったんですが、詳細をお待ちしてます。よくわかりませんでした。
        
    </content>
</entry>
<entry>
    <title>音程を0.1単位で弄る</title>
    <link rel="alternate" type="text/html" href="http://www.edolfzoku.com/diary/2008/01/01.html" />
    <link rel="service.edit" type="application/atom+xml" href="http://www.edolfzoku.com/diary/mt-atom.cgi/weblog/blog_id=1/entry_id=174" title="音程を0.1単位で弄る" />
    <id>tag:www.edolfzoku.com,2008:/diary//1.174</id>
    
    <published>2008-01-27T04:32:52Z</published>
    <updated>2008-01-27T05:00:51Z</updated>
    
    <summary>聞々ハヤえもん 2.19 β 5 で、音程を0.1単位で弄れるようにした。 ○聞...</summary>
    <author>
        <name>タロ</name>
        <uri>http://www.edolfzoku.com/</uri>
    </author>
            <category term="フリーソフト" />
    
    <content type="html" xml:lang="ja" xml:base="http://www.edolfzoku.com/diary/">
        <![CDATA[聞々ハヤえもん 2.19 β 5 で、音程を0.1単位で弄れるようにした。

○<a href="http://soft.edolfzoku.com/hayaemon2/">聞々ハヤえもん - 再生速度・再生周波数・音程を自由に変更できるMP3プレーヤ</a>

<a href="http://www.edolfzoku.com/diary/hiraiken.png"><img alt="平井堅" src="http://www.edolfzoku.com/diary/hiraiken.png" width="392" height="342" /></a>

楽しい。]]>
        
    </content>
</entry>
<entry>
    <title>キーボードカスタマイズ機能</title>
    <link rel="alternate" type="text/html" href="http://www.edolfzoku.com/diary/2008/01/post_114.html" />
    <link rel="service.edit" type="application/atom+xml" href="http://www.edolfzoku.com/diary/mt-atom.cgi/weblog/blog_id=1/entry_id=173" title="キーボードカスタマイズ機能" />
    <id>tag:www.edolfzoku.com,2008:/diary//1.173</id>
    
    <published>2008-01-20T16:08:00Z</published>
    <updated>2008-01-20T16:16:03Z</updated>
    
    <summary>聞々ハヤえもん 2.19 β 1 で、キーボードカスタマイズ機能を追加した。 ふ...</summary>
    <author>
        <name>タロ</name>
        <uri>http://www.edolfzoku.com/</uri>
    </author>
            <category term="フリーソフト" />
    
    <content type="html" xml:lang="ja" xml:base="http://www.edolfzoku.com/diary/">
        <![CDATA[聞々ハヤえもん 2.19 β 1 で、キーボードカスタマイズ機能を追加した。

<a href="http://www.edolfzoku.com/diary/shortcut2.png"><img alt="shortcut2.png" src="http://www.edolfzoku.com/diary/shortcut2.png" width="392" height="342" /></a>

ふう、なかなか手こずった。

前回終了時の設定内容復元機能は、次のバージョンでつける予定。]]>
        
    </content>
</entry>
<entry>
    <title>リストビューのヘッダの幅を変更できないよう固定する</title>
    <link rel="alternate" type="text/html" href="http://www.edolfzoku.com/diary/2008/01/post_113.html" />
    <link rel="service.edit" type="application/atom+xml" href="http://www.edolfzoku.com/diary/mt-atom.cgi/weblog/blog_id=1/entry_id=172" title="リストビューのヘッダの幅を変更できないよう固定する" />
    <id>tag:www.edolfzoku.com,2008:/diary//1.172</id>
    
    <published>2008-01-20T12:02:15Z</published>
    <updated>2008-01-20T12:11:37Z</updated>
    
    <summary>リストビューの列項目でユーザーに見せたくない項目がある場合、リストビューのヘッダ...</summary>
    <author>
        <name>タロ</name>
        <uri>http://www.edolfzoku.com/</uri>
    </author>
            <category term="プログラミング" />
    
    <content type="html" xml:lang="ja" xml:base="http://www.edolfzoku.com/diary/">
        <![CDATA[リストビューの列項目でユーザーに見せたくない項目がある場合、リストビューのヘッダの幅を 0 で固定する必要がある。リストビューのヘッダの幅を固定するには、リストビューをサブクラス化し、WM_NOTIFYとしてHDN_BEGINTRACK, HDN_DIVIDERDBLCLICK が飛んできた場合に TRUE を返す。ただし、環境によっては UNICODE 環境じゃないのに HDN_BEGINTRACKW, HDN_DIVIDERDBLCLICKW が飛んでくる事があるので、HDN_BEGINTRACKW, HDN_BEGINTRACKA, HDN_DIVIDERDBLCLICKW, HDN_DIVIDERDBLCLICKA を全て禁止する。

<blockquote>LRESULT OnNotify(int idFrom, NMHDR* pnmhdr)<br />
{<br />
&nbsp;&nbsp;&nbsp;&nbsp;// ヘッダの幅を変更できないようにする<br />
&nbsp;&nbsp;&nbsp;&nbsp;// UNICODE環境じゃなくてもHDN_*Wが飛んでくる場合があるようなので、<br />
&nbsp;&nbsp;&nbsp;&nbsp;// HDN_*A, HDN_*W 両方とも禁止<br />
&nbsp;&nbsp;&nbsp;&nbsp;HD_NOTIFY * phdn = (HD_NOTIFY *)pnmhdr;<br />
&nbsp;&nbsp;&nbsp;&nbsp;switch(phdn->hdr.code)<br />
&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;case HDN_BEGINTRACKA:<br />
&nbsp;&nbsp;&nbsp;&nbsp;case HDN_BEGINTRACKW:<br />
&nbsp;&nbsp;&nbsp;&nbsp;case HDN_DIVIDERDBLCLICKA:<br />
&nbsp;&nbsp;&nbsp;&nbsp;case HDN_DIVIDERDBLCLICKW:<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(phdn->iItem == 1)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return TRUE;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;return CListView::OnNotify(idFrom, pnmhdr);<br />
}</blockquote>

より完璧にするとしたら、境界線にマウスが来た際にマウスカーソルが変更されるのも阻止する。]]>
        
    </content>
</entry>
<entry>
    <title>ホットキーコントロールの入力制限をなくす</title>
    <link rel="alternate" type="text/html" href="http://www.edolfzoku.com/diary/2008/01/post_112.html" />
    <link rel="service.edit" type="application/atom+xml" href="http://www.edolfzoku.com/diary/mt-atom.cgi/weblog/blog_id=1/entry_id=171" title="ホットキーコントロールの入力制限をなくす" />
    <id>tag:www.edolfzoku.com,2008:/diary//1.171</id>
    
    <published>2008-01-13T14:36:25Z</published>
    <updated>2008-01-20T12:12:37Z</updated>
    
    <summary>ホットキーコントロールには入力制限があり、スペース、エンター、タブキーなどを受け...</summary>
    <author>
        <name>タロ</name>
        <uri>http://www.edolfzoku.com/</uri>
    </author>
            <category term="プログラミング" />
    
    <content type="html" xml:lang="ja" xml:base="http://www.edolfzoku.com/diary/">
        <![CDATA[ホットキーコントロールには入力制限があり、スペース、エンター、タブキーなどを受け付けてくれない。これを解除しようとすると、ホットキーコントロールをサブクラス化して、WM_KEYDOWNメッセージが飛んできた際にHKM_SETHOTKEYをホットキーコントロールに対して投げてやる必要がある。

<blockquote>virtual void OnKeyDown(UINT vk, int cRepeat, UINT flags)<br />
{<br />
&nbsp;&nbsp;&nbsp;&nbsp;if(vk == VK_RETURN || vk == VK_TAB || vk == VK_SPACE || vk == VK_DELETE || vk == VK_ESCAPE || vk == VK_BACK)<br />
&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SendMessage(m_hWnd, HKM_SETHOTKEY, MAKEWORD(vk, HIBYTE(SendMessage(m_hWnd, HKM_GETHOTKEY, 0, 0))), 0);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;CHotKeyCtrl::OnKeyDown(vk, cRepeat, flags);<br />
}</blockquote>

まあこんな感じ。]]>
        
    </content>
</entry>
<entry>
    <title>聞々ハヤえもん 2.18 安定版リリース</title>
    <link rel="alternate" type="text/html" href="http://www.edolfzoku.com/diary/2008/01/_218.html" />
    <link rel="service.edit" type="application/atom+xml" href="http://www.edolfzoku.com/diary/mt-atom.cgi/weblog/blog_id=1/entry_id=170" title="聞々ハヤえもん 2.18 安定版リリース" />
    <id>tag:www.edolfzoku.com,2008:/diary//1.170</id>
    
    <published>2008-01-12T15:59:37Z</published>
    <updated>2008-01-12T16:04:30Z</updated>
    
    <summary>キーカスタマイズ機能を追加する前に、2.18 をリリースした。 2.18では、速...</summary>
    <author>
        <name>タロ</name>
        <uri>http://www.edolfzoku.com/</uri>
    </author>
            <category term="フリーソフト" />
    
    <content type="html" xml:lang="ja" xml:base="http://www.edolfzoku.com/diary/">
        <![CDATA[キーカスタマイズ機能を追加する前に、2.18 をリリースした。

2.18では、速度/周波数が0.1%単位で指定できるようになったり、「古びたレコード再生」機能がついたりと、なかなか便利になった。

○<a href="http://soft.edolfzoku.com/hayaemon2/">聞々ハヤえもん - 再生速度・再生周波数・音程を自由に変更できるMP3プレーヤ</a>

キーカスタマイズ機能は１月中には追加したいと思う。]]>
        
    </content>
</entry>
<entry>
    <title>キーカスタマイズ その３</title>
    <link rel="alternate" type="text/html" href="http://www.edolfzoku.com/diary/2008/01/post_111.html" />
    <link rel="service.edit" type="application/atom+xml" href="http://www.edolfzoku.com/diary/mt-atom.cgi/weblog/blog_id=1/entry_id=169" title="キーカスタマイズ その３" />
    <id>tag:www.edolfzoku.com,2008:/diary//1.169</id>
    
    <published>2008-01-06T14:04:44Z</published>
    <updated>2008-01-06T14:06:53Z</updated>
    
    <summary>追加/変更ボタンを押した際に表示する画面を作った。 あと、それぞれの処理を実装し...</summary>
    <author>
        <name>タロ</name>
        <uri>http://www.edolfzoku.com/</uri>
    </author>
            <category term="プログラミング" />
    
    <content type="html" xml:lang="ja" xml:base="http://www.edolfzoku.com/diary/">
        <![CDATA[追加/変更ボタンを押した際に表示する画面を作った。

<a href="http://www.edolfzoku.com/diary/shortcut2.png"><img alt="shortcut2.png" src="http://www.edolfzoku.com/diary/shortcut2.png" width="392" height="342" /></a>

あと、それぞれの処理を実装したら完成。]]>
        
    </content>
</entry>
<entry>
    <title>キーカスタマイズ その２</title>
    <link rel="alternate" type="text/html" href="http://www.edolfzoku.com/diary/2008/01/post_110.html" />
    <link rel="service.edit" type="application/atom+xml" href="http://www.edolfzoku.com/diary/mt-atom.cgi/weblog/blog_id=1/entry_id=168" title="キーカスタマイズ その２" />
    <id>tag:www.edolfzoku.com,2008:/diary//1.168</id>
    
    <published>2008-01-05T14:48:50Z</published>
    <updated>2008-01-05T14:57:51Z</updated>
    
    <summary>キーカスタマイズ用の画面を作った。 あと、追加/変更ボタンを押した際に表示する画...</summary>
    <author>
        <name>タロ</name>
        <uri>http://www.edolfzoku.com/</uri>
    </author>
            <category term="プログラミング" />
    
    <content type="html" xml:lang="ja" xml:base="http://www.edolfzoku.com/diary/">
        <![CDATA[キーカスタマイズ用の画面を作った。

<a href="http://www.edolfzoku.com/diary/shortcut.png"><img alt="shortcut.png" src="http://www.edolfzoku.com/diary/shortcut.png" width="392" height="342" /></a>

あと、追加/変更ボタンを押した際に表示する画面を作って、それぞれの処理を実装したら完成。]]>
        
    </content>
</entry>
<entry>
    <title>キーカスタマイズ</title>
    <link rel="alternate" type="text/html" href="http://www.edolfzoku.com/diary/2008/01/post_109.html" />
    <link rel="service.edit" type="application/atom+xml" href="http://www.edolfzoku.com/diary/mt-atom.cgi/weblog/blog_id=1/entry_id=167" title="キーカスタマイズ" />
    <id>tag:www.edolfzoku.com,2008:/diary//1.167</id>
    
    <published>2008-01-02T17:25:44Z</published>
    <updated>2008-01-05T14:49:54Z</updated>
    
    <summary>管理者IDとパスワードを忘れない為に、早速日記を書く。 年末から更新してきた聞々...</summary>
    <author>
        <name>タロ</name>
        <uri>http://www.edolfzoku.com/</uri>
    </author>
            <category term="プログラミング" />
    
    <content type="html" xml:lang="ja" xml:base="http://www.edolfzoku.com/diary/">
        <![CDATA[管理者IDとパスワードを忘れない為に、早速日記を書く。

年末から更新してきた聞々ハヤえもんだが、そろそろキーカスタマイズ機能をつけることにする。以下の流れで開発を行っていく。

(１)動的にアクセラレータテーブルを管理する CAcceleratorTable クラスを作る。
※メンバ関数として、Create, Destroy, Add, Delete 関数を持つ。

(２)キーボードショートカットの選択にホットキーコントロールの使用を考えている為、CHotKeyCtrl クラスを作る。
※デフォルトのホットキーコントロールでは、スペースキー等入力不可なキーがあるのでサブクラス化できるようにしておく事。

(３)キーカスタマイズ用ウィンドウを管理する CKeySettingWnd_MainWnd クラスを作る。
※CFrameWnd クラスを継承する事。

(４)「システム→キー操作」メニューを追加。
※修正対象は、CMenu_MainWnd クラスと CMainWnd クラス。

これが済んだらホットキーに対応して、ウィンドウが非アクティブな場合でも操作ができるようにする。

さーて、作るぞ。

というわけで、まず、「(１)動的にアクセラレータテーブルを管理する CAcceleratorTable クラス」を書いてみた。

<blockquote>//----------------------------------------------------------------------------<br />
// AcceleratorTable.h : アクセラレータテーブルの管理を行う<br />
//----------------------------------------------------------------------------<br />
#ifndef AcceleratorTableH<br />
#define AcceleratorTableH<br />
<br />
#include &lt;windows.h&gt;<br />
//----------------------------------------------------------------------------<br />
// アクセラレータテーブルの管理を行うクラス<br />
//----------------------------------------------------------------------------<br />
class CAcceleratorTable<br />
{<br />
public: // 関数<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;CAcceleratorTable() : m_hAccel(0) { }<br />
&nbsp;&nbsp;&nbsp;&nbsp;virtual ~CAcceleratorTable() { Destroy(); }<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;virtual BOOL Add(BYTE fVirt, WORD key, WORD cmd)<br />
&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// ハンドルが存在しない場合は新たに作成する<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(!m_hAccel)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ACCEL accel[1];<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ZeroMemory(&accel, sizeof(ACCEL));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;accel[0].fVirt = fVirt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;accel[0].key = key;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;accel[0].cmd = cmd;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Create(accel, 1);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int nAccel = GetNum();<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ACCEL * pAccel = new ACCEL[nAccel + 1];<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Copy(pAccel, nAccel);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pAccel[nAccel].fVirt = fVirt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pAccel[nAccel].key = key;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pAccel[nAccel].cmd = cmd;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Create(pAccel, nAccel + 1);<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;delete [] pAccel;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return m_hAccel ? TRUE : FALSE;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;virtual int Copy(LPACCEL lpAccelDst, int cAccelEntries)<br />
&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(!m_hAccel) return 0;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return CopyAcceleratorTable(m_hAccel, lpAccelDst, cAccelEntries);<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;virtual BOOL Create(LPACCEL pAccel, int nAccel)<br />
&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Destroy();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;m_hAccel = CreateAcceleratorTable(pAccel, nAccel);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return m_hAccel ? TRUE : FALSE;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;virtual BOOL Delete(BYTE fVirt, WORD key, WORD cmd)<br />
&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(!m_hAccel) return FALSE;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int nAccel = GetNum();<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ACCEL * pAccel = new ACCEL[nAccel];<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Copy(pAccel, nAccel);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;BOOL bFound = FALSE; // 同じエントリが見つかったかどうか<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for(int i = 0; i < nAccel; i++)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(pAccel[i].fVirt == fVirt && pAccel[i].key == key && pAccel[i].cmd == cmd)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bFound = TRUE;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(bFound) // 見つかったら、１つずつ前に移動<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pAccel[i].fVirt = pAccel[i + 1].fVirt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pAccel[i].key = pAccel[i + 1].key;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pAccel[i].cmd = pAccel[i + 1].cmd;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(bFound) Create(pAccel, nAccel - 1);<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;delete [] pAccel;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return m_hAccel ? TRUE : FALSE;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;virtual BOOL Destroy()<br />
&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;BOOL bSuccess = FALSE;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(m_hAccel)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bSuccess = DestroyAcceleratorTable(m_hAccel);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;m_hAccel = 0;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return bSuccess;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;// エントリ数を得る<br />
&nbsp;&nbsp;&nbsp;&nbsp;virtual int GetNum() { return Copy(NULL, 0); }<br />
<br />
private: // メンバ変数<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;HACCEL m_hAccel;<br />
<br />
public: // メンバ変数の取得<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;operator HACCEL() const { return m_hAccel; }<br />
};<br />
//----------------------------------------------------------------------------<br />
<br />
#endif</blockquote>

これで、動的にアクセラレータテーブルを管理する事ができる。

次。「(２)キーボードショートカットの選択にホットキーコントロールの使用を考えている為、CHotKeyCtrl クラス」を作る。まあ、今までのコントロールと同じイメージ。

<blockquote>//----------------------------------------------------------------------------<br />
// HotKeyCtrl.h : ホットキーコントロールの管理を行う<br />
//----------------------------------------------------------------------------<br />
#ifndef HotKeyCtrlH<br />
#define HotKeyCtrlH<br />
<br />
#include &lt;commctrl.h&gt;<br />
#include "Wnd.h"<br />
//----------------------------------------------------------------------------<br />
// ホットキーコントロールの管理を行うクラス<br />
//----------------------------------------------------------------------------<br />
class CHotKeyCtrl : public CWnd<br />
{<br />
public: // 関数<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;CHotKeyCtrl() { }<br />
&nbsp;&nbsp;&nbsp;&nbsp;virtual ~CHotKeyCtrl() { }<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;virtual BOOL Create(HWND hParentWnd)<br />
&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Destroy();<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;INITCOMMONCONTROLSEX ic;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ic.dwSize = sizeof(INITCOMMONCONTROLSEX);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ic.dwICC = ICC_HOTKEY_CLASS;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;InitCommonControlsEx(&ic);<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;m_hWnd = CreateWindow(HOTKEY_CLASS, "", WS_CHILD, CW_USEDEFAULT,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;hParentWnd, 0, GetModuleHandle(NULL), NULL);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(!m_hWnd) return FALSE;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SetProc();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return TRUE;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
};<br />
//----------------------------------------------------------------------------<br />
<br />
#endif</blockquote>

実際に使うホットキーコントロールは、こいつを継承して作る。

次。「(３)キーカスタマイズ用ウィンドウを管理する CKeySettingWnd_MainWnd クラス」を作る。

キーカスタマイズ用ウィンドウには、ショートカット羅列用のリストビューと追加ボタン、変更ボタン、デフォルトの復元ボタン、ＯＫボタン、キャンセルボタンがある。追加ボタン、変更ボタンを押すと、ショートカット入力用の別ウィンドウが表示される。ショートカット入力用ウィンドウには、コマンド選択用コンボボックス、ホットキーコントロール、ＯＫボタン、キャンセルボタンがある。

コマンド名については、キーカスタマイズ用ウィンドウが管理する。GetCommandName関数を持っており、ID→コマンド名、コマンド名→IDの相互変換が可能。]]>
        
    </content>
</entry>

</feed> 

