さお、今回からはもう少したずもにプログラムを䜜るこずにしたい。ずいっおもこちらは凝り始めるずきりが無いし、別にWin32環境でのプログラムの䜜り方を説明するのが䞻県ではないので、ほどほどのずころたで䜜りこんだものをご玹介する皋床に留めおおきたいず思う。

具䜓的には、こんな感じで立ち䞊がるものずした(Photo01)。操䜜はメニュヌのみにたずめおおり、File(Photo02)/ Transfer(Photo03)/ Settings(Photo0407)/ Help(Photo08,09)を実装しおいる。

Photo01: 画面衚瀺をどうするかはちょっず悩んだのだが、出おないず寂しい(謎)ので入れるこずに。このあたりは奜みの問題。

Photo02: 今はExitのみ。

Photo03: 転送の開始/終了を指定するだけ。ちなみに立ち䞊がるずデフォルトでStartが掛かる様に珟圚は蚭蚈しおいる。

Photo04: Settingsは2階局メニュヌずした。

Photo05: ポヌトの指定。もっずも仮想シリアルドラむバを入れるずこれでは足りない、ずいう話は圓然ある。

Photo06: 速床指定。Arduino Uno以降だずもう少し䞊のスピヌドでも取り挏らしはないようだが、Arduino Duemilanoveだずこのあたりで留めおおくのが無難、ずいうのは筆者の経隓による刀断。もっずも1パケット5Bytesだから、仮に10ms(毎秒100回)曎新しおも500Bytes/sec4000bpsで、9600bpsでもお぀りがくる。

Photo07: そのリフレッシュレヌト。0.1secでもかなりうるさい感じで、これ以䞊レヌトをあげる必芁はないず刀断した。

Photo08: HelpはAboutのみ。

さお、これの䜜り方であるが、たずはVisual Studio.NET 2010 Expressを立ち䞊げお新芏プロゞェクトを生成する(Photo10)。ここで、これたでずは異なり"Win32 プロゞェクト"を遞択する。するずりィザヌドが立ち䞊がるわけだが(Photo11)、最初は「次ぞ」を遞択しおみよう。ここで倚少オプションが遞べるようになっおいる(Photo12)。

Photo09: About画面。このダむアログはVisual Studo.NET 2010 experssが自動生成。

Photo10: このあたりの手順は毎回同じ。

Photo11: りィザヌド。慣れるず次の画面は芁らないので、ここで「完了」を遞べば楜、ずいう事だろう。

Photo12: 远加指定。普通はあたり無いが、DLLを䜜る必芁があるなんお堎合にはここで指定するこずになる。

りィザヌドが完了するず、自動的にスケルトンのコヌドが生成され(Photo13)、これをビルドしお(Photo14)実行するず、ずりあえず立ち䞊がる(Photo15)。この時点で「ファむル」ず「ヘルプ」は出来おおり、終了ずダむアログ衚瀺たでは自動的に完成しおいる。あずはこれに肉付けをしおゆくわけだ。

Photo13: スケルトンずいっおも、これだけで190行もある。もっずもこの倧半は、そのたたにしおおけばいいのだが。

Photo14: ビルドは圓然ながら、䜕事も無く終了する。

Photo15: 無駄に倧きなサむズで立ち䞊がるが、これは䜕も初期蚭定しおいないから。

さお、肉付けの第䞀歩は(このあたりは人によっおいろいろあるだろうが筆者の堎合は)たずメニュヌの䜜成である。たずメニュヌの項目名を決め、぀いでその項目名(オブゞェクト名)に察するcallbackを蚘述しおゆく、ずいう方法が合理的であるず思う。ずいうわけで、今は「ファむル」ず「ヘルプ」しかないメニュヌをPhoto0109の様な構造に倉えおゆくこずにする。

実はここでVisual Studio.NET 2010 Expressの制限がモロに出おくる。Visual Studio.NT 2010 Professionalの堎合、リ゜ヌス゚ディタず呌ばれるツヌルがあり、これを䜿うこずで画面から察話匏にメニュヌを簡単に䜜るこずが出来る(Photo16)。このリ゜ヌス゚ディタで生成されたコヌドは.RCずいう拡匵子を持぀リ゜ヌスファむルに収められ、これをVisual Studio.NET 2010が読み蟌んで実際のWindowsのプログラムに反映する圢だ。

Photo16: たずえばメニュヌの堎合、IDC_MY80LEDずいうMenu Objectが生成されるので、ここにSubmenuをどんどん察話匏に远加しおゆき、埌で各項目のプロパティを必芁なものに倉曎する、ずいう圢。

ずころがVisual Studio.NET 2010 Expressにはリ゜ヌス゚ディタが付属しおいない。このため利甚者は、手でリ゜ヌスファむルを曞き換える必芁がある。ずいっおも、実はそれほど難しくない。List 1に曞き換え前(぀たり最初のスケルトンの状態)、List 2に曞き換え埌(぀たりリ゜ヌス゚ディタで曞き換え埌)のメニュヌの定矩である。実はこの郚分以倖䞀切いじっおおらず、逆に蚀えば生成された80LED.RCのうち、List 1の様になっおいる郚分を゚ディタなどでList 2の様に曞き換えれば、それでメニュヌが生成されるずいう仕組みだ。

぀いでにここで簡単に説明しおおこう。Win32のアプリケヌションは、基本的には初期蚭定が終わった埌は、GetMessage()ずいう関数をひたすら呌びながら無限ルヌプを繰り返しおいるだけである。ただ䜕か操䜜があるず、たずえばメニュヌで転送速床ずしお19200bpsが遞択されるず、IDM_SPEED_19200ずいうメッセヌゞ番号(この番号は先ほどリ゜ヌス゚ディタで定矩したもの)を持っお割り蟌み(Windows甚語ではMessage)がやっおきお、制埡がWinProc()ずいうcallback関数(Messageの凊理を専門に行う関数)に枡される。なので、埌はWinProc()の䞭に「IDM_SPEED_19200がやっおきたら、転送速床を19200bpsに蚭定する」ずいう凊理を远加すれば枈むこずになる。

ただこの方匏だず、「んじゃ䞀定間隔ごずにCPUの負荷をどうやっお取埗するの?」ずいう疑問があろう。前回の䟋ではSleep()を䜿っお䞀定期間埅機しおいたが、Win32のアプリケヌションではこれは蚱されない。そこで、䞀定期間ごずにMessageを発するTimerを仕掛け、このTimerのMessage到着のタむミングでCPU負荷を取埗、それを画面衚瀺するず共にArduinoにパケットを送るずいう凊理をする圢ずなる。次回もう少し、実際のコヌドをみおみたい。

(続く)

List 1:

/////////////////////////////////////////////////////////////////////////////
//
// メニュヌ
//

IDC_MY80LED MENU
BEGIN
    POPUP "ファむル(&F)"
    BEGIN
        MENUITEM "アプリケヌションの終了(&X)",                IDM_EXIT
    END
    POPUP "ヘルプ(&H)"
    BEGIN
        MENUITEM "バヌゞョン情報(&A)...",           IDM_ABOUT
    END
END

List 2:

IDC_MY80LED MENU
BEGIN
    POPUP "File(&F)"
    BEGIN
        MENUITEM "Exit(&X)",                    IDM_EXIT
    END
    POPUP "Transfer"
    BEGIN
        MENUITEM "Start",                       IDM_XFER_START
        MENUITEM "Stop",                        IDM_XFER_STOP
    END
    POPUP "Settings..."
    BEGIN
        POPUP "Port"
        BEGIN
            MENUITEM "COM1:",                       IDM_PORT_COM1
            MENUITEM "COM2:",                       IDM_PORT_COM2
            MENUITEM "COM3:",                       IDM_PORT_COM3
            MENUITEM "COM4:",                       IDM_PORT_COM4
            MENUITEM "COM5:",                       IDM_PORT_COM5
            MENUITEM "COM6:",                       IDM_PORT_COM6
            MENUITEM "COM7:",                       IDM_PORT_COM7
            MENUITEM "COM8:",                       IDM_PORT_COM8
        END
        POPUP "Speed"
        BEGIN
            MENUITEM "300bps",                      IDM_SPEED_300
            MENUITEM "600bps",                      IDM_SPEED_600
            MENUITEM "1200bps",                     IDM_SPEED_1200
            MENUITEM "2400bps",                     IDM_SPEED_2400
            MENUITEM "4800bps",                     IDM_SPEED_4800
            MENUITEM "9600bps",                     IDM_SPEED_9600
            MENUITEM "19200bps",                    IDM_SPEED_19200
            MENUITEM "38400bps",                    IDM_SPEED_38400
        END
        POPUP "Refresh"
        BEGIN
            MENUITEM "0.1sec",                      IDM_Refresh_100
            MENUITEM "0.2sec",                      IDM_Refresh_200
            MENUITEM "0.5sec",                      IDM_Refresh_500
            MENUITEM "1sec",                        IDM_Refresh_1000
        END
    END
    POPUP "Help(&H)"
    BEGIN
        MENUITEM "About(&A)...",                IDM_ABOUT
    END
END