Binary Editor のフレームワークを作成

Text Editor で表示できない Binary 形式のファイルを編集する Binary Editor のフレームワークを作成します。

前田稔(Maeda Minoru)の超初心者のプログラム入門

プログラムの説明

  1. Global Area の定義です。
    ウインドウに貼り付ける左右の ListBox や Buttom などのハンドルと領域の定義です。
    ListStr[] は ListBox に表示するテストデータです。
    g_hFont には ListBox の Font を格納します。
    m_hBrush_BkColor には EditBox の背景色を格納します。
        #define     NAME    "Binary Window"
        #include    <windows.h>
        #include    "resource.h"
    
        LPCTSTR     ListStr[]=
        { "     0  00112233 44556677  8899AABB CCDDEEFF  0123456789ABCDEF",
          "     1  00000000 11111111  22222222 33333333  XXXXXXXXXXXXXXXX",
                        :
                        :
          "99991F  IIIIIIII XXXXXXXX  WWWWWWWW MMMMMMMM  ................",
        };
    
        // Defines, constants, and global variables
        HINSTANCE   g_hInst;            //Instance Handle
        HWND        g_hListL;           //List Handle
        HWND        g_hListR;           //List Handle
        HWND        g_hEditL;           //Edit Handle
        HWND        g_hEditR;           //Edit Handle
        HWND        g_hButtomL1,g_hButtomL2,g_hButtomL3,g_hButtomL4,g_hButtomL5;
        HWND        g_hButtomR1,g_hButtomR2,g_hButtomR3,g_hButtomR4,g_hButtomR5;
        HFONT       g_hFont;            //ListBox Font
        HBRUSH      m_hBrush_BkColor;   //背景の色
        
  2. WinMain() はいつもと同じです。
    ウインドウのサイズは編集サイズに合わせて 800,520 に固定しました。
        int WINAPI WinMain(HINSTANCE hInst, HINSTANCE, LPSTR, int)
        {   MSG     msg;
                     :
            HWND hWnd = CreateWindow(NAME,NAME,WS_SYSMENU,
                        CW_USEDEFAULT,CW_USEDEFAULT,800,520,NULL,NULL,hInst,NULL);
                     :
            return msg.wParam;
        }
        
  3. CALLBACK 関数 WndProc() です。
    WM_CREATE: から呼び出している InitAll() 関数で、ウインドウの設定とテストデータの表示を行います。
    WM_CTLCOLOREDIT: は EditBox の色と文字の色の設定です。
    同じ色の Box ばかりでは芸が無いので「一工夫」してみました。
    終了時にフォントやブラシを開放して下さい。
        LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wp, LPARAM lp)
        {   HDC     hDC;
            HWND    hCtrl;
    
            switch (msg)
            {   case WM_CREATE:
                    InitAll(hWnd);
                    break;
                case WM_CTLCOLOREDIT:
                {   hDC = (HDC)wp;
                    hCtrl = (HWND)lp;
                    if (hCtrl==g_hEditL || hCtrl==g_hEditR)
                    {   SetBkMode(hDC, OPAQUE);             // 背景を塗りつぶし
                        SetTextColor(hDC, RGB(255,0,0));    // テキストの色
                        SetBkColor(hDC,RGB(150,170,192));   // テキストが書かれている部分のテキストの背景の色
                        return (LRESULT)m_hBrush_BkColor;   // テキストが書かれていない部分の背景の色
                    }
                    break;
                }
                case WM_DESTROY:
                    DeleteObject(g_hFont);
                    DeleteObject(m_hBrush_BkColor);
                    PostQuitMessage(0);
                    break;
                default:
                    return (DefWindowProc(hWnd,msg,wp,lp));
            }
            return 0L;
        }
        
  4. InitAll() でウインドウに ListBox などを貼り付けます。
    左右の ListBox の座標とサイズを設定して貼り付けます。
    プログラムを制御する10個のボタンを貼り付けます。
    ボタンのIDはメニューのIDと共通で、ボタンをクリックするとメッセージがポストされます。
    編集に使用する左右の EditBox の座標とサイズを設定して貼り付けます。
    CreateSolidBrush() で EditBox で使用するブラシを作成します。
    SetWindowText() で10個のボタンにキャプションを設定します。
    SetInitialData() で ListBox にテストデータを表示します。
    SetMyFont() で ListBox で使用するフォントを作成して、SendMessage() で設定します。
    規定のフォントでは文字が揃いません。
        void InitAll(HWND hWnd)
        {
            g_hListL = CreateWindow("LISTBOX", NULL, WS_CHILD | WS_VISIBLE | WS_VSCROLL,
                            2, 4, 390, 396, hWnd, NULL, g_hInst, NULL);
            g_hListR = CreateWindow("LISTBOX", NULL, WS_CHILD | WS_VISIBLE | WS_VSCROLL,
                            400, 4, 390, 396, hWnd, NULL, g_hInst, NULL);
            g_hButtomL1 = CreateWindow("BUTTON", NULL, WS_CHILD | WS_VISIBLE,
                            20, 440, 60, 20, hWnd,  (HMENU)ID_BACKL, g_hInst, NULL);
            g_hButtomL2 = CreateWindow("BUTTON", NULL, WS_CHILD | WS_VISIBLE,
                            90, 440, 60, 20, hWnd,  (HMENU)ID_NEXTL, g_hInst, NULL);
            g_hButtomL3 = CreateWindow("BUTTON", NULL, WS_CHILD | WS_VISIBLE,
                            160, 440, 60, 20, hWnd, (HMENU)ID_EDITL, g_hInst, NULL);
            g_hButtomL4 = CreateWindow("BUTTON", NULL, WS_CHILD | WS_VISIBLE,
                            230, 440, 60, 20, hWnd, (HMENU)ID_UPDATEL, g_hInst, NULL);
            g_hButtomL5 = CreateWindow("BUTTON", NULL, WS_CHILD | WS_VISIBLE,
                            300, 440, 60, 20, hWnd, (HMENU)ID_PUTL, g_hInst, NULL);
            g_hButtomR1 = CreateWindow("BUTTON", NULL, WS_CHILD | WS_VISIBLE,
                            420, 440, 60, 20, hWnd,  (HMENU)ID_BACKR, g_hInst, NULL);
            g_hButtomR2 = CreateWindow("BUTTON", NULL, WS_CHILD | WS_VISIBLE,
                            490, 440, 60, 20, hWnd,  (HMENU)ID_NEXTR, g_hInst, NULL);
            g_hButtomR3 = CreateWindow("BUTTON", NULL, WS_CHILD | WS_VISIBLE,
                            560, 440, 60, 20, hWnd, (HMENU)ID_EDITR, g_hInst, NULL);
            g_hButtomR4 = CreateWindow("BUTTON", NULL, WS_CHILD | WS_VISIBLE,
                            630, 440, 60, 20, hWnd, (HMENU)ID_UPDATER, g_hInst, NULL);
            g_hButtomR5 = CreateWindow("BUTTON", NULL, WS_CHILD | WS_VISIBLE,
                            700, 440, 60, 20, hWnd, (HMENU)ID_PUTR, g_hInst, NULL);
    
            g_hEditL = CreateWindow("EDIT", NULL, WS_CHILD | WS_VISIBLE,
                            2, 408, 390, 24, hWnd, NULL, g_hInst, NULL);
            g_hEditR = CreateWindow("EDIT", NULL, WS_CHILD | WS_VISIBLE,
                            400, 408, 390, 24, hWnd, NULL, g_hInst, NULL);
            m_hBrush_BkColor= CreateSolidBrush(RGB(150,170,192));
    
            SetWindowText(g_hButtomL1,"↑前");
            SetWindowText(g_hButtomL2,"↓次");
            SetWindowText(g_hButtomL3,"編集");
            SetWindowText(g_hButtomL4,"更新");
            SetWindowText(g_hButtomL5,"上書");
            SetWindowText(g_hButtomR1,"↑前");
            SetWindowText(g_hButtomR2,"↓次");
            SetWindowText(g_hButtomR3,"編集");
            SetWindowText(g_hButtomR4,"更新");
            SetWindowText(g_hButtomR5,"上書");
            SetInitialData(g_hListL);
            SetInitialData(g_hListR);
    
            g_hFont= SetMyFont((LPCTSTR)"MS ゴシック",12,0);
            SendMessage(g_hListL,WM_SETFONT,(WPARAM)g_hFont,MAKELPARAM(TRUE,0));
            SendMessage(g_hListR,WM_SETFONT,(WPARAM)g_hFont,MAKELPARAM(TRUE,0));
        }
        
  5. ListBox の詳細は List Box に名簿を表示する を参照して下さい。
  6. フォントの詳細は 文字フォントを設定して描画する を参照して下さい。

[Next Chapter ↓] Binary Editor を作成する
[Previous Chapter ↑] Binary Editor の設計

超初心者のプログラム入門(Win32API C++)