SMHTB.C
资源名称:MSDN_VC98.zip [点击查看]
上传用户:bangxh
上传日期:2007-01-31
资源大小:42235k
文件大小:24k
源码类别:
Windows编程
开发平台:
Visual C++
- /*
- * S M H T B . C
- *
- * Sample mail handling hook configuration toolbar
- * Copyright 1992-95 Microsoft Corporation. All Rights Reserved.
- */
- #include "_pch.h"
- #include <richedit.h>
- #ifndef WIN16
- #include <commctrl.h>
- #endif
- /* Maximum number of font digits */
- #define cchSizeMax 16
- /* Enumeration of button bitmaps if toolbar bitmap */
- enum {
- itbBold,
- itbItalic,
- itbUnderline,
- itbColor,
- ctbMax
- };
- /* Gap sizes for format bar */
- #define cxDownButton 16
- #define cxName (125 + cxDownButton)
- #define cxSize (40 + cxDownButton)
- #define cxPlaceHolder (cxName + 8 + cxSize + 8)
- #define cxIndent (1440 / 4)
- /* Button descriptions for format bar */
- static const TBBUTTON rgtbbChar[] =
- {
- { cxPlaceHolder, 0L, TBSTATE_ENABLED, TBSTYLE_SEP, {0}, 0L, -1},
- { itbColor, ID_Color, TBSTATE_ENABLED, TBSTYLE_BUTTON, {0}, 0L, -1 },
- { itbBold, ID_Bold, TBSTATE_ENABLED, TBSTYLE_CHECK, {0}, 0L, -1},
- { itbItalic, ID_Italic, TBSTATE_ENABLED, TBSTYLE_CHECK, {0}, 0L, -1},
- { itbUnderline, ID_Underline, TBSTATE_ENABLED, TBSTYLE_CHECK, {0}, 0L, -1},
- };
- #define ctbbChar (sizeof(rgtbbChar) / sizeof(TBBUTTON))
- /* Color descriptions for dropdown color list */
- DWORD rgrgb[] = {
- RGB( 0, 0, 0), /* Auto */
- RGB( 0, 0, 0), /* Black */
- RGB(128, 0, 0), /* Dark red */
- RGB( 0, 128, 0), /* Dark green */
- RGB(128, 128, 0), /* Dark yellow */
- RGB( 0, 0, 128), /* Dark blue */
- RGB(128, 0, 128), /* Dark purple */
- RGB( 0, 128, 128), /* Dark aqua */
- RGB(128, 128, 128), /* Dark grey */
- RGB(192, 192, 192), /* Light grey */
- RGB(255, 0, 0), /* Light red */
- RGB( 0, 255, 0), /* Light green */
- RGB(255, 255, 0), /* Light yellow */
- RGB( 0, 0, 255), /* Light blue */
- RGB(255, 0, 255), /* Light purple */
- RGB( 0, 255, 255), /* Light aqua */
- RGB(255, 255, 255), /* White */
- };
- #define crgb (sizeof(rgrgb) / sizeof(rgrgb[0]))
- const LPTSTR rgszColor[] = {
- "Auto", "Black", "Maroon",
- "Green", "Olive", "Navy",
- "Purple", "Teal", "Gray",
- "Silver", "Red", "Lime",
- "Yellow", "Blue", "Fuchia",
- "Aqua", "White"
- };
- /* Font and paragraph effects */
- static const DWORD rgdwEffect[] = { CFE_BOLD, CFE_ITALIC, CFE_UNDERLINE };
- static const WORD rgwAlign[] = { PFA_LEFT, PFA_CENTER, PFA_RIGHT };
- static const UINT rglFontSize[] =
- {
- 8, 9, 10, 11,
- 12, 14, 16, 18,
- 20, 22, 24, 26,
- 28, 36, 48, 72
- };
- #define FontSize(_y) MulDiv((int)(_y), 72, 1440)
- /* Toolbar and combobox class names */
- static const TCHAR rgchTBClass[] = "SMHToolbar";
- static const TCHAR rgchComboBox[] = "ComboBox";
- #ifdef WIN16
- #define GWL_USERDATA 0
- #endif
- /*
- * Font, font size, and color dropdown and listing functions -----------------
- *
- * These functions are used to fill in and display the character formats
- * for the format bar. The font listbox gets filled once and only once
- * on format bar creation. The font size listbox will get filled up each
- * and everytime the font list gets dropped down. The font color menu
- * will get filled once at startup.
- */
- INT CALLBACK EXPORT
- EnumFontNames (LPVOID lpvLogFont,
- NEWTEXTMETRIC FAR * lpntm,
- INT nFontType,
- LPARAM lParam)
- {
- UINT i;
- DWORD dw = 0;
- LOGFONT FAR * lplf = FWin4Shell()
- ? &((ENUMLOGFONTEX FAR *)lpvLogFont)->elfLogFont
- : (LOGFONT FAR *)lpvLogFont;
- /* Add the face name into the listbox */
- DebugTrace ("SMH: adding font: %s%sn", lplf->lfFaceName,
- (lpntm->tmPitchAndFamily & TMPF_TRUETYPE)
- ? " (TrueType)"
- : "");
- i = ComboBox_AddString ((HWND)lParam, lplf->lfFaceName);
- if ((i != CB_ERR) || (i != CB_ERRSPACE))
- {
- Assert (!(lplf->lfCharSet & 0xFFFFFF00));
- Assert (!(lplf->lfPitchAndFamily & 0xFFFFFF00));
- Assert (!(nFontType & 0xFFFF0000));
- dw = lplf->lfCharSet & 0xFF;
- dw <<= 8;
- dw |= lplf->lfPitchAndFamily & 0xFF;
- dw <<= 16;
- dw |= nFontType & 0xFFFF;
- ComboBox_SetItemData ((HWND)lParam, i, dw);
- }
- return TRUE;
- }
- void
- FillFontNames (HWND hwnd)
- {
- HDC hdc;
- /* Empty the contents of the listbox and enumerate the fonts */
- ComboBox_ResetContent (hwnd);
- if (hdc = GetDC(NULL))
- {
- EnumFontFamilies (hdc,
- (LPTSTR)NULL,
- (FONTENUMPROC)EnumFontNames,
- (LPARAM)(LPVOID)hwnd);
- ReleaseDC (NULL, hdc);
- }
- }
- INT CALLBACK EXPORT
- EnumFontSizes (LPVOID lpvLogFont,
- NEWTEXTMETRIC FAR * lpntm,
- INT nFontType,
- LPARAM lParam)
- {
- TCHAR rgch[cchSizeMax];
- UINT i;
- if (lpntm->tmPitchAndFamily & TMPF_TRUETYPE)
- {
- /* If the font is TrueType, then just fillin random sizes */
- for (i = 0; i < (sizeof(rglFontSize) / sizeof(UINT)); i++)
- {
- wsprintf (rgch, "%d", rglFontSize[i]);
- DebugTrace ("SMH: adding font size: %sn", rgch);
- ComboBox_AddString (((LPFORMATBAR)lParam)->hwndSize, rgch);
- }
- return FALSE;
- }
- else
- {
- /* Calculate the size of the current instance */
- wsprintf (rgch, "%d", MulDiv ((INT)lpntm->tmHeight - lpntm->tmInternalLeading, 72,
- GetDeviceCaps (((LPFORMATBAR)lParam)->hdc, LOGPIXELSY)));
- if (ComboBox_FindStringExact (((LPFORMATBAR)lParam)->hwndSize, -1, rgch) == CB_ERR)
- {
- DebugTrace ("SMH: font height: %dn", lpntm->tmHeight - lpntm->tmInternalLeading);
- DebugTrace ("SMH: adding font size: %sn", rgch);
- ComboBox_AddString (((LPFORMATBAR)lParam)->hwndSize, rgch);
- ((LPFORMATBAR)lParam)->cSize++;
- }
- return TRUE;
- }
- }
- void
- FillSizes (LPFORMATBAR lpfb)
- {
- TCHAR rgch[30];
- /* Empty the contents of the listbox and enumerate the fonts */
- ComboBox_ResetContent (lpfb->hwndSize);
- ComboBox_GetText (lpfb->hwndFont, rgch, sizeof(rgch) - 1);
- if (lpfb->hdc = GetDC (lpfb->hwndSize))
- {
- lpfb->cSize = 0;
- EnumFontFamilies (lpfb->hdc, rgch, (FONTENUMPROC)EnumFontSizes, (LPARAM)lpfb);
- ReleaseDC (lpfb->hwndSize, lpfb->hdc);
- }
- }
- void CALLBACK
- ColorMenu_MeasureItem (HWND hwnd, MEASUREITEMSTRUCT FAR * lpmis)
- {
- LPFORMATBAR lpfb = (LPFORMATBAR)GetWindowLong (hwnd, GWL_USERDATA);
- HFONT hfnt;
- TEXTMETRIC tm;
- hfnt = SelectObject (lpfb->hdc, lpfb->hfnt);
- GetTextMetrics (lpfb->hdc, &tm);
- SelectObject (lpfb->hdc, hfnt);
- lpmis->itemHeight = tm.tmHeight;
- lpmis->itemWidth = 14 * tm.tmAveCharWidth;
- return;
- }
- void CALLBACK EXPORT
- ColorMenu_DrawItem (HWND hwnd, DRAWITEMSTRUCT FAR * lpdis)
- {
- LPFORMATBAR lpfb = (LPFORMATBAR)(GetWindowLong (hwnd, GWL_USERDATA));
- HBRUSH hbr;
- WORD dx;
- WORD dy;
- RECT rc;
- DWORD rgbBack;
- DWORD rgbText;
- if (lpdis->itemState & ODS_SELECTED)
- {
- rgbBack = SetBkColor (lpdis->hDC, GetSysColor (COLOR_HIGHLIGHT));
- rgbText = SetTextColor (lpdis->hDC, GetSysColor (COLOR_HIGHLIGHTTEXT));
- }
- else
- {
- rgbBack = SetBkColor (lpdis->hDC, GetSysColor(COLOR_WINDOW));
- rgbText = SetTextColor (lpdis->hDC, GetSysColor(COLOR_WINDOWTEXT));
- }
- ExtTextOut (lpdis->hDC,
- lpdis->rcItem.left,
- lpdis->rcItem.top,
- ETO_OPAQUE,
- &lpdis->rcItem,
- NULL, 0, NULL);
- dx = GetSystemMetrics(SM_CXBORDER);
- dy = GetSystemMetrics(SM_CYBORDER);
- rc.top = lpdis->rcItem.top + dy;
- rc.bottom = lpdis->rcItem.bottom - dy;
- rc.left = lpdis->rcItem.left + dx;
- rc.right = rc.left + 2 * (rc.bottom - rc.top);
- if (hbr = CreateSolidBrush (lpdis->itemData))
- {
- hbr = SelectObject (lpdis->hDC, hbr);
- Rectangle (lpdis->hDC, rc.left, rc.top, rc.right, rc.bottom);
- DeleteObject (SelectObject (lpdis->hDC, hbr));
- }
- DebugTrace ("SMH: color menu: painting item: %sn",
- (LPCSTR)rgszColor[lpdis->itemID - ID_Color - 1]);
- SelectObject (lpdis->hDC, lpfb->hfnt);
- TextOut (lpdis->hDC,
- 2 * dx + rc.right,
- lpdis->rcItem.top,
- rgszColor[lpdis->itemID - ID_Color - 1],
- lstrlen ((LPCSTR)rgszColor[lpdis->itemID - ID_Color - 1]));
- SetTextColor (lpdis->hDC, rgbText);
- SetBkColor (lpdis->hDC, rgbBack);
- return;
- }
- void
- FillColors (LPFORMATBAR lpfb)
- {
- UINT irgb;
- /* Setup the auto color */
- rgrgb[0] = GetSysColor (COLOR_WINDOWTEXT);
- for (irgb = 0; irgb < crgb; irgb++)
- {
- DebugTrace ("SMH: color menu: adding item: %s (0x%08lX)n",
- (LPCSTR)rgszColor[irgb], rgrgb[irgb]);
- AppendMenu (lpfb->hmnuColor,
- MF_ENABLED | MF_OWNERDRAW,
- ID_Color + irgb + 1,
- (LPCSTR)rgrgb[irgb]);
- }
- }
- /*
- * FormatBar window proc -----------------------------------------------------
- *
- * The formatbar window proc intercepts several window messages and
- * processes them as needed. The primary messages we operate on are the
- * messages that will cause items to be redrawn or shown.
- *
- * Additionally, WM_DESTROY is processed as for cleanup of all the
- * formatbar components
- */
- LRESULT CALLBACK EXPORT
- FormatBarWndProc (HWND hwnd,
- UINT msg,
- WPARAM wParam,
- LPARAM lParam)
- {
- LPFORMATBAR lpfb = (LPFORMATBAR)GetWindowLong (hwnd, GWL_USERDATA);
- switch (msg)
- {
- case WM_COMMAND:
- if ((GET_WM_COMMAND_CMD (wParam, lParam) == CBN_DROPDOWN) &&
- (GET_WM_COMMAND_ID (wParam, lParam) == ID_FontSize))
- FillSizes (lpfb);
- SendMessage (GetParent(hwnd), WM_COMMAND, wParam, lParam);
- return TRUE;
- case WM_SHOWWINDOW:
- SendMessage (lpfb->hwndTb, msg, wParam, lParam);
- break;
- case WM_DRAWITEM:
- ColorMenu_DrawItem (hwnd, (DRAWITEMSTRUCT FAR *)lParam);
- return TRUE;
- case WM_MEASUREITEM:
- ColorMenu_MeasureItem (hwnd, (MEASUREITEMSTRUCT FAR *)lParam);
- return TRUE;
- case WM_DESTROY:
- DebugTrace ("SMH: destroying format barn");
- DestroyWindow (lpfb->hwndTb);
- DestroyWindow (lpfb->hwndFont);
- DestroyWindow (lpfb->hwndSize);
- DeleteObject (lpfb->hbrBtnFace);
- DestroyMenu (lpfb->hmnuColor);
- UlRelease (lpfb->lpreoc);
- (*lpfb->lpscd->lpfnFree) (lpfb);
- break;
- }
- return DefWindowProc (hwnd, msg, wParam, lParam);
- }
- /*
- * Toolbar subclass proc -----------------------------------------------------
- *
- * The subclassing of the toolbar is done so that the listboxes added to
- * the toolbar will be drawn with the correct control color.
- */
- LRESULT CALLBACK EXPORT
- ToolbarSubclassProc (HWND hwnd,
- UINT msg,
- WPARAM wParam,
- LPARAM lParam)
- {
- LPFORMATBAR lpfb = (LPFORMATBAR)GetWindowLong (GetParent (hwnd), GWL_USERDATA);
- switch (msg)
- {
- #ifdef _WIN32
- case WM_CTLCOLORLISTBOX:
- #else
- case WM_CTLCOLOR:
- switch (HIWORD (lParam))
- {
- case CTLCOLOR_LISTBOX:
- #endif
- if (!lpfb->hbrBtnFace)
- {
- lpfb->hbrBtnFace = CreateSolidBrush (FWin4Shell()
- ? GetSysColor (COLOR_WINDOW)
- : GetSysColor (COLOR_BTNFACE));
- }
- return (LRESULT)(LPVOID)lpfb->hbrBtnFace;
- #ifdef _WIN32
- break;
- #else
- break;
- }
- break;
- #endif
- }
- return CallWindowProc (lpfb->lpfnToolbar, hwnd, msg, wParam, lParam);
- }
- STDMETHODIMP_(SCODE)
- ScCreateToolbar (LPSCD lpscd,
- HWND hwnd,
- UINT idPeg,
- BOOL fPropsheet,
- LPFORMATBAR FAR * lppfb)
- {
- SCODE sc;
- RECT rc;
- RECT rcId;
- RECT rcTb;
- RECT rcCli;
- UINT x;
- UINT y;
- WNDCLASS wc = {0};
- LPFORMATBAR lpfb = NULL;
- sc = (*lpscd->lpfnAlloc) (sizeof(FORMATBAR), &lpfb);
- if (!FAILED (sc))
- {
- memset (lpfb, 0, sizeof(FORMATBAR));
- lpfb->hwndEdit = GetDlgItem (hwnd, idPeg);
- lpfb->cf.cbSize = sizeof(CHARFORMAT);
- SendMessage (lpfb->hwndEdit, EM_GETCHARFORMAT, TRUE, (LPARAM)(LPVOID)&lpfb->cf);
- lpfb->pf.cbSize = sizeof(PARAFORMAT);
- SendMessage (lpfb->hwndEdit, EM_GETPARAFORMAT, 0, (LPARAM)(LPVOID)&lpfb->pf);
- SendMessage (lpfb->hwndEdit, EM_SETEVENTMASK, 0, ENM_SELCHANGE | ENM_CHANGE);
- lpfb->cf.dwMask = CFM_FACE | CFM_SIZE | CFE_BOLD | CFE_ITALIC | CFE_UNDERLINE | CFM_COLOR;
- lpfb->cf.dwEffects = CFE_AUTOCOLOR;
- lstrcpy (lpfb->cf.szFaceName, "Arial");
- lpfb->cf.yHeight = 200;
- SendMessage (lpfb->hwndEdit, EM_SETCHARFORMAT, 0, (LPARAM)(LPVOID)&lpfb->cf);
- if (!GetClassInfo (lpscd->hinst, rgchTBClass, &wc))
- {
- wc.style = CS_HREDRAW | CS_VREDRAW;
- wc.lpfnWndProc = FormatBarWndProc;
- wc.cbWndExtra = sizeof(LPVOID);
- wc.hInstance = lpscd->hinst;
- wc.hCursor = LoadCursor (NULL, IDC_ARROW);
- wc.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1);
- wc.lpszClassName = (LPCTSTR)rgchTBClass;
- SideAssert (RegisterClass (&wc));
- }
- Assert (IsWindow (hwnd));
- GetWindowRect (lpfb->hwndEdit, &rcId);
- if (lpfb->hwndFrame = CreateWindow ((LPCTSTR)rgchTBClass,
- "SMH",
- WS_CHILD,
- 0, 0, rcId.right, 30,
- hwnd,
- (HMENU)ID_Frame,
- lpscd->hinst,
- NULL))
- {
- CTL3D_SubclassCtl (lpCtl3D, lpfb->hwndFrame);
- lpfb->hmnuColor = CreatePopupMenu();
- FillColors (lpfb);
- if (lpfb->hwndTb = CreateToolbarEx (lpfb->hwndFrame,
- CCS_TOP | WS_CHILD,
- 0,
- ctbMax,
- lpscd->hinst,
- ID_Toolbar,
- rgtbbChar,
- ctbbChar,
- 16, 16, 16, 16,
- sizeof(TBBUTTON)))
- {
- lpfb->lpscd = lpscd;
- SetWindowLong (lpfb->hwndFrame, GWL_USERDATA, (ULONG)lpfb);
- /* Move the window to where it belongs */
- GetWindowRect (hwnd, &rc);
- GetClientRect (lpfb->hwndTb, &rcTb);
- x = rcId.left - rc.left;
- y = rcId.top - rc.top - rcTb.bottom - 2;
- /* Adjust y by any title bars and framing */
- if (!fPropsheet)
- {
- GetClientRect (hwnd, &rcCli);
- y -= rc.bottom - rc.top - rcCli.bottom;
- x -= (rc.right - rc.left - rcCli.right) / 2;
- y += (rc.right - rc.left - rcCli.right) / 2;
- }
- MoveWindow (lpfb->hwndFrame, x, y, rcId.right - rcId.left, rcTb.bottom, FALSE);
- lpfb->hfnt = (HFONT) SendMessage (lpfb->hwndTb, WM_GETFONT, 0, 0);
- lpfb->lpfnToolbar = (WNDPROC)SetWindowLong (lpfb->hwndTb,
- GWL_WNDPROC,
- (LONG)ToolbarSubclassProc);
- lpfb->hwndFont = CreateWindow ((LPCTSTR)rgchComboBox,
- NULL,
- WS_CHILD | WS_VSCROLL | CBS_DROPDOWN | CBS_SORT | WS_VISIBLE,
- 0, 3, cxName, rcTb.bottom * 5,
- lpfb->hwndTb,
- (HMENU) ID_Font,
- lpscd->hinst,
- NULL);
- CTL3D_SubclassCtl (lpCtl3D, lpfb->hwndFont);
- SetWindowFont (lpfb->hwndFont, lpfb->hfnt, TRUE);
- ComboBox_SetExtendedUI (lpfb->hwndFont, TRUE);
- FillFontNames (lpfb->hwndFont);
- lpfb->hwndSize = CreateWindow ((LPCTSTR)rgchComboBox,
- NULL,
- WS_CHILD | WS_VSCROLL | CBS_DROPDOWN | WS_VISIBLE,
- cxName + 8, 3, cxSize, rcTb.bottom * 5,
- lpfb->hwndTb,
- (HMENU) ID_FontSize,
- lpscd->hinst,
- NULL);
- CTL3D_SubclassCtl (lpCtl3D, lpfb->hwndSize);
- SetWindowFont (lpfb->hwndSize, lpfb->hfnt, TRUE);
- ComboBox_SetExtendedUI (lpfb->hwndSize, TRUE);
- ComboBox_LimitText (lpfb->hwndSize, cchSizeMax);
- FillSizes (lpfb);
- UpdateFormatBar (lpfb->hwndFrame);
- ShowWindow (lpfb->hwndFrame, SW_SHOW);
- ShowWindow (lpfb->hwndTb, SW_SHOW);
- }
- }
- }
- *lppfb = lpfb;
- DebugTraceSc (ScCreateToolbar(), (lpfb->hwndFrame ? S_OK : MAPI_E_CALL_FAILED));
- return (lpfb->hwndFrame ? S_OK : MAPI_E_CALL_FAILED);
- }
- STDMETHODIMP_(BOOL)
- FDoRTFCommand (HWND hwnd, UINT id, UINT code)
- {
- LPFORMATBAR lpfb = (LPFORMATBAR)(GetWindowLong (hwnd, GWL_USERDATA));
- DWORD dw;
- RECT rc;
- UINT iSel;
- switch (id)
- {
- case ID_Font:
- if (code == CBN_SELENDOK)
- {
- FillSizes (lpfb);
- iSel = ComboBox_GetCurSel (lpfb->hwndFont);
- lpfb->cf.dwMask = CFM_FACE | CFM_CHARSET;
- ComboBox_GetLBText (lpfb->hwndFont, iSel, lpfb->cf.szFaceName);
- dw = ComboBox_GetItemData (lpfb->hwndFont, iSel);
- lpfb->cf.bPitchAndFamily = (BYTE)(dw >>= 16) & 0xFF;
- lpfb->cf.bCharSet = (BYTE)(dw >>= 8) & 0xFF;
- SendMessage (lpfb->hwndEdit, EM_SETCHARFORMAT, SCF_SELECTION, (LPARAM)(LPVOID)&lpfb->cf);
- UpdateFormatBar (lpfb->hwndFrame);
- SetFocus (lpfb->hwndEdit);
- }
- break;
- case ID_FontSize:
- if (code == CBN_SELENDOK)
- {
- UINT i;
- TCHAR rgch[cchSizeMax];
- rgch[0] = 0;
- lpfb->cf.dwMask = CFM_SIZE;
- ComboBox_GetLBText (lpfb->hwndSize,
- ComboBox_GetCurSel (lpfb->hwndSize),
- rgch);
- for (lpfb->cf.yHeight = 0, i = 0; rgch[i]; i++)
- lpfb->cf.yHeight = (lpfb->cf.yHeight * 10) + (rgch[i] - '0');
- lpfb->cf.yHeight *= 20;
- SendMessage (lpfb->hwndEdit, EM_SETCHARFORMAT, SCF_SELECTION, (LPARAM)(LPVOID)&lpfb->cf);
- UpdateFormatBar (lpfb->hwndFrame);
- SetFocus (lpfb->hwndEdit);
- }
- break;
- break;
- case ID_Color:
- if (lpfb->hdc = GetDC (lpfb->hwndTb))
- {
- SendMessage (lpfb->hwndTb, TB_GETITEMRECT, 1, (LPARAM) &rc);
- MapWindowPoints (lpfb->hwndTb, NULL, (LPPOINT)&rc, 2);
- TrackPopupMenu (lpfb->hmnuColor, TPM_LEFTALIGN | TPM_LEFTBUTTON,
- rc.left, rc.bottom + 2, 0, hwnd, NULL);
- ReleaseDC (lpfb->hwndTb, lpfb->hdc);
- }
- break;
- case ID_ColorAuto:
- case ID_ColorBlack:
- case ID_ColorMaroon:
- case ID_ColorGreen:
- case ID_ColorOlive:
- case ID_ColorBlue:
- case ID_ColorPurple:
- case ID_ColorTeal:
- case ID_ColorGray:
- case ID_ColorSilver:
- case ID_ColorRed:
- case ID_ColorLime:
- case ID_ColorYellow:
- case ID_ColorNavy:
- case ID_ColorFuchia:
- case ID_ColorAqua:
- case ID_ColorWhite:
- lpfb->cf.dwMask = CFM_COLOR;
- lpfb->cf.dwEffects &= ~CFE_AUTOCOLOR;
- lpfb->cf.dwEffects |= (id == ID_ColorAuto) ? CFE_AUTOCOLOR : 0;
- lpfb->cf.crTextColor = (COLORREF)rgrgb[id - ID_Color - 1];
- SendMessage (lpfb->hwndEdit, EM_SETCHARFORMAT, SCF_SELECTION, (LPARAM)(LPVOID)&lpfb->cf);
- break;
- case ID_Bold:
- case ID_Italic:
- case ID_Underline:
- DebugTrace ("dwMask before: 0x%08lXn", lpfb->cf.dwMask);
- DebugTrace ("dwEffects before: 0x%08lXn", lpfb->cf.dwEffects);
- lpfb->cf.dwMask = rgdwEffect[id - ID_Bold];
- lpfb->cf.dwEffects ^= rgdwEffect[id - ID_Bold];
- DebugTrace ("dwMask after: 0x%08lXn", lpfb->cf.dwMask);
- DebugTrace ("dwEffects after: 0x%08lXn", lpfb->cf.dwEffects);
- SendMessage (lpfb->hwndEdit, EM_SETCHARFORMAT, SCF_SELECTION, (LPARAM)(LPVOID)&lpfb->cf);
- break;
- case ID_Indent:
- case ID_Collapse:
- lpfb->pf.dwMask = PFM_STARTINDENT;
- lpfb->pf.dxStartIndent += ((id == ID_Indent) ? cxIndent : -cxIndent);
- SendMessage (lpfb->hwndEdit, EM_SETPARAFORMAT, 0, (LPARAM)(LPVOID)&lpfb->pf);
- break;
- case ID_Left:
- case ID_Center:
- case ID_Right:
- lpfb->pf.dwMask = PFM_ALIGNMENT;
- lpfb->pf.wAlignment = rgwAlign[id - ID_Left];
- SendMessage (lpfb->hwndEdit, EM_SETPARAFORMAT, 0, (LPARAM)(LPVOID)&lpfb->pf);
- break;
- case ID_Bullet:
- lpfb->pf.dwMask = PFM_NUMBERING | PFM_OFFSET;
- if (lpfb->pf.wNumbering != PFN_BULLET)
- {
- lpfb->pf.wNumbering = PFN_BULLET;
- lpfb->pf.dxOffset = cxIndent;
- }
- else
- {
- lpfb->pf.wNumbering = 0;
- lpfb->pf.dxOffset = 0;
- }
- SendMessage (lpfb->hwndEdit, EM_SETPARAFORMAT, 0, (LPARAM)(LPVOID)&lpfb->pf);
- break;
- default:
- return FALSE;
- }
- return TRUE;
- }
- void
- UpdateFormatBar (HWND hwnd)
- {
- LPFORMATBAR lpfb = (LPFORMATBAR)(GetWindowLong (hwnd, GWL_USERDATA));
- TCHAR rgch[cchSizeMax];
- UINT i;
- SendMessage (lpfb->hwndEdit, EM_GETCHARFORMAT, TRUE, (LPARAM)(LPVOID)&lpfb->cf);
- DebugTrace ("SMH: updating formatbar: format: %s%s%sn",
- (lpfb->cf.dwEffects & rgdwEffect[0]) ? "BOLD, " : "",
- (lpfb->cf.dwEffects & rgdwEffect[1]) ? "ITALIC, " : "",
- (lpfb->cf.dwEffects & rgdwEffect[2]) ? "UNDERLINED" : "");
- DebugTrace ("SMH: updating formatbar: current font: %sn", lpfb->cf.szFaceName);
- DebugTrace ("SMH: updating formatbar: current font height: %dn", lpfb->cf.yHeight);
- DebugTrace ("SMH: updating formatbar: current font size: %dn", FontSize (lpfb->cf.yHeight));
- DebugTrace ("SMH: updating formatbar: color: 0x%2X (r), 0x%2X (g), 0x%2x (b)n",
- GetRValue (lpfb->cf.crTextColor),
- GetGValue (lpfb->cf.crTextColor),
- GetBValue (lpfb->cf.crTextColor));
- for (i = ID_Bold; i <= ID_Underline; i++)
- SendMessage (lpfb->hwndTb, TB_CHECKBUTTON, i,
- MAKELONG (lpfb->cf.dwEffects & rgdwEffect[i - ID_Bold], 0));
- i = ComboBox_FindString (lpfb->hwndFont, -1, lpfb->cf.szFaceName);
- if (i != (UINT)ComboBox_GetCurSel (lpfb->hwndFont))
- {
- ComboBox_SetCurSel (lpfb->hwndFont, i);
- ComboBox_SetText (lpfb->hwndFont, lpfb->cf.szFaceName);
- }
- wsprintf (rgch, "%d", FontSize (lpfb->cf.yHeight));
- i = (UINT)ComboBox_FindStringExact (lpfb->hwndSize, -1, rgch);
- if ((i != CB_ERR) || (i != (UINT)ComboBox_GetCurSel (lpfb->hwndSize)))
- ComboBox_SetCurSel (lpfb->hwndSize, i);
- ComboBox_SetText (lpfb->hwndSize, rgch);
- return;
- }