📄 cpropcomcustmenu.cpp
字号:
// $Id: CPropComCustmenu.cpp,v 1.15 2004/08/18 14:03:45 genta Exp $
/*! @file
共通設定ダイアログボックス、「カスタムメニュー」ページ
@author Norio Nakatani
$Revision: 1.15 $
*/
/*
Copyright (C) 1998-2001, Norio Nakatani
Copyright (C) 2000-2001, genta, MIK, jepro
This source code is designed for sakura editor.
Please contact the copyright holder to use this code for other purpose.
*/
#include "CPropCommon.h"
#include "CDlgInput1.h"
#include "CDlgOpenFile.h"
#include "etc_uty.h"
#include "debug.h" // 2002/2/10 aroka
// From Here Sept. 5, 2000 JEPRO 半角カタカナの全角化に伴い文字長を変更(27→46)
#define STR_CUSTMENU_HEAD_LEN 46
#define STR_CUSTMENU_HEAD "テキストエディタ カスタムメニュー設定ファイル\x1a"
// To Here Sept. 5, 2000
//@@@ 2001.02.04 Start by MIK: Popup Help
#if 1 //@@@ 2002.01.03 add MIK
#include "sakura.hh"
static const DWORD p_helpids[] = { //10100
IDC_BUTTON_DELETE, HIDC_BUTTON_DELETE, //メニューから機能削除
IDC_BUTTON_INSERTSEPARATOR, HIDC_BUTTON_INSERTSEPARATOR, //セパレータ挿入
IDC_BUTTON_INSERT, HIDC_BUTTON_INSERT, //メニューへ機能挿入
IDC_BUTTON_ADD, HIDC_BUTTON_ADD, //メニューへ機能追加
IDC_BUTTON_UP, HIDC_BUTTON_UP, //メニューの機能を上へ移動
IDC_BUTTON_DOWN, HIDC_BUTTON_DOWN, //メニューの機能を下へ移動
IDC_BUTTON_IMPORT, HIDC_BUTTON_IMPORT, //インポート
IDC_BUTTON_EXPORT, HIDC_BUTTON_EXPORT, //エクスポート
IDC_COMBO_FUNCKIND, HIDC_COMBO_FUNCKIND, //機能の種別
IDC_COMBO_MENU, HIDC_COMBO_MENU, //メニューの種別
IDC_LIST_FUNC, HIDC_LIST_FUNC, //機能一覧
IDC_LIST_RES, HIDC_LIST_RES, //メニュー一覧
// IDC_LABEL_MENUFUNCKIND, -1,
// IDC_LABEL_MENUCHOICE, -1,
// IDC_LABEL_MENUFUNC, -1,
// IDC_LABEL_MENU, -1,
// IDC_LABEL_MENUKEYCHANGE, -1,
// IDC_STATIC, -1,
0, 0
};
#else
static const DWORD p_helpids[] = { //10100
IDC_BUTTON_DELETE, 10100, //メニューから機能削除
IDC_BUTTON_INSERTSEPARATOR, 10101, //セパレータ挿入
IDC_BUTTON_INSERT, 10102, //メニューへ機能挿入
IDC_BUTTON_ADD, 10103, //メニューへ機能追加
IDC_BUTTON_UP, 10104, //メニューの機能を上へ移動
IDC_BUTTON_DOWN, 10105, //メニューの機能を下へ移動
IDC_BUTTON_IMPORT, 10106, //インポート
IDC_BUTTON_EXPORT, 10107, //エクスポート
IDC_COMBO_FUNCKIND, 10130, //機能の種別
IDC_COMBO_MENU, 10131, //メニューの種別
IDC_LIST_FUNC, 10150, //機能一覧
IDC_LIST_RES, 10151, //メニュー一覧
IDC_LABEL_MENUFUNCKIND, -1,
IDC_LABEL_MENUCHOICE, -1,
IDC_LABEL_MENUFUNC, -1,
IDC_LABEL_MENU, -1,
IDC_LABEL_MENUKEYCHANGE, -1,
// IDC_STATIC, -1,
0, 0
};
#endif
//@@@ 2001.02.04 End
// From Here Jun. 2, 2001 genta
/*!
@param hwndDlg ダイアログボックスのWindow Handle
@param uMsg メッセージ
@param wParam パラメータ1
@param lParam パラメータ2
*/
INT_PTR CALLBACK CPropCommon::DlgProc_PROP_CUSTMENU(
HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam )
{
return DlgProc( &CPropCommon::DispatchEvent_p8, hwndDlg, uMsg, wParam, lParam );
}
// To Here Jun. 2, 2001 genta
/* p8 メッセージ処理 */
INT_PTR CPropCommon::DispatchEvent_p8(
HWND hwndDlg, // handle to dialog box
UINT uMsg, // message
WPARAM wParam, // first message parameter
LPARAM lParam // second message parameter
)
{
WORD wNotifyCode;
WORD wID;
HWND hwndCtl;
NMHDR* pNMHDR;
NM_UPDOWN* pMNUD;
int idCtrl;
static HWND hwndCOMBO_FUNCKIND;
static HWND hwndLIST_FUNC;
static HWND hwndCOMBO_MENU;
static HWND hwndLIST_RES;
// static HWND hwndEDIT_KEY;
// int nLength;
// int nAssignedKeyNum;
// const char* cpszString;
// int nIndex;
// int nIndex2;
// int nIndex3;
int i;
// int j;
// int nNum;
// int nFuncCode;
int nIdx1;
int nIdx2;
int nNum2;
int nIdx3;
int nIdx4;
char szLabel[300];
char szLabel2[300];
char szKey[2];
int nFunc;
char cKey;
// WORD vkey; // virtual-key code
// WORD nCaretPos; // caret position
// HWND hwndLB; // handle of list box
// char* pszWork;
CDlgInput1 cDlgInput1;
switch( uMsg ){
case WM_INITDIALOG:
/* ダイアログデータの設定 p8 */
SetData_p8( hwndDlg );
// Modified by KEITA for WIN64 2003.9.6
::SetWindowLongPtr( hwndDlg, DWLP_USER, lParam );
/* コントロールのハンドルを取得 */
hwndCOMBO_FUNCKIND = ::GetDlgItem( hwndDlg, IDC_COMBO_FUNCKIND );
hwndLIST_FUNC = ::GetDlgItem( hwndDlg, IDC_LIST_FUNC );
hwndCOMBO_MENU = ::GetDlgItem( hwndDlg, IDC_COMBO_MENU );
hwndLIST_RES = ::GetDlgItem( hwndDlg, IDC_LIST_RES );
// hwndEDIT_KEY = ::GetDlgItem( hwndDlg, IDC_EDIT_KEY );
// /* ユーザーがエディット コントロールに入力できるテキストの長さを制限する */
// ::SendMessage( hwndEDIT_KEY, EM_LIMITTEXT, (WPARAM)1, 0 );
// ::SendMessage( hwndLIST_FUNC, LB_ADDSTRING, 0, (LPARAM)"テストテスト1" );
// ::SendMessage( hwndLIST_FUNC, LB_ADDSTRING, 0, (LPARAM)"テストテスト2" );
// ::SendMessage( hwndLIST_FUNC, LB_ADDSTRING, 0, (LPARAM)"テストテスト3" );
// ::SendMessage( hwndLIST_FUNC, LB_ADDSTRING, 0, (LPARAM)"テストテスト4" );
/* キー選択時の処理 */
// ::SendMessage( hwndKeyList, LB_SETCURSEL, (WPARAM)0, (LPARAM)0 );
::SendMessage( hwndDlg, WM_COMMAND, MAKELONG( IDC_COMBO_FUNCKIND, CBN_SELCHANGE ), (LPARAM)hwndCOMBO_FUNCKIND );
// ::SendMessage( hwndDlg, WM_COMMAND, MAKELONG( IDC_LIST_KEY, LBN_SELCHANGE ), (LPARAM)hwndKeyList );
::SetTimer( hwndDlg, 1, 300, NULL );
return TRUE;
case WM_NOTIFY:
idCtrl = (int)wParam;
pNMHDR = (NMHDR*)lParam;
pMNUD = (NM_UPDOWN*)lParam;
switch( pNMHDR->code ){
case PSN_HELP:
OnHelp( hwndDlg, IDD_PROP_CUSTMENU );
return TRUE;
case PSN_KILLACTIVE:
// MYTRACE( "p8 PSN_KILLACTIVE\n" );
/* ダイアログデータの取得 p8 */
GetData_p8( hwndDlg );
return TRUE;
//@@@ 2002.01.03 YAZAKI 最後に表示していたシートを正しく覚えていないバグ修正
case PSN_SETACTIVE:
m_nPageNum = ID_PAGENUM_CUSTMENU;
return TRUE;
}
break;
case WM_COMMAND:
wNotifyCode = HIWORD(wParam); /* 通知コード */
wID = LOWORD(wParam); /* 項目ID? コントロールID? またはアクセラレータID */
hwndCtl = (HWND) lParam; /* コントロールのハンドル */
switch( wNotifyCode ){
/* ボタン/チェックボックスがクリックされた */
case BN_CLICKED:
switch( wID ){
case IDC_BUTTON_IMPORT: /* インポート */
/* p8:カスタムメニュー設定をインポートする */
p8_Import_CustMenuSetting( hwndDlg );
return TRUE;
case IDC_BUTTON_EXPORT: /* エクスポート */
/* p8:カスタムメニュー設定をエクスポートする */
p8_Export_CustMenuSetting( hwndDlg );
return TRUE;
case IDC_BUTTON_MENUNAME:
// メニュー文字列の設定
nIdx1 = ::SendMessage( hwndCOMBO_MENU, CB_GETCURSEL, 0, 0 );
if( LB_ERR == nIdx1 ){
break;
}
::GetDlgItemText( hwndDlg, IDC_EDIT_MENUNAME,
m_Common.m_szCustMenuNameArr[nIdx1], MAX_CUSTOM_MENU_NAME_LEN );
// Combo Boxも変更 削除&再登録
::SendMessage( hwndCOMBO_MENU, CB_DELETESTRING, nIdx1, 0 );
::SendMessage( hwndCOMBO_MENU, CB_INSERTSTRING, nIdx1,
(LPARAM)m_Common.m_szCustMenuNameArr[nIdx1] );
// 削除すると選択が解除されるので,元に戻す
::SendMessage( hwndCOMBO_MENU, CB_SETCURSEL, nIdx1, 0 );
return TRUE;
}
break; /* BN_CLICKED */
}
if( hwndCOMBO_MENU == hwndCtl ){
switch( wNotifyCode ){
case CBN_SELCHANGE:
nIdx1 = ::SendMessage( hwndCOMBO_MENU, CB_GETCURSEL, 0, 0 );
if( CB_ERR == nIdx1 ){
break;
}
/* メニュー項目一覧に文字列をセット(リストボックス)*/
::SendMessage( hwndLIST_RES, LB_RESETCONTENT, 0, 0 );
for( i = 0; i < m_Common.m_nCustMenuItemNumArr[nIdx1]; ++i ){
if( 0 == m_Common.m_nCustMenuItemFuncArr[nIdx1][i] ){
// strcpy( szLabel2, "セパレータ" );
// strcpy( szLabel2, "--------------------------------" );
strcpy( szLabel2, " ─────────────" ); //Oct. 18, 2000 JEPRO 「ツールバー」タブで使っているセパレータと同じ線種に統一した
}else{
// Oct. 3, 2001 genta
m_cLookup.Funccode2Name( m_Common.m_nCustMenuItemFuncArr[nIdx1][i], szLabel, 256 );
// ::LoadString( m_hInstance, m_Common.m_nCustMenuItemFuncArr[nIdx1][i], szLabel, 256 );
/* キー */
if( '\0' == m_Common.m_nCustMenuItemKeyArr[nIdx1][i] ){
strcpy( szLabel2, szLabel );
}else{
wsprintf( szLabel2, "%s(%c)", szLabel, m_Common.m_nCustMenuItemKeyArr[nIdx1][i] );
}
}
// /* キー */
// if( '\0' == m_Common.nCustMenuItemKeyArr[nIdx][i] ||
// ' ' == m_Common.nCustMenuItemKeyArr[nIdx][i] ){
// strcpy( szKey, "" );
// }else{
// sprintf( szKey, "%c", m_Common.nCustMenuItemKeyArr[nIdx][i] );
// }
// ::SetWindowText( hwndEDIT_KEY, szKey );
::SendMessage( hwndLIST_RES, LB_ADDSTRING, 0, (LPARAM)szLabel2 );
}
// Oct. 15, 2001 genta メニュー名を設定
::SetDlgItemText( hwndDlg, IDC_EDIT_MENUNAME, m_Common.m_szCustMenuNameArr[nIdx1] );
// From Here Sept. 7, 2000 JEPRO わかりにくいので選択しないようにコメントアウトに変更
// (実際にはここでは選択されていないようなのでコメントアウトしなくても同じ。選択されているのはSetData_p8()の方)
// /* カスタムメニューの先頭の項目を選択(リストボックス)*/
// ::SendMessage( hwndLIST_RES, LB_SETCURSEL, (WPARAM)0, (LPARAM)0 );
// To Here Sept. 7, 2000
break; /* CBN_SELCHANGE */
}
}else
if( hwndLIST_RES == hwndCtl ){
switch( wNotifyCode ){
case LBN_DBLCLK:
nIdx1 = ::SendMessage( hwndCOMBO_MENU, CB_GETCURSEL, 0, 0 );
if( LB_ERR == nIdx1 ){
break;
}
nIdx2 = ::SendMessage( hwndLIST_RES, LB_GETCURSEL, 0, 0 );
if( LB_ERR == nIdx2 ){
break;
}
if( 0 == m_Common.m_nCustMenuItemFuncArr[nIdx1][nIdx2] ){
break;
}
// idListBox = (int) LOWORD(wParam); // identifier of list box
// hwndListBox = (HWND) lParam; // handle of list box
wsprintf( szKey, "%c", m_Common.m_nCustMenuItemKeyArr[nIdx1][nIdx2] );
if( FALSE == cDlgInput1.DoModal( m_hInstance, hwndDlg, "メニューアイテムのアクセスキー設定", "キーを入力してください。", 1, szKey ) ){
return TRUE;
}
// Oct. 3, 2001 genta
m_cLookup.Funccode2Name( m_Common.m_nCustMenuItemFuncArr[nIdx1][nIdx2], szLabel, 255 );
//::LoadString( m_hInstance, m_Common.m_nCustMenuItemFuncArr[nIdx1][nIdx2], szLabel, 255 );
// if( ( szKey[0] == '\0' ) || ( '0' <= szKey[0] && szKey[0] <= '9' ) || ( 'A' <= szKey[0] && szKey[0] <= 'Z' ) ){
m_Common.m_nCustMenuItemKeyArr[nIdx1][nIdx2] = szKey[0];
//@@@ 2002.01.08 YAZAKI カスタムメニューでアクセスキーを消した時、左カッコ ( がメニュー項目に一回残るバグ修正
// wsprintf( szLabel2, "%s(%c)", szLabel, m_Common.m_nCustMenuItemKeyArr[nIdx1][nIdx2] );
if (m_Common.m_nCustMenuItemKeyArr[nIdx1][nIdx2]){
wsprintf( szLabel2, "%s(%c)", szLabel, m_Common.m_nCustMenuItemKeyArr[nIdx1][nIdx2] );
}
else {
wsprintf( szLabel2, "%s", szLabel );
}
// }else{
// m_Common.m_nCustMenuItemKeyArr[nIdx1][nIdx2] = '\0';
// sprintf( szLabel2, "%s", szLabel );
// }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -