diff --git a/chapter.cpp b/chapter.cpp
index 51f86e5..2d791ca 100644
--- a/chapter.cpp
+++ b/chapter.cpp
@@ -123,10 +123,10 @@ BOOL func_WndProc(HWND hwnd,UINT message,WPARAM wparam,LPARAM lparam,void *editp
 			switch(LOWORD(wparam)) {
 				case IDC_BUADD:
 					g_config.AddList();
-					break;
+					return TRUE;
 				case IDC_BUDEL:
 					g_config.DelList();
-					break;
+					return TRUE;
 				case IDC_LIST1:
 					if(HIWORD(wparam) != LBN_SELCHANGE) break;
 					g_config.Seek();
@@ -142,6 +142,15 @@ BOOL func_WndProc(HWND hwnd,UINT message,WPARAM wparam,LPARAM lparam,void *editp
 				case IDC_CHECK1:
 					g_config.AuotSaveCheck();
 					break;
+				case IDC_CHECK2:
+					g_config.KeyFrameCheck();
+					break;
+				case IDC_BUTTON1:
+					g_config.SetAllKeyFrame();
+					return TRUE;
+				case IDC_BUTTON2:
+					g_config.UnsetAllKeyFrame();
+					return TRUE;
 			}
 			break;
 	}
@@ -158,6 +167,7 @@ BOOL func_project_save( FILTER *fp,void *editp,void *data,int *size ) {
 	g_prf.m_numChapter = g_config.m_numChapter;
 	CopyMemory(g_prf.m_Frame,g_config.m_Frame,sizeof(int)*100);
 	CopyMemory(g_prf.m_strTitle,g_config.m_strTitle,sizeof(char)*100*STRLEN);
+	CopyMemory(g_prf.m_Org_KeyFrame,g_config.m_Org_KeyFrame,sizeof(bool)*100);
 	CopyMemory(data,&g_prf,*size);
 	return TRUE;
 }
@@ -171,6 +181,7 @@ BOOL func_project_load( FILTER *fp,void *editp,void *data,int size ) {
 		g_config.m_numChapter = g_prf.m_numChapter;
 		CopyMemory(g_config.m_Frame,g_prf.m_Frame,sizeof(int)*100);
 		CopyMemory(g_config.m_strTitle,g_prf.m_strTitle,sizeof(char)*100*STRLEN);
+		CopyMemory(g_config.m_Org_KeyFrame,g_prf.m_Org_KeyFrame,sizeof(bool)*100);
 		g_config.ShowList();
 	}
 	return TRUE;
diff --git a/chapter.rc b/chapter.rc
index 77c5138..bd56424 100644
--- a/chapter.rc
+++ b/chapter.rc
@@ -66,7 +66,10 @@ BEGIN
     COMBOBOX        IDC_EDNAME,30,171,279,80,CBS_DROPDOWN | WS_VSCROLL | WS_TABSTOP
     PUSHBUTTON      "保存",IDC_BUSAVE,318,7,49,14
     PUSHBUTTON      "読込",IDC_BULOAD,318,31,49,14
-    CONTROL         "自動出力",IDC_CHECK1,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,319,55,48,10
+    CONTROL         "自動出力",IDC_CHECK1,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,319,53,48,10
+    CONTROL         "キーフレームを\n自動設定",IDC_CHECK2,"Button",BS_AUTOCHECKBOX | BS_MULTILINE | WS_TABSTOP,316,63,57,23
+    PUSHBUTTON      "全チャプタポイントをキーフレームにする",IDC_BUTTON1,317,87,50,32,BS_MULTILINE
+    PUSHBUTTON      "キーフレームを元に戻す",IDC_BUTTON2,317,123,50,23,BS_MULTILINE
 END
 
 
diff --git a/config.cpp b/config.cpp
index b389bd6..3c9bc6a 100644
--- a/config.cpp
+++ b/config.cpp
@@ -51,6 +51,12 @@ void CfgDlg::Init(HWND hwnd,void *editp,FILTER *fp) {
 	SendDlgItemMessage(hwnd,IDC_STATIC2,WM_SETFONT,(WPARAM)hfont,0);
 	CreateWindow("BUTTON","自動出力",WS_CHILD|WS_VISIBLE|BS_AUTOCHECKBOX,480,90,73,22,hwnd,(HMENU)IDC_CHECK1,hinst,0);
 	SendDlgItemMessage(hwnd,IDC_CHECK1,WM_SETFONT,(WPARAM)hfont,0);
+	CreateWindow("BUTTON","キーフレームを設定",WS_CHILD|WS_VISIBLE|BS_AUTOCHECKBOX|BS_MULTILINE,480,115,90,30,hwnd,(HMENU)IDC_CHECK2,hinst,0);
+	SendDlgItemMessage(hwnd,IDC_CHECK2,WM_SETFONT,(WPARAM)hfont,0);
+	CreateWindow("BUTTON","全チャプタポイントをキーフレームにする",WS_CHILD|WS_VISIBLE|BS_MULTILINE,480,145,73,75,hwnd,(HMENU)IDC_BUTTON1,hinst,0);
+	SendDlgItemMessage(hwnd,IDC_BUTTON1,WM_SETFONT,(WPARAM)hfont,0);
+	CreateWindow("BUTTON","元に戻す",WS_CHILD|WS_VISIBLE|BS_MULTILINE,480,220,73,22,hwnd,(HMENU)IDC_BUTTON2,hinst,0);
+	SendDlgItemMessage(hwnd,IDC_BUTTON2,WM_SETFONT,(WPARAM)hfont,0);
 
 	// コンボボックスに履歴追加
 	for(int n = 0;n < NUMHIS;n++) {
@@ -63,6 +69,10 @@ void CfgDlg::Init(HWND hwnd,void *editp,FILTER *fp) {
 	// 自動出力のチェックボックス
 	m_autosave = m_exfunc->ini_load_int(fp,"autosave",0);
 	CheckDlgButton(hwnd, IDC_CHECK1, m_autosave);
+
+	// キーフレーム設定のチェックボックス
+	m_keyframe = m_exfunc->ini_load_int(fp,"keyframe",0);
+	CheckDlgButton(hwnd, IDC_CHECK2, m_keyframe);
 }
 
 void CfgDlg::AuotSaveCheck() {
@@ -70,6 +80,11 @@ void CfgDlg::AuotSaveCheck() {
 	m_exfunc->ini_save_int(m_fp,"autosave",m_autosave);
 }
 
+void CfgDlg::KeyFrameCheck() {
+	m_keyframe = IsDlgButtonChecked(m_fp->hwnd,IDC_CHECK2);
+	m_exfunc->ini_save_int(m_fp,"keyframe",m_keyframe);
+}
+
 void CfgDlg::SetFps(int rate,int scale) {
 	m_scale = scale;
 	m_rate = rate;
@@ -131,6 +146,23 @@ void CfgDlg::AddHis() {
 	}
 }
 
+void CfgDlg::SetKeyFrame(int ins) {
+	FRAME_STATUS	fs;
+	m_fp->exfunc->get_frame_status(m_editp,m_Frame[ins],&fs);
+	if(fs.edit_flag&EDIT_FRAME_EDIT_FLAG_KEYFRAME) m_Org_KeyFrame[ins] = true; //元からキーフレームだったかどうかは設定に関わらず記憶
+	if(m_keyframe == 0) return; //キーフレームを設定するかどうか
+	fs.edit_flag = fs.edit_flag|EDIT_FRAME_EDIT_FLAG_KEYFRAME;
+	m_fp->exfunc->set_frame_status(m_editp,m_Frame[ins],&fs);
+}
+
+void CfgDlg::UnsetKeyFrame(int sel) {
+	if(m_Org_KeyFrame[sel] == true) return; //元からキーフレームだった場合はキーフレーム解除しない。
+	FRAME_STATUS	fs;
+	m_fp->exfunc->get_frame_status(m_editp,m_Frame[sel],&fs);
+	if(fs.edit_flag&EDIT_FRAME_EDIT_FLAG_KEYFRAME) fs.edit_flag = fs.edit_flag - EDIT_FRAME_EDIT_FLAG_KEYFRAME;
+	m_fp->exfunc->set_frame_status(m_editp,m_Frame[sel],&fs);
+}
+
 void CfgDlg::AddList() {
 	char str[STRLEN];
 	int ins;
@@ -148,6 +180,7 @@ void CfgDlg::AddList() {
 	for(int n = m_numChapter;n > ins;n--) {
 		m_Frame[n] = m_Frame[n-1];
 		strcpy_s(m_strTitle[n],STRLEN,m_strTitle[n-1]);
+		m_Org_KeyFrame[n] = m_Org_KeyFrame[n-1];
 	}
 	m_numChapter++;
 
@@ -155,6 +188,7 @@ void CfgDlg::AddList() {
 	m_Frame[ins] = m_frame;
 	ShowList();
 	AddHis();
+	SetKeyFrame(ins); //チャプタポイントにキーフレームを設定
 }
 
 void CfgDlg::DelList() {
@@ -166,10 +200,12 @@ void CfgDlg::DelList() {
 	if(m_loadfile == false) return;	//ファイルが読み込まれていない
 	if(m_numChapter <= sel) return; //アイテムがない
 
+	UnsetKeyFrame(sel); //キーフレーム解除
 	m_numChapter--;
 	for(int n = sel;n < m_numChapter;n++) {
 		m_Frame[n] = m_Frame[n+1];
 		strcpy_s(m_strTitle[n],STRLEN,m_strTitle[n+1]);
+		m_Org_KeyFrame[n] = m_Org_KeyFrame[n+1];
 	}
 	ShowList();
 }
@@ -342,4 +378,18 @@ void CfgDlg::Load() {
 	}
 	fclose(file);
 	ShowList();
+}
+
+void CfgDlg::SetAllKeyFrame() {
+	if(m_numChapter == 0) return;
+	for(int n = 0;n < m_numChapter;n++) {
+		SetKeyFrame(n);
+	}
+}
+
+void CfgDlg::UnsetAllKeyFrame() {
+	if(m_numChapter == 0) return;
+	for(int n = 0;n < m_numChapter;n++) {
+		UnsetKeyFrame(n);
+	}
 }
\ No newline at end of file
diff --git a/config.h b/config.h
index b56522b..5bfeb50 100644
--- a/config.h
+++ b/config.h
@@ -16,6 +16,7 @@ typedef struct
 	int m_numChapter;
 	int m_Frame[100];
 	char m_strTitle[100][STRLEN];
+	bool m_Org_KeyFrame[100];
 } PrfDat;
 
 class CfgDlg
@@ -33,6 +34,7 @@ class CfgDlg
 	int m_numHis;
 	bool m_loadfile;
 	int m_autosave;
+	int m_keyframe;
 
 	void AddHis();
 
@@ -40,6 +42,7 @@ public:
 	int m_numChapter;
 	int m_Frame[100];
 	char m_strTitle[100][STRLEN];
+	bool m_Org_KeyFrame[100];
 
 	void ShowList();
 	void Init(HWND hwnd,void *editp,FILTER *fp);
@@ -48,9 +51,14 @@ public:
 	void SetFrameN(void *editp,int frame_n);
 	void AddList();
 	void DelList();
+	void SetKeyFrame(int ins);
+	void UnsetKeyFrame(int sel);
 	void Seek();
 	void Save();
 	void AutoSave();
 	void Load();
 	void AuotSaveCheck();
+	void KeyFrameCheck();
+	void SetAllKeyFrame();
+	void UnsetAllKeyFrame();
 };
