2 * PROJECT: ReactOS Character Map
3 * LICENSE: GPL - See COPYING in the top level directory
4 * FILE: base/applications/charmap/MainWindow.cpp
5 * PURPOSE: Implements the main dialog window
6 * COPYRIGHT: Copyright 2015 Ged Murphy <gedmurphy@reactos.org>
11 #include "MainWindow.h"
14 /* DATA *****************************************************/
18 HINSTANCE g_hInstance
= NULL
;
21 /* PUBLIC METHODS **********************************************/
23 CCharMapWindow::CCharMapWindow(void) :
30 m_GridView
= new CGridView();
33 CCharMapWindow::~CCharMapWindow(void)
38 CCharMapWindow::Create(_In_ HINSTANCE hInst
,
41 INITCOMMONCONTROLSEX icex
;
42 CAtlStringW szAppName
;
49 // Initialize common controls
50 icex
.dwSize
= sizeof(INITCOMMONCONTROLSEX
);
51 icex
.dwICC
= ICC_BAR_CLASSES
| ICC_COOL_CLASSES
;
52 InitCommonControlsEx(&icex
);
54 // Load the application name
55 if (szAppName
.LoadStringW(g_hInstance
, IDS_TITLE
))
57 // Initialize the main window
58 if (Initialize(szAppName
, nCmdShow
))
60 // Run the application
63 // Uninitialize the main window
73 /* PRIVATE METHODS **********************************************/
76 CCharMapWindow::Initialize(_In_z_ LPCTSTR lpCaption
,
79 // The dialog has a rich edit text box
80 m_hRichEd
= LoadLibraryW(L
"riched20.DLL");
81 if (m_hRichEd
== NULL
) return false;
83 return !!(CreateDialogParamW(g_hInstance
,
84 MAKEINTRESOURCE(IDD_CHARMAP
),
91 CCharMapWindow::Uninitialize(void)
94 FreeLibrary(m_hRichEd
);
98 CCharMapWindow::Run(void)
102 // Pump the message queue
103 while (GetMessageW(&Msg
, NULL
, 0, 0) != 0)
105 TranslateMessage(&Msg
);
106 DispatchMessageW(&Msg
);
113 CCharMapWindow::UpdateStatusBar(_In_
bool InMenuLoop
)
115 SendMessageW(m_hStatusBar
,
122 CCharMapWindow::CreateStatusBar(void)
124 int StatWidths
[] = { 110, -1 }; // widths of status bar
127 // Create the status bar
128 m_hStatusBar
= CreateWindowExW(0,
131 WS_CHILD
| WS_VISIBLE
| SBARS_SIZEGRIP
,
134 (HMENU
)IDD_STATUSBAR
,
139 // Create the sections
140 bRet
= (SendMessageW(m_hStatusBar
,
142 sizeof(StatWidths
) / sizeof(int),
143 (LPARAM
)StatWidths
) != 0);
145 // Set the status bar for multiple parts output
146 SendMessage(m_hStatusBar
, SB_SIMPLE
, (WPARAM
)FALSE
, (LPARAM
)0);
153 CCharMapWindow::StatusBarLoadString(_In_ HWND hStatusBar
,
155 _In_ HINSTANCE hInstance
,
158 CAtlStringW szMessage
;
161 // Load the string from the resource
162 if (szMessage
.LoadStringW(hInstance
, uID
))
164 // Display it on the status bar
165 bRet
= (SendMessageW(hStatusBar
,
168 (LPARAM
)szMessage
.GetBuffer()) != 0);
175 CCharMapWindow::OnCreate(_In_ HWND hDlg
)
179 if (!CreateStatusBar())
182 if (!m_GridView
->Create(hDlg
))
185 // Load an 'about' option into the system menu
187 hSysMenu
= GetSystemMenu(m_hMainWnd
, FALSE
);
188 if (hSysMenu
!= NULL
)
190 CAtlStringW AboutText
;
191 if (AboutText
.LoadStringW(IDS_ABOUT
))
193 AppendMenuW(hSysMenu
, MF_SEPARATOR
, 0, NULL
);
194 AppendMenuW(hSysMenu
, MF_STRING
, ID_ABOUT
, AboutText
);
198 // Add all the fonts to the
199 if (!CreateFontComboBox())
204 // Configure Richedit control for sending notification changes.
206 evMask
= SendDlgItemMessage(hDlg
, IDC_TEXTBOX
, EM_GETEVENTMASK
, 0, 0);
207 evMask
|= ENM_CHANGE
;
208 SendDlgItemMessage(hDlg
, IDC_TEXTBOX
, EM_SETEVENTMASK
, 0, (LPARAM
)evMask
);
210 // Display the window according to the user request
211 ShowWindow(m_hMainWnd
, m_CmdShow
);
217 CCharMapWindow::OnSize(
221 RECT rcClient
, rcStatus
;
222 INT lvHeight
, iStatusHeight
;
224 // Resize the status bar
225 SendMessage(m_hStatusBar
, WM_SIZE
, 0, 0);
227 // Get the statusbar rect and save the height
228 GetWindowRect(m_hStatusBar
, &rcStatus
);
229 iStatusHeight
= rcStatus
.bottom
- rcStatus
.top
;
231 // Get the full client rect
232 GetClientRect(m_hMainWnd
, &rcClient
);
234 // Calculate the remaining height for the gridview
235 lvHeight
= rcClient
.bottom
- iStatusHeight
;
237 // Resize the grid view
238 SendMessageW(m_GridView
->GetHwnd(), WM_SIZE
, wParam
, 0);
244 CCharMapWindow::OnNotify(_In_ LPARAM lParam
)
246 LPNMHDR NmHdr
= (LPNMHDR
)lParam
;
267 CCharMapWindow::OnContext(_In_ LPARAM lParam
)
269 return 0;// m_GridView->OnContextMenu(lParam);
273 CCharMapWindow::OnCommand(_In_ WPARAM wParam
,
274 _In_ LPARAM
/*lParam*/)
280 Msg
= LOWORD(wParam
);
284 case IDC_CHECK_ADVANCED
:
288 if (HIWORD(wParam
) == CBN_SELCHANGE
)
295 // We didn't handle it
304 CCharMapWindow::OnDestroy(void)
306 // Clear the user data pointer
307 SetWindowLongPtr(m_hMainWnd
, GWLP_USERDATA
, 0);
309 // Break the message loop
316 CCharMapWindow::DialogProc(
323 CCharMapWindow
*This
;
326 // Get the object pointer from window context
327 This
= (CCharMapWindow
*)GetWindowLongPtr(hwndDlg
, GWLP_USERDATA
);
330 // Check that this isn't a create message
331 if (Msg
!= WM_INITDIALOG
)
333 // Don't handle null info pointer
342 // Get the object pointer from the create param
343 This
= (CCharMapWindow
*)lParam
;
345 // Store the pointer in the window's global user data
346 SetWindowLongPtr(hwndDlg
, GWLP_USERDATA
, (LONG_PTR
)This
);
348 // Call the create handler
349 return This
->OnCreate(hwndDlg
);
354 return This
->OnSize(wParam
);
359 return This
->OnNotify(lParam
);
364 return This
->OnContext(lParam
);
369 return This
->OnCommand(wParam
, lParam
);
377 MessageBoxW(This
->m_hMainWnd
,
378 L
"ReactOS Character Map\r\nCopyright Ged Murphy 2015",
380 MB_OK
| MB_APPLMODAL
);
385 case WM_ENTERMENULOOP
:
387 This
->UpdateStatusBar(true);
391 case WM_EXITMENULOOP
:
393 This
->UpdateStatusBar(false);
399 // Destroy the main window
400 return DestroyWindow(hwndDlg
);
406 // Call the destroy handler
407 return This
->OnDestroy();
414 struct EnumFontParams
416 CCharMapWindow
*This
;
422 CCharMapWindow::EnumDisplayFont(ENUMLOGFONTEXW
*lpelfe
,
423 NEWTEXTMETRICEXW
*lpntme
,
427 EnumFontParams
*Params
= (EnumFontParams
*)lParam
;
428 LPWSTR pszName
= lpelfe
->elfLogFont
.lfFaceName
;
430 /* Skip rotated font */
431 if (pszName
[0] == L
'@') return 1;
433 /* make sure font doesn't already exist in our list */
434 if (SendMessageW(Params
->hCombo
,
437 (LPARAM
)pszName
) == CB_ERR
)
440 idx
= (INT
)SendMessageW(Params
->hCombo
,
445 /* record the font's attributes (Fixedwidth and Truetype) */
446 BOOL fFixed
= (lpelfe
->elfLogFont
.lfPitchAndFamily
& FIXED_PITCH
) ? TRUE
: FALSE
;
447 BOOL fTrueType
= (lpelfe
->elfLogFont
.lfOutPrecision
== OUT_STROKE_PRECIS
) ? TRUE
: FALSE
;
449 /* store this information in the list-item's userdata area */
450 SendMessageW(Params
->hCombo
,
453 MAKEWPARAM(fFixed
, fTrueType
));
461 CCharMapWindow::CreateFontComboBox()
464 hCombo
= GetDlgItem(m_hMainWnd
, IDC_FONTCOMBO
);
466 NONCLIENTMETRICSW NonClientMetrics
;
467 NonClientMetrics
.cbSize
= sizeof(NONCLIENTMETRICSW
);
468 SystemParametersInfoW(SPI_GETNONCLIENTMETRICS
,
469 sizeof(NONCLIENTMETRICSW
),
473 // Get a handle to the font
475 GuiFont
= CreateFontIndirectW(&NonClientMetrics
.lfMessageFont
);
477 // Set the font used in the combo box
483 // Set the fonts which we want to enumerate
484 LOGFONTW FontsToEnum
;
485 ZeroMemory(&FontsToEnum
, sizeof(LOGFONTW
));
486 FontsToEnum
.lfCharSet
= DEFAULT_CHARSET
;
488 // Set the params we want to pass to the callback
489 EnumFontParams Params
;
491 Params
.hCombo
= hCombo
;
493 // Get a DC for combo box
497 // Enumerate all the fonts
499 ret
= EnumFontFamiliesExW(hdc
,
501 (FONTENUMPROCW
)EnumDisplayFont
,
505 ReleaseDC(hCombo
, hdc
);
506 DeleteObject(GuiFont
);
508 // Select the first item in the list
518 CCharMapWindow::ChangeMapFont(
522 hCombo
= GetDlgItem(m_hMainWnd
, IDC_FONTCOMBO
);
525 Length
= GetWindowTextLengthW(hCombo
);
526 if (!Length
) return false;
528 CAtlStringW FontName
;
529 FontName
.Preallocate(Length
);
533 FontName
.GetAllocLength(),
534 (LPARAM
)FontName
.GetBuffer());
536 return m_GridView
->SetFont(FontName
);