第307章 バルーン型ツールチップを付ける


ツールチップをWin2000では、おなじみのバルーン型ツールチップに変更してみます。 作り方は至って簡単です。文字色・背景色は自由に設定できます。



ツールチップも漫画の吹き出し様になると親しみがもてます。



実行環境は、Comctl32.dll, Shell32.dll, Shlwapi.dllのバージョンが5.80以降である 必要があります。これは、IE5.0以降がインストールされていれば大丈夫です。 (注)

ツールチップのスタイルにTTS_BALLOONを加えるだけです。

これでは、簡単すぎるので今回は、今まで作った部分を少し手直しします。

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

htmledit.hに変更はありません。

// htmledit07.rcの一部 ///////////////////////////////////////////////////////////////////////////// // // Menu // MYMENU MENU DISCARDABLE BEGIN POPUP "ファイル(&F)" BEGIN MENUITEM "新規作成(&N)...\tCtrl+N", IDM_NEW MENUITEM "開く(&O)...\tCtrl+O", IDM_OPEN MENUITEM SEPARATOR MENUITEM "上書き保存(&S)\tCtrl+S", IDM_SAVE MENUITEM "名前を付けて保存(&A)...", IDM_SAVEAS MENUITEM SEPARATOR MENUITEM "アプリケーションの終了(&X)", IDM_END END POPUP "編集(&E)" BEGIN MENUITEM "元に戻す(&U)\tCtrl+Z", IDM_UNDO MENUITEM "切り取り(&T)\tCtrl+X", IDM_CUT MENUITEM "コピー(&C)\tCtrl+C", IDM_COPY MENUITEM "貼り付け(&P)\tCtrl+V", IDM_PASTE MENUITEM "削除(&D)\tCtrl+D", IDM_DELETE MENUITEM SEPARATOR MENUITEM "すべて選択(&L)\tCtrl+A", IDM_ALL END POPUP "挿入(&I)" BEGIN MENUITEM "基本項目入力(&B)...\tShift+Ctrl+B", IDM_BASICINPUT MENUITEM SEPARATOR POPUP "タグの挿入" BEGIN MENUITEM "<P>", IDM_P MENUITEM "<BR>", IDM_BR MENUITEM "<H*></H*>...", IDM_H MENUITEM "<IMG>...", IDM_IMAGE MENUITEM "<A HREF></A>...", IDM_A MENUITEM "<TABLE></TABLE>...", IDM_TABLE MENUITEM "<FORM></FORM>...", IDM_FORM MENUITEM "<INPUT>...", IDM_INPUT END POPUP "JavaScriptの挿入" BEGIN MENUITEM "<SCRIPT>", IDM_SCRIPT END END POPUP "ブラウザ(&B)" BEGIN MENUITEM "ブラウザ起動(&E)\tF12", IDM_BROWSER END POPUP "オプション(&O)" BEGIN POPUP "ツールチップ(&T)" BEGIN MENUITEM "文字色(&L)", IDM_TIPTXTCOLOR MENUITEM "背景色(&B)", IDM_TIPBKCOLOR END END END INSERT MENU DISCARDABLE BEGIN POPUP "ダミーです" BEGIN MENUITEM "<P>", IDM_P MENUITEM "<BR>", IDM_BR MENUITEM "<H*></H*>...", IDM_H MENUITEM "<IMG>...", IDM_IMAGE MENUITEM "<A HREF></A>...", IDM_A MENUITEM "<TABLE></TABLE>...", IDM_TABLE MENUITEM "<FORM></FORM>...", IDM_FORM MENUITEM "<INPUT>...", IDM_INPUT END END ///////////////////////////////////////////////////////////////////////////// // // Dialog // MYBASICINPUT DIALOG DISCARDABLE 0, 0, 187, 121 STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU CAPTION "基本項目入力" FONT 9, "MS Pゴシック" BEGIN EDITTEXT IDC_EDIT1,39,7,141,14,ES_AUTOHSCROLL EDITTEXT IDC_EDIT2,39,27,141,14,ES_AUTOHSCROLL EDITTEXT IDC_EDIT3,39,47,141,14,ES_AUTOHSCROLL DEFPUSHBUTTON "OK",IDOK,39,100,50,14 PUSHBUTTON "キャンセル",IDCANCEL,96,100,50,14 LTEXT "タイトル",IDC_STATIC,7,7,23,8 LTEXT "作者",IDC_STATIC,7,30,15,8 LTEXT "E-Mail",IDC_STATIC,7,47,20,8 CONTROL "色",IDC_RADIO1,"Button",BS_AUTORADIOBUTTON,35,76,23,10 CONTROL "壁紙",IDC_RADIO2,"Button",BS_AUTORADIOBUTTON,67,76,32, 10 GROUPBOX "背景",IDC_STATIC,26,67,133,26 CONTROL "指定しない",IDC_RADIO3,"Button",BS_AUTORADIOBUTTON,108, 76,46,10 END MYHTAG DIALOG DISCARDABLE 0, 0, 187, 93 STYLE DS_MODALFRAME | DS_CENTER | WS_POPUP | WS_CAPTION | WS_SYSMENU CAPTION "見出しタグの挿入" FONT 9, "MS Pゴシック" BEGIN COMBOBOX IDC_COMBO1,51,7,18,68,CBS_DROPDOWN | CBS_SORT | WS_VSCROLL | WS_TABSTOP EDITTEXT IDC_EDIT1,51,27,129,32,ES_MULTILINE | ES_AUTOHSCROLL | ES_WANTRETURN DEFPUSHBUTTON "OK",IDOK,40,72,50,14 PUSHBUTTON "キャンセル",IDCANCEL,95,72,50,14 LTEXT "大きさ",IDC_STATIC,7,7,32,11 LTEXT "コンテンツ",IDC_STATIC,7,27,39,10 END MYIMGTAG DIALOG DISCARDABLE 0, 0, 187, 91 STYLE DS_MODALFRAME | DS_CENTER | WS_POPUP | WS_CAPTION | WS_SYSMENU CAPTION "イメージの挿入" FONT 9, "MS Pゴシック" BEGIN DEFPUSHBUTTON "OK",IDOK,43,70,41,14 PUSHBUTTON "キャンセル",IDCANCEL,101,70,41,14 CONTROL "パス付き",IDC_CHECK1,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,7,7,42,15 EDITTEXT IDC_EDIT1,50,7,107,16,ES_AUTOHSCROLL LTEXT "ファイル名",IDC_STATIC,7,33,38,11 EDITTEXT IDC_EDIT2,50,29,107,16,ES_AUTOHSCROLL PUSHBUTTON "参照",IDC_BUTTON1,160,31,20,15 CONTROL "画像を確認する",IDC_CHECK2,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,7,52,61,15 END MYTABLETAG DIALOG DISCARDABLE 0, 0, 95, 133 STYLE DS_MODALFRAME | DS_CENTER | WS_POPUP | WS_CAPTION | WS_SYSMENU CAPTION "テーブルの挿入" FONT 9, "MS Pゴシック" BEGIN DEFPUSHBUTTON "OK",IDOK,7,112,33,14 PUSHBUTTON "キャンセル",IDCANCEL,46,112,33,14 LTEXT "行",IDC_STATIC,7,7,11,10 COMBOBOX IDC_COMBO1,29,7,23,58,CBS_DROPDOWN | WS_VSCROLL | WS_TABSTOP LTEXT "列",IDC_STATIC,7,27,11,10 COMBOBOX IDC_COMBO2,29,25,23,55,CBS_DROPDOWN | WS_VSCROLL | WS_TABSTOP CONTROL "BORDER",IDC_CHECK1,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,7,49,41,12 EDITTEXT IDC_EDIT1,51,48,34,14,ES_AUTOHSCROLL CONTROL "CAPTION",IDC_CHECK2,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,7,67,44,12 COMBOBOX IDC_COMBO3,51,67,34,45,CBS_DROPDOWN | CBS_SORT | WS_VSCROLL | WS_TABSTOP EDITTEXT IDC_EDIT2,17,89,71,14,ES_AUTOHSCROLL END MYFORMTAG DIALOG DISCARDABLE 0, 0, 187, 103 STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU CAPTION "フォームの挿入" FONT 9, "MS Pゴシック" BEGIN DEFPUSHBUTTON "OK",IDOK,38,82,50,14 PUSHBUTTON "キャンセル",IDCANCEL,97,82,50,14 CONTROL "METHOD",IDC_CHECK1,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,7,7,47,12 COMBOBOX IDC_COMBO1,65,7,52,41,CBS_DROPDOWN | CBS_SORT | WS_VSCROLL | WS_TABSTOP CONTROL "ACTION",IDC_CHECK2,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,7,25,43,12 EDITTEXT IDC_EDIT1,65,25,114,12,ES_AUTOHSCROLL CONTROL "NAME",IDC_CHECK3,"Button",BS_AUTOCHECKBOX | WS_TABSTOP, 7,43,34,12 EDITTEXT IDC_EDIT2,65,43,114,12,ES_AUTOHSCROLL CONTROL "ID",IDC_CHECK4,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,7, 61,32,12 EDITTEXT IDC_EDIT3,65,61,114,12,ES_AUTOHSCROLL END MYINPUTTAG DIALOG DISCARDABLE 0, 0, 135, 203 STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU CAPTION "INPUTの挿入" FONT 9, "MS Pゴシック" BEGIN DEFPUSHBUTTON "OK",IDOK,17,182,50,14 PUSHBUTTON "キャンセル",IDCANCEL,71,182,50,14 LTEXT "TYPE",IDC_STATIC,7,7,24,9 COMBOBOX IDC_COMBO1,49,7,45,92,CBS_DROPDOWN | CBS_SORT | WS_VSCROLL | WS_TABSTOP CONTROL "NAME",IDC_CHECK2,"Button",BS_AUTOCHECKBOX | WS_TABSTOP, 7,48,35,14 CONTROL "ID",IDC_CHECK3,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,7, 67,25,14 CONTROL "onClick",IDC_CHECK4,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,7,86,35,14 EDITTEXT IDC_EDIT4,49,87,75,13,ES_AUTOHSCROLL EDITTEXT IDC_EDIT2,49,49,75,13,ES_AUTOHSCROLL EDITTEXT IDC_EDIT3,49,67,75,13,ES_AUTOHSCROLL EDITTEXT IDC_EDIT1,49,29,75,13,ES_AUTOHSCROLL CONTROL "VALUE",IDC_CHECK1,"Button",BS_AUTOCHECKBOX | WS_TABSTOP, 7,29,37,14 CONTROL "onBlur",IDC_CHECK5,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,7,105,36,14 EDITTEXT IDC_EDIT5,49,105,75,13,ES_AUTOHSCROLL CONTROL "onChange",IDC_CHECK6,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,7,124,40,14 EDITTEXT IDC_EDIT6,49,125,75,13,ES_AUTOHSCROLL CONTROL "onFocus",IDC_CHECK7,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,7,143,37,14 EDITTEXT IDC_EDIT7,49,143,75,13,ES_AUTOHSCROLL CONTROL "onSubmit",IDC_CHECK8,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,7,162,40,14 EDITTEXT IDC_EDIT8,49,163,75,13,ES_AUTOHSCROLL END ///////////////////////////////////////////////////////////////////////////// // // Icon // // Icon with lowest ID value placed first to ensure application icon // remains consistent on all systems. MYICON ICON DISCARDABLE "htmledit.ico" ///////////////////////////////////////////////////////////////////////////// // // Toolbar // IDR_TOOLBAR3X TOOLBAR DISCARDABLE 16, 15 BEGIN BUTTON ID_BUTTON40035 BUTTON ID_BUTTON40036 BUTTON ID_BUTTON40037 END IDR_TOOLBAR3 TOOLBAR DISCARDABLE 16, 15 BEGIN BUTTON ID_BUTTON40041 BUTTON ID_BUTTON40042 BUTTON ID_BUTTON40043 END ///////////////////////////////////////////////////////////////////////////// // // Bitmap // IDR_TOOLBAR3X BITMAP DISCARDABLE "toolbar3x.bmp" IDR_TOOLBAR3 BITMAP DISCARDABLE "toolbar3.bmp" ///////////////////////////////////////////////////////////////////////////// // // Accelerator // MYACCEL ACCELERATORS DISCARDABLE BEGIN "A", IDM_ALL, VIRTKEY, CONTROL, NOINVERT "B", IDM_BASICINPUT, VIRTKEY, SHIFT, CONTROL, NOINVERT "D", IDM_DELETE, VIRTKEY, CONTROL, NOINVERT "N", IDM_NEW, VIRTKEY, CONTROL, NOINVERT "O", IDM_OPEN, VIRTKEY, CONTROL, NOINVERT "S", IDM_SAVE, VIRTKEY, CONTROL, NOINVERT "V", IDM_PASTE, VIRTKEY, CONTROL, NOINVERT VK_F12, IDM_BROWSER, VIRTKEY, NOINVERT END

リソース・スクリプトにも若干の変更があります。ツールチップのテキストや背景色を 「ファイル」「編集」「挿入」ごとに設定できるようにしていましたが、使ってみると 大変面倒くさい。そこで一括で色を変更したらすべてのツールチップに反映するようにしました。

また、アクセラレーターキーで「削除」をDelキーに当てていましたが、これでは、 通常の編集でDelキーが効かなくなってしまうので、Ctrl+Dに変更しました。

また、ダイアログボックスの一部(Hタグ挿入)でタブオーダーを若干変更しました。

// htmedit07.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_PAGERA 108 #define ID_PAGERB 109 #define ID_PAGERC 110 #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); char szClassName[] = "htmedit07"; //ウィンドウクラス 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の基本的枠組みを作ります", "スクリプトを挿入します", "タグを挿入します" };

SetTipColor, SetTipBkColor関数の引数が変更になりました。

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

//ウィンドウプロシージャ LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wp, LPARAM lp) { int id; static HWND hEdit, hEdit_hide, hTool1, hTool2, hTool3, hRebar, hStatic, hStatus, hPagerA, hPagerB, hPagerC, hTip[3]; static HINSTANCE hInst; CREATESTRUCT *lpcs; char szWinTitle[64], szMenuName[32]; INITCOMMONCONTROLSEX ic; REBARINFO ri; REBARBANDINFO rbinfo; RECT rc; static int nClientX, nClientY, nRebarH, nStatusH; LPNMHDR lpnmhdr; int sb_size[3]; static HMENU hMenu; HMENU hToolMenu, hPopup; LPNMPGCALCSIZE lpCalcSize; LPNMPGSCROLL lpScroll; LPNMTOOLBAR lpnmTB; TPMPARAMS tpm; static COLORREF crTipText = RGB(255, 0, 0), crTipBk = RGB(255, 255, 255); switch (msg) { case WM_CREATE: 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); hPagerA = CreateWindowEx(0, WC_PAGESCROLLER, NULL, WS_CHILD | WS_VISIBLE | PGS_HORZ | PGS_AUTOSCROLL, 0, 0, 0, 0, hRebar, (HMENU)ID_PAGERA, hInst, NULL); hPagerB = CreateWindowEx(0, WC_PAGESCROLLER, NULL, WS_CHILD | WS_VISIBLE | PGS_HORZ | PGS_AUTOSCROLL, 0, 0, 0, 0, hRebar, (HMENU)ID_PAGERB, hInst, NULL); hPagerC = CreateWindowEx(0, WC_PAGESCROLLER, NULL, WS_CHILD | WS_VISIBLE | PGS_HORZ | PGS_AUTOSCROLL, 0, 0, 0, 0, hRebar, (HMENU)ID_PAGERC, hInst, NULL); hTool1 = MakeMyToolbar(hPagerA, 3, tbButton1, ID_TOOL1); hTool2 = MakeMyToolbar(hPagerB, 5, tbButton2, ID_TOOL2); hTool3 = MakeMyToolbar2(hPagerC, 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_TEXT | RBBIM_STYLE | RBBIM_CHILD | RBBIM_CHILDSIZE | RBBIM_SIZE; rbinfo.fStyle = RBBS_CHILDEDGE; rbinfo.lpText = "ファイル"; rbinfo.hwndChild = hPagerA; rbinfo.cxMinChild = 0; rbinfo.cyMinChild = 25; rbinfo.cx = 120; SendMessage(hRebar, RB_INSERTBAND, (WPARAM)-1, (LPARAM)&rbinfo); SendMessage(hPagerA, PGM_SETCHILD, 0, (LPARAM)hTool1); GetWindowRect(hRebar, &rc); rbinfo.lpText = "編集"; rbinfo.hwndChild = hPagerB; rbinfo.cxMinChild = 0; rbinfo.cyMinChild = 25; rbinfo.cx = (rc.right - rc.left) - rbinfo.cx; SendMessage(hRebar, RB_INSERTBAND, (WPARAM)-1, (LPARAM)&rbinfo); SendMessage(hPagerB, PGM_SETCHILD, 0, (LPARAM)hTool2); rbinfo.fStyle |= RBBS_BREAK; rbinfo.lpText = "挿入"; rbinfo.hwndChild = hPagerC; rbinfo.cxMinChild = 0; rbinfo.cyMinChild = 25; rbinfo.cx = 80; SendMessage(hRebar, RB_INSERTBAND, (WPARAM)-1, (LPARAM)&rbinfo); SendMessage(hPagerC, PGM_SETCHILD, 0, (LPARAM)hTool3); 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); 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; default: MySetStatusText(hStatus, 0, ""); break; } break; case WM_EXITMENULOOP: MySetStatusText(hStatus, 0, ""); break; case WM_NOTIFY: lpnmhdr = (LPNMHDR)lp; if (lpnmhdr->hwndFrom == hTip[0] || lpnmhdr->hwndFrom == hTip[1] || lpnmhdr->hwndFrom == hTip[2]) { switch (lpnmhdr->idFrom) { 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; } if (lpnmhdr->code == TTN_POP) MySetStatusText(hStatus, 0, ""); } switch (wp) { 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: lpnmhdr = (LPNMHDR)lp; 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; } break; case ID_PAGERA: switch (lpnmhdr->code) { case PGN_CALCSIZE: lpCalcSize = (LPNMPGCALCSIZE)lp; if (lpCalcSize->dwFlag == PGF_CALCWIDTH) { lpCalcSize->iWidth = 66; } break; case PGN_SCROLL: lpScroll = (LPNMPGSCROLL)lp; lpScroll->iScroll = 2; break; default: return (DefWindowProc(hWnd, msg, wp, lp)); } break; case ID_PAGERB: switch (lpnmhdr->code) { case PGN_CALCSIZE: lpCalcSize = (LPNMPGCALCSIZE)lp; if (lpCalcSize->dwFlag == PGF_CALCWIDTH) { lpCalcSize->iWidth = 110; } break; case PGN_SCROLL: lpScroll = (LPNMPGSCROLL)lp; lpScroll->iScroll = 2; break; default: return (DefWindowProc(hWnd, msg, wp, lp)); } break; case ID_PAGERC: switch (lpnmhdr->code) { case PGN_CALCSIZE: lpCalcSize = (LPNMPGCALCSIZE)lp; if (lpCalcSize->dwFlag == PGF_CALCWIDTH) { lpCalcSize->iWidth = 80; } else return (DefWindowProc(hWnd, msg, wp, lp)); break; case PGN_SCROLL: lpScroll = (LPNMPGSCROLL)lp; lpScroll->iScroll = 2; break; default: return (DefWindowProc(hWnd, msg, wp, lp)); } break; default: return (DefWindowProc(hWnd, msg, wp, lp)); } 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); } 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(hPagerA); DestroyWindow(hPagerB); DestroyWindow(hPagerC); 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; }

hTip1, hTip2, hTip3をhTip[3]の配列にしました。

ツールチップのテキスト色、背景色を格納する変数をそれぞれ1つだけにしました。

メニューのIDM_TIPCOLOR1, IDM_TIPCOLOR2, IDM_TIPCOLOR3を廃止してIDM_TIPTXTCOLOR1本にしました。 メニューのツールチップの背景色に関しても同様です。

MySetHTML, MyBasicInput, MyBasicInputProc, MySaveAs, MySave, MyInsertTag, MyInsertH の各関数に変更はありません。

LRESULT CALLBACK MyHProc(HWND hDlg, UINT msg, WPARAM wp, LPARAM lp) { static HWND hCombo, hEditContents; static LPMYHTAG lpmyh; switch (msg) { case WM_INITDIALOG: lpmyh = (LPMYHTAG)lp; hCombo = GetDlgItem(hDlg, IDC_COMBO1); hEditContents = GetDlgItem(hDlg, IDC_EDIT1); ComboBox_AddString(hCombo, "1"); ComboBox_AddString(hCombo, "2"); ComboBox_AddString(hCombo, "3"); ComboBox_AddString(hCombo, "4"); ComboBox_AddString(hCombo, "5"); ComboBox_AddString(hCombo, "6"); return TRUE; case WM_COMMAND: switch (LOWORD(wp)) { case IDOK: ComboBox_GetText(hCombo, lpmyh->szTagNo, sizeof(lpmyh->szTagNo)); Edit_GetText(hEditContents, lpmyh->szContents, sizeof(lpmyh->szContents)); EndDialog(hDlg, IDOK); return TRUE; case IDCANCEL: EndDialog(hDlg, IDCANCEL); return TRUE; case IDC_COMBO1: if (HIWORD(wp) == CBN_SELCHANGE) { SetFocus(hEditContents); return TRUE; } else { return FALSE; } } return FALSE; } return FALSE; }

IDC_COMBO1のSELが変更されたらフォーカスをhEditContensに移すようにしました。 具体的には、「大きさ」のコンボボックスから数値が選択されたら 「コンテンツ」のエディットコントロールにフォーカスが移動するようにしました。 これで、ユーザーは若干スムースに入力が続けられるようになります。 CBN_SELCHANGE通知メッセージについては 第195章に解説があります。

MyInsertIMG関数に変更はありません。

LRESULT CALLBACK MyImgProc(HWND hDlg, UINT msg, WPARAM wp, LPARAM lp) { static HWND hButton, hPath, hFile, hCheck, hImg; static LPMYIMGTAG lpimg; static BOOL bImg, bPath; switch (msg) { case WM_INITDIALOG: lpimg = (LPMYIMGTAG)lp; hButton = GetDlgItem(hDlg, IDC_BUTTON1); hCheck = GetDlgItem(hDlg, IDC_CHECK1); hPath = GetDlgItem(hDlg, IDC_EDIT1); hFile = GetDlgItem(hDlg, IDC_EDIT2); hImg = GetDlgItem(hDlg, IDC_CHECK2); if (bImg) Button_SetCheck(hImg, BST_CHECKED); else Button_SetCheck(hImg, BST_UNCHECKED); if (bPath) { EnableWindow(hPath, TRUE); Button_SetCheck(hCheck, BST_CHECKED); } else { EnableWindow(hPath, FALSE); Button_SetCheck(hCheck, BST_UNCHECKED); } return TRUE; case WM_COMMAND: switch (LOWORD(wp)) { case IDOK: Edit_GetText(hFile, lpimg->szFileName, MAX_PATH); if (Button_GetCheck(hCheck) == BST_CHECKED) { Edit_GetText(hPath, lpimg->szPath, MAX_PATH); lpimg->bPath = TRUE; } else { strcpy(lpimg->szPath, ""); lpimg->bPath = FALSE; } EndDialog(hDlg, IDOK); return TRUE; case IDCANCEL: EndDialog(hDlg, IDCANCEL); return TRUE; case IDC_CHECK1: if (Button_GetCheck(hCheck) == BST_CHECKED) { EnableWindow(hPath, TRUE); SetFocus(hPath); bPath = TRUE; } else { EnableWindow(hPath, FALSE); bPath = FALSE; } return TRUE; case IDC_BUTTON1: MyGetFileTitle(hDlg, hFile, bImg); return TRUE; case IDC_CHECK2: if (Button_GetCheck(hImg) == BST_CHECKED) bImg = TRUE; else bImg = FALSE; return TRUE; } return FALSE; } return FALSE; }

同様にIDC_CHECK1にチェックが付いたら、hPathエディットコントロールにフォーカスが 移動するようにしました。「パス付き」にチェックを付けたら、 エディットコントロールにフォーカスが移動するようになります。

MyGetFileTitle, MyGetBodyColor, MyGetWallPaper, MyInsertA, MyAProc, MyGetHREFFile, MyInsertTable, MyTableProc, MyInsertFormの各関数に変更はありません。

LRESULT CALLBACK MyFormProc(HWND hDlg, UINT msg, WPARAM wp, LPARAM lp) { static LPMYFORMTAG lpfm; static HWND hMethodCheck, hActionCheck, hMethodCombo, hActionEdit, hNameCheck, hNameEdit, hIDCheck, hIDEdit; static BOOL bMethod, bAction, bName, bID; static char szMethod[8], szAction[64], szName[16], szID[16]; switch (msg) { case WM_INITDIALOG: lpfm = (LPMYFORMTAG)lp; hMethodCheck = GetDlgItem(hDlg, IDC_CHECK1); hActionCheck = GetDlgItem(hDlg, IDC_CHECK2); hMethodCombo = GetDlgItem(hDlg, IDC_COMBO1); hActionEdit = GetDlgItem(hDlg, IDC_EDIT1); hNameCheck = GetDlgItem(hDlg, IDC_CHECK3); hNameEdit = GetDlgItem(hDlg, IDC_EDIT2); hIDCheck = GetDlgItem(hDlg, IDC_CHECK4); hIDEdit = GetDlgItem(hDlg, IDC_EDIT3); ComboBox_AddString(hMethodCombo, "POST"); ComboBox_AddString(hMethodCombo, "GET"); if (bMethod) { Button_SetCheck(hMethodCheck, BST_CHECKED); EnableWindow(hMethodCombo, TRUE); } else { Button_SetCheck(hMethodCheck, BST_UNCHECKED); EnableWindow(hMethodCombo, FALSE); } if (bAction) { Button_SetCheck(hActionCheck, BST_CHECKED); EnableWindow(hActionEdit, TRUE); } else { Button_SetCheck(hActionCheck, BST_UNCHECKED); EnableWindow(hActionEdit, FALSE); } if (bName) { Button_SetCheck(hNameCheck, BST_CHECKED); EnableWindow(hNameEdit, TRUE); } else { Button_SetCheck(hNameCheck, BST_UNCHECKED); EnableWindow(hNameEdit, FALSE); } if (bID) { Button_SetCheck(hIDCheck, BST_CHECKED); EnableWindow(hIDEdit, TRUE); } else { Button_SetCheck(hIDCheck, BST_UNCHECKED); EnableWindow(hIDEdit, FALSE); } ComboBox_SetText(hMethodCombo, szMethod); Edit_SetText(hActionEdit, szAction); Edit_SetText(hNameEdit, szName); Edit_SetText(hIDEdit, szID); return TRUE; case WM_COMMAND: switch (LOWORD(wp)) { case IDOK: if (Button_GetCheck(hMethodCheck) == BST_CHECKED) { ComboBox_GetText(hMethodCombo, lpfm->szMethod, sizeof(lpfm->szMethod)); lpfm->bMethod = TRUE; bMethod = TRUE; } else { strcpy(lpfm->szMethod, ""); lpfm->bMethod = FALSE; bMethod = FALSE; } if (Button_GetCheck(hActionCheck) == BST_CHECKED) { Edit_GetText(hActionEdit, lpfm->szAction, sizeof(lpfm->szAction)); lpfm->bAction = TRUE; bAction = TRUE; } else { strcpy(lpfm->szAction, ""); lpfm->bAction = FALSE; bAction = FALSE; } if (Button_GetCheck(hNameCheck) == BST_CHECKED) { Edit_GetText(hNameEdit, lpfm->szName, sizeof(lpfm->szName)); lpfm->bName = TRUE; bName = TRUE; } else { strcpy(lpfm->szName, ""); lpfm->bName = FALSE; bName = FALSE; } if (Button_GetCheck(hIDCheck) == BST_CHECKED) { Edit_GetText(hIDEdit, lpfm->szID, sizeof(lpfm->szID)); lpfm->bID = TRUE; bID = TRUE; } else { strcpy(lpfm->szID, ""); lpfm->bID = FALSE; bID = FALSE; } strcpy(szMethod, lpfm->szMethod); strcpy(szAction, lpfm->szAction); strcpy(szName, lpfm->szName); strcpy(szID, lpfm->szID); EndDialog(hDlg, IDOK); return TRUE; case IDCANCEL: EndDialog(hDlg, IDCANCEL); return TRUE; case IDC_CHECK1: if (Button_GetCheck(hMethodCheck) == BST_CHECKED) { EnableWindow(hMethodCombo, TRUE); bMethod = TRUE; } else { EnableWindow(hMethodCombo, FALSE); bMethod = FALSE; } return TRUE; case IDC_CHECK2: if (Button_GetCheck(hActionCheck) == BST_CHECKED) { EnableWindow(hActionEdit, TRUE); SetFocus(hActionEdit); bAction = TRUE; } else { EnableWindow(hActionEdit, FALSE); bAction = FALSE; } return TRUE; case IDC_CHECK3: if (Button_GetCheck(hNameCheck) == BST_CHECKED) { EnableWindow(hNameEdit, TRUE); SetFocus(hNameEdit); bName = TRUE; } else { EnableWindow(hNameEdit, FALSE); bName = FALSE; } return TRUE; case IDC_CHECK4: if (Button_GetCheck(hIDCheck) == BST_CHECKED) { EnableWindow(hIDEdit, TRUE); SetFocus(hIDEdit); bID = TRUE; } else { EnableWindow(hIDEdit, FALSE); bID = FALSE; } return TRUE; } return FALSE; } return FALSE; }

これも、同様です。「ACTION」「NAME」「ID」のチェックボックスにチェックが付いたら その横にあるエディットコントロールにフォーカスが移るようにしました。

LRESULT CALLBACK MyInputProc(HWND hDlg, UINT msg, WPARAM wp, LPARAM lp) { static LPMYINPUTTAG lpin; static HWND hValueCheck, hValueEdit, hTypeCombo, hNameCheck, hIDCheck, hOnClickCheck, hNameEdit, hIDEdit, hOnClickEdit, hOnBlurCheck, hOnBlurEdit, hOnChangeCheck, hOnChangeEdit, hOnFocusCheck, hOnFocusEdit, hOnSubmitCheck, hOnSubmitEdit; static BOOL bValue, bName, bID, bOnClick, bOnBlur, bOnChange, bOnFocus, bOnSubmit; static char szType[16], szValue[64], szName[16], szID[16], szOnClick[64], szOnBlur[64], szOnChange[64], szOnFocus[64], szOnSubmit[64]; switch (msg) { case WM_INITDIALOG: lpin = (LPMYINPUTTAG)lp; hValueCheck = GetDlgItem(hDlg, IDC_CHECK1); hValueEdit = GetDlgItem(hDlg, IDC_EDIT1); hTypeCombo = GetDlgItem(hDlg, IDC_COMBO1); hNameCheck = GetDlgItem(hDlg, IDC_CHECK2); hIDCheck = GetDlgItem(hDlg, IDC_CHECK3); hOnClickCheck = GetDlgItem(hDlg, IDC_CHECK4); hNameEdit = GetDlgItem(hDlg, IDC_EDIT2); hIDEdit = GetDlgItem(hDlg, IDC_EDIT3); hOnClickEdit = GetDlgItem(hDlg, IDC_EDIT4); hOnBlurCheck = GetDlgItem(hDlg, IDC_CHECK5); hOnBlurEdit = GetDlgItem(hDlg, IDC_EDIT5); hOnChangeCheck = GetDlgItem(hDlg, IDC_CHECK6); hOnChangeEdit = GetDlgItem(hDlg, IDC_EDIT6); hOnFocusCheck = GetDlgItem(hDlg, IDC_CHECK7); hOnFocusEdit = GetDlgItem(hDlg, IDC_EDIT7); hOnSubmitCheck = GetDlgItem(hDlg, IDC_CHECK8); hOnSubmitEdit = GetDlgItem(hDlg, IDC_EDIT8); ComboBox_AddString(hTypeCombo, "button"); ComboBox_AddString(hTypeCombo, "text"); ComboBox_AddString(hTypeCombo, "radio"); ComboBox_AddString(hTypeCombo, "checkbox"); ComboBox_AddString(hTypeCombo, "submit"); ComboBox_AddString(hTypeCombo, "reset"); if (bValue) { ShowWindow(hValueEdit, SW_SHOW); Button_SetCheck(hValueCheck, BST_CHECKED); } else { ShowWindow(hValueEdit, SW_HIDE); Button_SetCheck(hValueCheck, BST_UNCHECKED); } if (bName) { ShowWindow(hNameEdit, SW_SHOW); Button_SetCheck(hNameCheck, BST_CHECKED); } else { ShowWindow(hNameEdit, SW_HIDE); Button_SetCheck(hNameCheck, BST_UNCHECKED); } if (bID) { ShowWindow(hIDEdit, SW_SHOW); Button_SetCheck(hIDCheck, BST_CHECKED); } else { ShowWindow(hIDEdit, SW_HIDE); Button_SetCheck(hIDCheck, BST_UNCHECKED); } if (bOnClick) { ShowWindow(hOnClickEdit, SW_SHOW); Button_SetCheck(hOnClickCheck, BST_CHECKED); } else { ShowWindow(hOnClickEdit, SW_HIDE); Button_SetCheck(hOnClickCheck, BST_UNCHECKED); } if (bOnBlur) { ShowWindow(hOnBlurEdit, SW_SHOW); Button_SetCheck(hOnBlurCheck, BST_CHECKED); } else { ShowWindow(hOnBlurEdit, SW_HIDE); Button_SetCheck(hOnBlurCheck, BST_UNCHECKED); } if (bOnChange) { ShowWindow(hOnChangeEdit, SW_SHOW); Button_SetCheck(hOnChangeCheck, BST_CHECKED); } else { ShowWindow(hOnChangeEdit, SW_HIDE); Button_SetCheck(hOnChangeCheck, BST_UNCHECKED); } if (bOnFocus) { ShowWindow(hOnFocusEdit, SW_SHOW); Button_SetCheck(hOnFocusCheck, BST_CHECKED); } else { ShowWindow(hOnFocusEdit, SW_HIDE); Button_SetCheck(hOnFocusCheck, BST_UNCHECKED); } if (bOnSubmit) { ShowWindow(hOnSubmitEdit, SW_SHOW); Button_SetCheck(hOnSubmitCheck, BST_CHECKED); } else { ShowWindow(hOnSubmitEdit, SW_HIDE); Button_SetCheck(hOnSubmitCheck, BST_UNCHECKED); } ComboBox_SetText(hTypeCombo, szType); Edit_SetText(hValueEdit, szValue); Edit_SetText(hNameEdit, szName); Edit_SetText(hIDEdit, szID); Edit_SetText(hOnClickEdit, szOnClick); Edit_SetText(hOnBlurEdit, szOnBlur); Edit_SetText(hOnChangeEdit, szOnChange); Edit_SetText(hOnFocusEdit, szOnFocus); Edit_SetText(hOnSubmitEdit, szOnSubmit); return TRUE; case WM_COMMAND: switch (LOWORD(wp)) { case IDOK: ComboBox_GetText(hTypeCombo, lpin->szType, sizeof(lpin->szType)); if (Button_GetCheck(hValueCheck) == BST_CHECKED) { Edit_GetText(hValueEdit, lpin->szValue, sizeof(lpin->szValue)); strcpy(szValue, lpin->szValue); lpin->bValue = TRUE; bValue = TRUE; } else { strcpy(lpin->szValue, ""); lpin->bValue = FALSE; bValue = FALSE; } if (Button_GetCheck(hNameCheck) == BST_CHECKED) { Edit_GetText(hNameEdit, lpin->szName, sizeof(lpin->szName)); lpin->bName = TRUE; bName = TRUE; } else { strcpy(lpin->szName, ""); lpin->bName = FALSE; bName = FALSE; } if (Button_GetCheck(hIDCheck) == BST_CHECKED) { Edit_GetText(hIDEdit, lpin->szID, sizeof(lpin->szID)); lpin->bID = TRUE; bID = TRUE; } else { strcpy(lpin->szID, ""); lpin->bID = FALSE; bID = FALSE; } if (Button_GetCheck(hOnClickCheck) == BST_CHECKED) { Edit_GetText(hOnClickEdit, lpin->szOnClick, sizeof(lpin->szOnClick)); lpin->bClick = TRUE; bOnClick = TRUE; } else { strcpy(lpin->szOnClick, ""); lpin->bClick = FALSE; bOnClick = FALSE; } if (Button_GetCheck(hOnBlurCheck) == BST_CHECKED) { Edit_GetText(hOnBlurEdit, lpin->szOnBlur, sizeof(lpin->szOnBlur)); lpin->bBlur = TRUE; bOnBlur = TRUE; } else { strcpy(lpin->szOnBlur, ""); lpin->bBlur = FALSE; bOnBlur = FALSE; } if (Button_GetCheck(hOnChangeCheck) == BST_CHECKED) { Edit_GetText(hOnChangeEdit, lpin->szOnChange, sizeof(lpin->szOnChange)); lpin->bChange = TRUE; bOnChange = TRUE; } else { strcpy(lpin->szOnChange, ""); lpin->bChange = FALSE; bOnChange = FALSE; } if (Button_GetCheck(hOnFocusCheck) == BST_CHECKED) { Edit_GetText(hOnFocusEdit, lpin->szOnFocus, sizeof(lpin->szOnFocus)); lpin->bFocus = TRUE; bOnFocus = TRUE; } else { strcpy(lpin->szOnFocus, ""); lpin->bFocus = FALSE; bOnFocus = FALSE; } if (Button_GetCheck(hOnSubmitCheck) == BST_CHECKED) { Edit_GetText(hOnSubmitEdit, lpin->szOnSubmit, sizeof(lpin->szOnSubmit)); lpin->bSubmit = TRUE; bOnSubmit = TRUE; } else { strcpy(lpin->szOnSubmit, ""); lpin->bSubmit = FALSE; bOnSubmit = FALSE; } strcpy(szType, lpin->szType); strcpy(szName, lpin->szName); strcpy(szID, lpin->szID); strcpy(szOnClick, lpin->szOnClick); strcpy(szOnBlur, lpin->szOnBlur); strcpy(szOnChange, lpin->szOnChange); strcpy(szOnFocus, lpin->szOnFocus); strcpy(szOnSubmit, lpin->szOnSubmit); EndDialog(hDlg, IDOK); return TRUE; case IDCANCEL: EndDialog(hDlg, IDCANCEL); return TRUE; case IDC_CHECK1: if (Button_GetCheck(hValueCheck) == BST_CHECKED) { ShowWindow(hValueEdit, SW_SHOW); SetFocus(hValueEdit); bValue = TRUE; } else { ShowWindow(hValueEdit, SW_HIDE); bValue = FALSE; } case IDC_CHECK2: if (Button_GetCheck(hNameCheck) == BST_CHECKED) { ShowWindow(hNameEdit, SW_SHOW); SetFocus(hNameEdit); bName = TRUE; } else { ShowWindow(hNameEdit, SW_HIDE); bName = FALSE; } return TRUE; case IDC_CHECK3: if (Button_GetCheck(hIDCheck) == BST_CHECKED) { ShowWindow(hIDEdit, SW_SHOW); SetFocus(hIDEdit); bID = TRUE; } else { ShowWindow(hIDEdit, SW_HIDE); bID = FALSE; } return TRUE; case IDC_CHECK4: if (Button_GetCheck(hOnClickCheck) == BST_CHECKED) { ShowWindow(hOnClickEdit, SW_SHOW); SetFocus(hOnClickEdit); bOnClick = TRUE; } else { ShowWindow(hOnClickEdit, SW_HIDE); bOnClick = FALSE; } return TRUE; case IDC_CHECK5: if (Button_GetCheck(hOnBlurCheck) == BST_CHECKED) { ShowWindow(hOnBlurEdit, SW_SHOW); SetFocus(hOnBlurEdit); bOnBlur = TRUE; } else { ShowWindow(hOnBlurEdit, SW_HIDE); bOnBlur = FALSE; } return TRUE; case IDC_CHECK6: if (Button_GetCheck(hOnChangeCheck) == BST_CHECKED) { ShowWindow(hOnChangeEdit, SW_SHOW); SetFocus(hOnChangeEdit); bOnChange = TRUE; } else { ShowWindow(hOnChangeEdit, SW_HIDE); bOnChange = FALSE; } return TRUE; case IDC_CHECK7: if (Button_GetCheck(hOnFocusCheck) == BST_CHECKED) { ShowWindow(hOnFocusEdit, SW_SHOW); SetFocus(hOnFocusEdit); bOnFocus = TRUE; } else { ShowWindow(hOnFocusEdit, SW_HIDE); bOnFocus = FALSE; } return TRUE; case IDC_CHECK8: if (Button_GetCheck(hOnSubmitCheck) == BST_CHECKED) { ShowWindow(hOnSubmitEdit, SW_SHOW); SetFocus(hOnSubmitEdit); bOnSubmit = TRUE; } else { ShowWindow(hOnSubmitEdit, SW_HIDE); bOnSubmit = FALSE; } return TRUE; } return FALSE; } return FALSE; }

これも同様です。各チェックボックスにチェックが付いたら、その横にあるエディットコントロールに フォーカスが行くようにしました。

MyInsertInput, MyInsertScript, MakeMyToolbar, MyOpen, CheckMyMenu, CanPaste, NewEditProc, MySetStatusText, MakeMyToolbar2の各関数に変更はありません。

HWND MakeMyToolTip(HWND hMain, HWND hTool, int nStart, int nEnd, TBBUTTON *tbButton, char (*szText)[256]) { HWND hTT; TOOLINFO ti; int i; RECT rc; HINSTANCE hInst; hInst = (HINSTANCE)GetWindowLong(hTool, GWL_HINSTANCE); hTT = CreateWindowEx(0, TOOLTIPS_CLASS, "", WS_POPUP | TTS_NOPREFIX | TTS_BALLOON | TTS_ALWAYSTIP, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, hMain, (HMENU)NULL, hInst, NULL); SendMessage(hTT, TTM_SETTITLE, (WPARAM)1, (LPARAM)"Hint!"); memset(&ti, 0, sizeof(TOOLINFO)); ti.cbSize = sizeof(TOOLINFO); ti.uFlags = TTF_SUBCLASS; ti.hwnd = hTool; ti.hinst = hInst; for (i = 0; i <= nEnd - nStart; i++) { SendMessage(hTool, TB_GETITEMRECT, i, (LPARAM)&ti.rect); ti.uId = tbButton[i].idCommand; ti.lpszText = szText[i + nStart]; SendMessage(hTT, TTM_ADDTOOL, 0, (LPARAM)&ti); } SendMessage(hTool, TB_SETTOOLTIPS, (WPARAM)hTT, 0); rc.top = 5; rc.left = 5; rc.bottom = 5; rc.right = 5; SendMessage(hTT, TTM_SETMARGIN, 0, (LPARAM)&rc); SendMessage(hTT, TTM_SETMAXTIPWIDTH, 0, (LPARAM)200); return hTT; }

ウィンドウスタイルに、TTS_BALLOONが加わりました。

また、ツールチップウィンドウを作った後に、TTM_SETTITLEメッセージを 送っています。これによってツールチップにアイコンとタイトルを付けることができます。

TTM_SETTITLE wParam = icon; lParam = (LPCTSTR) pszTitle;

iconは1ならInfoアイコン、2ならWarningアイコン、3ならErrorアイコンがつきます。 0ならアイコンはありません。

pszTitleには、タイトルの文字列を指定します。

このメッセージはdllのバージョンが5.80以降でないと使えません。IEのバージョンが5.0以降であれば 使えます。(注)

void SetTipColor(HWND hWnd, HWND *lphTip, COLORREF *lpcrTip, int nNo) { CHOOSECOLOR cc; static DWORD dwCust[16]; int i; memset(&cc, 0, sizeof(CHOOSECOLOR)); cc.lStructSize = sizeof(CHOOSECOLOR); cc.hwndOwner = hWnd; cc.lpCustColors = dwCust; cc.rgbResult = *lpcrTip; cc.Flags = CC_RGBINIT; if(ChooseColor(&cc)) { *lpcrTip = cc.rgbResult; for (i = 0; i < nNo; i++) SendMessage(lphTip[i], TTM_SETTIPTEXTCOLOR, (WPARAM)*lpcrTip, 0); } return; }

引数が変更になりました。最後の引数は配列の個数です。 以前は1回呼ばれるごとに1つのツールチップウィンドウのテキスト色を変えていましたが 今回は、まとめて複数のウィンドウのテキスト色を変更するようにしました。

void SetTipBkColor(HWND hWnd, HWND *lphTip, COLORREF *lpcrTipBk, int nNo) { CHOOSECOLOR cc; static DWORD dwCust[16]; int i; memset(&cc, 0, sizeof(CHOOSECOLOR)); cc.lStructSize = sizeof(CHOOSECOLOR); cc.hwndOwner = hWnd; cc.lpCustColors = dwCust; cc.rgbResult = *lpcrTipBk; cc.Flags = CC_RGBINIT; if(ChooseColor(&cc)) { *lpcrTipBk = cc.rgbResult; for (i = 0; i < nNo; i++) SendMessage(lphTip[i], TTM_SETTIPBKCOLOR, (WPARAM)*lpcrTipBk, 0); } return; }

ツールチップの背景色を変える関数です。変更はテキスト色の所と同様です。

さて、今回は簡単でした。シェブロンなど他の新しいタイプのコモンコントロールにも 挑戦してみてください。


(注) 生のままのVC++6.0では、コンパイルできません。ヘッダファイル・ライブラリファイルを マイクロソフトのHPなどより入手する必要があります。
[SDK第4部 Index] [総合Index] [Previous Chapter] [Next Chapter]

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