- Add Copy & Paste functions for whole characters

- Add an "Edit" menu now that we have some more menu items belonging to this category

svn path=/trunk/; revision=32482
This commit is contained in:
Colin Finck 2008-02-25 18:01:06 +00:00
parent ac53928d2c
commit d31f977a47
13 changed files with 194 additions and 3 deletions

View file

@ -108,6 +108,7 @@ FontWndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
case WM_CHILDACTIVATE:
Info->MainWndInfo->CurrentFontWnd = Info;
SetToolbarFileButtonState(Info->MainWndInfo, TRUE);
SetPasteButtonState(Info->MainWndInfo);
break;
case WM_CREATE:
@ -165,6 +166,7 @@ FontWndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
// Otherwise CurrentFontWnd will stay NULL, so the main window knows that no more childs are opened.
Info->MainWndInfo->CurrentFontWnd = NULL;
SetToolbarFileButtonState(Info->MainWndInfo, FALSE);
SetPasteButtonState(Info->MainWndInfo);
if(uMsg == WM_USER_APPCLOSE)
{

View file

@ -47,6 +47,14 @@ BEGIN
MENUITEM "Èçõîä êàòî\tAlt+F4", ID_FILE_EXIT
END
POPUP "&Edit"
BEGIN
MENUITEM "Copy\tCtrl+C", ID_EDIT_COPY
MENUITEM "Paste\tCtrl+V", ID_EDIT_PASTE
MENUITEM SEPARATOR
MENUITEM "Edit Glyph...", ID_EDIT_GLYPH
END
POPUP "&Ïðîçîðåö"
BEGIN
MENUITEM "&Íàäèïëÿíå", ID_WINDOW_CASCADE
@ -81,4 +89,6 @@ BEGIN
IDS_TOOLTIP_OPEN, "Îòâàðÿíå"
IDS_TOOLTIP_SAVE, "Çàïèñ"
IDS_TOOLTIP_EDIT_GLYPH, "Îáðàáîòêà íà çíàê"
IDS_TOOLTIP_COPY, "Copy"
IDS_TOOLTIP_PASTE, "Paste"
END

View file

@ -47,6 +47,14 @@ BEGIN
MENUITEM "Beenden\tAlt+F4", ID_FILE_EXIT
END
POPUP "&Bearbeiten"
BEGIN
MENUITEM "Kopieren\tStrg+C", ID_EDIT_COPY
MENUITEM "Einfügen\tStrg+V", ID_EDIT_PASTE
MENUITEM SEPARATOR
MENUITEM "Schriftzeichen bearbeiten...", ID_EDIT_GLYPH
END
POPUP "&Fenster"
BEGIN
MENUITEM "&Überlappend", ID_WINDOW_CASCADE
@ -81,4 +89,6 @@ BEGIN
IDS_TOOLTIP_OPEN, "Öffnen"
IDS_TOOLTIP_SAVE, "Speichern"
IDS_TOOLTIP_EDIT_GLYPH, "Schriftzeichen bearbeiten"
IDS_TOOLTIP_COPY, "Kopieren"
IDS_TOOLTIP_PASTE, "Einfügen"
END

View file

@ -47,6 +47,14 @@ BEGIN
MENUITEM "Exit\tAlt+F4", ID_FILE_EXIT
END
POPUP "&Edit"
BEGIN
MENUITEM "Copy\tCtrl+C", ID_EDIT_COPY
MENUITEM "Paste\tCtrl+V", ID_EDIT_PASTE
MENUITEM SEPARATOR
MENUITEM "Edit Glyph...", ID_EDIT_GLYPH
END
POPUP "&Window"
BEGIN
MENUITEM "&Cascade", ID_WINDOW_CASCADE
@ -81,4 +89,6 @@ BEGIN
IDS_TOOLTIP_OPEN, "Open"
IDS_TOOLTIP_SAVE, "Save"
IDS_TOOLTIP_EDIT_GLYPH, "Edit Glyph"
IDS_TOOLTIP_COPY, "Copy"
IDS_TOOLTIP_PASTE, "Paste"
END

View file

@ -47,6 +47,14 @@ BEGIN
MENUITEM "Quitter\tAlt+F4", ID_FILE_EXIT
END
POPUP "&Edit"
BEGIN
MENUITEM "Copy\tCtrl+C", ID_EDIT_COPY
MENUITEM "Paste\tCtrl+V", ID_EDIT_PASTE
MENUITEM SEPARATOR
MENUITEM "Edit Glyph...", ID_EDIT_GLYPH
END
POPUP "Fenêtres"
BEGIN
MENUITEM "En &cascade", ID_WINDOW_CASCADE
@ -81,4 +89,6 @@ BEGIN
IDS_TOOLTIP_OPEN, "Ouvrir"
IDS_TOOLTIP_SAVE, "Enregistrer"
IDS_TOOLTIP_EDIT_GLYPH, "Éditer le glyphe"
IDS_TOOLTIP_COPY, "Copy"
IDS_TOOLTIP_PASTE, "Paste"
END

View file

@ -47,6 +47,14 @@ BEGIN
MENUITEM "WyjdŸ\tAlt+F4", ID_FILE_EXIT
END
POPUP "&Edit"
BEGIN
MENUITEM "Copy\tCtrl+C", ID_EDIT_COPY
MENUITEM "Paste\tCtrl+V", ID_EDIT_PASTE
MENUITEM SEPARATOR
MENUITEM "Edit Glyph...", ID_EDIT_GLYPH
END
POPUP "&Okna"
BEGIN
MENUITEM "&Kaskadowo", ID_WINDOW_CASCADE
@ -81,4 +89,6 @@ BEGIN
IDS_TOOLTIP_OPEN, "Otwórz"
IDS_TOOLTIP_SAVE, "Zapisz"
IDS_TOOLTIP_EDIT_GLYPH, "Edytuj Glify"
IDS_TOOLTIP_COPY, "Copy"
IDS_TOOLTIP_PASTE, "Paste"
END

View file

@ -47,6 +47,14 @@ BEGIN
MENUITEM "Âûõîä\tAlt+F4", ID_FILE_EXIT
END
POPUP "&Edit"
BEGIN
MENUITEM "Copy\tCtrl+C", ID_EDIT_COPY
MENUITEM "Paste\tCtrl+V", ID_EDIT_PASTE
MENUITEM SEPARATOR
MENUITEM "Edit Glyph...", ID_EDIT_GLYPH
END
POPUP "&Îêíà"
BEGIN
MENUITEM "&Êàñêàäîì", ID_WINDOW_CASCADE
@ -81,4 +89,6 @@ BEGIN
IDS_TOOLTIP_OPEN, "Îòêðûòü"
IDS_TOOLTIP_SAVE, "Ñîõðàíèòü"
IDS_TOOLTIP_EDIT_GLYPH, "Ðåäàêòèðîâàòü ñèìâîë"
IDS_TOOLTIP_COPY, "Copy"
IDS_TOOLTIP_PASTE, "Paste"
END

View file

@ -47,6 +47,14 @@ BEGIN
MENUITEM "Â&èõ³ä\tAlt+F4", ID_FILE_EXIT
END
POPUP "&Edit"
BEGIN
MENUITEM "Copy\tCtrl+C", ID_EDIT_COPY
MENUITEM "Paste\tCtrl+V", ID_EDIT_PASTE
MENUITEM SEPARATOR
MENUITEM "Edit Glyph...", ID_EDIT_GLYPH
END
POPUP "&³êíî"
BEGIN
MENUITEM "&Êàñêàäîì", ID_WINDOW_CASCADE
@ -81,4 +89,6 @@ BEGIN
IDS_TOOLTIP_OPEN, "³äêðèòè"
IDS_TOOLTIP_SAVE, "Çáåðåãòè"
IDS_TOOLTIP_EDIT_GLYPH, "Ðåäàãóâàòè ñèìâîë"
IDS_TOOLTIP_COPY, "Copy"
IDS_TOOLTIP_PASTE, "Paste"
END

View file

@ -8,9 +8,12 @@
#include "precomp.h"
static const WCHAR szCharacterClipboardFormat[] = L"RosVgaFontChar";
HINSTANCE hInstance;
HANDLE hProcessHeap;
PWSTR szAppName;
UINT uCharacterClipboardFormat;
INT WINAPI
wWinMain(HINSTANCE hInst, HINSTANCE hPrevInstance, LPWSTR lpCmdLine, int nCmdShow)
@ -30,6 +33,10 @@ wWinMain(HINSTANCE hInst, HINSTANCE hPrevInstance, LPWSTR lpCmdLine, int nCmdSho
hAccel = LoadAcceleratorsW( hInstance, MAKEINTRESOURCEW(IDA_MAINACCELERATORS) );
uCharacterClipboardFormat = RegisterClipboardFormatW(szCharacterClipboardFormat);
if(!uCharacterClipboardFormat)
return 1;
if( InitMainWndClass() && InitFontWndClass() && InitFontBoxesWndClass() && InitEditGlyphWndClasses() )
{
if( CreateMainWindow(nCmdShow, &Info) )

View file

@ -21,6 +21,8 @@ BEGIN
"N", ID_FILE_NEW, VIRTKEY, CONTROL
"O", ID_FILE_OPEN, VIRTKEY, CONTROL
"S", ID_FILE_SAVE, VIRTKEY, CONTROL
"C", ID_EDIT_COPY, VIRTKEY, CONTROL
"V", ID_EDIT_PASTE, VIRTKEY, CONTROL
END
IDB_MAIN_TOOLBAR BITMAP "res/toolbar.bmp"

View file

@ -88,6 +88,7 @@ SetToolbarFileButtonState(IN PMAIN_WND_INFO Info, BOOL bEnabled)
{
SetToolbarButtonState(Info, ID_FILE_SAVE, bEnabled);
SetToolbarButtonState(Info, ID_EDIT_GLYPH, bEnabled);
SetToolbarButtonState(Info, ID_EDIT_COPY, bEnabled);
}
static VOID
@ -143,11 +144,15 @@ InitMainWnd(IN PMAIN_WND_INFO Info)
AddToolbarButton(Info, iStandardBitmaps + STD_FILESAVE, ID_FILE_SAVE, IDS_TOOLTIP_SAVE);
AddToolbarSeparator(Info);
AddToolbarButton(Info, iCustomBitmaps + TOOLBAR_EDIT_GLYPH, ID_EDIT_GLYPH, IDS_TOOLTIP_EDIT_GLYPH);
AddToolbarSeparator(Info);
AddToolbarButton(Info, iStandardBitmaps + STD_COPY, ID_EDIT_COPY, IDS_TOOLTIP_COPY);
AddToolbarButton(Info, iStandardBitmaps + STD_PASTE, ID_EDIT_PASTE, IDS_TOOLTIP_PASTE);
SetToolbarFileButtonState(Info, FALSE);
SetPasteButtonState(Info);
// Add the MDI client area
ccs.hWindowMenu = GetSubMenu(Info->hMenu, 1);
ccs.hWindowMenu = GetSubMenu(Info->hMenu, 2);
ccs.idFirstChild = ID_MDI_FIRSTCHILD;
Info->hMdiClient = CreateWindowExW(WS_EX_CLIENTEDGE,
@ -172,11 +177,17 @@ InitMenuPopup(IN PMAIN_WND_INFO Info)
{
UINT uState;
uState = MF_BYCOMMAND | (Info->CurrentFontWnd == NULL);
uState = MF_BYCOMMAND | !(Info->CurrentFontWnd);
EnableMenuItem(Info->hMenu, ID_FILE_CLOSE, uState);
EnableMenuItem(Info->hMenu, ID_FILE_SAVE, uState);
EnableMenuItem(Info->hMenu, ID_FILE_SAVE_AS, uState);
EnableMenuItem(Info->hMenu, ID_EDIT_COPY, uState);
EnableMenuItem(Info->hMenu, ID_EDIT_GLYPH, uState);
uState = MF_BYCOMMAND | !(Info->CurrentFontWnd && IsClipboardFormatAvailable(uCharacterClipboardFormat));
EnableMenuItem(Info->hMenu, ID_EDIT_PASTE, uState);
}
static VOID
@ -248,6 +259,72 @@ DoFileSave(IN PMAIN_WND_INFO Info, IN BOOL bSaveAs)
CloseHandle(hFile);
}
static VOID
CopyCurrentGlyph(IN PFONT_WND_INFO FontWndInfo)
{
HGLOBAL hMem;
PUCHAR pCharacterBits;
if(!OpenClipboard(NULL))
return;
EmptyClipboard();
hMem = GlobalAlloc(GMEM_MOVEABLE, 8);
pCharacterBits = GlobalLock(hMem);
RtlCopyMemory(pCharacterBits, FontWndInfo->Font->Bits + FontWndInfo->uSelectedCharacter * 8, 8);
GlobalUnlock(hMem);
SetClipboardData(uCharacterClipboardFormat, hMem);
CloseClipboard();
}
static VOID
PasteIntoCurrentGlyph(IN PFONT_WND_INFO FontWndInfo)
{
HGLOBAL hMem;
if(!IsClipboardFormatAvailable(uCharacterClipboardFormat))
return;
if(!OpenClipboard(NULL))
return;
hMem = GetClipboardData(uCharacterClipboardFormat);
if(hMem)
{
PUCHAR pCharacterBits;
pCharacterBits = GlobalLock(hMem);
if(pCharacterBits)
{
RECT CharacterRect;
UINT uFontRow;
UINT uFontColumn;
RtlCopyMemory(FontWndInfo->Font->Bits + FontWndInfo->uSelectedCharacter * 8, pCharacterBits, 8);
GlobalUnlock(hMem);
FontWndInfo->OpenInfo->bModified = TRUE;
GetCharacterPosition(FontWndInfo->uSelectedCharacter, &uFontRow, &uFontColumn);
GetCharacterRect(uFontRow, uFontColumn, &CharacterRect);
InvalidateRect(FontWndInfo->hFontBoxesWnd, &CharacterRect, FALSE);
}
}
CloseClipboard();
}
VOID
SetPasteButtonState(IN PMAIN_WND_INFO Info)
{
SetToolbarButtonState(Info,
ID_EDIT_PASTE,
(Info->CurrentFontWnd && IsClipboardFormatAvailable(uCharacterClipboardFormat)));
}
static BOOL
MenuCommand(IN INT nMenuItemID, IN PMAIN_WND_INFO Info)
{
@ -278,11 +355,19 @@ MenuCommand(IN INT nMenuItemID, IN PMAIN_WND_INFO Info)
PostMessage(Info->hMainWnd, WM_CLOSE, 0, 0);
return TRUE;
// "Edit Glyph" toolbar button
// Edit Menu
case ID_EDIT_GLYPH:
EditCurrentGlyph(Info->CurrentFontWnd);
return TRUE;
case ID_EDIT_COPY:
CopyCurrentGlyph(Info->CurrentFontWnd);
return TRUE;
case ID_EDIT_PASTE:
PasteIntoCurrentGlyph(Info->CurrentFontWnd);
return TRUE;
// Window Menu
case ID_WINDOW_TILE_HORZ:
SendMessageW(Info->hMdiClient, WM_MDITILE, MDITILE_HORIZONTAL, 0);
@ -349,6 +434,8 @@ MainWndSize(PMAIN_WND_INFO Info, INT cx, INT cy)
static LRESULT CALLBACK
MainWndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
static HWND hNextClipboardViewer;
PMAIN_WND_INFO Info;
Info = (PMAIN_WND_INFO) GetWindowLongW(hwnd, GWLP_USERDATA);
@ -363,6 +450,14 @@ MainWndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
break;
case WM_CHANGECBCHAIN:
if((HWND)wParam == hNextClipboardViewer)
hNextClipboardViewer = (HWND)lParam;
else
SendMessage(hNextClipboardViewer, uMsg, wParam, lParam);
return 0;
case WM_CLOSE:
if(Info->FirstFontWnd)
{
@ -392,6 +487,8 @@ MainWndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
Info->hMenu = GetMenu(hwnd);
SetWindowLongW(hwnd, GWLP_USERDATA, (LONG)Info);
hNextClipboardViewer = SetClipboardViewer(hwnd);
InitMainWnd(Info);
InitResources(Info);
@ -406,6 +503,13 @@ MainWndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
PostQuitMessage(0);
return 0;
case WM_DRAWCLIPBOARD:
SetPasteButtonState(Info);
// Pass the message to the next clipboard window in the chain
SendMessage(hNextClipboardViewer, uMsg, wParam, lParam);
return 0;
case WM_INITMENUPOPUP:
InitMenuPopup(Info);
break;

View file

@ -147,6 +147,7 @@ VOID UnInitFontWndClass(VOID);
extern PWSTR szAppName;
extern HINSTANCE hInstance;
extern HANDLE hProcessHeap;
extern UINT uCharacterClipboardFormat;
// mainwnd.c
BOOL CreateMainWindow(IN INT nCmdShow, OUT PMAIN_WND_INFO* Info);
@ -154,6 +155,7 @@ BOOL InitMainWndClass(VOID);
VOID UnInitMainWndClass(VOID);
VOID DoFileSave(IN PMAIN_WND_INFO Info, IN BOOL bSaveAs);
VOID SetToolbarFileButtonState(IN PMAIN_WND_INFO Info, BOOL bEnabled);
VOID SetPasteButtonState(IN PMAIN_WND_INFO Info);
// misc.c
INT AllocAndLoadString(OUT PWSTR *lpTarget, IN UINT uID);

View file

@ -43,6 +43,8 @@
#define ID_FILE_EXIT 1006
#define ID_EDIT_GLYPH 2001
#define ID_EDIT_COPY 2002
#define ID_EDIT_PASTE 2003
#define ID_WINDOW_TILE_HORZ 3001
#define ID_WINDOW_TILE_VERT 3002
@ -71,5 +73,7 @@
#define IDS_TOOLTIP_OPEN 11002
#define IDS_TOOLTIP_SAVE 11003
#define IDS_TOOLTIP_EDIT_GLYPH 11004
#define IDS_TOOLTIP_COPY 11005
#define IDS_TOOLTIP_PASTE 11006
#endif