左の図のようにツールチップの背景色が黄色、文字色が赤というように
カスタマイズすることができます。さらに、文字列が複数行にわたっている点に
注意してください。
これは、メニューの「オプション」「ツールチップのテキスト色」「ツールチップの 背景色」で変えることができます。
ツールチップの背景色などを
変更するにはツールチップをCreateWindow関数で作る必要があります。
詳しくは第66章を参照してください。 たったこれだけです。メッセージの送り先を間違えないでください。(ツールチップに送るのか、 ツールバーに送るのか)1.コモンコントロールの準備(commctrl.h, comctl32.lib) 2.TOOLTIPS_CLASSでCreateWindow関数でツールチップウィンドウを作る ウィンドウスタイルはWS_POPUPまたはTTS_ALWAYSTIPにします 3.ツールバーのコマンドごとにTOOLINFO構造体をセットしてTTM_ADDTOOL メッセージをツールチップウィンドウに送る 4.TB_SETTOOLTIPSメッセージをツールバーに送る
さて、通常のツールチップができたらツールチップに対してTTM_SETTIPTEXTCOLOR, TTM_SETTIPBKCOLOR を送って文字色や背景色を変更します。
以下のメッセージはcomctl32.dllのバージョンが4.70以降で有効です。
ツールチップ・ウィンドウのテキスト色を変更します。TTM_SETTIPTEXTCOLOR wParam = (WPARAM)(COLORREF) clr; lParam = 0;
ツールチップ・ウィンドウの背景色を変更します 。TTM_SETTIPBKCOLOR wParam = (WPARAM)(COLORREF) clr; lParam = 0;
ツールチップ・ウィンドウの上下・左右のマージンを設定します。TTM_SETMARGIN wParam = 0; lParam = (LPARAM)(LPRECT) lprc;
lprcはtop, bottom, left, rightにそれぞれマージンを設定したRECT構造体へのポインタです。
ツールチップ・ウィンドウの最大横幅を設定します。TTM_SETMAXTIPWIDTH wParam = 0; lParam = (LPARAM)(INT) iWidth;
ツールチップテキストが最大幅を越し、テキストにスペースが 入っていればそこから改行します。ヘルプには書いてありませんが 「\n」が入っているとそこから強制的に改行するようです。
では、プログラムを見てみましょう。
メニューに「ツールチップの文字色」「ツールチップの背景色」が加わりました。// mailslot11.rcの一部 ///////////////////////////////////////////////////////////////////////////// // // Menu // MYMENU MENU DISCARDABLE BEGIN POPUP "ファイル(&F)" BEGIN MENUITEM "新規作成(&N)...\tCtrl + N", IDM_NEW MENUITEM "開く(&O)...\tCtrl + O", IDM_OPEN MENUITEM "上書き保存(&S)\tCtrl + S", IDM_SAVE MENUITEM "名前を付けて保存(&A)...", IDM_SAVEAS MENUITEM SEPARATOR MENUITEM "タスクトレーに格納(&T)", IDM_TASK MENUITEM SEPARATOR MENUITEM "終了(&X)...\tShift + Ctrl + Z", IDM_END END POPUP "編集(&E)" BEGIN MENUITEM "元に戻す(&U)\tCtrl + Z", IDM_UNDO, GRAYED MENUITEM SEPARATOR MENUITEM "切り取り(&T)\tCtrl + X", IDM_CUT, GRAYED MENUITEM "コピー(&C)\tCtrl + C", IDM_COPY, GRAYED MENUITEM "張り付け(&P)\tCtrl + V", IDM_PASTE, GRAYED MENUITEM "削除(&D)\tDel", IDM_DELETE, GRAYED MENUITEM SEPARATOR MENUITEM "すべて選択(&L)\tCtrl + A", IDM_ALL END POPUP "表示(&V)" BEGIN MENUITEM "書き込み用ウィンドウ", IDM_WRITE MENUITEM "ツールバー", IDM_TOOL END POPUP "オプション(&O)" BEGIN MENUITEM "IDを表示する(&I)", IDM_ID MENUITEM SEPARATOR MENUITEM ".chtを関連づける(&R)", IDM_REG MENUITEM SEPARATOR MENUITEM "ツールチップのテキスト色(&C)", IDM_TIPTEXTCOLOR MENUITEM "ツールチップ背景色(&B)", IDM_TIPBKCOLOR END END RTRAYMENU MENU DISCARDABLE BEGIN POPUP " ダミーです" BEGIN MENUITEM "タスクトレーから出す", IDM_SHOW MENUITEM "終了", IDM_END END END ///////////////////////////////////////////////////////////////////////////// // // Dialog // MAILSLOTNAME DIALOG DISCARDABLE 0, 0, 118, 61 STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU CAPTION "メールスロット名" FONT 9, "MS Pゴシック" BEGIN EDITTEXT IDC_EDIT1,7,19,104,16,ES_AUTOHSCROLL DEFPUSHBUTTON "OK",IDOK,34,39,50,14 LTEXT "自分のメールスロットの名前",IDC_STATIC,7,7,83,8 END MYWRITE DIALOG DISCARDABLE 0, 0, 163, 153 STYLE DS_MODALFRAME | WS_CHILD FONT 9, "MS Pゴシック" BEGIN EDITTEXT IDC_EDIT3,70,23,86,14,ES_AUTOHSCROLL EDITTEXT IDC_EDIT2,70,44,86,14,ES_AUTOHSCROLL EDITTEXT IDC_EDIT1,7,69,149,56,ES_MULTILINE | ES_AUTOVSCROLL | ES_AUTOHSCROLL | ES_WANTRETURN DEFPUSHBUTTON "送信",IDOK,56,132,50,14 LTEXT "相手のメールスロット",IDC_STATIC,7,45,62,8 LTEXT "送信先コンピュータ",IDC_STATIC,7,25,56,8 CONTROL "他のコンピュータにメッセージを送る",IDC_CHECK1,"Button", BS_AUTOCHECKBOX | WS_TABSTOP,7,7,119,10 END ///////////////////////////////////////////////////////////////////////////// // // Icon // MYICON ICON DISCARDABLE "myicon.ico" ///////////////////////////////////////////////////////////////////////////// // // Accelerator // MYACCEL ACCELERATORS DISCARDABLE BEGIN "A", IDM_ALL, VIRTKEY, CONTROL, NOINVERT "C", IDM_COPY, 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_DELETE, IDM_DELETE, VIRTKEY, NOINVERT "X", IDM_CUT, VIRTKEY, CONTROL, NOINVERT "Z", IDM_UNDO, VIRTKEY, CONTROL, NOINVERT "Z", IDM_END, VIRTKEY, SHIFT, CONTROL, NOINVERT END
ストリングテーブルがすっかりなくなりました。
ストリングテーブルの文字列をszTipTextの配列にしてみました。// mailslot11.cpp #ifndef STRICT #define STRICT #endif #include <windows.h> #include <windowsx.h> #include <commctrl.h> #include "resource.h" #define MYMSG_TRAY WM_USER #define ID_MYEDIT 100 #define ID_MYTRAY 101 #define ID_TOOL1 102 #define ID_TOOL2 103 #define ID_REBAR 104 #define ID_STATIC 105 LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); LRESULT CALLBACK MyNameProc(HWND, UINT, WPARAM, LPARAM); LRESULT CALLBACK MyWriteProc(HWND, UINT, WPARAM, LPARAM); LRESULT CALLBACK MyEditProc(HWND, UINT, WPARAM, LPARAM); ATOM InitApp(HINSTANCE); BOOL InitInstance(HINSTANCE, int); DWORD WINAPI ReadFunc(LPVOID); HANDLE MakeMySlot(HWND, BOOL *); void MyTaskTray(HWND, PNOTIFYICONDATA); int MakeRTrayMenu(HWND); int SaveAsMyFile(HWND); int OverWriteMyFile(HWND); int OpenMyFile(HWND); int OpenMyFile2(HWND); int MyReg(void); HWND MakeMyToolbar(HWND, int, TBBUTTON *, int); int MakeNewFile(HWND); int CheckMyMenu(HWND); BOOL CanPaste(HWND); HWND MakeMyToolTip(HWND, int, int, TBBUTTON *); void SetTipColor(HWND); void SetTipBkColor(HWND); char szClassName[] = "mailslot11"; //ウィンドウクラス char szMailSlot[128];//メールスロットの名前(フルパス付き) char szSlotName[64];//メールスロットの名前(パスなし) HANDLE hSlot; HINSTANCE hInst; HWND hMainEdit; BOOL bID = FALSE;//メッセージIDを表示するかどうか BOOL bIsTask = FALSE;//タスクトレーに格納されているかどうか HWND hWriteDlg;//書き込み用モードレスダイアログボックス int DlgX, DlgY;//書き込み用ダイアログの大きさ int RebarY;//レバーコントロールの高さ int ClientX, ClientY;//親ウィンドウのクライアント領域の大きさ BOOL bWriteDlg = FALSE;//書き込み用ダイアログが表示されいるかどうか char szFileName[MAX_PATH];//パス付きファイル名 char szFile[64];//ファイルタイトル BOOL bCmdLine;//コマンドライン引数があるかどうか WNDPROC Org_EditProc;//エディットコントロールのオリジナルプロシージャ HWND hTool1, hTool2; BOOL bTool = TRUE;//ツールバーが表示されているかどうか HACCEL hAccel;//アクセラレータハンドル HWND hParent;//親ウインドウのハンドル HWND hTip1, hTip2; COLORREF crTipText = RGB(0, 0, 0), crTipBk = RGB(255, 255, 255);//ツールチップ文字色、背景色 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}, }; char szTipText[][256] = { "新規に\nファイルを作成します", "ファイルを\nオープンします", "上書き保存を\nします", "選択された文字列を\nコピーします", "選択された文字列を\n切り取ってクリップボードに\n送ります", "クリップボードに\nある文字列を\n張り付けます", "選択された\n文字列を\n削除します", "編集を\n元に戻します" };
WinMain, InitApp, InitInstanceの各関数に変更はありません。
WM_CREATEメッセージが来たところで自作関数MakeMyToolTip関数を呼んで ツールチップ・ウィンドウを作っています。//ウィンドウプロシージャ LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wp, LPARAM lp) { int id; static BOOL bEnd; static HANDLE hThread; static HMENU hMenu; MENUITEMINFO mi; static NOTIFYICONDATA ni; RECT rc; MINMAXINFO *lpmm; INITCOMMONCONTROLSEX ic; static HWND hRebar, hStatic; REBARINFO ri; REBARBANDINFO rbinfo; switch (msg) { case WM_CREATE: ic.dwSize = sizeof(INITCOMMONCONTROLSEX); ic.dwICC = ICC_BAR_CLASSES | ICC_COOL_CLASSES; InitCommonControlsEx(&ic); hMenu = GetMenu(hWnd); 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); GetWindowRect(hRebar, &rc); RebarY = rc.bottom - rc.top; hStatic = CreateWindow("STATIC", "", WS_CHILD | WS_VISIBLE | SS_SUNKEN, 0, 0, 0, 0, hWnd, (HMENU)ID_STATIC, hInst, NULL); hTool1 = MakeMyToolbar(hRebar, 3, tbButton1, ID_TOOL1); hTool2 = MakeMyToolbar(hRebar, 5, tbButton2, ID_TOOL2); if (!bCmdLine) { EnableMenuItem(hMenu, IDM_SAVE, MF_BYCOMMAND | MF_GRAYED); SendMessage(hTool1, TB_ENABLEBUTTON, (WPARAM)IDM_SAVE, (LPARAM)MAKELONG(FALSE, 0)); } hMainEdit = CreateWindow("EDIT", "", WS_CHILD | WS_VISIBLE | ES_MULTILINE | ES_WANTRETURN | ES_NOHIDESEL | ES_AUTOHSCROLL | ES_AUTOVSCROLL | WS_HSCROLL | WS_VSCROLL, 0, RebarY, 0, 0, hWnd, (HMENU)ID_MYEDIT, hInst, NULL); memset(&ri, 0, sizeof(REBARINFO)); memset(&rbinfo, 0, sizeof(REBARBANDINFO)); ri.cbSize = sizeof(REBARINFO); ri.fMask = 0; ri.himl = NULL; SendMessage(hRebar, RB_SETBARINFO, 0, (LPARAM)&ri); rbinfo.cbSize = sizeof(REBARBANDINFO); rbinfo.fMask = RBBIM_TEXT | RBBIM_STYLE | RBBIM_CHILD | RBBIM_CHILDSIZE | RBBIM_SIZE; rbinfo.fStyle = RBBS_CHILDEDGE; rbinfo.lpText = "ファイル"; rbinfo.hwndChild = hTool1; rbinfo.cxMinChild = 0; rbinfo.cyMinChild = 25; GetWindowRect(hTool1, &rc); rbinfo.cx = 120; SendMessage(hRebar, RB_INSERTBAND, (WPARAM)-1, (LPARAM)&rbinfo); GetWindowRect(hRebar, &rc); rbinfo.lpText = "編集"; rbinfo.hwndChild = hTool2; rbinfo.cxMinChild = 0; rbinfo.cyMinChild = 25; rbinfo.cx = (rc.right - rc.left) - rbinfo.cx; SendMessage(hRebar, RB_INSERTBAND, (WPARAM)-1, (LPARAM)&rbinfo); Org_EditProc = (WNDPROC)GetWindowLong(hMainEdit, GWL_WNDPROC); SetWindowLong(hMainEdit, GWL_WNDPROC, (LONG)MyEditProc); DialogBox(hInst, "MAILSLOTNAME", hWnd, (DLGPROC)MyNameProc); bEnd = FALSE; hThread = MakeMySlot(hWnd, &bEnd); if (bCmdLine) { if (OpenMyFile2(hWnd) == 0) { EnableMenuItem(hMenu, IDM_SAVE, MF_BYCOMMAND | MF_ENABLED); SendMessage(hTool1, TB_ENABLEBUTTON, (WPARAM)IDM_SAVE, (LPARAM)MAKELONG(TRUE, 0)); } } SetFocus(hMainEdit); CheckMyMenu(hMainEdit); memset(&mi, 0, sizeof(MENUITEMINFO)); mi.cbSize = sizeof(MENUITEMINFO); mi.fMask = MIIM_STATE; mi.fState = MFS_CHECKED; SetMenuItemInfo(hMenu, IDM_TOOL, FALSE, &mi); hTip1 = MakeMyToolTip(hTool1, 0, 2, tbButton1); hTip2 = MakeMyToolTip(hTool2, 3, 7, tbButton2); break; case WM_SIZE: ClientX = LOWORD(lp); ClientY = HIWORD(lp); MoveWindow(hStatic, 0, 0, ClientX, 2, TRUE); SendMessage(hRebar, WM_SIZE, wp, lp); if (bTool) { GetWindowRect(hRebar, &rc); RebarY = rc.bottom - rc.top; } if (!bWriteDlg) { MoveWindow(hMainEdit, 0, RebarY + 2, ClientX, ClientY - RebarY - 2, TRUE); } else { MoveWindow(hMainEdit, 0, RebarY + 2, ClientX - DlgX, ClientY - RebarY - 2, TRUE); MoveWindow(hWriteDlg, ClientX - DlgX, RebarY + 2, DlgX, ClientY - RebarY - 2, TRUE); } break; case WM_GETMINMAXINFO: lpmm = (MINMAXINFO *)lp; if (bWriteDlg) { lpmm->ptMinTrackSize.y = 281 + RebarY; lpmm->ptMinTrackSize.x = 450; return 0; } else if (bTool){ lpmm->ptMinTrackSize.y = 140; lpmm->ptMinTrackSize.x = 300; } else { return (DefWindowProc(hWnd, msg, wp, lp)); } break; case MYMSG_TRAY: if (wp == ID_MYTRAY) { switch (lp) { case WM_RBUTTONDOWN: MakeRTrayMenu(hWnd); break; case WM_LBUTTONDBLCLK: bIsTask = FALSE; Shell_NotifyIcon(NIM_DELETE, &ni); ShowWindow(hWnd, SW_SHOWNORMAL); default: break; } } break; case WM_NOTIFY: switch (((LPNMHDR)lp)->code) { case RBN_HEIGHTCHANGE: if (bTool) { GetWindowRect(hRebar, &rc); RebarY = rc.bottom - rc.top; } MoveWindow(hMainEdit, 0, RebarY + 2, ClientX - DlgX, ClientY - RebarY - 2, TRUE); if (bWriteDlg) MoveWindow(hWriteDlg, ClientX - DlgX, RebarY + 2, DlgX, ClientY - RebarY - 2, TRUE); GetWindowRect(hWnd, &rc); MoveWindow(hWnd, rc.left, rc.top, rc.right - rc.left, rc.bottom - rc.top, TRUE); break; default: return (DefWindowProc(hWnd, msg, wp, lp)); } break; case WM_COMMAND: switch (LOWORD(wp)) { case IDM_TIPTEXTCOLOR: SetTipColor(hWnd); break; case IDM_TIPBKCOLOR: SetTipBkColor(hWnd); break; case IDM_END: SendMessage(hWnd, WM_CLOSE, 0, 0); break; case IDM_WRITE: if (!IsWindow(hWriteDlg)) { hWriteDlg = CreateDialog(hInst, "MYWRITE", hWnd, (DLGPROC)MyWriteProc); if (hWriteDlg != NULL) { bWriteDlg = TRUE; ShowWindow(hWriteDlg, SW_SHOW); GetWindowRect(hWriteDlg, &rc); DlgX = rc.right - rc.left; DlgY = rc.bottom - rc.top; MoveWindow(hWriteDlg, ClientX - DlgX, RebarY + 2, DlgX, ClientY - RebarY - 2, TRUE); MoveWindow(hMainEdit, 0, RebarY + 2, ClientX - DlgX, ClientY - RebarY - 2, TRUE); memset(&mi, 0, sizeof(MENUITEMINFO)); mi.cbSize = sizeof(MENUITEMINFO); mi.fMask = MIIM_STATE; mi.fState = MFS_CHECKED; SetMenuItemInfo(hMenu, IDM_WRITE, FALSE, &mi); GetWindowRect(hWnd, &rc); MoveWindow(hWnd, rc.left, rc.top, rc.right - rc.left, rc.bottom - rc.top, TRUE); } else { MessageBox(hWnd, "ダイアログボックス作成失敗です", "Error", MB_OK); return 0; } } else { DestroyWindow(hWriteDlg); bWriteDlg = FALSE; MoveWindow(hMainEdit, 0, RebarY + 2, ClientX, ClientY - RebarY - 2, TRUE); memset(&mi, 0, sizeof(MENUITEMINFO)); mi.cbSize = sizeof(MENUITEMINFO); mi.fMask = MIIM_STATE; mi.fState = MFS_UNCHECKED; SetMenuItemInfo(hMenu, IDM_WRITE, FALSE, &mi); DlgX = 0; DlgY = 0; } break; case IDM_TOOL: memset(&mi, 0, sizeof(MENUITEMINFO)); mi.cbSize = sizeof(MENUITEMINFO); mi.fMask = MIIM_STATE; if (bTool) { ShowWindow(hRebar, SW_HIDE); RebarY = 0; bTool = FALSE; mi.fState = MFS_UNCHECKED; SetMenuItemInfo(hMenu, IDM_TOOL, FALSE, &mi); GetWindowRect(hWnd, &rc); MoveWindow(hWnd, rc.left, rc.top, rc.right - rc.left, rc.bottom- rc.top + 1, TRUE); } else { ShowWindow(hRebar, SW_SHOW); GetWindowRect(hRebar, &rc); RebarY = rc.bottom - rc.top; bTool = TRUE; mi.fState = MFS_CHECKED; SetMenuItemInfo(hMenu, IDM_TOOL, FALSE, &mi); GetWindowRect(hWnd, &rc); SendMessage(hWnd, WM_SIZE, (WPARAM)SIZE_RESTORED, 0); MoveWindow(hWnd, rc.left, rc.top, rc.right - rc.left, rc.bottom - rc.top - 1, TRUE); } break; case IDM_NEW: MakeNewFile(hWnd); EnableMenuItem(hMenu, IDM_SAVE, MF_BYCOMMAND | MF_GRAYED); SendMessage(hTool1, TB_ENABLEBUTTON, (WPARAM)IDM_SAVE, (LPARAM)MAKELONG(FALSE, 0)); CheckMyMenu(hMainEdit); break; case IDM_OPEN: if (OpenMyFile(hWnd) == 0) { EnableMenuItem(hMenu, IDM_SAVE, MF_BYCOMMAND | MF_ENABLED); SendMessage(hTool1, TB_ENABLEBUTTON, (WPARAM)IDM_SAVE, (LPARAM)MAKELONG(TRUE, 0)); } break; case IDM_SAVE: OverWriteMyFile(hWnd); break; case IDM_SAVEAS: SaveAsMyFile(hWnd); break; case IDM_ID: memset(&mi, 0, sizeof(MENUITEMINFO)); mi.cbSize = sizeof(MENUITEMINFO); mi.fMask = MIIM_STATE; if (!bID) { mi.fState = MFS_CHECKED; SetMenuItemInfo(hMenu, IDM_ID, FALSE, &mi); bID = TRUE; break; } else { mi.fState = MFS_UNCHECKED; SetMenuItemInfo(hMenu, IDM_ID, FALSE, &mi); bID = FALSE; } break; case IDM_TASK: MyTaskTray(hWnd, &ni); ShowWindow(hWnd, SW_HIDE); bIsTask = TRUE; break; case IDM_SHOW: Shell_NotifyIcon(NIM_DELETE, &ni); ShowWindow(hWnd, SW_SHOWNORMAL); bIsTask = FALSE; break; case IDM_REG: MyReg(); break; case IDM_COPY: SendMessage(hMainEdit, WM_COPY, 0, 0); CheckMyMenu(hMainEdit); break; case IDM_CUT: SendMessage(hMainEdit, WM_CUT, 0, 0); CheckMyMenu(hMainEdit); break; case IDM_PASTE: SendMessage(hMainEdit, WM_PASTE, 0, 0); break; case IDM_ALL: SendMessage(hMainEdit, EM_SETSEL, 0, -1); CheckMyMenu(hMainEdit); break; case IDM_DELETE: SendMessage(hMainEdit, WM_CLEAR, 0, 0); CheckMyMenu(hMainEdit); break; case IDM_UNDO: if (SendMessage(hMainEdit, EM_CANUNDO, 0, 0)) SendMessage(hMainEdit, WM_UNDO, 0, 0); CheckMyMenu(hMainEdit); break; } break; case WM_CLOSE: if (SendMessage(hMainEdit, EM_GETMODIFY, 0, 0)) { id = MessageBox(hWnd, "チャットの内容が更新されています。\n" "保存せずに終了しますか", "確認", MB_YESNO | MB_ICONQUESTION); if (id == IDNO) break; } id = MessageBox(hWnd, "終了してもよいですか", "終了確認", MB_YESNO | MB_ICONQUESTION); if (id == IDYES) { if (hThread) { bEnd = TRUE; WaitForSingleObject(hThread, INFINITE); if (CloseHandle(hThread)) MessageBox(hWnd, "hThreadをクローズしました", "OK", MB_OK); } if (hSlot) { if (CloseHandle(hSlot)) MessageBox(hWnd, "メールスロットを削除しました", "OK", MB_OK); } if (bIsTask) Shell_NotifyIcon(NIM_DELETE, &ni); SetWindowLong(hMainEdit, GWL_WNDPROC, (LONG)Org_EditProc); DestroyWindow(hStatic); DestroyWindow(hMainEdit); DestroyWindow(hTool1); DestroyWindow(hTool2); DestroyWindow(hRebar); if (hWriteDlg) DestroyWindow(hWriteDlg); DestroyWindow(hWnd); } break; case WM_DESTROY: PostQuitMessage(0); break; default: return (DefWindowProc(hWnd, msg, wp, lp)); } return 0; }
WM_NOTIFYメッセージのところのTTN_GETDISPINFOの処理が全部なくなっています。
メニューからIDM_TIPTEXTCOLORやIDM_TIPBKCOLORが選択されたらそれぞれ 自作関数を呼んでツールチップの文字色や、背景色を変更します。
MakeMySlot, MyNameProc, MyWriteProc, ReadFunc, MyTaskTray, MakeRTrayMenu, MakeNewFile, SaveAsMyFile, OverWriteMyFile, OpenMyFile, OpenMyFile2, MyReg の各関数に変更はありません。
ツールバーを作るときTBSTYLE_TOOLTIPSスタイルを含めていないことに注意してください。HWND MakeMyToolbar(HWND hWnd, int n, TBBUTTON *tbButton, int id) { HWND hTool; TBADDBITMAP tbab; int stdid, i; hTool = CreateToolbarEx(hWnd, WS_VISIBLE | WS_CHILD| CCS_NODIVIDER | CCS_NORESIZE | TBSTYLE_FLAT, id , 0, NULL, NULL, tbButton, 0, 0, 0, 0, 0, sizeof(TBBUTTON)); tbab.hInst = HINST_COMMCTRL; tbab.nID = IDB_STD_SMALL_COLOR; stdid = SendMessage(hTool, TB_ADDBITMAP, n, (LPARAM)&tbab); for (i = 0; i < n; i++) tbButton[i].iBitmap += stdid; SendMessage(hTool, TB_ADDBUTTONS, n, (LONG)tbButton); SendMessage(hTool, TB_AUTOSIZE, 0, 0); return hTool; }
CheckMyMenu, MyEditProc, CanPasteの各関数に変更はありません。
ツールチップ・ウィンドウを作る関数です。 第66章と併せて読んでみてください。HWND MakeMyToolTip(HWND hTool, int nStart, int nEnd, TBBUTTON *tbButton) { HWND hTT; TOOLINFO ti; int i; RECT rc; hTT = CreateWindowEx(0, TOOLTIPS_CLASS, "", TTS_ALWAYSTIP, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, hParent, (HMENU)NULL, hInst, NULL); 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 = szTipText[i + nStart]; SendMessage(hTT, TTM_ADDTOOL, 0, (LPARAM)&ti); } SendMessage(hTool, TB_SETTOOLTIPS, (WPARAM)hTT, 0); SendMessage(hTT, TTM_SETTIPTEXTCOLOR, (WPARAM)crTipText, 0); SendMessage(hTT, TTM_SETTIPBKCOLOR, (WPARAM)crTipBk, 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; }
ツールチップ・テキストの色を変更する関数です。void SetTipColor(HWND hWnd) { CHOOSECOLOR cc; static DWORD dwCust[16]; memset(&cc, 0, sizeof(CHOOSECOLOR)); cc.lStructSize = sizeof(CHOOSECOLOR); cc.hwndOwner = hWnd; cc.lpCustColors = dwCust; cc.rgbResult = crTipText; cc.Flags = CC_RGBINIT; if(ChooseColor(&cc)) { crTipText = cc.rgbResult; SendMessage(hTip1, TTM_SETTIPTEXTCOLOR, (WPARAM)crTipText, 0); SendMessage(hTip2, TTM_SETTIPTEXTCOLOR, (WPARAM)crTipText, 0); } return; }
CHOOSECOLOR構造体、ChooseColor関数については 第139章を参照してください。
ツールチップ・ウィンドウの背景色を変更する関数です。void SetTipBkColor(HWND hWnd) { CHOOSECOLOR cc; static DWORD dwCust[16]; memset(&cc, 0, sizeof(CHOOSECOLOR)); cc.lStructSize = sizeof(CHOOSECOLOR); cc.hwndOwner = hWnd; cc.lpCustColors = dwCust; cc.rgbResult = crTipBk; cc.Flags = CC_RGBINIT; if(ChooseColor(&cc)) { crTipBk = cc.rgbResult; SendMessage(hTip1, TTM_SETTIPBKCOLOR, (WPARAM)crTipBk, 0); SendMessage(hTip2, TTM_SETTIPBKCOLOR, (WPARAM)crTipBk, 0); } return; }
ツールチップ・ウィンドウの取り扱い方には他にもいろいろあります。 研究してみてください。
Update 12/Mar/2000 By Y.Kumei