mirror of
https://github.com/reactos/reactos.git
synced 2024-11-11 01:04:11 +00:00
c424146e2c
svn path=/branches/cmake-bringup/; revision=48236
368 lines
8.8 KiB
C
368 lines
8.8 KiB
C
/*
|
|
* PROJECT: ReactOS Character Map
|
|
* LICENSE: GPL - See COPYING in the top level directory
|
|
* FILE: base/applications/charmap/charmap.c
|
|
* PURPOSE: main dialog implementation
|
|
* COPYRIGHT: Copyright 2007 Ged Murphy <gedmurphy@reactos.org>
|
|
*
|
|
*/
|
|
|
|
#include <precomp.h>
|
|
|
|
#define ID_ABOUT 0x1
|
|
|
|
HINSTANCE hInstance;
|
|
|
|
/* Font-enumeration callback */
|
|
static
|
|
int
|
|
CALLBACK
|
|
EnumFontNames(ENUMLOGFONTEXW *lpelfe,
|
|
NEWTEXTMETRICEXW *lpntme,
|
|
DWORD FontType,
|
|
LPARAM lParam)
|
|
{
|
|
HWND hwndCombo = (HWND)lParam;
|
|
LPWSTR pszName = lpelfe->elfLogFont.lfFaceName;
|
|
|
|
/* make sure font doesn't already exist in our list */
|
|
if(SendMessageW(hwndCombo,
|
|
CB_FINDSTRING,
|
|
0,
|
|
(LPARAM)pszName) == CB_ERR)
|
|
{
|
|
INT idx;
|
|
BOOL fFixed;
|
|
BOOL fTrueType;
|
|
|
|
/* add the font */
|
|
idx = (INT)SendMessageW(hwndCombo,
|
|
CB_ADDSTRING,
|
|
0,
|
|
(LPARAM)pszName);
|
|
|
|
/* record the font's attributes (Fixedwidth and Truetype) */
|
|
fFixed = (lpelfe->elfLogFont.lfPitchAndFamily & FIXED_PITCH) ? TRUE : FALSE;
|
|
fTrueType = (lpelfe->elfLogFont.lfOutPrecision == OUT_STROKE_PRECIS) ? TRUE : FALSE;
|
|
|
|
/* store this information in the list-item's userdata area */
|
|
SendMessageW(hwndCombo,
|
|
CB_SETITEMDATA,
|
|
idx,
|
|
MAKEWPARAM(fFixed, fTrueType));
|
|
}
|
|
|
|
return 1;
|
|
}
|
|
|
|
|
|
/* Initialize the font-list by enumeration all system fonts */
|
|
static
|
|
VOID
|
|
FillFontStyleComboList(HWND hwndCombo)
|
|
{
|
|
HDC hdc;
|
|
LOGFONTW lf;
|
|
|
|
/* FIXME: for fun, draw each font in its own style */
|
|
HFONT hFont = GetStockObject(DEFAULT_GUI_FONT);
|
|
SendMessageW(hwndCombo,
|
|
WM_SETFONT,
|
|
(WPARAM)hFont,
|
|
0);
|
|
|
|
ZeroMemory(&lf, sizeof(lf));
|
|
lf.lfCharSet = DEFAULT_CHARSET;
|
|
|
|
hdc = GetDC(hwndCombo);
|
|
|
|
/* store the list of fonts in the combo */
|
|
EnumFontFamiliesExW(hdc,
|
|
&lf,
|
|
(FONTENUMPROCW)EnumFontNames,
|
|
(LPARAM)hwndCombo,
|
|
0);
|
|
|
|
ReleaseDC(hwndCombo,
|
|
hdc);
|
|
|
|
SendMessageW(hwndCombo,
|
|
CB_SETCURSEL,
|
|
0,
|
|
0);
|
|
}
|
|
|
|
|
|
static
|
|
VOID
|
|
ChangeMapFont(HWND hDlg)
|
|
{
|
|
HWND hCombo;
|
|
HWND hMap;
|
|
LPWSTR lpFontName;
|
|
INT Len;
|
|
|
|
hCombo = GetDlgItem(hDlg, IDC_FONTCOMBO);
|
|
|
|
Len = GetWindowTextLengthW(hCombo);
|
|
|
|
if (Len != 0)
|
|
{
|
|
lpFontName = HeapAlloc(GetProcessHeap(),
|
|
0,
|
|
(Len + 1) * sizeof(WCHAR));
|
|
|
|
if (lpFontName)
|
|
{
|
|
SendMessageW(hCombo,
|
|
WM_GETTEXT,
|
|
Len + 1,
|
|
(LPARAM)lpFontName);
|
|
|
|
hMap = GetDlgItem(hDlg, IDC_FONTMAP);
|
|
|
|
SendMessageW(hMap,
|
|
FM_SETFONT,
|
|
0,
|
|
(LPARAM)lpFontName);
|
|
}
|
|
|
|
HeapFree(GetProcessHeap(),
|
|
0,
|
|
lpFontName);
|
|
}
|
|
}
|
|
|
|
|
|
static
|
|
VOID
|
|
AddCharToSelection(HWND hText,
|
|
WCHAR ch)
|
|
{
|
|
LPWSTR lpText;
|
|
INT Len = GetWindowTextLength(hText);
|
|
|
|
if (Len != 0)
|
|
{
|
|
lpText = HeapAlloc(GetProcessHeap(),
|
|
0,
|
|
(Len + 2) * sizeof(WCHAR));
|
|
|
|
if (lpText)
|
|
{
|
|
LPWSTR lpStr = lpText;
|
|
|
|
SendMessageW(hText,
|
|
WM_GETTEXT,
|
|
Len + 1,
|
|
(LPARAM)lpStr);
|
|
|
|
lpStr += Len;
|
|
*lpStr = ch;
|
|
lpStr++;
|
|
*lpStr = L'\0';
|
|
|
|
SendMessageW(hText,
|
|
WM_SETTEXT,
|
|
0,
|
|
(LPARAM)lpText);
|
|
|
|
HeapFree(GetProcessHeap(),
|
|
0,
|
|
lpText);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
WCHAR szText[2];
|
|
|
|
szText[0] = ch;
|
|
szText[1] = L'\0';
|
|
|
|
SendMessageW(hText,
|
|
WM_SETTEXT,
|
|
0,
|
|
(LPARAM)szText);
|
|
}
|
|
}
|
|
|
|
|
|
static
|
|
INT_PTR
|
|
CALLBACK
|
|
DlgProc(HWND hDlg,
|
|
UINT Message,
|
|
WPARAM wParam,
|
|
LPARAM lParam)
|
|
{
|
|
static HICON hSmIcon;
|
|
static HICON hBgIcon;
|
|
LPWSTR lpAboutText = NULL;
|
|
|
|
switch(Message)
|
|
{
|
|
case WM_INITDIALOG:
|
|
{
|
|
HMENU hSysMenu;
|
|
|
|
hSmIcon = LoadImageW(hInstance,
|
|
MAKEINTRESOURCEW(IDI_ICON),
|
|
IMAGE_ICON,
|
|
16,
|
|
16,
|
|
0);
|
|
if (hSmIcon)
|
|
{
|
|
SendMessageW(hDlg,
|
|
WM_SETICON,
|
|
ICON_SMALL,
|
|
(LPARAM)hSmIcon);
|
|
}
|
|
|
|
hBgIcon = LoadImageW(hInstance,
|
|
MAKEINTRESOURCEW(IDI_ICON),
|
|
IMAGE_ICON,
|
|
32,
|
|
32,
|
|
0);
|
|
if (hBgIcon)
|
|
{
|
|
SendMessageW(hDlg,
|
|
WM_SETICON,
|
|
ICON_BIG,
|
|
(LPARAM)hBgIcon);
|
|
}
|
|
|
|
FillFontStyleComboList(GetDlgItem(hDlg,
|
|
IDC_FONTCOMBO));
|
|
|
|
ChangeMapFont(hDlg);
|
|
hSysMenu = GetSystemMenu(hDlg,
|
|
FALSE);
|
|
if (hSysMenu != NULL)
|
|
{
|
|
if (LoadStringW(hInstance,
|
|
IDS_ABOUT,
|
|
lpAboutText,
|
|
0))
|
|
{
|
|
AppendMenuW(hSysMenu,
|
|
MF_SEPARATOR,
|
|
0,
|
|
NULL);
|
|
AppendMenuW(hSysMenu,
|
|
MF_STRING,
|
|
ID_ABOUT,
|
|
lpAboutText);
|
|
}
|
|
}
|
|
return TRUE;
|
|
}
|
|
|
|
case WM_COMMAND:
|
|
{
|
|
switch(LOWORD(wParam))
|
|
{
|
|
case IDC_FONTMAP:
|
|
{
|
|
switch (HIWORD(wParam))
|
|
{
|
|
case FM_SETCHAR:
|
|
AddCharToSelection(GetDlgItem(hDlg, IDC_TEXTBOX),
|
|
LOWORD(lParam));
|
|
break;
|
|
}
|
|
}
|
|
break;
|
|
|
|
case IDC_FONTCOMBO:
|
|
{
|
|
if (HIWORD(wParam) == CBN_SELCHANGE)
|
|
{
|
|
ChangeMapFont(hDlg);
|
|
}
|
|
}
|
|
break;
|
|
|
|
case IDC_SELECT:
|
|
{
|
|
WCHAR ch;
|
|
HWND hMap = GetDlgItem(hDlg, IDC_FONTMAP);
|
|
|
|
ch = (WCHAR) SendMessageW(hMap, FM_GETCHAR, 0, 0);
|
|
|
|
if (ch)
|
|
{
|
|
AddCharToSelection(GetDlgItem(hDlg, IDC_TEXTBOX),
|
|
ch);
|
|
}
|
|
|
|
break;
|
|
}
|
|
|
|
case IDOK:
|
|
if (hSmIcon)
|
|
DestroyIcon(hSmIcon);
|
|
if (hBgIcon)
|
|
DestroyIcon(hBgIcon);
|
|
EndDialog(hDlg, 0);
|
|
break;
|
|
}
|
|
}
|
|
break;
|
|
|
|
case WM_SYSCOMMAND:
|
|
{
|
|
switch(wParam)
|
|
{
|
|
case ID_ABOUT:
|
|
ShowAboutDlg(hDlg);
|
|
break;
|
|
}
|
|
}
|
|
break;
|
|
|
|
case WM_CLOSE:
|
|
if (hSmIcon)
|
|
DestroyIcon(hSmIcon);
|
|
if (hBgIcon)
|
|
DestroyIcon(hBgIcon);
|
|
EndDialog(hDlg, 0);
|
|
break;
|
|
|
|
default:
|
|
return FALSE;
|
|
}
|
|
|
|
return FALSE;
|
|
}
|
|
|
|
|
|
INT
|
|
WINAPI
|
|
wWinMain(HINSTANCE hInst,
|
|
HINSTANCE hPrev,
|
|
LPWSTR Cmd,
|
|
int iCmd)
|
|
{
|
|
INITCOMMONCONTROLSEX iccx;
|
|
INT Ret = 1;
|
|
|
|
hInstance = hInst;
|
|
|
|
iccx.dwSize = sizeof(INITCOMMONCONTROLSEX);
|
|
iccx.dwICC = ICC_TAB_CLASSES;
|
|
InitCommonControlsEx(&iccx);
|
|
|
|
if (RegisterMapClasses(hInstance))
|
|
{
|
|
Ret = DialogBoxW(hInstance,
|
|
MAKEINTRESOURCEW(IDD_CHARMAP),
|
|
NULL,
|
|
DlgProc) >= 0;
|
|
|
|
UnregisterMapClasses(hInstance);
|
|
}
|
|
|
|
return Ret;
|
|
}
|