第310章 シェブロンの手直し


今までは、シェブロンをクリックして出てくるメニューには、 状況が反映されていませんでした。たとえば文字列が選択されていないときは 「コピー」などの項目は灰色表示でなくてはいけません。 今回は、これを修正します。

また、メニュー項目によっては説明がステータスバーに表示されないものが ありましたが、今回はすべて表示するようにしました。

せっかくツールチップの文字色などを変更しても、次回起動時にはデフォルトの 色に戻ってしまいました。これをレジストリに記憶させて、次回起動時に反映させます。

と、言っても目新しいことは出てきません。今までの手直しです。



シェブロンをクリックしたときのメニューにも、灰色表示が 反映されています。



では、プログラムを見てみましょう。

// htmledit.h typedef struct _tagHData { char szTagNo[4]; char szContents[256]; } MYHTAG, *LPMYHTAG; typedef struct _tagImgData { char szFileName[MAX_PATH]; char szPath[MAX_PATH]; BOOL bPath; } MYIMGTAG, *LPMYIMGTAG; typedef struct _tagTableData { char szRow[8]; char szColumn[8]; char szTitle[64]; char szTitleAlign[16]; char szBorder[8]; BOOL bTitle; BOOL bBorder; } MYTABLETAG, *LPMYTABLETAG; typedef struct _tagFormData { char szMethod[8]; char szAction[64]; char szName[16]; char szID[16]; BOOL bMethod; BOOL bAction; BOOL bName; BOOL bID; } MYFORMTAG, *LPMYFORMTAG; typedef struct _tagInputData { char szType[16]; char szValue[64]; char szName[16]; char szID[16]; char szOnClick[64]; char szOnBlur[64]; char szOnChange[64]; char szOnFocus[64]; char szOnSubmit[64]; BOOL bValue; BOOL bName; BOOL bID; BOOL bClick; BOOL bBlur; BOOL bChange; BOOL bFocus; BOOL bSubmit; } MYINPUTTAG, *LPMYINPUTTAG; typedef struct _tagInitialData { int x; //ウィンドウx座標 int y; //y座標 int wx; //ウィンドウ幅 int wy; //ウィンドウ高さ COLORREF crTipText; COLORREF crTipBackground; } MYINITIALDATA, *LPMYINITIALDATA;

最後のMYINITIALDATA構造体の定義が増えました。

リソース・スクリプトに変更はありません。

// htmedit09.cpp #ifndef STRICT #define STRICT #endif #define ID_EDIT 100 #define ID_EDIT2 101 #define ID_TOOL1 102 #define ID_TOOL2 103 #define ID_TOOL3 104 #define ID_TOOLMENU 105 #define ID_REBAR 105 #define ID_STATIC 106 #define ID_STATUS 107 #define ID_TIP1 111 #define ID_TIP2 112 #define ID_TIP3 113 #define MY_BUF_SIZE 1024 * 64 - 1 #define MY_MSG WM_USER #include <windows.h> #include <windowsx.h> #include "resource.h" #include "htmledit.h" #include <commctrl.h> LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); LRESULT CALLBACK MyBasicInputProc(HWND, UINT, WPARAM, LPARAM); LRESULT CALLBACK MyHProc(HWND, UINT, WPARAM, LPARAM); LRESULT CALLBACK MyImgProc(HWND, UINT, WPARAM, LPARAM); LRESULT CALLBACK MyAProc(HWND, UINT, WPARAM, LPARAM); LRESULT CALLBACK MyTableProc(HWND, UINT, WPARAM, LPARAM); LRESULT CALLBACK MyFormProc(HWND, UINT, WPARAM, LPARAM); LRESULT CALLBACK MyInputProc(HWND, UINT, WPARAM, LPARAM); LRESULT CALLBACK NewEditProc(HWND, UINT, WPARAM, LPARAM); ATOM InitApp(HINSTANCE); BOOL InitInstance(HINSTANCE, int); BOOL MySetHTML(HWND, HWND); int MyBasicInput(HWND); BOOL MySaveAs(HWND); BOOL MySave(HWND); BOOL MyInsertTag(HWND, HWND, char *); BOOL MyInsertH(HWND, HWND); BOOL MyInsertIMG(HWND, HWND); BOOL MyGetFileTitle(HWND, HWND, BOOL); BOOL MyGetBodyColor(HWND); BOOL MyGetWallPaper(HWND); BOOL MyInsertA(HWND, HWND); BOOL MyGetHREFFile(HWND, HWND, BOOL); BOOL MyInsertTable(HWND, HWND); BOOL MyInsertForm(HWND, HWND); BOOL MyInsertInput(HWND, HWND); BOOL MyInsertScript(HWND, HWND); HWND MakeMyToolbar(HWND, int, TBBUTTON *, int); HWND MakeMyToolbar2(HWND, int, TBBUTTON *, int, int, int); BOOL MyOpen(HWND, HWND); BOOL CheckMyMenu(HMENU, HWND, HWND); BOOL CanPaste(HWND); BOOL MySetStatusText(HWND, int, char *); HWND MakeMyToolTip(HWND, HWND, int, int, TBBUTTON *, char [][256]); void SetTipColor(HWND, HWND *, COLORREF *, int); void SetTipBkColor(HWND, HWND *, COLORREF *, int); BOOL GetInitialSetting(LPMYINITIALDATA); BOOL SetInitialSetting(LPMYINITIALDATA); char szClassName[] = "htmedit09"; //ウィンドウクラス char *lpszWinTitleOrg = "猫でもわかるHTMLエディタ[%s]"; char *lpszHead = "<HTML>\r\n<HEAD>\r\n" "<meta http-equiv=\"Content-Type\" content=\"text/html; charset=x-sjis\">\r\n<TITLE>"; char szTitle[64] = "タイトル"; char *lpszBody1 = "</TITLE>\r\n</HEAD>\r\n<BODY"; char szBody2[256]; char *lpszBody3 =">\r\n"; char *lpszAddress = "<ADDRESS>"; char *lpszMailto = "<A HREF=\"mailto:"; char szEMail[256] = "webmaster@kumei.ne.jp"; char *lpszMailEnd = "\">"; char szAuthor[64] = "Yasutaka Kumei"; char *lpszCloseA = "</A>"; char *lpszEnd = "</ADDRESS>\r\n</BODY>\r\n</HTML>"; char szFileName[MAX_PATH]; char szFileTitle[64]; WNDPROC OrgEditProc; HIMAGELIST hImage; HWND hParent; TBBUTTON tbButton1[] = { {STD_FILENEW, IDM_NEW, TBSTATE_ENABLED, TBSTYLE_BUTTON, 0, 0, 0}, {STD_FILEOPEN, IDM_OPEN, TBSTATE_ENABLED, TBSTYLE_BUTTON, 0, 0, 0}, {STD_FILESAVE, IDM_SAVE, TBSTATE_ENABLED, TBSTYLE_BUTTON, 0, 0, 0}, }; TBBUTTON tbButton2[] = { {STD_COPY, IDM_COPY, TBSTATE_ENABLED, TBSTYLE_BUTTON, 0, 0, 0}, {STD_CUT, IDM_CUT, TBSTATE_ENABLED, TBSTYLE_BUTTON, 0, 0, 0}, {STD_PASTE, IDM_PASTE, TBSTATE_ENABLED, TBSTYLE_BUTTON, 0, 0, 0}, {STD_DELETE, IDM_DELETE, TBSTATE_ENABLED, TBSTYLE_BUTTON, 0, 0, 0}, {STD_UNDO, IDM_UNDO, TBSTATE_ENABLED, TBSTYLE_BUTTON, 0, 0, 0}, }; TBBUTTON tbButton3[] = { {0, IDM_BASICINPUT, TBSTATE_ENABLED, TBSTYLE_BUTTON, 0, 0, 0}, {1, IDM_SCRIPT, TBSTATE_ENABLED, TBSTYLE_BUTTON, 0, 0, 0}, {2, IDM_TAG, TBSTATE_ENABLED, TBSTYLE_DROPDOWN, 0, 0, 0}, }; char szTipText1[][256] = { "新規にHTMLファイルを作成します", "HTMLファイルを開きます", "上書き保存をします\nすでに名前を付けて保存してある必要があります" }; char szTipText2[][256] = { "選択された文字列をコピーします", "選択された文字列を切り取って\nクリップボードに格納します", "クリップボードから貼り付けます", "選択された文字列を削除します\n削除してしまってもUNDOで取り消すこともできます", "元に戻します" }; char szTipText3[][256] = { "HTMLの基本的枠組みを作ります", "スクリプトを挿入します", "タグを挿入します" };

GetInitialSetting, SetInitialSetting関数のプロトタイプ宣言が増えました。

WinMain, InitApp, InitInstanceの各関数に変更はありません。

//ウィンドウプロシージャ LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wp, LPARAM lp) { int id, nBtn, i; static HWND hEdit, hEdit_hide, hTool1, hTool2, hTool3, hRebar, hStatic, hStatus, hTip[3]; static HINSTANCE hInst; CREATESTRUCT *lpcs; char szWinTitle[64], szMenuName[32]; INITCOMMONCONTROLSEX ic; REBARINFO ri; REBARBANDINFO rbinfo; RECT rc, rc1, rc2; static int nClientX, nClientY, nRebarH, nStatusH; LPNMHDR lpnmhdr; int sb_size[3]; static HMENU hMenu; HMENU hToolMenu, hPopup; LPNMTOOLBAR lpnmTB; TPMPARAMS tpm; static COLORREF crTipText = RGB(255, 0, 0), crTipBk = RGB(255, 255, 255); NMREBARCHEVRON *lpnmchevron; int nHideBtn = 0; HMENU hPopMenu, hSubMenu; char szResourceName[32]; POINT pt; RECT rc1_scr, rc2_scr, rc3_scr; MYINITIALDATA myinit; switch (msg) { case WM_CREATE: memset(&myinit, 0, sizeof(MYINITIALDATA)); GetInitialSetting(&myinit); if (myinit.wx != 0 && myinit.wy != 0) { MoveWindow(hWnd, myinit.x, myinit.y, myinit.wx, myinit.wy, TRUE); } ic.dwSize = sizeof(INITCOMMONCONTROLSEX); ic.dwICC = ICC_BAR_CLASSES | ICC_COOL_CLASSES | ICC_PAGESCROLLER_CLASS; InitCommonControlsEx(&ic); wsprintf(szWinTitle, lpszWinTitleOrg, "無題"); SetWindowText(hWnd, szWinTitle); lpcs = (CREATESTRUCT *)lp; hInst = lpcs->hInstance; hEdit = CreateWindowEx(WS_EX_CLIENTEDGE, "EDIT", "", WS_CHILD | WS_VISIBLE | ES_MULTILINE | ES_WANTRETURN | ES_AUTOVSCROLL | ES_AUTOHSCROLL | WS_HSCROLL | WS_VSCROLL, 0, 0, 0, 0, hWnd, (HMENU)ID_EDIT, hInst, NULL); OrgEditProc = (WNDPROC)GetWindowLong(hEdit, GWL_WNDPROC); SetWindowLong(hEdit, GWL_WNDPROC, (LONG)NewEditProc); hEdit_hide = CreateWindow("EDIT", "", WS_CHILD, 0, 0, 0, 0, hEdit, (HMENU)ID_EDIT2, hInst, NULL); hStatic = CreateWindow("STATIC", "", WS_CHILD | WS_VISIBLE | SS_SUNKEN, 0, 0, 0, 0, hWnd, (HMENU)ID_STATIC, hInst, NULL); hRebar = CreateWindowEx(WS_EX_TOOLWINDOW, REBARCLASSNAME, NULL, WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS | WS_CLIPCHILDREN | RBS_BANDBORDERS | RBS_VARHEIGHT, 0, 0, 0, 0, hWnd, (HMENU)ID_REBAR, hInst, NULL); hTool1 = MakeMyToolbar(hRebar, 3, tbButton1, ID_TOOL1); hTool2 = MakeMyToolbar(hRebar, 5, tbButton2, ID_TOOL2); hTool3 = MakeMyToolbar2(hRebar, 3, tbButton3, ID_TOOL3, IDR_TOOLBAR3, IDR_TOOLBAR3X); hStatus = CreateStatusWindow(WS_CHILD | WS_VISIBLE, "", hWnd, ID_STATUS); memset(&ri, 0, sizeof(REBARINFO)); ri.cbSize = sizeof(REBARINFO); ri.fMask = 0; ri.himl = NULL; SendMessage(hRebar, RB_SETBARINFO, 0, (LPARAM)&ri); memset(&rbinfo, 0, sizeof(REBARBANDINFO)); rbinfo.cbSize = sizeof(REBARBANDINFO); rbinfo.fMask = RBBIM_STYLE | RBBIM_CHILD | RBBIM_CHILDSIZE | RBBIM_SIZE | RBBIM_IDEALSIZE; rbinfo.fStyle = RBBS_CHILDEDGE | RBBS_USECHEVRON; rbinfo.hwndChild = hTool1; rbinfo.cxMinChild = 0; rbinfo.cyMinChild = 25; rbinfo.cxIdeal = 69; rbinfo.cx = 85; SendMessage(hRebar, RB_INSERTBAND, (WPARAM)-1, (LPARAM)&rbinfo); GetWindowRect(hRebar, &rc); rbinfo.hwndChild = hTool2; rbinfo.cxMinChild = 0; rbinfo.cyMinChild = 25; rbinfo.cxIdeal = 115; rbinfo.cx = 131; SendMessage(hRebar, RB_INSERTBAND, (WPARAM)-1, (LPARAM)&rbinfo); rbinfo.hwndChild = hTool3; rbinfo.cxMinChild = 0; rbinfo.cyMinChild = 25; rbinfo.cx = 79; rbinfo.cxIdeal = 95; SendMessage(hRebar, RB_INSERTBAND, (WPARAM)-1, (LPARAM)&rbinfo); hTip[0] = MakeMyToolTip(hWnd, hTool1, 0, 2, tbButton1, szTipText1); hTip[1] = MakeMyToolTip(hWnd, hTool2, 0, 4, tbButton2, szTipText2); hTip[2] = MakeMyToolTip(hWnd, hTool3, 0, 2, tbButton3, szTipText3); if (myinit.crTipText != 0 && myinit.crTipText != 0) { crTipText = myinit.crTipText; crTipBk = myinit.crTipBackground; for (i = 0; i < 3; i++) { SendMessage(hTip[i], TTM_SETTIPBKCOLOR, (WPARAM)crTipBk, 0); SendMessage(hTip[i], TTM_SETTIPTEXTCOLOR, (WPARAM)crTipText, 0); } } hMenu = GetMenu(hWnd); SendMessage(hEdit, MY_MSG, 0, (LPARAM)hTool2); CheckMyMenu(hMenu, hEdit, hTool2); break; case WM_SIZE: nClientX = LOWORD(lp); nClientY = HIWORD(lp); MoveWindow(hStatic , 0, 0, nClientX, 2, TRUE); GetWindowRect(hRebar, &rc); nRebarH = rc.bottom - rc.top; GetWindowRect(hStatus, &rc); nStatusH = rc.bottom - rc.top; SendMessage(hRebar, WM_SIZE, wp, lp); sb_size[2] = nClientX; sb_size[1] = nClientX - 200; sb_size[0] = 300; SendMessage(hStatus, SB_SETPARTS, (WPARAM)3, (LPARAM)sb_size); SendMessage(hStatus, WM_SIZE, wp, lp); MoveWindow(hEdit, 0, nRebarH + 2, LOWORD(lp), HIWORD(lp) - (nRebarH + 2 + nStatusH), TRUE); SetFocus(hEdit); break; case WM_MENUSELECT: switch (LOWORD(wp)) { case IDM_NEW: MySetStatusText(hStatus, 0, szTipText1[0]); break; case IDM_OPEN: MySetStatusText(hStatus, 0, szTipText1[1]); break; case IDM_SAVE: MySetStatusText(hStatus, 0, szTipText1[2]); break; case IDM_COPY: MySetStatusText(hStatus, 0, szTipText2[0]); break; case IDM_CUT: MySetStatusText(hStatus, 0, szTipText2[1]); break; case IDM_PASTE: MySetStatusText(hStatus, 0, szTipText2[2]); break; case IDM_DELETE: MySetStatusText(hStatus, 0, szTipText2[3]); break; case IDM_UNDO: MySetStatusText(hStatus, 0, szTipText2[4]); break; case IDM_BASICINPUT: MySetStatusText(hStatus, 0, szTipText3[0]); break; case IDM_SCRIPT: MySetStatusText(hStatus, 0, szTipText3[1]); break; case IDM_SAVEAS: MySetStatusText(hStatus, 0, "名前を付けて保存します"); break; case IDM_END: MySetStatusText(hStatus, 0, "このアプリケーションを終了します"); break; case IDM_ALL: MySetStatusText(hStatus, 0, "すべてを選択状態にします"); break; case IDM_P: MySetStatusText(hStatus, 0, "<P>タグを挿入します"); break; case IDM_BR: MySetStatusText(hStatus, 0, "<BR>タグを挿入します"); break; case IDM_H: MySetStatusText(hStatus, 0, "<H>タグを挿入します"); break; case IDM_IMAGE: MySetStatusText(hStatus, 0, "<IMG>タグを挿入します"); break; case IDM_A: MySetStatusText(hStatus, 0, "<A HREF>タグを挿入します"); break; case IDM_TABLE: MySetStatusText(hStatus, 0, "<TABLE>タグを挿入します"); break; case IDM_FORM: MySetStatusText(hStatus, 0, "<FORM>タグを挿入します"); break; case IDM_INPUT: MySetStatusText(hStatus, 0, "<INPUT>タグを挿入します"); break; case IDM_BROWSER: MySetStatusText(hStatus, 0, "作成したHTML文書をブラウザで表示します"); break; case IDM_TIPTXTCOLOR: MySetStatusText(hStatus, 0, "ツールチップの文字色を設定します"); break; case IDM_TIPBKCOLOR: MySetStatusText(hStatus, 0, "ツールチップの背景色を設定します"); break; default: MySetStatusText(hStatus, 0, ""); break; } break; case WM_EXITMENULOOP: MySetStatusText(hStatus, 0, ""); break; case WM_NOTIFY: lpnmhdr = (LPNMHDR)lp; if (lpnmhdr->code == TTN_POP) { MySetStatusText(hStatus, 0, ""); return 0; } switch (wp) { case IDM_NEW: MySetStatusText(hStatus, 0, szTipText1[0]); break; case IDM_OPEN: MySetStatusText(hStatus, 0, szTipText1[1]); break; case IDM_SAVE: MySetStatusText(hStatus, 0, szTipText1[2]); break; case IDM_COPY: MySetStatusText(hStatus, 0, szTipText2[0]); break; case IDM_CUT: MySetStatusText(hStatus, 0, szTipText2[1]); break; case IDM_PASTE: MySetStatusText(hStatus, 0, szTipText2[2]); break; case IDM_DELETE: MySetStatusText(hStatus, 0, szTipText2[3]); break; case IDM_UNDO: MySetStatusText(hStatus, 0, szTipText2[4]); break; case IDM_BASICINPUT: MySetStatusText(hStatus, 0, szTipText3[0]); break; case IDM_SCRIPT: MySetStatusText(hStatus, 0, szTipText3[1]); break; case IDM_TAG: MySetStatusText(hStatus, 0, szTipText3[2]); break; case ID_TOOL3: if (lpnmhdr->hwndFrom == hTool3 && lpnmhdr->code == TBN_DROPDOWN) { lpnmTB = (LPNMTOOLBAR)lp; SendMessage(hTool3, TB_GETRECT, (WPARAM)lpnmTB->iItem, (LPARAM)&rc); MapWindowPoints(hTool3, HWND_DESKTOP, (LPPOINT)&rc, 2); tpm.cbSize = sizeof(TPMPARAMS); tpm.rcExclude.top = rc.top; tpm.rcExclude.left = rc.left; tpm.rcExclude.bottom = rc.bottom; tpm.rcExclude.right = rc.right; switch (lpnmTB->iItem) { case IDM_TAG: lstrcpy(szMenuName, "INSERT"); break; } hToolMenu = LoadMenu(hInst, szMenuName); hPopup = GetSubMenu(hToolMenu, 0); TrackPopupMenuEx(hPopup, TPM_LEFTALIGN | TPM_LEFTBUTTON | TPM_VERTICAL, rc.left, rc.bottom, hWnd, &tpm); DestroyMenu(hToolMenu); } else { return (DefWindowProc(hWnd, msg, wp, lp)); } break; case ID_REBAR: switch (lpnmhdr->code) { case RBN_HEIGHTCHANGE: GetWindowRect(hRebar, &rc); nRebarH = rc.bottom - rc.top; MoveWindow(hEdit, 0, nRebarH + 2, nClientX, nClientY - nRebarH - 2 - nStatusH, TRUE); break; case RBN_CHEVRONPUSHED: lpnmchevron = (NMREBARCHEVRON *)lp; if (SendMessage(hRebar, RB_GETRECT, (WPARAM)lpnmchevron->uBand, (LPARAM)&rc1) == 0) { MessageBox(hWnd, "RB_GETRECT ERROR", "OK", MB_OK); return FALSE; } pt.x = rc1.left; pt.y = rc1.top; ClientToScreen(hRebar, &pt); rc1_scr.left = pt.x; rc1_scr.top = pt.y; pt.x = rc1.right; pt.y = rc1.bottom; ClientToScreen(hRebar, &pt); rc1_scr.right = pt.x; rc1_scr.bottom = pt.y; memset(&rbinfo, 0, sizeof(REBARBANDINFO)); rbinfo.cbSize = sizeof(REBARBANDINFO); rbinfo.fMask = RBBIM_CHILD; if (SendMessage(hRebar, RB_GETBANDINFO, (WPARAM)lpnmchevron->uBand, (LPARAM)&rbinfo) == 0) MessageBox(hWnd, "Error RB_GETBANDINFO", "Error", MB_OK); nBtn = SendMessage(rbinfo.hwndChild, TB_BUTTONCOUNT, 0, 0); for (i = 0; i < nBtn; i++) { SendMessage(rbinfo.hwndChild, TB_GETITEMRECT, (WPARAM)i, (LPARAM)&rc2); pt.x = rc2.left; pt.y = rc2.top; ClientToScreen(rbinfo.hwndChild, &pt); rc2_scr.left = pt.x; rc2_scr.top = pt.y; pt.x = rc2.right; pt.y = rc2.bottom; ClientToScreen(rbinfo.hwndChild, &pt); rc2_scr.right = pt.x; rc2_scr.bottom = pt.y; IntersectRect(&rc3_scr, &rc2_scr, &rc1_scr); if (!EqualRect(&rc2_scr, &rc3_scr)) { nHideBtn = nBtn - i; break; } } if (rbinfo.hwndChild == hTool1) { strcpy(szResourceName, "FILE"); } else if (rbinfo.hwndChild == hTool2) { strcpy(szResourceName, "EDIT"); } else if (rbinfo.hwndChild == hTool3) { strcpy(szResourceName, "INSERT2"); } else { MessageBox(hWnd, "Error", "Error", MB_OK); return FALSE; } hPopMenu = LoadMenu(hInst, szResourceName); if (hPopMenu == NULL) { MessageBox(hWnd, "LoadMenu Error", "Error", MB_OK); break; } hSubMenu = GetSubMenu(hPopMenu, 0); if (nHideBtn == 0) nHideBtn = 1; for (i = 0; i < nBtn - nHideBtn; i++) { if (DeleteMenu(hSubMenu, 0, MF_BYPOSITION) == 0) { MessageBox(hWnd, "DeleteMenu Error", "Error", MB_OK); return 0; } } CheckMyMenu(hPopMenu, hEdit, hTool2); TrackPopupMenu(hSubMenu, TPM_LEFTALIGN, rc1_scr.right-10, rc1_scr.bottom, 0, hWnd, NULL); DestroyMenu(hPopMenu); break; default: return DefWindowProc(hWnd, msg, wp, lp); } break; } break; case WM_COMMAND: switch (LOWORD(wp)) { case IDM_END: SendMessage(hWnd, WM_CLOSE, 0, 0); break; case IDM_BASICINPUT: if (MyBasicInput(hEdit) == IDCANCEL) break; id = MessageBox(hWnd, "現在のソースファイルが置き換わりますがよろしいですか", "注意", MB_YESNO | MB_ICONQUESTION); if (id == IDNO) break; if (MySetHTML(hEdit, hEdit_hide)) MySetStatusText(hStatus, 0, "基本項目を入力しました"); break; case IDM_SAVEAS: MySaveAs(hEdit); wsprintf(szWinTitle, lpszWinTitleOrg, szFileTitle); SetWindowText(hWnd, szWinTitle); break; case IDM_NEW: if (SendMessage(hEdit, EM_GETMODIFY, 0, 0)) { id = MessageBox(hWnd, "変更を保存しますか", "注意", MB_YESNO | MB_ICONQUESTION); if (id == IDYES) MySave(hEdit); } SendMessage(hEdit, EM_SETSEL, (WPARAM)0, (LPARAM)-1); SendMessage(hEdit, WM_CLEAR, 0, 0); strcpy(szFileName, ""); strcpy(szFileTitle, ""); wsprintf(szWinTitle, lpszWinTitleOrg, "無題"); SetWindowText(hWnd, szWinTitle); break; case IDM_SAVE: id = MessageBox(hWnd, "上書きしてもよろしいですか", "上書き保存", MB_YESNO | MB_ICONQUESTION); if (id == IDYES) { MySave(hEdit); wsprintf(szWinTitle, lpszWinTitleOrg, szFileTitle); SetWindowText(hWnd, szWinTitle); } break; case IDM_P: MyInsertTag(hEdit, hEdit_hide, "<P>"); MySetStatusText(hStatus, 0, "<P>タグを挿入しました"); break; case IDM_BR: MyInsertTag(hEdit, hEdit_hide, "<BR>"); MySetStatusText(hStatus, 0, "<BR>タグを挿入しました"); break; case IDM_H: if (MyInsertH(hEdit, hEdit_hide)) MySetStatusText(hStatus, 0, "<H>タグを挿入しました");; break; case IDM_IMAGE: if (MyInsertIMG(hEdit, hEdit_hide)) MySetStatusText(hStatus, 0, "イメージを挿入しました"); break; case IDM_BROWSER: if (strcmp(szFileName, "") == 0) { MessageBox(hWnd, "まだHTMLファイルが保存されていません", "Error", MB_OK); break; } if (ShellExecute(NULL, "open", szFileName, NULL, NULL, SW_SHOWNORMAL) > (HINSTANCE)32) { MySetStatusText(hStatus, 0, "ブラウザが起動しました"); } else { MySetStatusText(hStatus, 0, "ブラウザの起動に失敗"); } return 0; case IDM_A: if (MyInsertA(hEdit, hEdit_hide)) MySetStatusText(hStatus, 0, "<A>タグを挿入しました"); break; case IDM_TABLE: if (MyInsertTable(hEdit, hEdit_hide)) MySetStatusText(hStatus, 0, "テーブルを挿入しました"); break; case IDM_FORM: if (MyInsertForm(hEdit, hEdit_hide)) MySetStatusText(hStatus, 0, "<FORM>タグを挿入しました"); break; case IDM_INPUT: if (MyInsertInput(hEdit, hEdit_hide)) MySetStatusText(hStatus, 0, "<INPUT>タグを挿入しました"); break; case IDM_SCRIPT: if (MyInsertScript(hEdit, hEdit_hide)) MySetStatusText(hStatus, 0, "<SCRIPT>タグを挿入しました"); break; case IDM_OPEN: MyOpen(hEdit, hEdit_hide); break; case IDM_COPY: SendMessage(hEdit, WM_COPY, 0, 0); break; case IDM_CUT: SendMessage(hEdit, WM_CUT, 0, 0); break; case IDM_PASTE: SendMessage(hEdit, WM_PASTE, 0, 0); break; case IDM_UNDO: SendMessage(hEdit, WM_UNDO, 0, 0); break; case IDM_DELETE: SendMessage(hEdit, WM_CLEAR, 0, 0); break; case IDM_ALL: SendMessage(hEdit, EM_SETSEL, (WPARAM)0, (LPARAM)-1); break; case IDM_TIPTXTCOLOR: SetTipColor(hEdit, hTip, &crTipText, 3); break; case IDM_TIPBKCOLOR: SetTipBkColor(hEdit, hTip, &crTipBk, 3); break; } CheckMyMenu(hMenu, hEdit, hTool2); SetFocus(hEdit); break; case WM_CLOSE: id = MessageBox(hWnd, "終了してもよいですか", "終了確認", MB_YESNO | MB_ICONQUESTION); if (id == IDYES) { if (SendMessage(hEdit, EM_GETMODIFY, 0, 0)) { id = MessageBox(hWnd, "変更を保存しますか", "保存", MB_YESNO | MB_ICONQUESTION); if (id == IDYES) MySave(hEdit); } GetWindowRect(hWnd, &rc); myinit.x = rc.left; myinit.y = rc.top; myinit.wx = rc.right - rc.left; myinit.wy = rc.bottom - rc.top; myinit.crTipText = crTipText; myinit.crTipBackground = crTipBk; SetInitialSetting(&myinit); SetWindowLong(hEdit, GWL_WNDPROC, (LONG)OrgEditProc); ImageList_Destroy(hImage); DestroyWindow(hTip[0]); DestroyWindow(hTip[1]); DestroyWindow(hTip[2]); DestroyWindow(hTool1); DestroyWindow(hTool2); DestroyWindow(hTool3); DestroyWindow(hRebar); DestroyWindow(hStatus); DestroyWindow(hStatic); DestroyWindow(hEdit_hide); DestroyWindow(hEdit); DestroyWindow(hWnd); } break; case WM_DESTROY: PostQuitMessage(0); break; default: return (DefWindowProc(hWnd, msg, wp, lp)); } return 0; }

メインウィンドウのプロシージャです。

WM_CREATEメッセージが来たらmyinit構造体のメンバを全部0で初期化します。

自作関数GetInitialSettingを呼んでレジストリより、前回終了時の ウィンドウの位置、大きさを読み込みます。もし、このプログラムが 初回起動であればGetInitialSetting関数は、レジストリにキーを作るだけなので myinit構造体のメンバはすべて0です。この構造体を見てウインドウの大きさが縦も横も 0なら、レジスリから読み込まれていないので、何もしません。 レジストリより読み込まれている場合は、MoveWindow関数を使って、前回終了時の 位置・大きさを再現します。

同様に、レジストリからツールチップの文字色や背景色が読み込まれている場合は、 ツールチップウィンドウにTTM_SETTIPBKCOLOR, TTM_SETTIPTEXTCOLORメッセージを 送って前回終了時の色を再現します。

WM_MENUSELECTメッセージが来たときは、IDM_**のすべてについてMySetStatusText関数を 実行して、ステータスバーに説明を表示するようにしました。

さて、エディットコントロールの状態(文字列が選択されているどうか)によって シェブロンから出るメニュー項目をの灰色表示にするかどうかは、どうやって決めればよいのでしょうか。 これは、簡単です。RBN_CHEVRONPUSHED通知メッセージが来て、TrackPopupMenuが実行される直前で CheckMyMenu関数を実行します。この時第1引数はツールチップウィンドウのハンドルにします。 プログラム終了時にウィンドウの位置・大きさ、ツールチップの文字色・背景色をmyinit構造体に 書き込んで、このアドレスをSetInitialSetting関数に渡します。

MySetHTML, MyBasicInput, MyBasicInputProc, MySaveAs, MySave, MyInsertTag, MyInsertH, MyHProc, MyInsertIMG, MyImgProc, MyGetFileTitle, MyGetBodyColor, MyGetWallPaper, MyInsertA, MyAProc, MyGetHREFFile, MyInsertTable, MyTableProc, MyInsertForm, MyFormProc, MyInputProc, MyInsertInput, MyInsertScript, MakeMyToolbar, MyOpen, CheckMyMenu, CanPaste, NewEditProc, MySetStatusText, MakeMyToolbar2, MakeMyToolTip, SetTipColor, SetTipBkColor の各関数に変更はありません。

BOOL GetInitialSetting(LPMYINITIALDATA lpmyinit) { HKEY hKey; DWORD dwResult, dwType, dwByte; LONG lResult; lResult = RegCreateKeyEx(HKEY_CURRENT_USER, "SoftWare\\Kumei\\htmledit", 0, "", REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, &hKey, &dwResult); if (lResult != ERROR_SUCCESS) { MessageBox(NULL, "レジストリ操作に失敗しました", "Error", MB_OK); return FALSE; } else if (dwResult == REG_CREATED_NEW_KEY) { return FALSE; } dwType = REG_DWORD; dwByte = (DWORD)sizeof(DWORD); RegQueryValueEx(hKey, "x", NULL, &dwType, (BYTE *)&(lpmyinit->x), &dwByte); RegQueryValueEx(hKey, "y", NULL, &dwType, (BYTE *)&(lpmyinit->y), &dwByte); RegQueryValueEx(hKey, "wx", NULL, &dwType, (BYTE *)&(lpmyinit->wx), &dwByte); RegQueryValueEx(hKey, "wy", NULL, &dwType, (BYTE *)&(lpmyinit->wy), &dwByte); dwByte = sizeof(COLORREF); RegQueryValueEx(hKey, "TipTextColor", NULL, &dwType, (BYTE *)&(lpmyinit->crTipText), &dwByte); RegQueryValueEx(hKey, "TipBkColor", NULL, &dwType, (BYTE *)&(lpmyinit->crTipBackground), &dwByte); RegCloseKey(hKey); return TRUE; }

レジストリから、ウィンドウ位置・大きさ、ツールチップ文字色・背景色を 読み出して構造体に書き込む関数です。

初回起動で、レジストリに情報がないときはサブキーを作って戻ります。 情報があるときは構造体に値をセットします。

レジスリの読み書きについては第129章を参照してください。

BOOL SetInitialSetting(LPMYINITIALDATA lpmyinit) { HKEY hKey; DWORD dwResult; LONG lResult; lResult = RegCreateKeyEx(HKEY_CURRENT_USER, "SoftWare\\Kumei\\htmledit", 0, "", REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, &hKey, &dwResult); if (lResult != ERROR_SUCCESS) { MessageBox(NULL, "レジストリ操作に失敗しました", "Error", MB_OK); return FALSE; } RegSetValueEx(hKey, "x", 0, REG_DWORD, (CONST BYTE *)&(lpmyinit->x), sizeof(DWORD)); RegSetValueEx(hKey, "y", 0, REG_DWORD, (CONST BYTE *)&(lpmyinit->y), sizeof(DWORD)); RegSetValueEx(hKey, "wx", 0, REG_DWORD, (CONST BYTE *)&(lpmyinit->wx), sizeof(DWORD)); RegSetValueEx(hKey, "wy", 0, REG_DWORD, (CONST BYTE *)&(lpmyinit->wy), sizeof(DWORD)); RegSetValueEx(hKey, "TipTextColor", 0, REG_DWORD, (CONST BYTE *)&(lpmyinit->crTipText), sizeof(COLORREF)); RegSetValueEx(hKey, "TipBkColor", 0, REG_DWORD, (CONST BYTE *)&(lpmyinit->crTipBackground), sizeof(COLORREF)); RegCloseKey(hKey); return TRUE; }

ウィンドウ位置・大きさ、ツールチップの文字色・背景色をレジストリに 書き込む関数です。

今回は簡単でした。メニューバーもインターネット・エクスプローラ風に作り替えて みてください。


[SDK第4部 Index] [総合Index] [Previous Chapter] [Next Chapter]

Update 23/Jun/2001 By Y.Kumei
当ホーム・ページの一部または全部を無断で複写、複製、 転載あるいはコンピュータ等のファイルに保存することを禁じます。