テキストエディタ

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
オカピーα
記事: 120
登録日時: 13年前

テキストエディタ

#1

投稿記事 by オカピーα » 12年前

現在テキストエディタを製作中です。
内容はすごくシンプルなものを目指しているのですが
少し問題が発生しました。
したのコードを見てください。

コード:

/*Lunaスタイルの適応*/
#pragma comment(linker,"/manifestdependency:\"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='*' publicKeyToken='6595b64144ccf1df' language='*'\"")
/*WindowsXPへの適応*/
#define _WIN32_WINNT 0x0501
/*ヘッダファイルのインクルード*/
#include <windows.h>
#include "resource.h"
#include <commctrl.h>
#include "header.h"
#include <windowsx.h>
/*Libファイルのリンク*/
#pragma comment(lib, "comctl32.lib")      // ツリービューの作成に必要
 
 
 
/*リテラル定義*/
#define SPLIT_WIDTH 2
#define SPLIT_MIN 50
#define MAXTAB 10
/*グローバル変数*/
HINSTANCE hInst;                          // 現在のインターフェイス
int width = 150;                         // 分割ウインドウ(左)の幅
/*ウィンドウハンドル*/
HWND hTree;
HWND hEdit;
HWND hCombo1;                             // コンボボックスのハンドル
HWND hToolBar;                            // ツールバーのウィンドウハンドル
HWND hRebar;                             // レバーコントロールのハンドル
HWND hStatus;
HWND hTab;            // タブコントロールのハンドル
WNDPROC defProc;
 
//エディット入力内容
TCHAR szEditBuf[MAXTAB][1024*1024];
 
// TBBUTTON(ツールバーボタン)型の配列
TBBUTTON tbButton[] = {
  { STD_FILEOPEN, ID_BUTTON1, TBSTATE_ENABLED, TBSTYLE_BUTTON | BTNS_AUTOSIZE, 0, 0, 0},
  { STD_FILESAVE, ID_BUTTON2, TBSTATE_ENABLED, TBSTYLE_BUTTON | BTNS_AUTOSIZE, 0, 0, 0},
  { STD_COPY,     ID_BUTTON3, TBSTATE_ENABLED, TBSTYLE_BUTTON | BTNS_AUTOSIZE, 0, 0, 0},
  { STD_CUT,      ID_BUTTON4, TBSTATE_ENABLED, TBSTYLE_BUTTON | BTNS_AUTOSIZE, 0, 0, 0},
  { STD_DELETE,   ID_BUTTON5, TBSTATE_ENABLED, TBSTYLE_BUTTON | BTNS_AUTOSIZE, 0, 0, 0},
  { STD_PASTE,    ID_BUTTON6, TBSTATE_ENABLED, TBSTYLE_BUTTON | BTNS_AUTOSIZE, 0, 0, 0},
  { STD_REDOW,    ID_BUTTON7, TBSTATE_ENABLED, TBSTYLE_BUTTON | BTNS_AUTOSIZE, 0, 0, 0},
  { STD_UNDO,     ID_BUTTON8, TBSTATE_ENABLED, TBSTYLE_BUTTON | BTNS_AUTOSIZE, 0, 0, 0}
};
TBBUTTON tbSPACE = {0, 0, TBSTATE_ENABLED, TBSTYLE_SEP, 0, 0L};
 
/* コールバック関数/初期化関数 */
ATOM MyRegisterClass(HINSTANCE hInstance);
BOOL InitInstance(HINSTANCE, int);
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
LRESULT CALLBACK ToolbarProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam);
 
/* 関数の定義 */
 
void AddItemTree();
 
int OpenFile();
int NewFile();
int SaveAsFile();
int SaveFile();
int ConfirmFile();
 
 
TCHAR szTitle[128] = TEXT("Test");
TCHAR szTitle_org[] = TEXT("Test [ %s ]");
TCHAR szFile[MAX_PATH];
TCHAR szFileTitle[MAX_PATH];
 
TCITEM AddTi;
 
 
int APIENTRY WinMain(HINSTANCE hInstance,
                     HINSTANCE hPrevInstance,
                     LPSTR lpCmdLine,
                     int nCmdShow)
{
    MSG msg;
    MyRegisterClass(hInstance);
 
    if (!InitInstance (hInstance, nCmdShow))
    {
        return FALSE;
    }
    while (GetMessage(&msg, NULL, 0, 0))
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
    return (int) msg.wParam;
}
 
 
ATOM MyRegisterClass(HINSTANCE hInstance)
{
    WNDCLASSEX wcex;
 
    wcex.cbSize = sizeof(WNDCLASSEX);
 
    wcex.style = CS_HREDRAW | CS_VREDRAW;
    wcex.lpfnWndProc = WndProc;
    wcex.cbClsExtra = 0;
    wcex.cbWndExtra = 0;
    wcex.hInstance = hInstance;
    wcex.hIcon = LoadIcon(hInst ,MAKEINTRESOURCE(TEST_ICON));
    wcex.hCursor = LoadCursor(NULL, IDC_ARROW);
    wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
    wcex.lpszMenuName = MAKEINTRESOURCE(IDC_MENU);
    wcex.lpszClassName = TEXT("Test");
    wcex.hIconSm = LoadIcon(wcex.hInstance, MAKEINTRESOURCE(TEST_ICON));
 
    return RegisterClassEx(&wcex);
}
 
BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
{
   HWND hWnd;
 
   hInst = hInstance; // グローバル変数にインスタンス処理を格納します。
 
   hWnd = CreateWindow(TEXT("Test"),TEXT("Test Ver.1.0.1.1") , WS_OVERLAPPEDWINDOW,
      CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL);
 
   if (!hWnd)
   {
      return FALSE;
   }
 
   ShowWindow(hWnd, nCmdShow);
   UpdateWindow(hWnd);
 
   return TRUE;
}
 
LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
    int wmId, wmEvent;
    static BOOL push = FALSE;
    RECT Rect;                // RECT構造体
    static RECT winRect,staRect;
    INITCOMMONCONTROLSEX ic;  // INITCOMMONCONTROLSEX構造体
    REBARBANDINFO rbBand;     // REBARBANDINFO構造体
    HFONT hFont;              // フォント
    LPCTSTR szBuf_edit1;
    LPCTSTR strItem1[] = {
      TEXT("COM1") ,
      TEXT("COM2") ,
      TEXT("COM3")
    };
    UINT i;
    UINT index;
    UINT com_no;
    TBADDBITMAP tb;
    int nTab;
    static RECT Tabrc;
    //TCITEM ti;
    //LPMINMAXINFO lpmm;
    static HFONT hEditFont;
    RECT ReSize;
 
    switch (msg)
    {
        case WM_CREATE:
            InitCommonControls();           //コモンコントロール初期化処理
 
            hTree = CreateWindowEx(WS_EX_CLIENTEDGE, // 拡張ウィンドウスタイル
                WC_TREEVIEW,
                TEXT(""),
                WS_CHILD | WS_BORDER | WS_VISIBLE | TVS_HASLINES |
                TVS_HASBUTTONS | TVS_LINESATROOT | TVS_CHECKBOXES | TVS_EDITLABELS | TVS_NONEVENHEIGHT | TVS_NOSCROLL
                ,
                0, 0,
                0, 0,
                hWnd,
                (HMENU)IDC_TREE,
                hInst,
                NULL);
            hTab = CreateWindowEx(0,
                WC_TABCONTROL, TEXT(""), 
                WS_CHILD | WS_CLIPSIBLINGS | WS_VISIBLE, 
                0, 0, 0, 0, 
                hWnd, (HMENU)ID_TAB, hInst, NULL);
            hEdit = CreateWindowEx(WS_EX_CLIENTEDGE, // 拡張ウィンドウスタイル
                TEXT("EDIT"),
                TEXT(""),
                WS_CHILD | WS_VISIBLE | ES_WANTRETURN | ES_MULTILINE | 
                ES_AUTOVSCROLL | WS_VSCROLL | ES_AUTOHSCROLL | WS_HSCROLL,
                0, 0,
                0, 0,
                hTab,
                (HMENU)IDC_EDIT2,
                hInst,
                NULL);
            Edit_LimitText(hEdit,0);
            AddItemTree();      //ツリービューに要素を挿入
 
 
            //コモンコントロールの初期化  
            ic.dwICC = ICC_COOL_CLASSES | ICC_BAR_CLASSES;
            ic.dwSize = sizeof(INITCOMMONCONTROLSEX); 
            InitCommonControlsEx(&ic); 
 
            //レバーコントロールの作成
            hRebar = CreateWindowEx(0,REBARCLASSNAME,TEXT(""),
                      WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS |WS_CLIPCHILDREN | CCS_NODIVIDER,
                      0, 0, 0, 0,
                      hWnd, (HMENU)ID_COOL,
                      (HINSTANCE)GetWindowLong(hWnd, GWL_HINSTANCE), NULL);
 
            // REBARBANDINFO構造体
            ZeroMemory(&rbBand, sizeof(REBARBANDINFO)); 
            // 構造体のサイズ
            rbBand.cbSize = sizeof(REBARBANDINFO);
            // マスクフラグ
            rbBand.fMask = RBBIM_STYLE | RBBIM_CHILD | RBBIM_CHILDSIZE | RBBIM_SIZE | RBBIM_BACKGROUND;
            // バンドの背景
            rbBand.hbmBack = LoadBitmap((HINSTANCE)GetWindowLong(hWnd, GWL_HINSTANCE),
                              MAKEINTRESOURCE(IDB_BITMAP1));
            // バンドのスタイルフラグ
            rbBand.fStyle = RBBS_CHILDEDGE;   
            // 最小値の高さ
            rbBand.cyMinChild = 21;
            // 最小値の幅
            rbBand.cxMinChild = 100;
            // レバーコントロールにのせる対象の子ウインドウのハンドル
            hFont = CreateFont(12, 0, 0, 0,
                      FW_NORMAL, FALSE, FALSE, FALSE,
                      SHIFTJIS_CHARSET,
                      OUT_DEFAULT_PRECIS,
                      CLIP_DEFAULT_PRECIS,
                      DEFAULT_QUALITY,
                      FF_MODERN,
                      TEXT("MS Pゴシック"));
            hCombo1 = CreateWindowEx(0, TEXT("COMBOBOX"), TEXT(""),
                       WS_CHILD | WS_VISIBLE | CBS_DROPDOWN,
                       0, 0, 0, 0,
                       hRebar, (HMENU)ID_COMBO1, 
                       (HINSTANCE)GetWindowLong(hWnd, GWL_HINSTANCE) ,NULL);
            SendMessage(hCombo1, WM_SETFONT, (WPARAM)hFont, MAKELPARAM(true, 0));
            // コンボボックスにデータを詰めていく
            for (i = 0 ; i < 3 ; i++)
            {
                SendMessage(hCombo1 , CB_ADDSTRING , 0 , (LPARAM)strItem1[i]);
            }
            // ウインドウ生成時にはじめに表示するデータを指定
            index = SendMessage(hCombo1, CB_FINDSTRINGEXACT, -1, (LPARAM)TEXT("COM1"));
            SendMessage(hCombo1, CB_SETCURSEL, index, 0);
            rbBand.hwndChild = hCombo1;
 
            // レバーコントロールにコンボボックス1を挿入 
            SendMessage(hRebar, RB_INSERTBAND, (WPARAM)-1, (LPARAM)&rbBand);
 
            // レバーコントロールにツールバーを挿入
            hToolBar = CreateWindowEx(
                0,                //拡張スタイルなし
                TOOLBARCLASSNAME, // クラスネーム
                NULL,             //ウィンドウタイトル
                WS_CHILD
                 | WS_VISIBLE
                 | CCS_NODIVIDER
                 | CCS_NORESIZE
                 | TBSTYLE_FLAT,  //ウィンドウスタイル
                0, 0,             //ウィンドウ位置
                0, 0,             //ウィンドウ幅、高さ
                hRebar,           //親ウィンドウ
                (HMENU)IDW_TOOL,  //コントロール識別子
                (HINSTANCE)GetWindowLong(hWnd, GWL_HINSTANCE) ,   //インスタンスハンドル
                NULL);            //pointer to window-creation data 
            tb.hInst = HINST_COMMCTRL;    // ボタンをシステム定義のビットマップ
            tb.nID = IDB_STD_SMALL_COLOR; // システム標準ビットマップ(小)
            SendMessage(hToolBar, TB_ADDBITMAP, 0, (LPARAM)&tb); 
 
            /* TBBUTTON 構造体のサイズを設定 */
            SendMessage(hToolBar, TB_BUTTONSTRUCTSIZE, (WPARAM)sizeof(TBBUTTON), 0);
            /* ツールバーにボタンを挿入 */
            SendMessage(hToolBar, TB_ADDBUTTONS, (WPARAM)8, (LPARAM)(LPTBBUTTON)&tbButton);
            // ボタンの区切りを挿入
            SendMessage(hToolBar, TB_INSERTBUTTON, 2, (LPARAM)&tbSPACE);
            /* ツールバーサブクラス化 */
            defProc = (WNDPROC)GetWindowLong(hToolBar, GWL_WNDPROC);
            SetWindowLong(hToolBar, GWL_WNDPROC, (LONG)ToolbarProc);
            SetWindowLong(hToolBar, GWL_USERDATA, (LONG)defProc);
 
            rbBand.hwndChild = hToolBar;
            GetClientRect(hRebar, &Rect);
            rbBand.cx = Rect.right - 100;
            SendMessage(hRebar, RB_INSERTBAND, (WPARAM)-1, (LPARAM)&rbBand);
 
            GetWindowRect(hRebar,&winRect);
            GetWindowRect(hStatus,&staRect);
 
            GetClientRect(hWnd, &Tabrc);
            // ステータスバーを作成
            hStatus = CreateStatusWindow(
                WS_CHILD | WS_VISIBLE | CCS_BOTTOM | SBARS_SIZEGRIP,
                "",
                hWnd,
                ID_STATUS
            );
            SendMessage(hTab, WM_SETFONT, (WPARAM)GetStockObject(DEFAULT_GUI_FONT), 0);
 
            //ti.mask = TCIF_TEXT;
            //ti.pszText = TEXT("タブ0");
            //TabCtrl_InsertItem(hTab, 0, &ti);
            //ti.pszText = TEXT("タブ1");
            //TabCtrl_InsertItem(hTab, 1, &ti);
            //ti.pszText = TEXT("タブ2");
            //TabCtrl_InsertItem(hTab, 2, &ti);
            SendMessage(hTree,TVM_SETITEMHEIGHT,(WPARAM)16,0);
 
            hEditFont = CreateFont(15, 0, 0, 0, /* フォントの高さ,平均文字幅,文字送り方向の角度,ベースラインの角度 */
            FW_NORMAL, FALSE, FALSE, 0, /* フォントの太さ,斜体,下線,取り消し線 */
            SHIFTJIS_CHARSET, /* 文字セットの識別子 */
            OUT_DEFAULT_PRECIS, /* 出力精度 */
            CLIP_DEFAULT_PRECIS, /* クリッピング精度 */
            DEFAULT_QUALITY, DEFAULT_PITCH, "MS Pゴシック"); /* 出力品質,ピッチとファミリ,フォント名 */
 
            SendMessage(hEdit, WM_SETFONT, (WPARAM)hEditFont, MAKELPARAM(FALSE, 0)); /* フォントの変更 */
 
            SetFocus(hEdit);
            break;
        case WM_NOTIFY:
            //ツリービューの通知メッセージ処理
            if (((LPNMHDR)lParam)->code == TVN_SELCHANGED) {
                TCHAR    szBuf[256];
                TVITEMEX item;
 
                item.mask       = TVIF_HANDLE | TVIF_TEXT;
                item.hItem      = ((LPNMTREEVIEW)lParam)->itemNew.hItem;
                item.pszText    = szBuf;
                item.cchTextMax = sizeof(szBuf) / sizeof(TCHAR);
                TreeView_GetItem(hTree, &item);
                GetWindowRect(hWnd,&ReSize);
 
        MessageBox(NULL, szBuf, TEXT("OK"), MB_OK);
    }
            //タブコントロールの通知メッセージ処理
            switch (((NMHDR *)lParam)->code) {
                case TCN_SELCHANGE:
                    nTab = TabCtrl_GetCurSel(hTab);
                    SetWindowText(hEdit, szEditBuf[nTab]);
 
                    break;
                case TCN_SELCHANGING:
                    nTab = TabCtrl_GetCurSel(hTab);
                    GetWindowText(hEdit, szEditBuf[nTab], sizeof(szEditBuf[nTab]));
                    break;
            }
            break;
        case WM_SIZE:
            MoveWindow(hTree, 0, winRect.bottom - winRect.top, width - SPLIT_WIDTH, HIWORD(lParam) - (winRect.bottom - winRect.top) - 25, TRUE);
            MoveWindow(hEdit, width + SPLIT_WIDTH-148  , winRect.bottom - winRect.top , LOWORD(lParam)-160, HIWORD(lParam) - 80 , TRUE);
            MoveWindow(hTab, width + SPLIT_WIDTH, winRect.bottom - winRect.top, LOWORD(lParam), HIWORD(lParam)- (winRect.bottom - winRect.top) - 25, TRUE);
            SendMessage(hRebar, WM_SIZE, wParam, lParam);
            SendMessage(hStatus, WM_SIZE, wParam, lParam );
            break;
 
        case WM_COMMAND:
            wmId = LOWORD(wParam);
            wmEvent = HIWORD(wParam);
            switch (wmId)
            {
                case ID_COMBO1:
                    if (HIWORD(wParam) == CBN_SELCHANGE)
                    { 
                        // 現在のコンボボックスのデータを取得
                        com_no = (UINT)SendMessage(hCombo1, CB_GETCURSEL, 0, 0);
                        // テキストの表示
                        szBuf_edit1 = strItem1[com_no];
                        MessageBox(hWnd, szBuf_edit1, TEXT("メッセージ"), MB_OK);
                    }
                    break;
                case IDM_EXIT:
                    DestroyWindow(hWnd);
                    break;
                case IDM_OPEN:
                    OpenFile();
                    break;
                case IDM_NEW:
                    NewFile();
                    break;
                case IDM_SAVEAS:
                    SaveAsFile();
                    break;
                case IDM_SAVE:
                    SaveFile();
                    break;
 
                default:
                    return DefWindowProc(hWnd, msg, wParam, lParam);
            }
            break;
 
        case WM_DESTROY:
            PostQuitMessage(0);
            break;
 
        default:
            return DefWindowProc(hWnd, msg, wParam, lParam);
    }
    return 0;
}
 
 
void AddItemTree(){
 
    HTREEITEM hParent1, hParent2, hParent3, hChild1, hChild2;
    TV_INSERTSTRUCT tv;
 
            tv.hInsertAfter = TVI_LAST;
            tv.item.mask = TVIF_TEXT;
            tv.hParent = TVI_ROOT;
            tv.item.pszText = TEXT("親1");
            hParent1 = TreeView_InsertItem(hTree, &tv);
 
            tv.item.pszText = TEXT("親2");
            hParent2 = TreeView_InsertItem(hTree, &tv);
 
            tv.item.pszText = TEXT("親3");
            hParent3 = TreeView_InsertItem(hTree, &tv);
 
            tv.hParent = hParent1;
            tv.item.pszText = TEXT("子1");
            hChild1 = TreeView_InsertItem(hTree, &tv);
            tv.item.pszText = TEXT("子2");
            hChild2 = TreeView_InsertItem(hTree, &tv);
            tv.hParent = hChild1;
            tv.item.pszText = TEXT("孫1");
            TreeView_InsertItem(hTree, &tv);
            tv.hParent = hChild1;
            tv.item.pszText = TEXT("孫2");
            TreeView_InsertItem(hTree, &tv);
            tv.hParent = hParent2;
            tv.item.pszText = TEXT("子3");
            TreeView_InsertItem(hTree, &tv);
            tv.hParent = hParent3;
            tv.item.pszText = TEXT("子4");
            TreeView_InsertItem(hTree, &tv);
}
 
//* ツールバーサブクラス */
//* WindowsXPにおいて、
//ツールバーのボタン上でマウスの左ボタンを押したまま右ボタンを押すと、
//それ以降のマウス操作を正常に受け付けなくなる。 */
LRESULT CALLBACK ToolbarProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
    switch (msg)
    {
        case WM_RBUTTONDOWN:
        case WM_RBUTTONUP:
            if (SendMessage(hWnd, TB_GETHOTITEM, 0, 0) >= 0){
                ReleaseCapture();
            }
            return 0;
    }
    return CallWindowProc(defProc, hWnd, msg, wParam, lParam);
}
 
 
 
 
 
int OpenFile()
{
    int id;
    HWND hMain;
    DWORD dwSize = 0L;
    OPENFILENAME ofn;
    HANDLE hFile;
    DWORD dwAccBytes;
    LPTSTR lpszBuf;
 
    HGLOBAL hMem;
 
    id = ConfirmFile();
    if (id == IDCANCEL)
        return -1;
 
    // OPENFILENAME構造体を設定
    memset(&ofn, 0, sizeof(OPENFILENAME));
    ofn.lStructSize = sizeof(OPENFILENAME);
    ofn.hwndOwner = hEdit;
    ofn.lpstrFilter =
        TEXT("テキストファイル(*.txt)\0*.txt\0すべてのファイル(*.*)\0*.*\0\0");
    ofn.lpstrFile = szFile;
    ofn.lpstrFileTitle = szFileTitle;
    ofn.nMaxFile = MAX_PATH;
    ofn.nMaxFileTitle = MAX_PATH;
    ofn.Flags = OFN_FILEMUSTEXIST | OFN_HIDEREADONLY;
    ofn.lpstrDefExt = TEXT("txt");
    ofn.lpstrTitle = TEXT("ファイルを開く");
 
    if(GetOpenFileName(&ofn) == 0)  // 「ファイルを開く」ダイアログ
        return -1;
 
    hFile = CreateFile(szFile,  // ファイル名
        GENERIC_READ,           // 読み取り/書き込みアクセス
        0,                      // 共有設定 0だと共有対象としない
        NULL,                   // セキュリティ属性
        OPEN_ALWAYS,            // ファイルがすでに存在しているかどうか
        FILE_ATTRIBUTE_NORMAL,  // ファイル属性
        NULL);
    dwSize = GetFileSize(hFile, NULL);  // ファイルサイズを取得
 
    // メモリを動的に確保
    hMem = GlobalAlloc(GHND, dwSize + sizeof(TCHAR));
    if (hMem == NULL) {
        MessageBox(hEdit, TEXT("メモリの確保に失敗しました\nメモリの残量を確認してください"),
                   TEXT("Test"),
                   MB_ICONERROR | MB_OK);
        return -1;
    }
    lpszBuf = (LPTSTR)GlobalLock(hMem);
 
    // ファイルを読み込み、エディットコントロールに表示する
    ReadFile(hFile, lpszBuf, dwSize, &dwAccBytes, NULL);
    lpszBuf[dwAccBytes] = TEXT('\0');
 
    AddTi.mask = TCIF_TEXT;
    AddTi.pszText = szFile;
    TabCtrl_InsertItem(hTab,0, &AddTi);
    InvalidateRect(hTab,NULL,TRUE);
    TabCtrl_SetCurSel(hTab,0);
 
    Edit_SetText(hEdit, lpszBuf);
 
    // タイトルバーの設定
    //wsprintf(szTitle, szTitle_org, szFileTitle, dwSize);
    //hMain = GetParent(hEdit);
    //SetWindowText(hMain, szTitle);
 
 
 
    CloseHandle(hFile);
    GlobalUnlock(hMem);
    GlobalFree(hMem);
 
    return 0;
}
 
int SaveAsFile()
{
    OPENFILENAME ofn;
    HANDLE hFile;
    DWORD dwAccBytes;
    TCITEM GetTi;
    LPTSTR lpszBuf;
    int nLen;
    HGLOBAL hMem;
 
    //int cTab = TabCtrl_GetCurSel(hTab);
    //TabCtrl_GetItem(hTab,cTab,&GetTi);
    //if(lstrcmp(GetTi.pszText,TEXT("無題")) == FALSE ){
 
 
    // エディットコントロールに書き込まれている文字数を取得し、
    // それに見合うメモリを動的に確保
    nLen = GetWindowTextLength(hEdit);
    hMem = GlobalAlloc(GHND, sizeof(TCHAR) * (nLen + 1));
    lpszBuf = (LPTSTR)GlobalLock(hMem);
 
    // エディットコントロールの内容をlpszBufに保管
    GetWindowText(hEdit, lpszBuf, nLen + 1);
 
    // OPENFILENAME構造体を設定
    memset(&ofn, 0, sizeof(OPENFILENAME));
    ofn.lStructSize = sizeof(OPENFILENAME);
    ofn.hwndOwner = hEdit;
    ofn.lpstrFilter =
        TEXT("テキストファイル(*.txt)\0*.txt\0すべてのファイル(*.*)\0*.*\0\0");
    ofn.lpstrFile = szFile;
    ofn.lpstrFileTitle = szFileTitle;
    ofn.nFilterIndex = 1;
    ofn.nMaxFile = MAX_PATH;
    ofn.nMaxFileTitle = MAX_PATH;
    ofn.Flags = OFN_OVERWRITEPROMPT | OFN_HIDEREADONLY;
    ofn.lpstrDefExt = TEXT("txt");
    ofn.lpstrTitle = TEXT("名前を付けて保存する");
 
    if(GetSaveFileName(&ofn) == 0)  // 「ファイルを保存」ダイアログ
        return -1;
 
    // ファイルにlpszBufの内容を書き込む
    hFile = CreateFile(szFile, GENERIC_WRITE, 0, NULL,
                CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
    WriteFile(hFile, lpszBuf, (DWORD)lstrlen(lpszBuf),
              &dwAccBytes, NULL);
 
    AddTi.mask = TCIF_TEXT;
    AddTi.pszText = szFile;
    //TabCtrl_InsertItem(hTab, 0, &AddTi);
    int nTab = TabCtrl_GetCurSel(hTab);
    TabCtrl_SetItem(hTab,nTab,&AddTi);
    TabCtrl_SetCurSel(hTab,nTab);
    InvalidateRect(hTab,NULL,TRUE);
 
    // タイトルバーの設定
    //wsprintf(szTitle, szTitle_org, szFileTitle, nLen);
    //SetWindowText(GetParent(hEdit), szTitle);
 
    if(CloseHandle(hFile) == 0)
        MessageBox(hEdit, TEXT("ハンドルのクローズに失敗しました\nユーザーの操作に欠陥はありません"),
                   TEXT("Test"), MB_OK);
 
    // エディットコントロールの変更フラグをFALSEに設定
    SendMessage(hEdit, EM_SETMODIFY, FALSE, 0);
 
    GlobalUnlock(hMem);
    GlobalFree(hMem);
 
    return 0;
}
 
int SaveFile()
{
    HANDLE hFile;
    DWORD dwAccBytes;
    int nLen;
    LPTSTR lpszBuf;
    HGLOBAL hMem;
 
    if (lstrcmp(szFile, TEXT("") ) == 0) {
        MessageBox(hEdit, TEXT("ファイル名が付けられていません"),
                   TEXT("Test"), MB_OK);
        SaveAsFile();
        return -1;
    }
 
    // エディットコントロールに書き込まれている文字数を取得し、
    // それに見合うメモリを動的に確保
    nLen = GetWindowTextLength(hEdit);
    hMem = GlobalAlloc(GHND, nLen + sizeof(TCHAR));
    lpszBuf = (LPTSTR)GlobalLock(hMem);
 
    // エディットコントロールの内容をlpszBufに保管
    GetWindowText(hEdit, lpszBuf, nLen + 1);
 
    // ファイルにlpszBufの内容を書き込む
    hFile = CreateFile(szFile, GENERIC_WRITE, 0, NULL,
                TRUNCATE_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
    WriteFile(hFile, lpszBuf, (DWORD)lstrlen(lpszBuf),
              &dwAccBytes, NULL);
 
    AddTi.mask = TCIF_TEXT;
    AddTi.pszText = szFile;
    //TabCtrl_InsertItem(hTab, 0, &AddTi);
    int nTab = TabCtrl_GetCurSel(hTab);
    TabCtrl_SetItem(hTab,nTab,&AddTi);
    TabCtrl_SetCurSel(hTab,nTab);
    InvalidateRect(hTab,NULL,TRUE);
 
    GlobalUnlock(hMem);
    GlobalFree(hMem);
 
    // エディットコントロールの変更フラグをFALSEに設定
    SendMessage(hEdit, EM_SETMODIFY, FALSE, 0);
 
    /*wsprintf(szTitle, szTitle_org, szFileTitle, nLen);*/
 
    /*SetWindowText(GetParent(hEdit), szTitle);*/
    if (CloseHandle(hFile) == 0) {
        MessageBox(hEdit, TEXT("ハンドルのクローズに失敗しました\nユーザーの操作に欠陥はありません"),
                   TEXT("Test"), MB_OK);
        return -1;
    }
 
    return 0;
}
 
int ConfirmFile()
{
    int id;
 
    if (SendMessage(hEdit, EM_GETMODIFY, 0, 0) == TRUE) {
        id = MessageBox(hEdit,
            TEXT("文書が更新されています。\n変更を保存しますか?"),
            TEXT("Test"),
            MB_YESNOCANCEL | MB_ICONEXCLAMATION);
        if (id == IDYES) {
            SaveFile();
        } else if (id == IDCANCEL) {
            return IDCANCEL;
        } else if (id ==  IDNO) {
            return IDNO;
        }
    }
    return 0;
}
 
int NewFile()
{
    int id;
    id = ConfirmFile();
    if (id == IDCANCEL) {
        return -1;
    }
    Edit_SetText(hEdit, TEXT(""));
    
    AddTi.mask = TCIF_TEXT;
    AddTi.pszText = TEXT("無題");
    TabCtrl_InsertItem(hTab, 0, &AddTi);
    TabCtrl_SetCurSel(hTab,0);
    InvalidateRect(hTab,NULL,TRUE);
    
    lstrcpy(szFile, TEXT(""));
    return 0;
}
header.h

コード:

#define IDC_TREE 1001
#define IDC_EDIT2 1002
#define IDM_ABOUT 104
#define IDM_EXIT 105
#define IDC_HP 109
#define IDW_TOOL 149
#define ID_COOL 150
#define ID_COMBO1 165
#define ID_COMBO2 166
#define IDC_COMBO1 161
#define IDC_COMBO2 162
#define ID_BUTTON1 151
#define ID_BUTTON2 152
#define ID_BUTTON3 153
#define ID_BUTTON4 154
#define ID_BUTTON5 155
#define ID_BUTTON6 156
#define ID_BUTTON7 157
#define ID_BUTTON8 158
#define ID_STATUS 2005
#define ID_TAB 1008
#define IDC_RICHEDIT 158
resoure.h

コード:

#ifndef IDC_STATIC
#define IDC_STATIC (-1)
#endif
 
#define IDM_ABOUT                               104
#define IDM_EXIT                                105
#define IDC_MENU                                110
#define IDB_BITMAP1                             111
#define TEST_ICON                          118
#define IDM_OPEN                                40000
#define IDM_NEW                                 40001
#define IDM_SAVEAS                              40002
#define IDM_SAVE                                40003
main.rc

コード:

// Generated by ResEdit 1.5.9
// Copyright (C) 2006-2011
// <!-- m --><a class=\"postlink\" href=\"http://www.resedit.net\">http://www.resedit.net</a><!-- m -->
 
#include <windows.h>
#include <commctrl.h>
#include <richedit.h>
#include "resource.h"
 
 
 
 
//
// Bitmap resources
//
LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL
IDB_BITMAP1        BITMAP         ".\\reber.bmp"
 
 
 
//
// Menu resources
//
LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL
IDC_MENU MENU
BEGIN
    POPUP "ファイル(&F)"
    BEGIN
        MENUITEM "新規作成(&N)", IDM_NEW
        MENUITEM "ファイルを開く(&O)...", IDM_OPEN
        MENUITEM "上書き保存(&S)", IDM_SAVE
        MENUITEM "名前を付けて保存(&A)...", IDM_SAVEAS
        MENUITEM SEPARATOR
        MENUITEM "アプリケーションの終了(&X)", IDM_EXIT
    END
    POPUP "ヘルプ(&H)"
    BEGIN
        MENUITEM "バージョン情報(&A)...", IDM_ABOUT
    END
END
 
 
 
//
// Icon resources
//
LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL
TEST_ICON     ICON           ".\\1007_32.ico"
実行していただくとわかると思うんですが、
「新規作成」して「ファイルを開く」からファイルを開き、新規作成したファイルで文字を書き、
「上書き保存」をするとファイルを開くで開いたファイルに上書きされてしまいます。

どうやったら解決できるのでしょう。
どなたか教えてください、お願いします!


開発環境 Visual Studio C++ 2008 Express Edision
       WindowsXP


※フォーラムルールに違反したので記事削除を訂正しました。
ご迷惑をおかけして申し訳ございませんでした。
[/code]
最後に編集したユーザー オカピーα on 2012年10月18日(木) 17:04 [ 編集 2 回目 ]
C,C++,C#,これらを極めることを「3C政策」と言う

box
記事: 2002
登録日時: 14年前

Re: テキストエディタ

#2

投稿記事 by box » 12年前

オカピーα さんが書きました: 「新規作成」して「ファイルを開く」からファイルを開き、
ここの操作がよくわからないです。
「新規作成」を選択したら、まっさらの編集用ウィンドウが出るだけではないのですか?
また、「ファイルを開く」という操作は、通常、既存のファイルを開くという意味ではないかと思います。
これら2つの操作を連続して行なう意味がよくわかりません。
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 15年前
住所: 東海地方
連絡を取る:

Re: テキストエディタ

#3

投稿記事 by softya(ソフト屋) » 12年前

>「ファイルを開く」からファイルを開いて「上書き保存」をするとファイルを開くで開いたファイルに上書きされてしまいます。

これは仕様です。
「新規作成」したら「上書き保存」する時に名前を付けます。その間に「ファイルを開く」があってはいけません。
Windowsのソフトは全て、そうなっているはずですが?
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

オカピーα
記事: 120
登録日時: 13年前

Re: テキストエディタ

#4

投稿記事 by オカピーα » 12年前

回答を締め切ります。


※自力で解決できたため...
最後に編集したユーザー オカピーα on 2012年10月18日(木) 17:17 [ 編集 1 回目 ]
C,C++,C#,これらを極めることを「3C政策」と言う

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 15年前
住所: 東海地方
連絡を取る:

Re: テキストエディタ

#5

投稿記事 by softya(ソフト屋) » 12年前

特別な事情を除いて質問内容を削除することは禁止されています。
フォーラムルール違反になりますので元に戻してください。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 15年前
住所: 東海地方
連絡を取る:

Re: テキストエディタ

#6

投稿記事 by softya(ソフト屋) » 12年前

次の場合は違反になるので注意してくださいね。
3. 禁止行為について

以下の行為を禁止行為として定めます。

・卑猥な、暴力的な、差別的な、その他閲覧者が不快に思うコンテンツのアップロードまたは行為
・名誉、プライバシー、著作権等を侵害する行為
・当サイト運営を妨害する行為、他人に迷惑のかかる行為
・情報の改ざんやその方法を掲示、伝達する行為
・ユーザーの個人情報を収集する行為、出会い系等他サイトへ勧誘する行為
・犯罪を助長/表明する行為、また犯罪につながる特定の手段を問う行為
・試験中に試験問題を提示して回答を求める行為
・企業等の秘密事項を質問文・回答文を通して漏洩する行為
・アフェリエイト、特定サイトへの不正な誘導等、個人の極端な利益目的にコメントを投稿する行為
・その他、一般常識に反する行為と管理者が判断する行為


[C言語何でも質問掲示板でのみ適用される事項]

名前を複数利用して質問する行為
記事の内容を無暗に変更する行為
自分勝手な都合で記事を削除する行為
課題・試験の丸投げをする行為
質問後、お礼を言わずにトピックを閉じる、または去る行為
親しくない人に対して丁寧語を使わない行為 (ネタや冗談などは常識の範囲内で)
円滑なコミュニケーションを心がけない行為
それと質問者は解決内容を書くことは義務となっておりますので、よろしくおねがいします。
10/11/30 問題が解決した際、解決方法の明記を義務化
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 15年前
住所: 東海地方
連絡を取る:

Re: テキストエディタ

#7

投稿記事 by softya(ソフト屋) » 12年前

他の人が見て真似ができない結論は困ります。
解決方法 あるいは 解決コードの掲載
でお願いします。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

閉鎖

“C言語何でも質問掲示板” へ戻る