📄 wmain.c
字号:
if( !einfo ) {
return( NULL );
}
if( !einfo->file_name ) {
fname = einfo->info->file_name;
} else {
fname = einfo->file_name;
}
text = WAllocRCString( W_MENUAPPTITLE );
if( !fname || !text ) {
return( NULL );
}
offset = WRFindFnOffset( fname );
fname = &fname[offset];
len = strlen( fname ) + strlen( text ) + 6;
title = (char *)WMemAlloc( len );
if( title ) {
strcpy( title, text );
strcat( title, " - [" );
strcat( title, fname );
strcat( title, "]" );
}
if( text ) {
WFreeRCString( text );
}
return( title );
}
void WSetEditTitle ( WMenuEditInfo *einfo )
{
char *title;
Bool is_rc;
title = WCreateEditTitle( einfo );
is_rc = FALSE;
if( !title ) {
title = WAllocRCString( W_MENUAPPTITLE );
is_rc = TRUE;
}
if( title ) {
SendMessage( einfo->win, WM_SETTEXT, 0, (LPARAM) title );
if( is_rc ) {
WFreeRCString( title );
} else {
WMemFree( title );
}
}
}
Bool WCreateEditWindow ( HINSTANCE inst, WMenuEditInfo *einfo )
{
int x, y, width, height;
char *title;
HMENU hmenu;
HMENU menu;
Bool is_rc;
RECT rect;
if( !einfo ) {
return ( FALSE );
}
x = CW_USEDEFAULT;
y = CW_USEDEFAULT;
width = appWidth;
height = appHeight;
if( einfo->info->stand_alone ) {
WGetScreenPosOption( &rect );
if( !IsRectEmpty( &rect ) ) {
x = rect.left;
y = rect.top;
width = max( appWidth, rect.right - rect.left );
height = max( appHeight, rect.bottom - rect.top );
}
}
is_rc = FALSE;
title = WCreateEditTitle( einfo );
if( !title ) {
title = WAllocRCString( W_MENUAPPTITLE );
is_rc = TRUE;
}
menu = (HMENU)NULL;
if( einfo->info->stand_alone ) {
menu = LoadMenu( inst, WMainSOMenuName );
}
einfo->win = CreateWindow( WMainClass, title, WS_OVERLAPPEDWINDOW,
x, y, width, height, einfo->info->parent,
menu, inst, einfo );
if( title ) {
if( is_rc ) {
WFreeRCString( title );
} else {
WMemFree( title );
}
}
if( einfo->win == (HWND)NULL ) {
return( FALSE );
}
if( !WCreateRibbon( einfo ) ) {
return ( FALSE );
}
einfo->wsb = WCreateStatusLine( einfo->win, inst );
if( !einfo->wsb ) {
return( FALSE );
}
einfo->insert_subitems = FALSE;
einfo->insert_before = FALSE;
einfo->first_preview_id = FIRST_PREVIEW_ID;
hmenu = GetMenu( einfo->win );
if( hmenu != (HMENU)NULL ) {
EnableMenuItem( hmenu, IDM_MENU_CUT, MF_GRAYED );
EnableMenuItem( hmenu, IDM_MENU_COPY, MF_GRAYED );
}
CheckMenuItem( hmenu, IDM_MENU_INSERTSUBITEMS, MF_UNCHECKED );
CheckMenuItem( hmenu, IDM_MENU_INSERTAFTER, MF_CHECKED );
if( !WCreateMenuEditWindow( einfo, inst ) ) {
return( FALSE );
}
if( WGetOption( WOptScreenMax ) ) {
ShowWindow( einfo->win, SW_SHOWMAXIMIZED );
} else {
ShowWindow( einfo->win, SW_SHOWNORMAL );
}
UpdateWindow( einfo->win );
WResizeWindows( einfo );
SetFocus( einfo->edit_dlg );
return( TRUE );
}
WMenuEditInfo *WGetCurrentEditInfo ( void )
{
return ( WCurrEditInfo );
}
void WSetCurrentEditInfo ( WMenuEditInfo *einfo )
{
WCurrEditInfo = einfo;
}
HMENU WGetMenuHandle ( WMenuEditInfo *einfo )
{
if ( !einfo ) {
einfo = WGetCurrentEditInfo ();
}
if ( einfo && einfo->win ) {
return ( GetMenu ( einfo->win ) );
}
return ( NULL );
}
static void handleSymbols( WMenuEditInfo *einfo )
{
char *text;
if( !WEditSymbols( einfo->win, &einfo->info->symbol_table,
WGetEditInstance(), WMenuHelpRoutine ) ) {
return;
}
WResolveMenuSymIDs( einfo );
text = WGetStrFromEdit( GetDlgItem( einfo->edit_dlg, IDM_MENUEDID ),
NULL );
WRAddSymbolsToComboBox( einfo->info->symbol_table, einfo->edit_dlg,
IDM_MENUEDID, WR_HASHENTRY_ALL );
if( text != NULL ) {
WSetEditWithStr( GetDlgItem( einfo->edit_dlg, IDM_MENUEDID ),
text );
WMemFree( text );
}
WHandleSelChange( einfo );
}
static void handleLoadSymbols( WMenuEditInfo *einfo )
{
char *file;
file = WLoadSymbols( &einfo->info->symbol_table,
einfo->info->symbol_file,
einfo->win, TRUE );
if( file == NULL ) {
return;
}
if( einfo->info->symbol_file ) {
WMemFree( einfo->info->symbol_file );
}
einfo->info->symbol_file = file;
// lookup the id associated with the symbol for all entries
WResolveMenuSymIDs( einfo );
// look for the symbol matching the id for all entries
WResolveMenuEntries( einfo );
WRAddSymbolsToComboBox( einfo->info->symbol_table, einfo->edit_dlg,
IDM_MENUEDID, WR_HASHENTRY_ALL );
einfo->info->modified = TRUE;
WDoHandleSelChange( einfo, FALSE, TRUE );
}
LRESULT WINEXPORT WMainWndProc ( HWND hWnd, UINT message,
WPARAM wParam, volatile LPARAM lParam )
{
HMENU menu;
#if 0
HWND win;
#endif
LRESULT ret;
Bool pass_to_def;
WMenuEditInfo *einfo;
WORD wp;
MINMAXINFO *minmax;
pass_to_def = TRUE;
ret = FALSE;
einfo = (WMenuEditInfo *) GetWindowLong ( hWnd, 0 );
WSetCurrentEditInfo ( einfo );
switch ( message ) {
case WM_ACTIVATE:
if( GET_WM_ACTIVATE_FACTIVE(wParam, lParam) &&
!GET_WM_ACTIVATE_FMINIMIZED(wParam, lParam) &&
einfo && einfo->edit_dlg != (HWND)NULL ) {
SetFocus( einfo->edit_dlg );
pass_to_def = FALSE;
}
break;
case WM_INITMENU:
if( wParam == (WPARAM) GetMenu(hWnd) ) {
// set the cut and copy menu items
ret = SendDlgItemMessage( einfo->edit_dlg, IDM_MENUEDLIST,
LB_GETCURSEL, 0, 0 );
if( ret != LB_ERR ) {
EnableMenuItem( (HMENU)wParam, IDM_MENU_CUT, MF_ENABLED );
EnableMenuItem( (HMENU)wParam, IDM_MENU_COPY, MF_ENABLED );
} else {
EnableMenuItem( (HMENU)wParam, IDM_MENU_CUT, MF_GRAYED );
EnableMenuItem( (HMENU)wParam, IDM_MENU_COPY, MF_GRAYED );
}
// set the paste menu item
if( OpenClipboard( hWnd ) ) {
if( //IsClipboardFormatAvailable( WClipbdFormat ) ||
IsClipboardFormatAvailable( WItemClipbdFormat ) ) {
EnableMenuItem( (HMENU)wParam, IDM_MENU_PASTE, MF_ENABLED );
} else {
EnableMenuItem( (HMENU)wParam, IDM_MENU_PASTE, MF_GRAYED );
}
CloseClipboard();
}
ret = FALSE;
}
break;
case WM_CREATE:
einfo = ((CREATESTRUCT *)lParam)->lpCreateParams;
SetWindowLong ( hWnd, 0, (LONG)einfo );
break;
case WM_MENUSELECT:
if ( einfo ) {
menu = WGetMenuHandle ( einfo );
WHandleMenuSelect ( einfo->wsb, menu, wParam, lParam );
}
break;
case WM_GETMINMAXINFO:
minmax = (MINMAXINFO *) lParam;
minmax->ptMinTrackSize.x = appWidth;
minmax->ptMinTrackSize.y = appHeight;
break;
case WM_MOVE:
if ( einfo ) {
if ( IsZoomed ( hWnd ) ) {
WSetOption ( WOptScreenMax, TRUE );
} else if ( !IsIconic ( hWnd ) ) {
WUpdateScreenPosOpt ( hWnd );
WSetOption ( WOptScreenMax, FALSE );
}
WMovePrevWindow( einfo );
}
break;
case WM_SETFOCUS:
if( einfo && ( einfo->preview_window != (HWND)NULL ) ) {
SendMessage( einfo->preview_window, WM_NCACTIVATE, (WPARAM)TRUE, (LPARAM)NULL );
}
break;
case WM_SHOWWINDOW:
if( wParam ) {
ShowWindow( einfo->preview_window, SW_SHOWNA );
} else {
ShowWindow( einfo->preview_window, SW_HIDE );
}
break;
case WM_SIZE:
if( einfo ) {
if( wParam == SIZE_MAXIMIZED ) {
WSetOption ( WOptScreenMax, TRUE );
} else if ( wParam != SIZE_MINIMIZED ) {
WUpdateScreenPosOpt ( hWnd );
WSetOption ( WOptScreenMax, FALSE );
}
if( einfo->preview_window != (HWND)NULL ) {
if( wParam == SIZE_MINIMIZED ) {
ShowWindow( einfo->preview_window, SW_HIDE );
} else {
ShowWindow( einfo->preview_window, SW_SHOWNA );
}
}
if( wParam != SIZE_MINIMIZED ) {
WResizeWindows ( einfo );
}
}
break;
#if 0
case WM_ACTIVATE:
if ( GET_WM_ACTIVATE_FACTIVE(wParam, lParam) != WA_INACTIVE ) {
win = GET_WM_ACTIVATE_HWND(wParam, lParam);
einfo = (WMenuEditInfo *) GetWindowLong ( win, 0 );
WSetCurrentEditInfo ( einfo );
} else {
WSetCurrentEditInfo ( NULL );
}
break;
#endif
case WM_COMMAND:
wp = LOWORD(wParam);
switch ( wp ) {
case IDM_MENU_CLEAR:
WHandleClear( einfo );
pass_to_def = FALSE;
break;
case IDM_MENU_UPDATE:
SendMessage( einfo->info->parent, MENU_PLEASE_SAVEME, 0,
(LPARAM)einfo->hndl );
pass_to_def = FALSE;
break;
case IDM_MENU_OPEN:
pass_to_def = FALSE;
if( einfo->info->modified ) {
ret = WQuerySave( einfo, FALSE );
if( !ret ) {
break;
}
}
ret = SendMessage( einfo->info->parent,
MENU_PLEASE_OPENME, 0,
(LPARAM)einfo->hndl );
ret = FALSE;
break;
case IDM_MENU_SAVE:
WSaveObject( einfo, FALSE, FALSE );
pass_to_def = FALSE;
break;
case IDM_MENU_SAVEAS:
WSaveObject( einfo, TRUE, FALSE );
pass_to_def = FALSE;
break;
case IDM_MENU_SAVEINTO:
WSaveObject( einfo, TRUE, TRUE );
pass_to_def = FALSE;
break;
case IDM_MENU_EXIT:
/* clean up before we exit */
PostMessage( einfo->win, WM_CLOSE, 0, 0 );
break;
case IDM_MENU_PASTE:
WPasteMenuItem( einfo );
pass_to_def = FALSE;
break;
case IDM_MENU_CUT:
case IDM_MENU_COPY:
WClipMenuItem( einfo, ( wp == IDM_MENU_CUT ) );
pass_to_def = FALSE;
break;
case IDM_MENU_DELETE:
WDeleteMenuEntry ( einfo );
pass_to_def = FALSE;
break;
case IDM_MENU_INSERTSUBITEMS:
WToggleInsertSubitems( einfo );
break;
case IDM_MENU_INSERTBEFORE:
if( !einfo->insert_before ) {
WToggleInsertBitmap( einfo );
}
break;
case IDM_MENU_INSERTAFTER:
if( einfo->insert_before ) {
WToggleInsertBitmap( einfo );
}
break;
case IDM_MENU_INSERTTOGGLE:
WToggleInsertBitmap( einfo );
break;
#if 0
case IDM_MENU_NEWITEM:
WInsertNewMenuEntry ( einfo, FALSE, FALSE );
pass_to_def = FALSE;
break;
case IDM_MENU_NEWPOPUP:
WInsertNewMenuEntry ( einfo, TRUE, FALSE );
pass_to_def = FALSE;
break;
case IDM_MENU_NEWSEPARATOR:
WInsertNewMenuEntry ( einfo, FALSE, TRUE );
pass_to_def = FALSE;
break;
#else
case IDM_MENU_NEWITEM:
WInsertNew( einfo );
pass_to_def = FALSE;
break;
#endif
case IDM_MENU_SYMBOLS:
handleSymbols( einfo );
pass_to_def = FALSE;
break;
case IDM_MENU_LOAD_SYMBOLS:
handleLoadSymbols( einfo );
pass_to_def = FALSE;
break;
case IDM_MENU_SHOWRIBBON:
menu = WGetMenuHandle( einfo );
WShowRibbon( einfo, menu );
pass_to_def = FALSE;
break;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -