<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0">
   <channel>
      <title>日記 - エドルフ族</title>
      <link>http://www.edolfzoku.com/diary/</link>
      <description>エドルフ族では、フリーソフトの開発・公開、吉里吉里/KAG 関連など、管理人・タロの興味のあることを気ままに扱っていきます。</description>
      <language>ja</language>
      <copyright>Copyright 2008</copyright>
      <lastBuildDate>Sun, 20 Jul 2008 23:33:52 +0900</lastBuildDate>
      <generator>http://www.sixapart.com/movabletype/?v=3.2-ja-2</generator>
      <docs>http://blogs.law.harvard.edu/tech/rss</docs> 

            <item>
         <title>ろくろ</title>
         <description><![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>]]></description>
         <link>http://www.edolfzoku.com/diary/2008/07/post_121.html</link>
         <guid>http://www.edolfzoku.com/diary/2008/07/post_121.html</guid>
         <category>雑記</category>
         <pubDate>Sun, 20 Jul 2008 23:33:52 +0900</pubDate>
      </item>
            <item>
         <title>目覚まし</title>
         <description><![CDATA[聞々ハヤえもんに目覚まし機能（タイマー再生）をつけた。

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

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

○<a href="http://soft.edolfzoku.com/hayaemon2/">聞々ハヤえもん - 再生速度・再生周波数・音程を自由に変更できるMP3プレーヤ</a>]]></description>
         <link>http://www.edolfzoku.com/diary/2008/06/post_120.html</link>
         <guid>http://www.edolfzoku.com/diary/2008/06/post_120.html</guid>
         <category>フリーソフト</category>
         <pubDate>Sun, 22 Jun 2008 15:47:04 +0900</pubDate>
      </item>
            <item>
         <title>別れの曲</title>
         <description><![CDATA[久々に「ファミコンクラシック」を更新した。

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

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

○<a href="http://fami.edolfzoku.com/">ファミコンクラシック - クラシック曲をファミコン音で再現｜MP3フリー素材</a>]]></description>
         <link>http://www.edolfzoku.com/diary/2008/06/post_119.html</link>
         <guid>http://www.edolfzoku.com/diary/2008/06/post_119.html</guid>
         <category>音楽</category>
         <pubDate>Mon, 16 Jun 2008 00:54:29 +0900</pubDate>
      </item>
            <item>
         <title>励み</title>
         <description><![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>

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

はてさて、聞々ハヤえもんは一体どこまで辿り着けるんだろうか。楽しみだ。ちょっと他人事っぽいかな。]]></description>
         <link>http://www.edolfzoku.com/diary/2008/03/post_118.html</link>
         <guid>http://www.edolfzoku.com/diary/2008/03/post_118.html</guid>
         <category>フリーソフト</category>
         <pubDate>Sun, 09 Mar 2008 22:13:55 +0900</pubDate>
      </item>
            <item>
         <title>聞々ハヤえもん</title>
         <description><![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>]]></description>
         <link>http://www.edolfzoku.com/diary/2008/02/post_117.html</link>
         <guid>http://www.edolfzoku.com/diary/2008/02/post_117.html</guid>
         <category>フリーソフト</category>
         <pubDate>Sun, 17 Feb 2008 22:43:26 +0900</pubDate>
      </item>
            <item>
         <title>ターンテーブルコントロール</title>
         <description><![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>]]></description>
         <link>http://www.edolfzoku.com/diary/2008/02/post_116.html</link>
         <guid>http://www.edolfzoku.com/diary/2008/02/post_116.html</guid>
         <category></category>
         <pubDate>Tue, 05 Feb 2008 14:33:18 +0900</pubDate>
      </item>
            <item>
         <title>コメント</title>
         <description>昨日の22時頃、web拍手でコメントをくれた方。

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

というコメントだったんですが、詳細をお待ちしてます。よくわかりませんでした。</description>
         <link>http://www.edolfzoku.com/diary/2008/01/post_115.html</link>
         <guid>http://www.edolfzoku.com/diary/2008/01/post_115.html</guid>
         <category>フリーソフト</category>
         <pubDate>Sun, 27 Jan 2008 14:09:51 +0900</pubDate>
      </item>
            <item>
         <title>音程を0.1単位で弄る</title>
         <description><![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>

楽しい。]]></description>
         <link>http://www.edolfzoku.com/diary/2008/01/01.html</link>
         <guid>http://www.edolfzoku.com/diary/2008/01/01.html</guid>
         <category>フリーソフト</category>
         <pubDate>Sun, 27 Jan 2008 13:32:52 +0900</pubDate>
      </item>
            <item>
         <title>キーボードカスタマイズ機能</title>
         <description><![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>

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

前回終了時の設定内容復元機能は、次のバージョンでつける予定。]]></description>
         <link>http://www.edolfzoku.com/diary/2008/01/post_114.html</link>
         <guid>http://www.edolfzoku.com/diary/2008/01/post_114.html</guid>
         <category>フリーソフト</category>
         <pubDate>Mon, 21 Jan 2008 01:08:00 +0900</pubDate>
      </item>
            <item>
         <title>リストビューのヘッダの幅を変更できないよう固定する</title>
         <description><![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>

より完璧にするとしたら、境界線にマウスが来た際にマウスカーソルが変更されるのも阻止する。]]></description>
         <link>http://www.edolfzoku.com/diary/2008/01/post_113.html</link>
         <guid>http://www.edolfzoku.com/diary/2008/01/post_113.html</guid>
         <category>プログラミング</category>
         <pubDate>Sun, 20 Jan 2008 21:02:15 +0900</pubDate>
      </item>
            <item>
         <title>ホットキーコントロールの入力制限をなくす</title>
         <description><![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>

まあこんな感じ。]]></description>
         <link>http://www.edolfzoku.com/diary/2008/01/post_112.html</link>
         <guid>http://www.edolfzoku.com/diary/2008/01/post_112.html</guid>
         <category>プログラミング</category>
         <pubDate>Sun, 13 Jan 2008 23:36:25 +0900</pubDate>
      </item>
            <item>
         <title>聞々ハヤえもん 2.18 安定版リリース</title>
         <description><![CDATA[キーカスタマイズ機能を追加する前に、2.18 をリリースした。

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

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

キーカスタマイズ機能は１月中には追加したいと思う。]]></description>
         <link>http://www.edolfzoku.com/diary/2008/01/_218.html</link>
         <guid>http://www.edolfzoku.com/diary/2008/01/_218.html</guid>
         <category>フリーソフト</category>
         <pubDate>Sun, 13 Jan 2008 00:59:37 +0900</pubDate>
      </item>
            <item>
         <title>キーカスタマイズ その３</title>
         <description><![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>

あと、それぞれの処理を実装したら完成。]]></description>
         <link>http://www.edolfzoku.com/diary/2008/01/post_111.html</link>
         <guid>http://www.edolfzoku.com/diary/2008/01/post_111.html</guid>
         <category>プログラミング</category>
         <pubDate>Sun, 06 Jan 2008 23:04:44 +0900</pubDate>
      </item>
            <item>
         <title>キーカスタマイズ その２</title>
         <description><![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>

あと、追加/変更ボタンを押した際に表示する画面を作って、それぞれの処理を実装したら完成。]]></description>
         <link>http://www.edolfzoku.com/diary/2008/01/post_110.html</link>
         <guid>http://www.edolfzoku.com/diary/2008/01/post_110.html</guid>
         <category>プログラミング</category>
         <pubDate>Sat, 05 Jan 2008 23:48:50 +0900</pubDate>
      </item>
            <item>
         <title>キーカスタマイズ</title>
         <description><![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の相互変換が可能。]]></description>
         <link>http://www.edolfzoku.com/diary/2008/01/post_109.html</link>
         <guid>http://www.edolfzoku.com/diary/2008/01/post_109.html</guid>
         <category>プログラミング</category>
         <pubDate>Thu, 03 Jan 2008 02:25:44 +0900</pubDate>
      </item>
      
   </channel>
</rss>
