アークピットのホームページに戻る

WinAPIトピックのトップページに戻る

APIトピックの各章に移動する

ダウンロードのページに移動する
ダウンロードができ
ない場合の対処法
 

ページ移動

2-4-4. ApMdisysプログラムのコード

 ApMdisysアプリケーションのコードを示します。全ソースコードのファイルは、ここを押せばダウンロードできます。コードの説明は、次項から詳細に説明します。

ApMdisys.h

/**********************************************************************
 * ApMdisys for Windows(The Windows MDI Type Application Sample) V1.0 *
 *                           リソースの定数                           *
 *                                                                    *
 *         (C) Copyright 1999 Arcpit Inc.  ALL RIGHT RESERVED.        *
 **********************************************************************/

#define IDM_NEWHELLO         100
#define IDM_NEWREDIT         101
#define IDM_OPEN             102
#define IDM_ABOUT            103
#define IDM_EXIT             104

#define IDMC_WINDOW          1
#define IDM_CASCADE          200
#define IDM_VTILE            201
#define IDM_HTILE            202
#define IDM_ALLCLOSE         203
#define IDM_ARRANGE          204
#define IDM_REARRANGE        205
#define IDM_ICONSORT         206

#define IDM_LEFT             300
#define IDM_CENTER           301
#define IDM_RIGHT            302

#define IDM_BOLD             400
#define IDM_ITALIC           401
#define IDM_UNDERLINE        402
#define IDM_STRIKEOUT        403
#define IDM_ALIGNLEFT        404
#define IDM_ALIGNCENTER      405
#define IDM_ALIGNRIGHT       406
#define IDM_FONT             407

#define IDC_STATIC           -1

#define IDI_MAIN             1000
#define IDI_HELLO            1001
#define IDI_REDIT            1002

#define ID_MDICHILD          2000
#define ID_RTF               3000

ApMdisys.c

/**********************************************************************
 * ApMdisys for Windows(The Windows MDI Type Application Sample) V1.0 *
 *                 MDIタイプのサンプルプログラム                   *
 *                                                                    *
 *         (C) Copyright 1999 Arcpit Inc.  ALL RIGHT RESERVED.        *
 **********************************************************************/

#include <windows.h>
#include <richedit.h>
#include <commctrl.h>
#include "ApMdisys.h"

LRESULT CALLBACK ApMdiProc(HWND hWnd,UINT uMsg,
                           WPARAM wParam,LPARAM lParam);
static BOOL CALLBACK CloseEnumProc(HWND hWnd,LONG lParam);
static BOOL CALLBACK AboutProc(HWND hDlg,UINT uMsg,
                               WPARAM wParam,LPARAM lParam);
LRESULT CALLBACK HelloProc(HWND hWnd,UINT uMsg,
                           WPARAM wParam,LPARAM lParam);
LRESULT CALLBACK ReditProc(HWND hWnd,UINT uMsg,
                           WPARAM wParam,LPARAM lParam);
static VOID ChangeCharFormat(UINT uCmd);
static VOID ChangeAlignment(UINT uCmd);
static VOID ChangeFont(HWND hWnd);
static HWND GetReditWindow(VOID);

static HWND   hWndMain    = NULL;
static HACCEL hAccel      = NULL;
static HWND   hWndClient  = NULL;
static HMENU  hMenuInit   = NULL;
static HMENU  hMenuHello  = NULL;
static HMENU  hMenuRedit  = NULL;
static LPSTR  pHelloClass = "HelloClass";
static LPSTR  pHelloApp   = "ApHello";
static LPSTR  pReditClass = "ReditClass";
static LPSTR  pReditApp   = "ApRedit";
static LPSTR  pHello      = "Hello World.";
static HFONT  hFont       = NULL;

/**********************************************************************
 *                     アプリケーションの初期処理                     *
 **********************************************************************/

INT  APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
                      LPTSTR lpCmdLine, int nCmdShow)
{
    MSG        msg;
    WNDCLASSEX wc;
    static LPSTR pClassName = "ApMdiClass";
    static LPSTR pAppName   = "ApMdisys";

    // フレームウィンドウのクラスの登録
    wc.cbSize        = sizeof(WNDCLASSEX);
    wc.style         = CS_HREDRAW | CS_VREDRAW;
    wc.lpfnWndProc   = (WNDPROC)ApMdiProc;
    wc.cbClsExtra    = 0;
    wc.cbWndExtra    = 0;
    wc.hInstance     = hInstance;
    wc.hIcon         = LoadIcon(hInstance,MAKEINTRESOURCE(IDI_MAIN));
    wc.hCursor       = LoadCursor(NULL,IDC_ARROW);
    wc.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
    wc.lpszMenuName  = NULL;
    wc.lpszClassName = pClassName;
    wc.hIconSm       = LoadImage(hInstance,MAKEINTRESOURCE(IDI_MAIN),
                                 IMAGE_ICON,16,16,LR_DEFAULTCOLOR);
    if (!RegisterClassEx(&wc)) return FALSE;
    // Hello MDI子ウィンドウのクラスの登録
    wc.lpfnWndProc   = (WNDPROC)HelloProc;
    wc.cbWndExtra    = sizeof(LONG);
    wc.hIcon         = LoadIcon(hInstance,MAKEINTRESOURCE(IDI_HELLO));
    wc.lpszClassName = pHelloClass;
    wc.hIconSm       = LoadImage(hInstance,MAKEINTRESOURCE(IDI_HELLO),
                                 IMAGE_ICON,16,16,LR_DEFAULTCOLOR);
    if (!RegisterClassEx(&wc)) return FALSE;
    // リッチテキストMDI子ウィンドウのクラスの登録
    wc.lpfnWndProc   = (WNDPROC)ReditProc;
    wc.cbWndExtra    = sizeof(LONG);
    wc.hIcon         = LoadIcon(hInstance,MAKEINTRESOURCE(IDI_REDIT));
    wc.lpszClassName = pReditClass;
    wc.hIconSm       = LoadImage(hInstance,MAKEINTRESOURCE(IDI_REDIT),
                                 IMAGE_ICON,16,16,LR_DEFAULTCOLOR);
    if (!RegisterClassEx(&wc)) return FALSE;
    // フレームウィンドウの作成
    hMenuInit  = LoadMenu(hInstance,"ApMdisys");
    hMenuHello = LoadMenu(hInstance,"ApMdiHello");
    hMenuRedit = LoadMenu(hInstance,"ApMdiRedit");
    hAccel = LoadAccelerators(hInstance,pAppName);
    hWndMain = CreateWindow(pClassName,NULL,WS_OVERLAPPEDWINDOW,
                            CW_USEDEFAULT,CW_USEDEFAULT,
                            CW_USEDEFAULT,CW_USEDEFAULT,
                            NULL,hMenuInit,hInstance,NULL);
    if (!hWndMain) return FALSE;
    SetWindowText(hWndMain,pAppName);
    ShowWindow(hWndMain,nCmdShow);
    UpdateWindow(hWndMain);
    while (GetMessage(&msg,NULL,0,0))
    {
        if (!TranslateAccelerator(hWndMain,hAccel,&msg) &&
                          !TranslateMDISysAccel(hWndClient,&msg))
        {
            TranslateMessage(&msg);
            DispatchMessage(&msg);
        }
    }
    return msg.wParam;
    UNREFERENCED_PARAMETER(hPrevInstance);
}

/**********************************************************************
 *             フレーム(メイン)ウィンドウのプロシージャ             *
 **********************************************************************/

LRESULT CALLBACK ApMdiProc(HWND hWnd,UINT uMsg
                                    ,WPARAM wParam,LPARAM lParam)
{
    static HINSTANCE  hRtfLib;  // リッチテキストDLLのインスタンスのハンドル
    static CLIPFORMAT cfRTF;    // クリップボードのフォーマット

    switch (uMsg)
    {
        case WM_CREATE:         // メインウィンドウの新規作成
        {
            LPCREATESTRUCT     lpcs;
            CLIENTCREATESTRUCT ccs;
            HINSTANCE hInst;
            LOGFONT   lf;

            InitCommonControls();
            hRtfLib = LoadLibrary("RICHED32.DLL");
            hInst = (HINSTANCE)GetWindowLong(hWnd,GWL_HINSTANCE);
            lpcs  = (LPCREATESTRUCT)lParam;
            ccs.hWindowMenu  = GetSubMenu(lpcs->hMenu,IDMC_WINDOW);
            ccs.idFirstChild = ID_MDICHILD;
            hWndClient = CreateWindow("MDICLIENT",NULL,
                                WS_CHILD|WS_VISIBLE|WS_CLIPCHILDREN|
                                WS_HSCROLL|WS_VSCROLL,
                                0,0,0,0,hWnd,lpcs->hMenu,
                                hInst,(LPVOID)&ccs);
            ZeroMemory(&lf,sizeof(LOGFONT));
            lf.lfHeight = 32;
            lf.lfCharSet = ANSI_CHARSET;
            lstrcpy(lf.lfFaceName,"Arial");
            hFont = CreateFontIndirect(&lf);
            cfRTF = RegisterClipboardFormat(CF_RTF);
            break;
        }
        case WM_DESTROY:        // ウィンドウを破棄する
        {
            if (hWndClient) DestroyWindow(hWndClient);
            if (hFont) DeleteObject(hFont);
            if (hRtfLib) FreeLibrary(hRtfLib);
            break;
        }
        case WM_SIZE:           // ウィンドウのサイズが変わった
        {
            if (hWndClient)     // MDIクライアントウィンドウのサイズを調整する
                MoveWindow(hWndClient,0,0,
                          LOWORD(lParam),HIWORD(lParam),TRUE);
            return 0;
        }
        case WM_INITMENUPOPUP:  // メニューがポップアップする前に発生
        {
            HMENU   hMenu;
            HWND    hMdi;
            WNDPROC proc;
            INT     n;

            if ((BOOL)HIWORD(lParam)) return 0;  // コントロールメニュー
            hMdi = (HWND)SendMessage(hWndClient,WM_MDIGETACTIVE,0,0);
            if (!hMdi) return 0;
            hMenu = (HMENU)wParam;
            proc = (WNDPROC)GetWindowLong(hMdi,GWL_WNDPROC);
            switch (GetMenuItemID(hMenu,0))
            {
               case IDM_LEFT: // 表示メニュー
                   if (proc != HelloProc) break;
                   for(n=IDM_LEFT; n <= IDM_RIGHT; ++n)
                      CheckMenuItem(hMenu,n,MF_BYCOMMAND|MF_UNCHECKED);
                   n = GetWindowLong(hMdi,0);
                   CheckMenuItem(hMenu,n,MF_BYCOMMAND|MF_CHECKED);
                   break;
               case IDM_BOLD: // 書式メニュー
               {
                   HWND       hEdit;
                   CHARFORMAT cf;
                   PARAFORMAT pf;
                   UINT       flag;

                   if (proc != ReditProc) break;
                   for(n=IDM_BOLD; n <= IDM_ALIGNRIGHT; ++n)
                      CheckMenuItem(hMenu,n,MF_BYCOMMAND|MF_UNCHECKED);
                   hEdit = (HWND)GetWindowLong(hMdi,0);
                   cf.cbSize = sizeof(CHARFORMAT);
                   SendMessage(hEdit,EM_GETCHARFORMAT,TRUE,(LPARAM)&cf);
                   // 強調,斜体,アンダーライン,取消し線のメニュー項目を設定
                   if (cf.dwMask & CFM_BOLD)
                   {
                       flag = (cf.dwEffects&CFE_BOLD) ?
                                             MF_CHECKED : MF_UNCHECKED;
                       CheckMenuItem(hMenu,IDM_BOLD,MF_BYCOMMAND|flag);
                   }
                   if (cf.dwMask & CFM_ITALIC)
                   {
                       flag = (cf.dwEffects&CFE_ITALIC) ?
                                           MF_CHECKED : MF_UNCHECKED;
                       CheckMenuItem(hMenu,IDM_ITALIC
                                          ,MF_BYCOMMAND|flag);
                   }
                   if (cf.dwMask & CFM_UNDERLINE)
                   {
                       flag = (cf.dwEffects&CFE_UNDERLINE) ?
                                           MF_CHECKED : MF_UNCHECKED;
                       CheckMenuItem(hMenu,IDM_UNDERLINE
                                          ,MF_BYCOMMAND|flag);
                   }
                   if (cf.dwMask & CFM_STRIKEOUT)
                   {
                       flag = (cf.dwEffects&CFE_STRIKEOUT) ?
                                           MF_CHECKED : MF_UNCHECKED;
                       CheckMenuItem(hMenu,IDM_STRIKEOUT
                                          ,MF_BYCOMMAND|flag);
                   }
                   pf.cbSize = sizeof(PARAFORMAT);
                   SendMessage(hEdit,EM_GETPARAFORMAT,0,(LPARAM)&pf);
                   if (pf.dwMask & PFM_ALIGNMENT)
                   {
                       switch (pf.wAlignment)
                       {
                           case PFA_LEFT:   n=IDM_ALIGNLEFT;   break;
                           case PFA_CENTER: n=IDM_ALIGNCENTER; break;
                           case PFA_RIGHT:  n=IDM_ALIGNRIGHT;  break;
                       }
                       CheckMenuRadioItem(hMenu,IDM_ALIGNLEFT,
                                    IDM_ALIGNRIGHT,n,MF_BYCOMMAND);
                   }
                   break;
               }
            }
            return 0;
        }
        case WM_COMMAND:        // メニューやアクセラレータのコマンド
        {
            switch (LOWORD(wParam))
            {
                //
                // [ファイル(F)]のメニュー項目
                //
                case IDM_NEWHELLO: // Helloウィンドウの新規作成
                {
                    CreateMDIWindow(pHelloClass,pHelloApp,0,
                         CW_USEDEFAULT,CW_USEDEFAULT,
                         CW_USEDEFAULT,CW_USEDEFAULT,
                         hWndClient,
                         (HINSTANCE)GetWindowLong(hWnd,GWL_HINSTANCE),
                         0);
                    break;
                }
                case IDM_NEWREDIT: // 文章ウィンドウの新規作成
                {
                    MDICREATESTRUCT mdic;

                    mdic.szClass = pReditClass;
                    mdic.szTitle = pReditApp;
                    mdic.hOwner  = (HINSTANCE)GetWindowLong(hWnd,
                                                     GWL_HINSTANCE);
                    mdic.x  = mdic.y  = CW_USEDEFAULT;
                    mdic.cx = mdic.cy = CW_USEDEFAULT;
                    mdic.style   = 0;
                    mdic.lParam  = 0;
                    SendMessage(hWndClient,WM_MDICREATE
                                          ,0,(LPARAM)&mdic);
                    break;
                }
                case IDM_OPEN:     // ファイルの表示
                {
                    OPENFILENAME ofn;
                    TCHAR        szFileName[MAX_PATH];

                    szFileName[0] = '\0';
                    // OPENFILENAME構造体を設定する。
                    ZeroMemory(&ofn,sizeof(OPENFILENAME));
                    ofn.lStructSize = sizeof(OPENFILENAME);
                    ofn.hwndOwner   = hWnd;
                    ofn.lpstrFilter = "全ファイル形式(*.*)\0*.*\0"
                                      "テキストファイル形式(*.txt)\0*.txt\0"
                                      "プログラムファイル形式(*.c,*.h)\0"
                                      "*.c;*.h;*.cpp;*.rc;*.mak\0\0";
                    ofn.lpstrFile   = szFileName;
                    ofn.nMaxFile    = MAX_PATH;
                    ofn.Flags       = OFN_FILEMUSTEXIST|OFN_ENABLEHOOK
                                        |OFN_EXPLORER|OFN_HIDEREADONLY;
                    ofn.lpstrDefExt = "txt";
                    if (!GetOpenFileName(&ofn)) break; // キャンセル
                    CreateMDIWindow(pReditClass,pReditApp,0,
                         CW_USEDEFAULT,CW_USEDEFAULT,
                         CW_USEDEFAULT,CW_USEDEFAULT,
                         hWndClient,
                         (HINSTANCE)GetWindowLong(hWnd,GWL_HINSTANCE),
                         (LPARAM)szFileName);
                    break;
                }
                case IDM_ABOUT:    // バージョン情報
                {
                    HINSTANCE hInst;

                    hInst = (HINSTANCE)GetWindowLong(hWnd,
                                                     GWL_HINSTANCE);
                    DialogBox(hInst,"ABOUTDLG"
                                   ,hWnd,(DLGPROC)AboutProc);
                    break;
                }
                case IDM_EXIT:     // ApMdisysの終了
                    PostMessage(hWnd,WM_CLOSE,0,0);
                    break;
                //
                // [表示(V)]のメニュー項目
                //
                case IDM_LEFT:     // 左側に表示
                case IDM_CENTER:   // 中央に表示
                case IDM_RIGHT:    // 右側に表示
                {
                    HWND hActive;
                    UINT id;

                    id = LOWORD(wParam);
                    hActive = (HWND)SendMessage(hWndClient,
                                                WM_MDIGETACTIVE,0,0);
                    if (!hActive) return 0;
                    SetWindowLong(hActive,0,(LONG)id);
                    InvalidateRect(hActive,NULL,TRUE);
                    UpdateWindow(hActive);
                    break;
                }
                //
                // [書式(F)]のメニュー項目
                //
                case IDM_BOLD:         // 強調
                case IDM_ITALIC:       // 斜体
                case IDM_UNDERLINE:    // アンダーライン
                case IDM_STRIKEOUT:    // 取消し線
                    ChangeCharFormat(LOWORD(wParam));
                    break;
                case IDM_ALIGNLEFT:    // 左寄せ
                case IDM_ALIGNCENTER:  // 中央寄せ
                case IDM_ALIGNRIGHT:   // 右寄せ
                    ChangeAlignment(LOWORD(wParam));
                    break;
                case IDM_FONT:         // フォント
                    ChangeFont(hWnd);
                    break;
                //
                // ウィンドウ(W) Menu
                //
                case IDM_CASCADE:      // 重ねて表示
                    SendMessage(hWndClient,WM_MDICASCADE,0L,0L);
                    return 0L;
                case IDM_VTILE:        // 上下に並べて表示
                    SendMessage(hWndClient,WM_MDITILE
                                          ,MDITILE_HORIZONTAL,0L);
                    return 0L;
                case IDM_HTILE:        // 左右に並べて表示
                    SendMessage(hWndClient,WM_MDITILE
                                          ,MDITILE_VERTICAL,0L);
                    return 0L;
                case IDM_ARRANGE:      // すべて最小化する
                    EnumChildWindows(hWndClient,CloseEnumProc,1);
                    return 0L;
                case IDM_REARRANGE:    // すべて元に戻す
                    EnumChildWindows(hWndClient,CloseEnumProc,2);
                    return 0L;
                case IDM_ICONSORT:     // アイコンを整列する
                    SendMessage(hWndClient,WM_MDIICONARRANGE,0L,0L);
                    return 0L;
                case IDM_ALLCLOSE:     // すべて閉じる
                    EnumChildWindows(hWndClient,CloseEnumProc,0);
                    return 0L;
            }
            break;
        }
    }
    return DefFrameProc(hWnd,hWndClient,uMsg,wParam,lParam);
}

//
// MDI子ウィンドウを列挙してすべてのウィンドウをクローズ・アイコン化・復帰する。
//

static BOOL CALLBACK CloseEnumProc(HWND hWnd,LONG lParam)
{
    if (GetParent(hWnd) != hWndClient) return 1;
    if (lParam == 0)          // Close
    {
        if (!SendMessage(hWnd,WM_QUERYENDSESSION,0,0L)) return 1;
        SendMessage(hWndClient,WM_MDIDESTROY,(WPARAM)hWnd,0L);
    }
    else if (lParam == 1)     // Icon
        ShowWindow(hWnd,SW_MINIMIZE);
    else if (lParam == 2)     // Restore
        SendMessage(hWndClient,WM_MDIRESTORE,(WPARAM)hWnd,0L);
    return 1;
}

//
// [About]ダイアログボックスのプロシージャ
//

static BOOL CALLBACK AboutProc(HWND hDlg,UINT uMsg
                                        ,WPARAM wParam,LPARAM lParam)
{
    switch (uMsg)
    {
        case WM_COMMAND:
            switch (LOWORD(wParam))
            {
                case IDOK:       // OK
                case IDCANCEL:   // キャンセル
                    EndDialog(hDlg,TRUE);
                    return TRUE;
            }
            break;
    }
    return FALSE;
}

/**********************************************************************
 *                  Hello 子ウィンドウのプロシージャ                  *
 **********************************************************************/

LRESULT CALLBACK HelloProc(HWND hWnd,UINT uMsg
                                    ,WPARAM wParam,LPARAM lParam)
{
    switch (uMsg)
    {
        case WM_CREATE:         // メインウィンドウの新規作成
        {
            SetWindowLong(hWnd,0,IDM_CENTER);
            return 0;
        }
        case WM_PAINT:
        {
            HDC         hdc;
            PAINTSTRUCT ps;
            RECT        rc;
            UINT        w;

            hdc = BeginPaint(hWnd,&ps);
            if (hdc)
            {
                GetClientRect(hWnd,&rc);
                SetBkMode(hdc,TRANSPARENT);
                SetTextColor(hdc,RGB(0,0,255));
                SelectObject(hdc,hFont);
                switch ((UINT)GetWindowLong(hWnd,0))
                {
                    case IDM_LEFT:   w = DT_LEFT;   break;
                    case IDM_CENTER: w = DT_CENTER; break;
                    case IDM_RIGHT:  w = DT_RIGHT;  break;
                }
                DrawText(hdc,pHello,strlen(pHello)
                            ,&rc,DT_SINGLELINE|DT_VCENTER|w);
            }
            EndPaint(hWnd,&ps);
            return 0;
        }
        //
        // このMDI子ウィンドウがアクティブなため、固有のメニューを設定する。
        //
        case WM_MDIACTIVATE:
        {
            HMENU hMenu;

            if ((HWND)lParam == hWnd)
            {
                hMenu = GetSubMenu(hMenuHello,IDMC_WINDOW+1);
                SendMessage(hWndClient,WM_MDISETMENU
                                ,(WPARAM)hMenuHello,(LPARAM)hMenu);
            }
            else
            {
                hMenu = GetSubMenu(hMenuInit,IDMC_WINDOW);
                SendMessage(hWndClient,WM_MDISETMENU
                                 ,(WPARAM)hMenuInit,(LPARAM)hMenu);
            }
            DrawMenuBar(hWndMain);
            return 0;
        }
    }
    return DefMDIChildProc(hWnd,uMsg,wParam,lParam);
}

/**********************************************************************
 *              リッチエディト子ウィンドウのプロシージャ              *
 **********************************************************************/

LRESULT CALLBACK ReditProc(HWND hWnd,UINT uMsg
                                    ,WPARAM wParam,LPARAM lParam)
{
    HWND hEdit = (HWND)GetWindowLong(hWnd,0);

    switch(uMsg)
    {
        //
        // MDI子ウィンドウの新規作成で、各種の初期化を行なう。
        //
        case WM_CREATE:
        {
            LPCREATESTRUCT    pcs;
            LPMDICREATESTRUCT pmdic;
            HINSTANCE hInst;
            LPSTR     pFile;

            pcs   = (CREATESTRUCT *)lParam;
            pmdic = (MDICREATESTRUCT *)pcs->lpCreateParams;
            pFile = (LPSTR)pmdic->lParam;
            hInst = (HINSTANCE)GetWindowLong(hWnd,GWL_HINSTANCE);
            hEdit = CreateWindowEx(WS_EX_CLIENTEDGE,"RICHEDIT",NULL,
                             WS_CHILD|WS_BORDER|WS_VISIBLE|WS_VSCROLL|
                             ES_AUTOVSCROLL|ES_MULTILINE|ES_NOHIDESEL,
                             0,0,0,0,
                             hWnd,(HMENU)ID_RTF,hInst,NULL);
            SetWindowLong(hWnd,0,(LONG)hEdit);
            if (hEdit)
            {
                CHARFORMAT cf;
                HANDLE     hFile;
                HGLOBAL    hMem;
                LPSTR      p;
                DWORD      dwSize,dwN;

                SendMessage(hEdit,EM_EXLIMITTEXT,0,0x00FFFFFF);
                cf.cbSize = sizeof(CHARFORMAT);
                cf.dwMask = CFM_FACE;
                strcpy(cf.szFaceName,"FixedSys");
                SendMessage(hEdit,EM_SETCHARFORMAT
                                 ,SCF_SELECTION,(LPARAM)&cf);
                if (pFile)
                {
                    hFile = CreateFile(pFile,GENERIC_READ,0,NULL,
                                       OPEN_EXISTING,
                                       FILE_ATTRIBUTE_NORMAL,NULL);
                    if (hFile != INVALID_HANDLE_VALUE)
                    {
                        dwSize = GetFileSize(hFile,NULL);
                        hMem = GlobalAlloc(GPTR,dwSize+256);
                        p = GlobalLock(hMem);
                        if (p)
                        {
                            ReadFile(hFile,p,dwSize,&dwN,NULL);
                            *(p+dwSize) = '\0';
                            SetWindowText(hEdit,p);
                            wsprintf(p,"%s - ApRedit",pFile);
                            SetWindowText(hWnd,p);
                        }
                        GlobalUnlock(hMem);
                        GlobalFree(hMem);
                        CloseHandle(hFile);
                    }
                }
            }
            return 0;
        }
        //
        // このウィンドウのクローズに伴う破棄で後処理とメモリ開放
        //
        case WM_DESTROY:
        {
            if (hEdit) DestroyWindow(hEdit);
            break;
        }
        //
        // ウィンドウをリサイズしたのでRTFコントロールも変更する
        //
        case WM_SIZE:
        {
            if (hEdit)
                MoveWindow(hEdit,0,0,
                           LOWORD(lParam),HIWORD(lParam),TRUE);
            break; // return 0;はダメ
        }
        //
        // このウィンドウにフォーカスが移った
        //
        case WM_SETFOCUS:
        {
            if (hEdit) SetFocus(hEdit);
            break;
        }
        //
        // このMDI子ウィンドウがアクティブなため、固有のメニューを設定する。
        //
        case WM_MDIACTIVATE:
        {
            HMENU hMenu;

            if ((HWND)lParam == hWnd)
            {
                hMenu = GetSubMenu(hMenuRedit,IDMC_WINDOW+1);
                SendMessage(hWndClient,WM_MDISETMENU
                                ,(WPARAM)hMenuRedit,(LPARAM)hMenu);
            }
            else
            {
                hMenu = GetSubMenu(hMenuInit,IDMC_WINDOW);
                SendMessage(hWndClient,WM_MDISETMENU
                                ,(WPARAM)hMenuInit,(LPARAM)hMenu);
            }
            DrawMenuBar(hWndMain);
            return 0;
        }
    }
    return DefMDIChildProc(hWnd,uMsg,wParam,lParam);
}

/**********************************************************************
 *                    書式(F)のコマンドの処理関数                     *
 **********************************************************************/

// ボールド・イタリック・取消し線・アンダーラインの処理の設定か解除

static VOID ChangeCharFormat(UINT uCmd)
{
    CHARFORMAT cf;
    HWND       hEdit;

    hEdit = GetReditWindow();
    if (!hEdit) return;
    // 現在の設定を取得する。
    cf.cbSize = sizeof(CHARFORMAT);
    SendMessage(hEdit,EM_GETCHARFORMAT,TRUE,(LPARAM)&cf);
    // 変更をRTFエディットコントロールに適用する。
    switch (uCmd)
    {
        case IDM_BOLD:
            cf.dwMask = CFM_BOLD;
            cf.dwEffects ^= CFE_BOLD;
            break;
        case IDM_ITALIC:
            cf.dwMask = CFM_ITALIC;
            cf.dwEffects ^= CFE_ITALIC;
            break;
        case IDM_STRIKEOUT:
            cf.dwMask = CFM_STRIKEOUT;
            cf.dwEffects ^= CFE_STRIKEOUT;
            break;
        case IDM_UNDERLINE:
            cf.dwMask = CFM_UNDERLINE;
            cf.dwEffects ^= CFE_UNDERLINE;
            break;
    }
    SendMessage(hEdit,EM_SETCHARFORMAT,SCF_SELECTION,(LPARAM)&cf);
}

static VOID ChangeAlignment(UINT uCmd)
{
    PARAFORMAT pf;
    HWND       hEdit;

    hEdit = GetReditWindow();
    if (!hEdit) return;
    pf.cbSize = sizeof(PARAFORMAT);
    pf.dwMask = PFM_ALIGNMENT;
    switch (uCmd)
    {
        case IDM_ALIGNLEFT   : pf.wAlignment = PFA_LEFT;   break;
        case IDM_ALIGNCENTER : pf.wAlignment = PFA_CENTER; break;
        case IDM_ALIGNRIGHT  : pf.wAlignment = PFA_RIGHT;  break;
    }
    SendMessage(hEdit,EM_SETPARAFORMAT,0,(LPARAM)&pf);
}

static VOID ChangeFont(HWND hWnd)
{
    CHARFORMAT cf;
    CHOOSEFONT chFont;
    LOGFONT    lf;
    HDC        hDC;
    HWND       hEdit;

    hEdit = GetReditWindow();
    if (!hEdit) return;
    // 現在のフォント情報を取得する。
    cf.cbSize = sizeof(CHARFORMAT);
    SendMessage(hEdit,EM_GETCHARFORMAT,TRUE,(LPARAM)&cf);
    ZeroMemory(&chFont,sizeof(CHOOSEFONT));
    ZeroMemory(&lf,sizeof(LOGFONT));
    hDC = GetDC(hWndMain);
    lf.lfHeight = MulDiv(cf.yHeight,
                         GetDeviceCaps(hDC,LOGPIXELSY),-1440);
    ReleaseDC(hWndMain,hDC);
    lf.lfWeight = (cf.dwEffects & CFE_BOLD) ? FW_BOLD : FW_NORMAL;
    lf.lfItalic = (BOOL)(cf.dwEffects & CFE_ITALIC);
    lf.lfStrikeOut = (BOOL)(cf.dwEffects & CFE_STRIKEOUT);
    lf.lfUnderline = (BOOL)(cf.dwEffects & CFE_UNDERLINE);
    lf.lfCharSet = cf.bCharSet;  // ANSI_CHARSET;
    lf.lfQuality = DEFAULT_QUALITY;
    lf.lfPitchAndFamily = cf.bPitchAndFamily;
    strcpy(lf.lfFaceName,cf.szFaceName);
    // CHOOSEFONT構造体を設定する。
    chFont.lStructSize = sizeof(CHOOSEFONT);
    chFont.hwndOwner   = hWnd;
    chFont.lpLogFont   = &lf;
    chFont.Flags       = CF_SCREENFONTS|CF_SCALABLEONLY|
                         CF_EFFECTS|CF_INITTOLOGFONTSTRUCT;
    if (!(cf.dwEffects & CFE_AUTOCOLOR))
        chFont.rgbColors = cf.crTextColor;
    if (ChooseFont(&chFont))
    {
        cf.dwMask = CFM_BOLD | CFM_COLOR | CFM_FACE | CFM_ITALIC |
                    CFM_CHARSET | CFM_OFFSET | CFM_SIZE |
                    CFM_STRIKEOUT | CFM_UNDERLINE;
        cf.yHeight = 2 * chFont.iPointSize;
        cf.yOffset = 0;
        cf.dwEffects = 0;
        if (lf.lfWeight >= FW_BOLD) cf.dwEffects |= CFE_BOLD;
        if (lf.lfItalic)            cf.dwEffects |= CFE_ITALIC;
        if (lf.lfStrikeOut)         cf.dwEffects |= CFE_STRIKEOUT;
        if (lf.lfUnderline)         cf.dwEffects |= CFE_UNDERLINE;
        cf.bCharSet = lf.lfCharSet;
        cf.bPitchAndFamily = lf.lfPitchAndFamily;
        if (chFont.rgbColors == GetSysColor(COLOR_WINDOWTEXT))
            cf.dwEffects |= CFE_AUTOCOLOR;
        else
            cf.crTextColor = chFont.rgbColors;
        strcpy(cf.szFaceName,lf.lfFaceName);
        SendMessage(hEdit,EM_SETCHARFORMAT,SCF_SELECTION,(LPARAM)&cf);
    }
}

static HWND GetReditWindow(VOID)
{
    HWND hActive;

    hActive = (HWND)SendMessage(hWndClient,WM_MDIGETACTIVE,0,0);
    if (!hActive) return 0;
    return (HWND)GetWindowLong(hActive,0);
}

ApMdisys.rc

/**********************************************************************
 * ApMdisys for Windows(The Windows MDI Type Application Sample) V1.0 *
 *                              リソース                              *
 *                                                                    *
 *         (C) Copyright 1999 Arcpit Inc.  ALL RIGHT RESERVED.        *
 **********************************************************************/

#include <windows.h>
#include <winver.h>
#include "ApMdisys.h"

/**********************************************************************
 *      アイコン・カーソル・メニュー・アクセラレータ類のリソース      *
 **********************************************************************/

IDI_MAIN  ICON    DISCARDABLE     "ApMdisys.ico"
IDI_HELLO ICON    DISCARDABLE     "ApHello.ico"
IDI_REDIT ICON    DISCARDABLE     "ApRedit.ico"

ApMdisys ACCELERATORS
{
    "^N",    IDM_NEWREDIT
    "^O",    IDM_OPEN
    "^K",    IDM_BOLD
    "^I",    IDM_ITALIC
    "^U",    IDM_UNDERLINE
    "?",     IDM_ABOUT,     ALT
    "/",     IDM_ABOUT,     ALT
    VK_F4,   IDM_EXIT,      VIRTKEY,ALT
}

ApMdisys  MENU DISCARDABLE 
BEGIN
    POPUP "ファイル(&F)"
    BEGIN
        MENUITEM "Helloウィンドウの新規作成(&H)",  IDM_NEWHELLO
        MENUITEM "文章ウィンドウの新規作成(&N)",   IDM_NEWREDIT
        MENUITEM SEPARATOR
        MENUITEM "開く(&O)...",                IDM_OPEN
        MENUITEM SEPARATOR
        MENUITEM "バージョン情報(&A)...",         IDM_ABOUT
        MENUITEM SEPARATOR
        MENUITEM "ApMdisysの終了(&X)",         IDM_EXIT
    END
    POPUP "ウィンドウ(&W)"
    BEGIN
        MENUITEM "重ねて表示(&C)",             IDM_CASCADE
        MENUITEM "上下に並べて表示(&H)",       IDM_VTILE
        MENUITEM "左右に並べて表示(&T)",       IDM_HTILE
        MENUITEM SEPARATOR
        MENUITEM "すべて閉じる(&L)",           IDM_ALLCLOSE
        MENUITEM "すべて最小化する(&I)",       IDM_ARRANGE
        MENUITEM "すべて元に戻す(&R)",         IDM_REARRANGE
        MENUITEM "アイコンを整列する(&S)",         IDM_ICONSORT
    END
END

ApMdiHello  MENU DISCARDABLE 
BEGIN
    POPUP "ファイル(&F)"
    BEGIN
        MENUITEM "Helloウィンドウの新規作成(&H)",  IDM_NEWHELLO
        MENUITEM "文章ウィンドウの新規作成(&N)",   IDM_NEWREDIT
        MENUITEM SEPARATOR
        MENUITEM "開く(&O)...",                IDM_OPEN
        MENUITEM SEPARATOR
        MENUITEM "バージョン情報(&A)...",         IDM_ABOUT
        MENUITEM SEPARATOR
        MENUITEM "ApMdisysの終了(&X)",         IDM_EXIT
    END
    POPUP "表示(&V)"
    BEGIN
        MENUITEM "左側へ表示(&L)",             IDM_LEFT
        MENUITEM "中央へ表示(&C)",             IDM_CENTER
        MENUITEM "右側へ表示(&R)",             IDM_RIGHT
    END
    POPUP "ウィンドウ(&W)"
    BEGIN
        MENUITEM "重ねて表示(&C)",             IDM_CASCADE
        MENUITEM "上下に並べて表示(&H)",       IDM_VTILE
        MENUITEM "左右に並べて表示(&T)",       IDM_HTILE
        MENUITEM SEPARATOR
        MENUITEM "すべて閉じる(&L)",           IDM_ALLCLOSE
        MENUITEM "すべて最小化する(&I)",       IDM_ARRANGE
        MENUITEM "すべて元に戻す(&R)",         IDM_REARRANGE
        MENUITEM "アイコンを整列する(&S)",         IDM_ICONSORT
    END
END

ApMdiRedit  MENU DISCARDABLE 
BEGIN
    POPUP "ファイル(&F)"
    BEGIN
        MENUITEM "Helloウィンドウの新規作成(&H)",  IDM_NEWHELLO
        MENUITEM "文章ウィンドウの新規作成(&N)",   IDM_NEWREDIT
        MENUITEM SEPARATOR
        MENUITEM "開く(&O)...",                IDM_OPEN
        MENUITEM SEPARATOR
        MENUITEM "バージョン情報(&A)...",         IDM_ABOUT
        MENUITEM SEPARATOR
        MENUITEM "ApMdisysの終了(&X)",         IDM_EXIT
    END
    POPUP "書式(&O)"
    BEGIN
        MENUITEM "強調(&B)",                   IDM_BOLD
        MENUITEM "斜体(&I)",                   IDM_ITALIC
        MENUITEM "アンダーライン(&U)",               IDM_UNDERLINE
        MENUITEM "取消し線(&S)",               IDM_STRIKEOUT
        MENUITEM SEPARATOR
        MENUITEM "左寄せ(&L)",                 IDM_ALIGNLEFT
        MENUITEM "中央寄せ(&C)",               IDM_ALIGNCENTER
        MENUITEM "右寄せ(&R)",                 IDM_ALIGNRIGHT
        MENUITEM SEPARATOR
        MENUITEM "フォント(&F)...",                IDM_FONT
    END
    POPUP "ウィンドウ(&W)"
    BEGIN
        MENUITEM "重ねて表示(&C)",             IDM_CASCADE
        MENUITEM "上下に並べて表示(&H)",       IDM_VTILE
        MENUITEM "左右に並べて表示(&T)",       IDM_HTILE
        MENUITEM SEPARATOR
        MENUITEM "すべて閉じる(&L)",           IDM_ALLCLOSE
        MENUITEM "すべて最小化する(&I)",       IDM_ARRANGE
        MENUITEM "すべて元に戻す(&R)",         IDM_REARRANGE
        MENUITEM "アイコンを整列する(&S)",         IDM_ICONSORT
    END
END

/**********************************************************************
 *                    ダイアログボックスのリソース                    *
 **********************************************************************/

ABOUTDLG DIALOG DISCARDABLE  0, 0, 191, 101
STYLE DS_MODALFRAME | WS_VISIBLE | WS_CAPTION
CAPTION "ApMdisysのバージョン情報"
FONT 9, "MS Pゴシック"
BEGIN
    CTEXT         "ApMdisys for Windows 9x",IDC_STATIC,33,8,148,8
    CTEXT         "The Sample of Windows API Topics.",IDC_STATIC,
                  33,20,148,8
    CTEXT         "Version 1.00",IDC_STATIC,33,35,148,8
    CTEXT         "(C) Copyright 1999 Arcpit Inc. All Right Reserved."
                  ,IDC_STATIC,33,54,148,8
    ICON          "ApMdisys",IDC_STATIC,8,13,18,21
    DEFPUSHBUTTON "OK",IDOK,136,73,50,14
    LTEXT         "ホームページ: http://www.tsp.ne.jp/~arcpit/",
                  IDC_STATIC,6,72,118,8
    LTEXT         "Eメール:       arcpit@tsp.ne.jp",IDC_STATIC,6,84,79,8
END

/**********************************************************************
 *                    バージョンテーブルのリソース                    *
 **********************************************************************/

VS_VERSION_INFO VERSIONINFO
 FILEVERSION 1,0,0,1
 PRODUCTVERSION 1,0,0,1
 FILEFLAGSMASK 0x3fL
#ifdef _DEBUG
 FILEFLAGS 0x1L
#else
 FILEFLAGS 0x0L
#endif
 FILEOS 0x4L
 FILETYPE 0x1L
 FILESUBTYPE 0x0L
BEGIN
    BLOCK "StringFileInfo"
    BEGIN
        BLOCK "041103a4"
        BEGIN
            VALUE "Comments", "The Sample of Windows API Topics\0"
            VALUE "CompanyName", "Arcpit Inc.\0"
            VALUE "FileDescription", "ApMdisys for Windows9x\0"
            VALUE "FileVersion", "1, 0, 0, 1\0"
            VALUE "InternalName", "ApMdisys\0"
            VALUE "LegalCopyright", "Copyright (C) 1999. Arcpit Inc.\0"
            VALUE "OriginalFilename", "ApMdisys.exe\0"
            VALUE "ProductName", "Sample Program\0"
            VALUE "ProductVersion", "1, 0, 0, 1\0"
        END
    END
    BLOCK "VarFileInfo"
    BEGIN
        VALUE "Translation", 0x411, 932
    END
END

ページ移動