// AeroEdit.cpp : implementation file // #include "stdafx.h" #include "SymbolEdit.h" #include "cp_main.h" // CSymbolEdit IMPLEMENT_DYNAMIC(CSymbolEdit, CEdit) CSymbolEdit::CSymbolEdit() : m_hSymbolIcon(NULL), m_bInternalIcon(false), m_colorPromptText(RGB(127, 127, 127)) { m_fontPrompt.CreateFont( 16, // nHeight 0, // nWidth 0, // nEscapement 0, // nOrientation FW_NORMAL, // nWeight TRUE, // bItalic FALSE, // bUnderline 0, // cStrikeOut DEFAULT_CHARSET, // nCharSet OUT_DEFAULT_PRECIS, // nOutPrecision CLIP_DEFAULT_PRECIS, // nClipPrecision DEFAULT_QUALITY, // nQuality DEFAULT_PITCH | FF_SWISS, // nPitchAndFamily _T("Calibri")); m_editFocusColor = RGB(255, 255, 255); m_editNonFocusColor = RGB(240, 240, 240); m_editFocusBrush.CreateSolidBrush(m_editFocusColor); m_editNonFocusBrush.CreateSolidBrush(m_editNonFocusColor); } CSymbolEdit::~CSymbolEdit() { DestroyIcon(); } BEGIN_MESSAGE_MAP(CSymbolEdit, CEdit) ON_WM_PAINT() ON_MESSAGE(WM_SETFONT, OnSetFont) ON_WM_CTLCOLOR_REFLECT() ON_WM_SETFOCUS() ON_WM_KILLFOCUS() END_MESSAGE_MAP() BOOL CSymbolEdit::PreTranslateMessage(MSG* pMsg) { // TODO: Add your specialized code here and/or call the base class // Intercept Ctrl + Z (Undo), Ctrl + X (Cut), Ctrl + C (Copy), Ctrl + V (Paste) and Ctrl + A (Select All) // before CEdit base class gets a hold of them. if (pMsg->message == WM_KEYDOWN && CONTROL_PRESSED) { switch (pMsg->wParam) { case 'Z': Undo(); return TRUE; case 'X': Cut(); return TRUE; case 'C': Copy(); return TRUE; case 'V': Paste(); return TRUE; case 'A': SetSel(0, -1); return TRUE; } } switch (pMsg->message) { case WM_KEYDOWN: { if (pMsg->wParam == VK_RETURN) { CWnd *pWnd = GetParent(); if (pWnd) { if (g_Opt.m_bFindAsYouType) { pWnd->SendMessage(NM_SEARCH_ENTER_PRESSED, 0, 0); } else { //Send a message to the parent to refill the lb from the search pWnd->PostMessage(CB_SEARCH, 0, 0); } } return TRUE; } else if (pMsg->wParam == VK_DOWN || pMsg->wParam == VK_UP || pMsg->wParam == VK_F3 || pMsg->wParam == VK_PRIOR || pMsg->wParam == VK_NEXT) { CWnd *pWnd = GetParent(); if (pWnd) { pWnd->SendMessage(CB_UPDOWN, pMsg->wParam, pMsg->lParam); return TRUE; } } break; } } return CEdit::PreTranslateMessage(pMsg); } void CSymbolEdit::DestroyIcon() { // if icon was loaded internally, destroy it if (m_bInternalIcon || m_hSymbolIcon != NULL) ::DestroyIcon(m_hSymbolIcon); } void CSymbolEdit::PreSubclassWindow() { RecalcLayout(); } void CSymbolEdit::SetSymbolIcon(HICON hIcon, BOOL redraw) { DestroyIcon(); m_hSymbolIcon = hIcon; // icon was not loaded internally m_bInternalIcon = false; RecalcLayout(); if (redraw) Invalidate(TRUE); } void CSymbolEdit::SetSymbolIcon(UINT id, BOOL redraw) { DestroyIcon(); m_hSymbolIcon = (HICON)::LoadImage( AfxGetResourceHandle(), MAKEINTRESOURCE(id), IMAGE_ICON, 16, 16, LR_DEFAULTCOLOR | LR_LOADTRANSPARENT); ASSERT(m_hSymbolIcon != NULL); // icon was loaded internally m_bInternalIcon = true; RecalcLayout(); if (redraw) Invalidate(TRUE); } void CSymbolEdit::SetPromptText(CString text, BOOL redraw) { m_strPromptText = text; if (redraw) Invalidate(TRUE); } void CSymbolEdit::SetPromptText(LPCTSTR szText, BOOL redraw) { m_strPromptText = szText; if (redraw) Invalidate(TRUE); } void CSymbolEdit::SetPromptTextColor(COLORREF color, BOOL redraw) { m_colorPromptText = color; if (redraw) Invalidate(TRUE); } void CSymbolEdit::SetPromptFont(CFont& font, BOOL redraw) { LOGFONT lf; memset(&lf, 0, sizeof(LOGFONT)); font.GetLogFont(&lf); SetPromptFont(&lf); if (redraw) Invalidate(TRUE); } void CSymbolEdit::SetPromptFont(const LOGFONT* lpLogFont, BOOL redraw) { m_fontPrompt.DeleteObject(); m_fontPrompt.CreateFontIndirect(lpLogFont); if (redraw) Invalidate(TRUE); } void CSymbolEdit::RecalcLayout() { int width = GetSystemMetrics(SM_CXSMICON); if (m_hSymbolIcon) { DWORD dwMargins = GetMargins(); SetMargins(LOWORD(dwMargins), width + 6); } } // CSymbolEdit message handlers void CSymbolEdit::OnPaint() { CPaintDC dc(this); CRect rect; GetClientRect(&rect); // Clearing the background dc.FillSolidRect(rect, GetSysColor(COLOR_WINDOW)); DWORD dwMargins = GetMargins(); if (m_hSymbolIcon) { // Drawing the icon int width = GetSystemMetrics(SM_CXSMICON); int height = GetSystemMetrics(SM_CYSMICON); ::DrawIconEx( dc.m_hDC, rect.right - width - 1, 1, m_hSymbolIcon, width, height, 0, NULL, DI_NORMAL); rect.left += LOWORD(dwMargins) + 1; rect.right -= (width + 7); } else { //rect.left += (LOWORD(dwMargins) + 1); //rect.right -= (HIWORD(dwMargins) + 1); } CString text; GetWindowText(text); CFont* oldFont = NULL; //rect.top += 1; if (text.GetLength() == 0) { if (this != GetFocus() && m_strPromptText.GetLength() > 0) { dc.FillSolidRect(rect, m_editNonFocusColor); oldFont = dc.SelectObject(&m_fontPrompt); COLORREF color = dc.GetTextColor(); dc.SetTextColor(m_colorPromptText); DWORD margins = this->GetMargins(); rect.left += LOWORD(margins); rect.right -= HIWORD(margins); dc.DrawText(m_strPromptText, rect, DT_LEFT | DT_SINGLELINE | DT_EDITCONTROL); dc.SetTextColor(color); dc.SelectObject(oldFont); } } else { dc.FillSolidRect(rect, m_editFocusColor); oldFont = dc.SelectObject(GetFont()); DWORD margins = this->GetMargins(); rect.left += LOWORD(margins); rect.right -= HIWORD(margins); dc.DrawText(text, rect, DT_SINGLELINE | DT_INTERNAL | DT_EDITCONTROL); dc.SelectObject(oldFont); } } void CSymbolEdit::OnSize(UINT nType, int cx, int cy) { CEdit::OnSize(nType, cx, cy); RecalcLayout(); } LRESULT CSymbolEdit::OnSetFont(WPARAM wParam, LPARAM lParam) { DefWindowProc(WM_SETFONT, wParam, lParam); RecalcLayout(); return 0; } HBRUSH CSymbolEdit::CtlColor(CDC* pDC, UINT n) { if (::GetFocus() == m_hWnd) { pDC->SetBkColor(m_editFocusColor); return m_editFocusBrush; } else { pDC->SetBkColor(m_editNonFocusColor); return m_editNonFocusBrush; } } void CSymbolEdit::OnSetFocus(CWnd* pOldWnd) { Invalidate(FALSE); CEdit::OnSetFocus(pOldWnd); } void CSymbolEdit::OnKillFocus(CWnd* pNewWnd) { Invalidate(FALSE); CEdit::OnKillFocus(pNewWnd); }