クリス・クラフト C#
オリジナルはこちらです。
私はデザイナーではありませんが、前述のように、アプリケーションは魅力的に見えるはずです。 そのため、GPSコンパスについては、 ウィキメディアで非常に良い無料の画像を見つけました。 設計の基礎が選択されたとき、GPSデータを取得するメカニズムを決定することは残っています。 次のオプションが利用できました。
- シリアルポート経由でデータを受信する
- OpenNetCF GPSライブラリを使用
- GPS Intermediate Driverを使用する
私は3番目のオプションに決めました それはまったく新しいものであり、ドキュメントにあるように、「それは便利です。なぜなら、 GPSデバイスのメーカーと開発者の間の中間レベルの抽象化を提供します。」 同じように機器を製造する人はいません-常に機能と落とし穴があります。
アプリケーションをテストするために、GPSデバイスが必要であり、1つ(AT&T Tilt)もありましたが、残念ながら、部屋では信号レベルがゼロになる傾向がありました。 幸いなことに、Microsoftは私の目的にぴったりのFakeGPSユーティリティを見つけました。 このユーティリティは、GPSデータを含むテキストファイルを使用して、実際のGPS受信機の機能をエミュレートします。
ドキュメントで、私はすぐに必要なもの、 つまりGPS_POSITION構造の説明を発見しました。 単純なアプリケーションでは、度単位でflHeadingフィールドを1つだけ必要としました。 北はゼロです。
この段階で、例のWindows Mobile 6 SDKを完了し、GPSアプリケーションを見つけました-C:\ Program Files \ Windows Mobile 6 SDK \ Samples \ PocketPC \ CS \ GPS
もちろん、すべてをゼロから書くこともできましたが、もう一度繰り返します。常に既存の経験を最大限に活用するようにしてください。
アプリケーションには良好なステータス画面があり、その呼び出しはメニューで行いました。 ただし、アプリケーションの主要コンポーネントは、もちろん、上のスクリーンショットに表示されています。 原則として、この例に基づいて、GPSを使用するアプリケーションを作成できます。
ソースコードをダウンロードします 。
ご注意 翻訳者:クリスは記事でコード例を提供することを好みません。プロジェクトのソースコードを含むファイルへのリンクをすぐに提供することを好みます。 ただし、関連する場合は、特に興味深い挿入を行うことができます。 GPSコンパスの場合、コードを引用することは無意味です。なぜなら、 少なすぎるか多すぎることが判明します。 1つ言います。クリスが手元にSDKアプリケーションを持っていなかったら、彼はそれ以来多くの苦しみを覚えていたでしょう この例には、ネイティブ構造、列挙、およびメソッドのすべてのラッパーが含まれています。この例は、大きく複雑な構造をマーシャリングする機能の研究にも適しています。
クリストファーフェアベアン WinAPI-C
Windows Mobile 5以降には、 GPS Intermediate Driverという統合されたAPIがあります。これにより、多くのアプリケーションが1つのGPSデバイスを同時に使用できるようになります。 これは高レベルのインターフェースであり、 NEMAセンテンスなどを解析する必要がありません 。
GPSデバイスに接続するには、gpsapi.hを接続してGPSOpenDeviceを呼び出す必要があります
// GPS Intermediate Driver <br/>
HANDLE hGPS = GPSOpenDevice(NULL, NULL, NULL, 0);
* This source code was highlighted with Source Code Highlighter .
このAPI はリンクを考慮します 。これは、GPSOpenDeviceへのすべての呼び出しに終了GPSCloseDeviceが必要であることを意味します。 GPS機器は、最後のクライアントが接続を完了したときにのみオフになります。
次に、情報については、 GPSGetPositionメソッドまたはGPSGetDeviceStateメソッドを使用して、デバイスの位置またはステータスをそれぞれ取得します。 たとえば、現在の場所を取得するには、次のコードを使用できます。
GPS_POSITION pos;<br> <br> // <br>memset(&pos, 0, sizeof (pos));<br>pos.dwVersion = GPS_VERSION_CURRENT;<br>pos.dwSize = sizeof (pos);<br> <br> // GPS intermediate driver <br> // . <br>GPSGetPosition(hGPS, &pos, 500000, 0); <br><br> * This source code was highlighted with Source Code Highlighter .
GPS_POSITION構造体にはdwValidFlagsフィールドが含まれていることに注意してください。 これは、どのフィールドに正しい情報が含まれているかを示すビットマスクです。 たとえば、GPS_VALID_LATITUDEフラグがフィールドに設定されていない場合、これはdblLatitudeフィールドに依存できないことを意味します。
GPSコンパスでは、1つの興味深い機能を使用します。 2つのイベントハンドラーをパラメーターとしてGPSOpenDeviceメソッドに渡すことにより、GPSGetPositionを使用してデバイスを定期的にポーリングする必要がなくなります。 代わりに、このイベントまたはそのイベントが発生するまで待機し、以前に取得した値とは異なるデータを受信することを保証します。
メニューを作成します。
これは、メニューを必要とする最初のアプリケーションです。 メニューはリソースエディターで作成され、 SHCreateMenuBarを使用して読み込まれます。 このメソッドの呼び出しは通常、 WM_INITDIALOGハンドラーに配置されます。
case WM_INITDIALOG:<br> // Configure the menu <br> SHMENUBARINFO mbi;<br> memset(&mbi, 0, sizeof (mbi));<br> mbi.cbSize = sizeof (mbi);<br> mbi.hWndParent = hWnd; // the dialog's handle <br> mbi.nToolBarId = IDR_MENU; // the menu resource id <br> mbi.hInstRes = GetModuleHandle(NULL);<br> mbi.dwFlags = SHCMBF_HMENU;<br> <br> // Create the menu <br> SHCreateMenuBar(&mbi);<br> break ; <br><br> * This source code was highlighted with Source Code Highlighter .
次に、メニュー項目とやり取りするためのAPIの完全なセットがあります 。 たとえば、 EnableMenuItemを使用して特定のアイテムをアクティブまたは非アクティブにできます。
// Disable a menu item with id 'IDC_SOME_ITEM' <br>EnableMenuItem(hMenu, IDC_SOME_ITEM,<br> MF_BYCOMMAND | MF_GRAYED);<br> <br> // Enable a menu item with id 'IDC_SOME_ITEM' <br>EnableMenuItem(hMenu, IDC_SOME_ITEM,<br> MF_BYCOMMAND | MF_ENABLED); <br><br> * This source code was highlighted with Source Code Highlighter .
メニュー項目のさまざまな状態を設定するために同じメソッドが呼び出されることに注意してください。 このような呼び出しの正しい場所は、 WM_INITMENUPOPUPハンドラーです。 このメッセージは、メニューが表示される直前にメニュー所有者に送信されます。
ソースコードをダウンロードします 。
翻訳者からの結論
2つの記事を一度に翻訳するのが好きなのは、Chrisが必要な機能をC#にすばやく組み込む方法を説明していることと、Christopherが常に深く掘り下げて、.netからは見ることができないライブラリの繊細さを説明していることです。 したがって、純粋なWinAPIでプログラミングする必要がない場合でも、すべてが内部でどのように配置されているかを知ることは非常に役立ちます。