電子工作のためのWindowsプログラミングメモ(仮)

by K.I

Index


概要

QuickDrawとSDK

リソースについて

何故SDKを使うのか

電子工作に必要な機能

こんなところかな。。。
[top]

プログラム環境

とりあえずVC++

斬新すぎるインターフェース

ライブラリの追加は?

古い形式

'LPCWSTR'に変換できません

変数の場合は


1自分が多用する定義、単に typedef char str255[256]; なんだけど。→255文字あれば、ちょっとした間違いではオーバーし難いし、いつも同じサイズならチェックもやりやすい。簡易メモリリーク防止策になる。

[top]

TEXTについて(追記)

漢字の扱い

charとWCHARとTCHAR

文字列定数

_tWinMain

DLLの場合

結局は


[top]

Windowシステム

Updateイベント

システムが発生させるUpdateイベント

アプリケーションが発生させるUpdateイベント

オフスクリーン・テクニック

アクティベートイベント

そういうことで


2本当かしらん。。間違いもありそうなので、話半分で。。。

[top]

Windowsプログラムの基本構造

WinMain

int APIENTRY _tWinMain(HINSTANCE hInstance,
                     HINSTANCE hPrevInstance,
                     LPTSTR    lpCmdLine,
                     int       nCmdShow)
{

        MyRegisterClass(hInstance);             // ウィンドウクラスの定義

        InitInstance (hInstance, nCmdShow)      // アプリケーションの初期化

        // メイン メッセージ ループ:
        while (GetMessage(&msg, NULL, 0, 0))
        {
                if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))
                {
                        TranslateMessage(&msg);
                        DispatchMessage(&msg);  // これでWndProcへメッセージが送られる
                }
        }

        return (int) msg.wParam;
}

InitInstance

BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
{
   g.hInst = hInstance; // グローバル変数にインスタンス処理を格納します。

   hWnd = CreateWindow(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW,
      CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL);
                :
                :
}

WndProc

LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wp, LPARAM lp)
{

        switch (msg)            //メッセージにより処理を行うだけ
        {
                case WM_CREATE: // メッセージ処理を並べる
                        :

                case WM_COMMAND:
                        :
        }
}

プロジェクトの構成

自分用プロジェクトの構成についてのメモ
3関数名に_tが付いてるのは、UniCode対応でコンパイル出来るってことは、後から知った。

[top]

メッセージについて

WM_CREATE

WM_PAINT

WM_ACTIVATE

WM_TIMER

WM_COMMAND

WM_CLOSE

WM_DESTROY

SendMessageとPostMessage


[top]

プログラミングTips

グローバル変数について

これはTipsでも何でも無いんだけど、

メニューを追加する

ステータスバーを追加する

コンボボックスの配置

コントロールに文字表示

コントロールの色を変える

        case WM_CTLCOLORSTATIC:
                // --- コントロールの文字に色を付ける
                if( GetDlgItem( g.hDlg0,IDC_SENSOR0_C) == (HWND)lp) {
                        SetTextColor( (HDC)wp, RGB( 255, 255, 255)) ;
                        SetBkColor( (HDC)wp, RGB(255,0,0)) ;
                        return (BOOL)(HBRUSH)GetStockObject(NULL_BRUSH) ;
                }
                :
                :

コントロールのフォントを変える

フォント属性の変更

ウィンドウにDialogリソースを貼り付け

Dialog処理ルーチンを追加

About表示

Windowサイズの制限

タイマー処理

iniファイル


4最初これが分からなかった。分かり辛いよね。
5それに分かり難い。MacのCDEFとかLDEFとかの方がまだ分かり易かったな〜。
6保持が必要ということに関しては自信がない。しなくても良いような気もする。(140606追記)

[top]

描画に関するメモ

オフスクリーン生成

        // ---- オフスクリーンを生成
                g.hdc = GetDC(hWnd);

                g.hBitmap = CreateCompatibleBitmap(g.hdc , g.bufx , g.bufy);
                g.hBuffer = CreateCompatibleDC(g.hdc);

                SelectObject(g.hBuffer , g.hBitmap);
                SelectObject(g.hBuffer , GetStockObject(NULL_PEN));

                PatBlt(g.hBuffer , 0 , 0 , g.bufx , g.bufy , WHITENESS);
                
                ReleaseDC(hWnd , g.hdc);

スクリーン座標を求める

long graph_x(double x)          // データ座標xからスクリーン座標を求める
{
        double xk;              
        xk = (srt.right-srt.left)/(drt.right-drt.left);
        return((long)(xk*(x-drt.left)+srt.left));
}

long graph_y(double y)          // データ座標yからスクリーン座標を求める
{
        double yk;              
        yk = (srt.bottom-srt.top)/(drt.top-drt.bottom);
        return((long)(yk*(y-drt.bottom)+srt.top));
}

[top]

DLL

DLLを作成する

DLLを使う

明示的なリンク

        typedef void(*DLLFUNC)(void);           //DLL関数の型を定義
        HINSTANCE       h_dll;                  //DLLのインスタンスハンドル
        DLLFUNC         dll_function;           //DLL関数のアドレス

        if (NULL == (h_dll=LoadLibrary("dll_function.dll")))            //DLLのロード
                DLL読み込み失敗!

        dll_function = (DLLFUNC)GetProcAddress(h_dll,"dll_function");   //DLL関数のアドレスを求める

        dll_function();                                                 //DLL関数を使う

        if (!FreeLibrary(h_dll))                                        //DLLを開放する
                DLL開放失敗!

7何も指定しないと__cdecl形式になるら。これは関数の呼出し時の引数の渡し方の違いらしい。

[top]

スレッド

スレッドの同期

非同期I/O

オーバーラップ構造体

処理の完了を知る

イベントオブジェクト

意味
WAIT_OBJECT_0 シグナル状態になった(処理が完了した)
WAIT_TIMEOUT タイムアウトで戻ってきた
WAIT_ABANDONED オブジェクトが別スレッドで廃棄された
WAIT_FAILED 関数が失敗した

8自動リセットの設定されたイベントの場合は、ResetEvent出来ない。

[top]

参考

参考にさせて頂いたサイト(感謝)

comments powered by Disqus