From dd9b851aed7e1f9b3b7be45f22c73c2a055a26cf Mon Sep 17 00:00:00 2001 From: Mari Sano Date: Sun, 25 Oct 2020 19:20:00 +0900 Subject: [PATCH 01/18] =?UTF-8?q?ApiWrap::Wnd=5FGetText=E3=81=AE=E3=82=AA?= =?UTF-8?q?=E3=83=BC=E3=83=90=E3=83=BC=E3=83=AD=E3=83=BC=E3=83=89=E9=96=A2?= =?UTF-8?q?=E6=95=B0=E3=82=92=E8=BF=BD=E5=8A=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit std::make_uniqueを使わないで済むようにラッパー関数を追加する --- sakura_core/apiwrap/StdControl.cpp | 56 ++++++++++++++++++++++++++++++ sakura_core/apiwrap/StdControl.h | 9 +++++ 2 files changed, 65 insertions(+) diff --git a/sakura_core/apiwrap/StdControl.cpp b/sakura_core/apiwrap/StdControl.cpp index b4e2a65017..7452ede587 100644 --- a/sakura_core/apiwrap/StdControl.cpp +++ b/sakura_core/apiwrap/StdControl.cpp @@ -4,6 +4,62 @@ namespace ApiWrap{ + /*! + @brief Window テキストを取得する + @param[in] hWnd ウィンドウハンドル + @param[out] strText ウィンドウテキストを受け取る変数 + @return 成功した場合 true + @return 失敗した場合 false + */ + bool Wnd_GetText( HWND hWnd, std::wstring& strText ) + { + // バッファをクリアしておく + strText.clear(); + + // GetWindowTextLength() はウィンドウテキスト取得に必要なバッファサイズを返す。 + // 条件によっては必要なサイズより大きな値を返すことがある模様 + // https://docs.microsoft.com/en-us/windows/desktop/api/winuser/nf-winuser-getwindowtextlengthw + const int cchRequired = ::GetWindowTextLength( hWnd ); + if( cchRequired < 0 ){ + // ドキュメントには失敗した場合、あるいはテキストが空の場合には 0 を返すとある。 + // 0 の場合はエラーかどうか判断できないのでテキストの取得処理を続行する。 + // 仕様上は負の場合はありえないが、念の為エラーチェックしておく。 + return false; + }else if( cchRequired == 0 ){ + // GetWindowTextLength はエラーの場合、またはテキストが空の場合は 0 を返す + if( GetLastError() != 0 ){ + return false; + } + return true; + } + + // ウィンドウテキストを取得するのに必要なバッファを確保する + strText.reserve( cchRequired ); + + // GetWindowText() はコピーした文字数を返す。 + // https://docs.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-getwindowtextw + const int actualCopied = ::GetWindowText( hWnd, strText.data(), cchRequired ); + if( actualCopied < 0 ){ + // 仕様上は負の場合はありえないが、念の為エラーチェックしておく。 + return false; + } + else if( actualCopied == 0 ){ + // GetWindowText はエラーの場合、またはテキストが空の場合は 0 を返す + if( GetLastError() != 0 ){ + return false; + } + } + else if( (int)strText.capacity() <= actualCopied ){ + // GetWindowText() の仕様上はありえないはず + return false; + } + + // データサイズを反映する + strText.assign( strText.data(), actualCopied ); + + return true; + } + LRESULT List_GetText(HWND hwndList, int nIndex, WCHAR* pszText, size_t cchText) { LRESULT nCount = SendMessage( hwndList, LB_GETTEXTLEN, (WPARAM)nIndex, (LPARAM)0); diff --git a/sakura_core/apiwrap/StdControl.h b/sakura_core/apiwrap/StdControl.h index a171f7d292..8d1c952fb9 100644 --- a/sakura_core/apiwrap/StdControl.h +++ b/sakura_core/apiwrap/StdControl.h @@ -63,6 +63,15 @@ namespace ApiWrap{ return SetWindowText(hwnd, str.GetStringPtr()); } + /*! + @brief Window テキストを取得する + @param[in] hWnd ウィンドウハンドル + @param[out] strText ウィンドウテキストを受け取る変数 + @return 成功した場合 true + @return 失敗した場合 false + */ + bool Wnd_GetText( HWND hWnd, std::wstring& strText ); + /*! @brief Window テキストを取得する @param[in] hwnd ウィンドウハンドル From 2e8452ccdb01ce65d40fe5a73c82c090d6a6c016 Mon Sep 17 00:00:00 2001 From: Mari Sano Date: Sun, 25 Oct 2020 19:52:59 +0900 Subject: [PATCH 02/18] =?UTF-8?q?ApiWrap::DlgItem=5FGetText=E3=81=AE?= =?UTF-8?q?=E3=82=AA=E3=83=BC=E3=83=90=E3=83=BC=E3=83=AD=E3=83=BC=E3=83=89?= =?UTF-8?q?=E9=96=A2=E6=95=B0=E3=82=92=E8=BF=BD=E5=8A=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit std::make_uniqueを使わないで済むようにラッパー関数を追加する --- sakura_core/apiwrap/StdControl.cpp | 22 ++++++++++++++++++++++ sakura_core/apiwrap/StdControl.h | 1 + 2 files changed, 23 insertions(+) diff --git a/sakura_core/apiwrap/StdControl.cpp b/sakura_core/apiwrap/StdControl.cpp index 7452ede587..0317e7fbdc 100644 --- a/sakura_core/apiwrap/StdControl.cpp +++ b/sakura_core/apiwrap/StdControl.cpp @@ -70,6 +70,28 @@ namespace ApiWrap{ return SendMessage( hwndList, LB_GETTEXT, (WPARAM)nIndex, LPARAM(pszText) ); } + /*! + @brief ダイアログアイテムのテキストを取得する + @param[in] hDlg ウィンドウハンドル + @param[in] nIDDlgItem ダイアログアイテムのID + @param[out] strText アイテムテキストを受け取る変数 + @return 成功した場合 true + @return 失敗した場合 false + */ + bool DlgItem_GetText( HWND hDlg, int nIDDlgItem, std::wstring& strText ) + { + // バッファをクリアしておく + strText.clear(); + + // アイテムのハンドルを取得する + HWND hWnd = ::GetDlgItem( hDlg, nIDDlgItem ); + if( hWnd == NULL ){ + return false; + } + + return Wnd_GetText( hWnd, strText ); + } + UINT DlgItem_GetText(HWND hwndDlg, int nIDDlgItem, WCHAR* pszText, int nMaxCount) { return GetDlgItemText(hwndDlg, nIDDlgItem, pszText, nMaxCount); diff --git a/sakura_core/apiwrap/StdControl.h b/sakura_core/apiwrap/StdControl.h index 8d1c952fb9..880883f841 100644 --- a/sakura_core/apiwrap/StdControl.h +++ b/sakura_core/apiwrap/StdControl.h @@ -303,6 +303,7 @@ namespace ApiWrap{ return SetDlgItemText(hwndDlg, nIDDlgItem, str); } + bool DlgItem_GetText( HWND hDlg, int nIDDlgItem, std::wstring& strText ); UINT DlgItem_GetText(HWND hwndDlg, int nIDDlgItem, WCHAR* pszText, int nMaxCount); bool TreeView_GetItemTextVector(HWND hwndTree, TVITEM& item, std::vector& vecStr); From ed530f83857b9460ea2ea3b4f4ba51acfbc8ac4e Mon Sep 17 00:00:00 2001 From: Mari Sano Date: Sun, 25 Oct 2020 20:10:10 +0900 Subject: [PATCH 03/18] =?UTF-8?q?ApiWrap::List=5FGetText=E3=81=AE=E3=82=AA?= =?UTF-8?q?=E3=83=BC=E3=83=90=E3=83=BC=E3=83=AD=E3=83=BC=E3=83=89=E9=96=A2?= =?UTF-8?q?=E6=95=B0=E3=82=92=E8=BF=BD=E5=8A=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit std::make_uniqueを使わないで済むようにラッパー関数を追加する --- sakura_core/apiwrap/StdControl.cpp | 43 ++++++++++++++++++++++++++++++ sakura_core/apiwrap/StdControl.h | 1 + 2 files changed, 44 insertions(+) diff --git a/sakura_core/apiwrap/StdControl.cpp b/sakura_core/apiwrap/StdControl.cpp index 0317e7fbdc..3c7d8bc671 100644 --- a/sakura_core/apiwrap/StdControl.cpp +++ b/sakura_core/apiwrap/StdControl.cpp @@ -2,6 +2,8 @@ #include "StdAfx.h" #include "StdControl.h" +#include + namespace ApiWrap{ /*! @@ -60,6 +62,47 @@ namespace ApiWrap{ return true; } + /*! + @brief リストアイテムのテキストを取得する + @param[in] hList リストコントロールのウインドウハンドル + @param[in] nIndex リストアイテムのインデックス + @param[out] strText アイテムテキストを受け取る変数 + @return 成功した場合 true + @return 失敗した場合 false + */ + bool List_GetText( HWND hList, int nIndex, std::wstring& strText ) + { + // バッファをクリアしておく + strText.clear(); + + const int cchRequired = ListBox_GetTextLen( hList, nIndex ); + if( cchRequired < 0 ){ + // LB_ERR(-1)とその他のエラーは区別しない + return false; + }else if( cchRequired == 0 ){ + return true; + } + + // ウィンドウタイトルを設定するのに必要なバッファを確保する + strText.reserve( cchRequired ); + + // ListBox_GetText() はコピーした文字数を返す。 + const int actualCopied = ListBox_GetText( hList, nIndex, strText.data() ); + if( actualCopied < 0 ){ + // LB_ERR(-1)とその他のエラーは区別しない + return false; + } + else if( (int)strText.capacity() <= actualCopied ){ + // ListBox_GetText() の仕様上はありえないはず + return false; + } + + // データサイズを反映する + strText.assign( strText.data(), actualCopied ); + + return true; + } + LRESULT List_GetText(HWND hwndList, int nIndex, WCHAR* pszText, size_t cchText) { LRESULT nCount = SendMessage( hwndList, LB_GETTEXTLEN, (WPARAM)nIndex, (LPARAM)0); diff --git a/sakura_core/apiwrap/StdControl.h b/sakura_core/apiwrap/StdControl.h index 880883f841..074b08441b 100644 --- a/sakura_core/apiwrap/StdControl.h +++ b/sakura_core/apiwrap/StdControl.h @@ -228,6 +228,7 @@ namespace ApiWrap{ // -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- // // リストボックス // // -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- // + bool List_GetText( HWND hList, int nIndex, std::wstring& strText ); LRESULT List_GetText(HWND hwndList, int nIndex, WCHAR* pszText, size_t cchText); template LRESULT List_GetText(HWND hwndList, int nIndex, WCHAR(&pszText)[cchText]) { From c5b4a0fad70999d3e832ab34602ebf23debc6752 Mon Sep 17 00:00:00 2001 From: Mari Sano Date: Sun, 25 Oct 2020 20:36:12 +0900 Subject: [PATCH 04/18] =?UTF-8?q?Wnd=5FGetText=E3=82=92=E9=81=A9=E7=94=A8?= =?UTF-8?q?=E3=81=99=E3=82=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit std::make_uniqueを使わないように修正 --- sakura_core/dlg/CDlgAbout.cpp | 16 +++++------ sakura_core/dlg/CDlgFind.cpp | 11 ++------ sakura_core/dlg/CDlgGrep.cpp | 7 ++--- sakura_core/dlg/CDlgGrepReplace.cpp | 5 +--- sakura_core/dlg/CDlgReplace.cpp | 23 +++++---------- sakura_core/typeprop/CPropTypesRegex.cpp | 36 ++++++++++++------------ sakura_core/window/CMainToolBar.cpp | 5 +--- 7 files changed, 40 insertions(+), 63 deletions(-) diff --git a/sakura_core/dlg/CDlgAbout.cpp b/sakura_core/dlg/CDlgAbout.cpp index a34137af36..ee499baf10 100644 --- a/sakura_core/dlg/CDlgAbout.cpp +++ b/sakura_core/dlg/CDlgAbout.cpp @@ -390,14 +390,14 @@ BOOL CUrlWnd::SetSubclassWindow( HWND hWnd ) SendMessageAny( hWnd, WM_SETFONT, (WPARAM)m_hFont, (LPARAM)FALSE ); // 設定されているテキストを取得する - const ULONG cchText = ::GetWindowTextLength( hWnd ); - auto textBuf = std::make_unique( cchText + 1 ); - WCHAR* pchText = textBuf.get(); - ::GetWindowText( hWnd, pchText, cchText + 1 ); - - // サイズを調整する - auto retSetText = OnSetText( pchText, cchText ); - return retSetText ? TRUE : FALSE; + std::wstring strText; + if( ApiWrap::Wnd_GetText( hWnd, strText ) ){ + // サイズを調整する + auto retSetText = OnSetText( strText.data(), strText.length() ); + return retSetText ? TRUE : FALSE; + } + + return FALSE; } LRESULT CALLBACK CUrlWnd::UrlWndProc( HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam ) diff --git a/sakura_core/dlg/CDlgFind.cpp b/sakura_core/dlg/CDlgFind.cpp index 3c43e7faab..233b6756be 100644 --- a/sakura_core/dlg/CDlgFind.cpp +++ b/sakura_core/dlg/CDlgFind.cpp @@ -182,10 +182,8 @@ void CDlgFind::SetCombosList( void ) while (Combo_GetCount(hwndCombo) > 0) { Combo_DeleteString( hwndCombo, 0); } - int nBufferSize = ::GetWindowTextLength( GetItemHwnd(IDC_COMBO_TEXT) ) + 1; - auto vText = std::make_unique(nBufferSize); - Combo_GetText( hwndCombo, &vText[0], nBufferSize ); - if (m_strText.compare( &vText[0] ) != 0) { + std::wstring strText; + if( !ApiWrap::DlgItem_GetText( GetHwnd(), IDC_COMBO_TEXT, strText ) || strText != m_strText ) { ::DlgItem_SetText( GetHwnd(), IDC_COMBO_TEXT, m_strText.c_str() ); } } @@ -212,10 +210,7 @@ int CDlgFind::GetData( void ) m_pShareData->m_Common.m_sSearch.m_bNOTIFYNOTFOUND = m_bNOTIFYNOTFOUND; // 検索/置換 見つからないときメッセージを表示 /* 検索文字列 */ - int nBufferSize = ::GetWindowTextLength( GetItemHwnd(IDC_COMBO_TEXT) ) + 1; - auto vText = std::make_unique(nBufferSize); - ::DlgItem_GetText( GetHwnd(), IDC_COMBO_TEXT, &vText[0], nBufferSize); - m_strText = &vText[0]; + ApiWrap::DlgItem_GetText( GetHwnd(), IDC_COMBO_TEXT, m_strText ); /* 検索ダイアログを自動的に閉じる */ m_pShareData->m_Common.m_sSearch.m_bAutoCloseDlgFind = ::IsDlgButtonChecked( GetHwnd(), IDC_CHECK_bAutoCloseDlgFind ); diff --git a/sakura_core/dlg/CDlgGrep.cpp b/sakura_core/dlg/CDlgGrep.cpp index 21ec97e74d..3d4f1ca81d 100644 --- a/sakura_core/dlg/CDlgGrep.cpp +++ b/sakura_core/dlg/CDlgGrep.cpp @@ -791,11 +791,8 @@ int CDlgGrep::GetData( void ) m_bGrepSeparateFolder = IsDlgButtonCheckedBool( GetHwnd(), IDC_CHECK_SEP_FOLDER ); /* 検索文字列 */ - int nBufferSize = ::GetWindowTextLength( GetItemHwnd(IDC_COMBO_TEXT) ) + 1; - auto vText = std::make_unique(nBufferSize); - ::DlgItem_GetText( GetHwnd(), IDC_COMBO_TEXT, &vText[0], nBufferSize); - m_strText = &vText[0]; - m_bSetText = true; + m_bSetText = ApiWrap::DlgItem_GetText( GetHwnd(), IDC_COMBO_TEXT, m_strText );; + /* 検索ファイル */ ::DlgItem_GetText( GetHwnd(), IDC_COMBO_FILE, m_szFile, _countof2(m_szFile) ); /* 検索フォルダ */ diff --git a/sakura_core/dlg/CDlgGrepReplace.cpp b/sakura_core/dlg/CDlgGrepReplace.cpp index 1b29cb6ab8..e83bf7abcc 100644 --- a/sakura_core/dlg/CDlgGrepReplace.cpp +++ b/sakura_core/dlg/CDlgGrepReplace.cpp @@ -199,10 +199,7 @@ int CDlgGrepReplace::GetData( void ) m_bPaste = IsDlgButtonCheckedBool( GetHwnd(), IDC_CHK_PASTE ); /* 置換後 */ - int nBufferSize = ::GetWindowTextLength( GetItemHwnd(IDC_COMBO_TEXT2) ) + 1; - auto vText = std::make_unique(nBufferSize); - ::DlgItem_GetText( GetHwnd(), IDC_COMBO_TEXT2, &vText[0], nBufferSize); - m_strText2 = &vText[0]; + ApiWrap::DlgItem_GetText(GetHwnd(), IDC_COMBO_TEXT2, m_strText2 ); if( 0 == ::GetWindowTextLength( GetItemHwnd(IDC_COMBO_TEXT) ) ){ WarningMessage( GetHwnd(), LS(STR_DLGREPLC_REPSTR) ); diff --git a/sakura_core/dlg/CDlgReplace.cpp b/sakura_core/dlg/CDlgReplace.cpp index 524b0490cd..ff655a56f5 100644 --- a/sakura_core/dlg/CDlgReplace.cpp +++ b/sakura_core/dlg/CDlgReplace.cpp @@ -194,10 +194,8 @@ void CDlgReplace::SetCombosList( void ) while (Combo_GetCount(hwndCombo) > 0) { Combo_DeleteString( hwndCombo, 0); } - int nBufferSize = ::GetWindowTextLength( hwndCombo ) + 1; - auto vText = std::make_unique(nBufferSize); - Combo_GetText( hwndCombo, &vText[0], nBufferSize ); - if (m_strText.compare( &vText[0] ) != 0) { + std::wstring strText; + if( !ApiWrap::DlgItem_GetText( GetHwnd(), IDC_COMBO_TEXT, strText ) || strText != m_strText ) { ::DlgItem_SetText( GetHwnd(), IDC_COMBO_TEXT, m_strText.c_str() ); } @@ -206,10 +204,8 @@ void CDlgReplace::SetCombosList( void ) while (Combo_GetCount(hwndCombo) > 0) { Combo_DeleteString( hwndCombo, 0); } - nBufferSize = ::GetWindowTextLength( hwndCombo ) + 1; - vText = std::make_unique(nBufferSize); - Combo_GetText( hwndCombo, &vText[0], nBufferSize ); - if (m_strText2.compare( &vText[0] ) != 0) { + std::wstring strText2; + if( !ApiWrap::DlgItem_GetText( GetHwnd(), IDC_COMBO_TEXT2, strText2 ) || strText2 != m_strText2 ) { ::DlgItem_SetText( GetHwnd(), IDC_COMBO_TEXT2, m_strText2.c_str() ); } } @@ -240,18 +236,13 @@ int CDlgReplace::GetData( void ) m_pShareData->m_Common.m_sSearch.m_bNOTIFYNOTFOUND = m_bNOTIFYNOTFOUND; // 検索/置換 見つからないときメッセージを表示 /* 検索文字列 */ - int nBufferSize = ::GetWindowTextLength( GetItemHwnd(IDC_COMBO_TEXT) ) + 1; - auto vText = std::make_unique(nBufferSize); - ::DlgItem_GetText( GetHwnd(), IDC_COMBO_TEXT, &vText[0], nBufferSize); - m_strText = &vText[0]; + ApiWrap::DlgItem_GetText( GetHwnd(), IDC_COMBO_TEXT, m_strText ); + /* 置換後文字列 */ if( ::IsDlgButtonChecked( GetHwnd(), IDC_RADIO_LINEDELETE ) ){ m_strText2 = L""; }else{ - nBufferSize = ::GetWindowTextLength( GetItemHwnd(IDC_COMBO_TEXT2) ) + 1; - vText = std::make_unique(nBufferSize); - ::DlgItem_GetText( GetHwnd(), IDC_COMBO_TEXT2, &vText[0], nBufferSize); - m_strText2 = &vText[0]; + ApiWrap::DlgItem_GetText( GetHwnd(), IDC_COMBO_TEXT2, m_strText2 ); } /* 置換 ダイアログを自動的に閉じる */ diff --git a/sakura_core/typeprop/CPropTypesRegex.cpp b/sakura_core/typeprop/CPropTypesRegex.cpp index f5b267aa6a..265874b136 100644 --- a/sakura_core/typeprop/CPropTypesRegex.cpp +++ b/sakura_core/typeprop/CPropTypesRegex.cpp @@ -182,10 +182,10 @@ INT_PTR CPropTypesRegex::DispatchEvent( case IDC_BUTTON_REGEX_INS: /* 挿入 */ { //挿入するキー情報を取得する。 - auto szKeyWord = std::make_unique(nKeyWordSize); - szKeyWord[0] = L'\0'; - ::DlgItem_GetText( hwndDlg, IDC_EDIT_REGEX, &szKeyWord[0], nKeyWordSize ); - if( szKeyWord[0] == L'\0' ) return FALSE; + std::wstring strKeyWord; + if( !ApiWrap::DlgItem_GetText( hwndDlg, IDC_EDIT_REGEX, strKeyWord ) ){ + return FALSE; + } //同じキーがないか調べる。 nIndex2 = ListView_GetItemCount(hwndList); if( nIndex2 >= MAX_REGEX_KEYWORD ) @@ -200,7 +200,7 @@ INT_PTR CPropTypesRegex::DispatchEvent( //選択中でなければ最後にする。 nIndex = nIndex2; } - if( !CheckKeywordList(hwndDlg, &szKeyWord[0], -1) ){ + if( !CheckKeywordList( hwndDlg, strKeyWord.c_str(), -1 ) ){ return FALSE; } @@ -209,7 +209,7 @@ INT_PTR CPropTypesRegex::DispatchEvent( ::DlgItem_GetText( hwndDlg, IDC_COMBO_REGEX_COLOR, szColorIndex, _countof(szColorIndex) ); //キー情報を挿入する。 lvi.mask = LVIF_TEXT | LVIF_PARAM; - lvi.pszText = &szKeyWord[0]; + lvi.pszText = strKeyWord.data(); lvi.iItem = nIndex; lvi.iSubItem = 0; lvi.lParam = 0; @@ -227,20 +227,20 @@ INT_PTR CPropTypesRegex::DispatchEvent( case IDC_BUTTON_REGEX_ADD: /* 追加 */ { - auto szKeyWord = std::make_unique(nKeyWordSize); //最後のキー番号を取得する。 nIndex = ListView_GetItemCount( hwndList ); //追加するキー情報を取得する。 - szKeyWord[0] = L'\0'; - ::DlgItem_GetText( hwndDlg, IDC_EDIT_REGEX, &szKeyWord[0], nKeyWordSize ); - if( szKeyWord[0] == L'\0' ) return FALSE; + std::wstring strKeyWord; + if( !ApiWrap::DlgItem_GetText( hwndDlg, IDC_EDIT_REGEX, strKeyWord ) ){ + return FALSE; + } nIndex2 = ListView_GetItemCount(hwndList); if( nIndex2 >= MAX_REGEX_KEYWORD ) { ErrorMessage( hwndDlg, LS(STR_PROPTYPEREGEX_NOREG)); return FALSE; } - if( !CheckKeywordList(hwndDlg, &szKeyWord[0], -1) ){ + if( !CheckKeywordList( hwndDlg, strKeyWord.c_str(), -1 ) ){ return FALSE; } //追加するキー情報を取得する。 @@ -248,7 +248,7 @@ INT_PTR CPropTypesRegex::DispatchEvent( ::DlgItem_GetText( hwndDlg, IDC_COMBO_REGEX_COLOR, szColorIndex, _countof(szColorIndex) ); //キーを追加する。 lvi.mask = LVIF_TEXT | LVIF_PARAM; - lvi.pszText = &szKeyWord[0]; + lvi.pszText = strKeyWord.data(); lvi.iItem = nIndex; lvi.iSubItem = 0; lvi.lParam = 0; @@ -266,7 +266,6 @@ INT_PTR CPropTypesRegex::DispatchEvent( case IDC_BUTTON_REGEX_UPD: /* 更新 */ { - auto szKeyWord = std::make_unique(nKeyWordSize); //選択中のキーを探す。 nIndex = ListView_GetNextItem( hwndList, -1, LVNI_ALL | LVNI_SELECTED ); if( -1 == nIndex ) @@ -275,10 +274,11 @@ INT_PTR CPropTypesRegex::DispatchEvent( return FALSE; } //更新するキー情報を取得する。 - szKeyWord[0] = L'\0'; - ::DlgItem_GetText( hwndDlg, IDC_EDIT_REGEX, &szKeyWord[0], nKeyWordSize ); - if( szKeyWord[0] == L'\0' ) return FALSE; - if( !CheckKeywordList(hwndDlg, &szKeyWord[0], nIndex) ){ + std::wstring strKeyWord; + if( !ApiWrap::DlgItem_GetText( hwndDlg, IDC_EDIT_REGEX, strKeyWord ) ){ + return FALSE; + } + if( !CheckKeywordList( hwndDlg, strKeyWord.c_str(), nIndex ) ){ return FALSE; } //追加するキー情報を取得する。 @@ -286,7 +286,7 @@ INT_PTR CPropTypesRegex::DispatchEvent( ::DlgItem_GetText( hwndDlg, IDC_COMBO_REGEX_COLOR, szColorIndex, _countof(szColorIndex) ); //キーを更新する。 lvi.mask = LVIF_TEXT | LVIF_PARAM; - lvi.pszText = &szKeyWord[0]; + lvi.pszText = strKeyWord.data(); lvi.iItem = nIndex; lvi.iSubItem = 0; lvi.lParam = 0; diff --git a/sakura_core/window/CMainToolBar.cpp b/sakura_core/window/CMainToolBar.cpp index b93a9163dd..eb6a14c001 100644 --- a/sakura_core/window/CMainToolBar.cpp +++ b/sakura_core/window/CMainToolBar.cpp @@ -596,10 +596,7 @@ void CMainToolBar::AcceptSharedSearchKey() int CMainToolBar::GetSearchKey(std::wstring& strText) { if( m_hwndSearchBox ){ - int nBufferSize = ::GetWindowTextLength( m_hwndSearchBox ) + 1; - auto vText = std::make_unique(nBufferSize); - ::GetWindowText( m_hwndSearchBox, &vText[0], nBufferSize); - strText = &vText[0]; + ApiWrap::Wnd_GetText( m_hwndSearchBox, strText ); }else{ strText = L""; } From 2318efb6ed63dbdafe6c461ea1a84972a44ec769 Mon Sep 17 00:00:00 2001 From: Mari Sano Date: Sun, 25 Oct 2020 21:02:33 +0900 Subject: [PATCH 05/18] =?UTF-8?q?List=5FGetText=E3=82=92=E9=81=A9=E7=94=A8?= =?UTF-8?q?=E3=81=99=E3=82=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit std::make_uniqueを使わないように修正 --- sakura_core/CHokanMgr.cpp | 28 +++++++++++++--------------- 1 file changed, 13 insertions(+), 15 deletions(-) diff --git a/sakura_core/CHokanMgr.cpp b/sakura_core/CHokanMgr.cpp index 0fe4f293d7..8aea93a143 100644 --- a/sakura_core/CHokanMgr.cpp +++ b/sakura_core/CHokanMgr.cpp @@ -539,26 +539,25 @@ BOOL CHokanMgr::DoHokan( int nVKey ) if( VK_TAB == nVKey && !m_pShareData->m_Common.m_sHelper.m_bHokanKey_TAB ) return FALSE;/* VK_TAB 補完決定キーが有効/無効 */ if( VK_RIGHT == nVKey && !m_pShareData->m_Common.m_sHelper.m_bHokanKey_RIGHT ) return FALSE;/* VK_RIGHT 補完決定キーが有効/無効 */ - HWND hwndList; - int nItem; - CEditView* pcEditView; - hwndList = GetItemHwnd( IDC_LIST_WORDS ); - nItem = List_GetCurSel( hwndList ); + HWND hList = GetItemHwnd( IDC_LIST_WORDS ); + const int nItem = List_GetCurSel( hList ); if( LB_ERR == nItem ){ return FALSE; } - int nLabelLen = List_GetTextLen( hwndList, nItem ); - auto pszLabel = std::make_unique(nLabelLen + 1); - List_GetText( hwndList, nItem, &pszLabel[0], nLabelLen + 1 ); + + std::wstring strLabel; + if( !ApiWrap::List_GetText( hList, nItem, strLabel ) ){ + return FALSE; + } /* テキストを貼り付け */ - pcEditView = reinterpret_cast(m_lParam); + CEditView* pcEditView = reinterpret_cast(m_lParam); // Apr. 28, 2000 genta pcEditView->GetCommander().HandleCommand( F_WordDeleteToStart, false, 0, 0, 0, 0 ); - pcEditView->GetCommander().HandleCommand( F_INSTEXT_W, true, (LPARAM)&pszLabel[0], wcslen(&pszLabel[0]), TRUE, 0 ); + pcEditView->GetCommander().HandleCommand( F_INSTEXT_W, true, (LPARAM)strLabel.data(), strLabel.length(), TRUE, 0 ); // Until here -// pcEditView->GetCommander().HandleCommand( F_INSTEXT_W, true, (LPARAM)(pszLabel + m_cmemCurWord.GetLength()), TRUE, 0, 0 ); +// pcEditView->GetCommander().HandleCommand( F_INSTEXT_W, true, (LPARAM)(strLabel.data() + m_cmemCurWord.GetLength()), TRUE, 0, 0 ); Hide(); return TRUE; @@ -658,9 +657,8 @@ void CHokanMgr::ShowTip() nItem = List_GetCurSel( hwndCtrl ); if( LB_ERR == nItem ) return ; - int nLabelLen = List_GetTextLen( hwndCtrl, nItem ); - auto szLabel = std::make_unique(nLabelLen + 1); - List_GetText( hwndCtrl, nItem, &szLabel[0], nLabelLen + 1 ); // 選択中の単語を取得 + std::wstring strLabel; + if( !ApiWrap::List_GetText( hwndCtrl, nItem, strLabel ) ) return; pcEditView = reinterpret_cast(m_lParam); @@ -681,7 +679,7 @@ void CHokanMgr::ShowTip() if( point.y > m_poWin.y && point.y < m_poWin.y + m_nHeight ) { ::SetRect( &rcHokanWin , m_poWin.x, m_poWin.y, m_poWin.x + m_nWidth, m_poWin.y + m_nHeight ); - if( !pcEditView -> ShowKeywordHelp( point, &szLabel[0], &rcHokanWin ) ) + if( !pcEditView -> ShowKeywordHelp( point, strLabel.data(), &rcHokanWin ) ) pcEditView -> m_dwTipTimer = ::GetTickCount(); // 表示するべきキーワードヘルプが無い } } From 74e75f2e79872f164f2da63d2a05eef15e389f94 Mon Sep 17 00:00:00 2001 From: Mari Sano Date: Sun, 25 Oct 2020 21:25:43 +0900 Subject: [PATCH 06/18] =?UTF-8?q?DebugOutW=E3=81=AE=E3=83=AA=E3=83=95?= =?UTF-8?q?=E3=82=A1=E3=82=AF=E3=82=BF=E3=83=AA=E3=83=B3=E3=82=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit std::make_uniqueを使わないように修正 --- sakura_core/debug/Debug1.cpp | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/sakura_core/debug/Debug1.cpp b/sakura_core/debug/Debug1.cpp index 6910533ba7..f53b5b7b2c 100644 --- a/sakura_core/debug/Debug1.cpp +++ b/sakura_core/debug/Debug1.cpp @@ -54,10 +54,15 @@ void DebugOutW( LPCWSTR lpFmt, ...) ::DebugBreak(); - int count = _vscwprintf( lpFmt, argList ); - auto pLargeBuf = std::make_unique( count + 1 ); - if( vswprintf( &pLargeBuf[0], count + 1, lpFmt, argList ) > 0 ) - ::OutputDebugStringW( &pLargeBuf[0] ); + const int count = _vscwprintf( lpFmt, argList ); + + std::wstring strTooLongMessage; + strTooLongMessage.reserve( count ); + + ::_vsnwprintf_s( strTooLongMessage.data(), count + 1, _TRUNCATE, lpFmt, argList ); + strTooLongMessage.assign( strTooLongMessage.data(), count ); + + ::OutputDebugStringW( strTooLongMessage.c_str() ); } va_end(argList); From 085ac88dd0881ff62ab1d2b89aab3152f3271da6 Mon Sep 17 00:00:00 2001 From: Mari Sano Date: Sun, 25 Oct 2020 21:52:53 +0900 Subject: [PATCH 07/18] =?UTF-8?q?CGrepAgent::CreateFolders=E3=83=AA?= =?UTF-8?q?=E3=83=95=E3=82=A1=E3=82=AF=E3=82=BF=E3=83=AA=E3=83=B3=E3=82=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit std::make_uniqueを使わないように修正 --- sakura_core/CGrepAgent.cpp | 39 +++++++++----------------------------- 1 file changed, 9 insertions(+), 30 deletions(-) diff --git a/sakura_core/CGrepAgent.cpp b/sakura_core/CGrepAgent.cpp index 9b1e7cddd5..0176a69a2a 100644 --- a/sakura_core/CGrepAgent.cpp +++ b/sakura_core/CGrepAgent.cpp @@ -114,43 +114,22 @@ void CGrepAgent::OnAfterSave(const SSaveInfo& sSaveInfo) */ void CGrepAgent::CreateFolders( const WCHAR* pszPath, std::vector& vPaths ) { - const int nPathLen = wcslen( pszPath ); - auto szPath = std::make_unique(nPathLen + 1); - auto szTmp = std::make_unique(nPathLen + 1); - wcscpy( &szPath[0], pszPath ); + std::wstring strPath( pszPath ); + const int nPathLen = static_cast( strPath.length() ); + WCHAR* token; int nPathPos = 0; - while( NULL != (token = my_strtok( &szPath[0], nPathLen, &nPathPos, L";")) ){ - wcscpy( &szTmp[0], token ); - WCHAR* p; - WCHAR* q; - p = q = &szTmp[0]; - while( *p ){ - if( *p != L'"' ){ - if( p != q ){ - *q = *p; - } - q++; - } - p++; + while( NULL != (token = my_strtok( strPath.data(), nPathLen, &nPathPos, L";")) ){ + std::wstring strTemp( token ); + if( strTemp.length() >= 2 && strTemp.front() == L'"' && strTemp.back() == strTemp.front() ){ + strTemp = strTemp.substr( 1, strTemp.length() - 2 ); } - *q = L'\0'; -#if 0 - // 2011.12.25 仕様変更。最後の\\は取り除く - int nFolderLen = q - &szTmp[0]; - if( 0 < nFolderLen ){ - int nCharChars = &szTmp[nFolderLen] - CNativeW::GetCharPrev( &szTmp[0], nFolderLen, &szTmp[nFolderLen] ); - if( 1 == nCharChars && (L'\\' == szTmp[nFolderLen - 1] || L'/' == szTmp[nFolderLen - 1]) ){ - szTmp[nFolderLen - 1] = L'\0'; - } - } -#endif /* ロングファイル名を取得する */ WCHAR szTmp2[_MAX_PATH]; - if( ::GetLongFileName( &szTmp[0], szTmp2 ) ){ + if( ::GetLongFileName( strTemp.c_str(), szTmp2 ) ){ vPaths.push_back( szTmp2 ); }else{ - vPaths.push_back( &szTmp[0] ); + vPaths.emplace_back( strTemp ); } } } From 020f8b761943b2a5244f6e6b6ace845021b801f4 Mon Sep 17 00:00:00 2001 From: Mari Sano Date: Sun, 25 Oct 2020 22:38:38 +0900 Subject: [PATCH 08/18] =?UTF-8?q?CPropTypesRegex=E3=83=AA=E3=83=95?= =?UTF-8?q?=E3=82=A1=E3=82=AF=E3=82=BF=E3=83=AA=E3=83=B3=E3=82=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit std::make_uniqueを使わないように修正 --- sakura_core/typeprop/CPropTypesRegex.cpp | 55 ++++++++++-------------- 1 file changed, 23 insertions(+), 32 deletions(-) diff --git a/sakura_core/typeprop/CPropTypesRegex.cpp b/sakura_core/typeprop/CPropTypesRegex.cpp index 265874b136..66dccfb7e3 100644 --- a/sakura_core/typeprop/CPropTypesRegex.cpp +++ b/sakura_core/typeprop/CPropTypesRegex.cpp @@ -97,8 +97,6 @@ INT_PTR CPropTypesRegex::DispatchEvent( hwndList = GetDlgItem( hwndDlg, IDC_LIST_REGEX ); - // ANSIビルドではCP932だと2倍程度必要 - const int nKeyWordSize = MAX_REGEX_KEYWORDLEN; WCHAR szColorIndex[256]; switch( uMsg ){ @@ -317,19 +315,18 @@ INT_PTR CPropTypesRegex::DispatchEvent( case IDC_BUTTON_REGEX_TOP: /* 先頭 */ { - auto szKeyWord = std::make_unique(nKeyWordSize); - szKeyWord[0] = L'\0'; + WCHAR szKeyWord[MAX_REGEX_KEYWORDLEN]{ 0 }; //選択中のキーを探す。 nIndex = ListView_GetNextItem( hwndList, -1, LVNI_ALL | LVNI_SELECTED ); if( -1 == nIndex ) return FALSE; if( 0 == nIndex ) return TRUE; //すでに先頭にある。 nIndex2 = 0; - ListView_GetItemText(hwndList, nIndex, 0, &szKeyWord[0], nKeyWordSize); + ListView_GetItemText(hwndList, nIndex, 0, szKeyWord, _countof(szKeyWord)); ListView_GetItemText(hwndList, nIndex, 1, szColorIndex, _countof(szColorIndex)); ListView_DeleteItem(hwndList, nIndex); //古いキーを削除 //キーを追加する。 lvi.mask = LVIF_TEXT | LVIF_PARAM; - lvi.pszText = &szKeyWord[0]; + lvi.pszText = szKeyWord; lvi.iItem = nIndex2; lvi.iSubItem = 0; lvi.lParam = 0; @@ -347,17 +344,16 @@ INT_PTR CPropTypesRegex::DispatchEvent( case IDC_BUTTON_REGEX_LAST: /* 最終 */ { - auto szKeyWord = std::make_unique(nKeyWordSize); - szKeyWord[0] = L'\0'; + WCHAR szKeyWord[MAX_REGEX_KEYWORDLEN]{ 0 }; nIndex = ListView_GetNextItem( hwndList, -1, LVNI_ALL | LVNI_SELECTED ); if( -1 == nIndex ) return FALSE; nIndex2 = ListView_GetItemCount(hwndList); if( nIndex2 - 1 == nIndex ) return TRUE; //すでに最終にある。 - ListView_GetItemText(hwndList, nIndex, 0, &szKeyWord[0], nKeyWordSize); + ListView_GetItemText(hwndList, nIndex, 0, szKeyWord, _countof(szKeyWord)); ListView_GetItemText(hwndList, nIndex, 1, szColorIndex, _countof(szColorIndex)); //キーを追加する。 lvi.mask = LVIF_TEXT | LVIF_PARAM; - lvi.pszText = &szKeyWord[0]; + lvi.pszText = szKeyWord; lvi.iItem = nIndex2; lvi.iSubItem = 0; lvi.lParam = 0; @@ -376,20 +372,19 @@ INT_PTR CPropTypesRegex::DispatchEvent( case IDC_BUTTON_REGEX_UP: /* 上へ */ { - auto szKeyWord = std::make_unique(nKeyWordSize); - szKeyWord[0] = L'\0'; + WCHAR szKeyWord[MAX_REGEX_KEYWORDLEN]{ 0 }; nIndex = ListView_GetNextItem( hwndList, -1, LVNI_ALL | LVNI_SELECTED ); if( -1 == nIndex ) return FALSE; if( 0 == nIndex ) return TRUE; //すでに先頭にある。 nIndex2 = ListView_GetItemCount(hwndList); if( nIndex2 <= 1 ) return TRUE; nIndex2 = nIndex - 1; - ListView_GetItemText(hwndList, nIndex, 0, &szKeyWord[0], nKeyWordSize); + ListView_GetItemText(hwndList, nIndex, 0, szKeyWord, _countof(szKeyWord)); ListView_GetItemText(hwndList, nIndex, 1, szColorIndex, _countof(szColorIndex)); ListView_DeleteItem(hwndList, nIndex); //古いキーを削除 //キーを追加する。 lvi.mask = LVIF_TEXT | LVIF_PARAM; - lvi.pszText = &szKeyWord[0]; + lvi.pszText = szKeyWord; lvi.iItem = nIndex2; lvi.iSubItem = 0; lvi.lParam = 0; @@ -407,19 +402,18 @@ INT_PTR CPropTypesRegex::DispatchEvent( case IDC_BUTTON_REGEX_DOWN: /* 下へ */ { - auto szKeyWord = std::make_unique(nKeyWordSize); - szKeyWord[0] = L'\0'; + WCHAR szKeyWord[MAX_REGEX_KEYWORDLEN]{ 0 }; nIndex = ListView_GetNextItem( hwndList, -1, LVNI_ALL | LVNI_SELECTED ); if( -1 == nIndex ) return FALSE; nIndex2 = ListView_GetItemCount(hwndList); if( nIndex2 - 1 == nIndex ) return TRUE; //すでに最終にある。 if( nIndex2 <= 1 ) return TRUE; nIndex2 = nIndex + 2; - ListView_GetItemText(hwndList, nIndex, 0, &szKeyWord[0], nKeyWordSize); + ListView_GetItemText(hwndList, nIndex, 0, szKeyWord, _countof(szKeyWord)); ListView_GetItemText(hwndList, nIndex, 1, szColorIndex, _countof(szColorIndex)); //キーを追加する。 lvi.mask = LVIF_TEXT | LVIF_PARAM; - lvi.pszText = &szKeyWord[0]; + lvi.pszText = szKeyWord; lvi.iItem = nIndex2; lvi.iSubItem = 0; lvi.lParam = 0; @@ -494,11 +488,10 @@ INT_PTR CPropTypesRegex::DispatchEvent( } if( nPrevIndex != nIndex ) //@@@ 2003.03.26 MIK { //更新時にListViewのSubItemを正しく取得できないので、その対策 - auto szKeyWord = std::make_unique(nKeyWordSize); - szKeyWord[0] = L'\0'; - ListView_GetItemText(hwndList, nIndex, 0, &szKeyWord[0], nKeyWordSize); + WCHAR szKeyWord[MAX_REGEX_KEYWORDLEN]{ 0 }; + ListView_GetItemText(hwndList, nIndex, 0, szKeyWord, _countof(szKeyWord)); ListView_GetItemText(hwndList, nIndex, 1, szColorIndex, _countof(szColorIndex)); - ::DlgItem_SetText( hwndDlg, IDC_EDIT_REGEX, &szKeyWord[0] ); /* 正規表現 */ + ::DlgItem_SetText( hwndDlg, IDC_EDIT_REGEX, szKeyWord ); /* 正規表現 */ hwndCombo = GetDlgItem( hwndDlg, IDC_COMBO_REGEX_COLOR ); for(i = 0, j = 0; i < COLORIDX_LAST; i++) { @@ -616,8 +609,7 @@ int CPropTypesRegex::GetData( HWND hwndDlg ) { HWND hwndList; int nIndex, i, j; - const int szKeyWordSize = _countof(m_Types.m_RegexKeywordList) * 2 + 1; - auto szKeyWord = std::make_unique(szKeyWordSize); + WCHAR szKeyWord[MAX_REGEX_KEYWORDLEN * 2]{ 0 }; WCHAR szColorIndex[256]; //使用する・使用しない @@ -638,10 +630,10 @@ int CPropTypesRegex::GetData( HWND hwndDlg ) { szKeyWord[0] = L'\0'; szColorIndex[0] = L'\0'; - ListView_GetItemText(hwndList, i, 0, &szKeyWord[0], szKeyWordSize ); + ListView_GetItemText(hwndList, i, 0, szKeyWord, _countof(szKeyWord) ); ListView_GetItemText(hwndList, i, 1, szColorIndex, _countof(szColorIndex)); if( pKeyword < pKeywordLast - 1 ){ - wcsncpy_s( pKeyword, pKeywordLast - pKeyword, &szKeyWord[0], _TRUNCATE ); + wcsncpy_s( pKeyword, pKeywordLast - pKeyword, szKeyWord, _TRUNCATE ); } //色指定文字列を番号に変換する m_Types.m_RegexKeywordArr[i].m_nColorIndex = COLORIDX_REGEX1; @@ -704,23 +696,22 @@ bool CPropTypesRegex::CheckKeywordList(HWND hwndDlg, const WCHAR* szNewKeyWord, if( nRet != IDYES ) return false; } // 重複確認・文字列長制限チェック - const int nKeyWordSize = MAX_REGEX_KEYWORDLEN; HWND hwndList = GetDlgItem( hwndDlg, IDC_LIST_REGEX ); int nIndex = ListView_GetItemCount(hwndList); - auto szKeyWord = std::make_unique(nKeyWordSize); + WCHAR szKeyWord[MAX_REGEX_KEYWORDLEN]{ 0 }; int nKeywordLen = 0; for(int i = 0; i < nIndex; i++){ if( i != nUpdateItem ){ szKeyWord[0] = L'\0'; - ListView_GetItemText(hwndList, i, 0, &szKeyWord[0], nKeyWordSize); - if( wcscmp(szNewKeyWord, &szKeyWord[0]) == 0 ) + ListView_GetItemText(hwndList, i, 0, szKeyWord, _countof(szKeyWord)); + if( wcscmp(szNewKeyWord, szKeyWord) == 0 ) { ErrorMessage( hwndDlg, LS(STR_PROPTYPEREGEX_ALREADY)); return false; } // 長さには\0も含む - nKeywordLen += wcsnlen(&szKeyWord[0], nKeyWordSize) + 1; - if( _countof(m_Types.m_RegexKeywordList) - 1 < nKeywordLen ){ + nKeywordLen += wcsnlen(szKeyWord, _countof(szKeyWord)) + 1; + if( _countof(m_Types.m_RegexKeywordList) - 1 < _countof(szKeyWord) ){ ErrorMessage( hwndDlg, LS(STR_PROPTYPEREGEX_FULL) ); return false; } From 336cc8e3ccdf3501120dfe0dbc5dd1afc3710898 Mon Sep 17 00:00:00 2001 From: Mari Sano Date: Mon, 26 Oct 2020 12:19:27 +0900 Subject: [PATCH 09/18] =?UTF-8?q?=E3=83=87=E3=83=83=E3=83=89=E3=82=B3?= =?UTF-8?q?=E3=83=BC=E3=83=89=E5=89=8A=E9=99=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- sakura_core/CHokanMgr.cpp | 2 -- 1 file changed, 2 deletions(-) diff --git a/sakura_core/CHokanMgr.cpp b/sakura_core/CHokanMgr.cpp index 8aea93a143..6c4ea347ec 100644 --- a/sakura_core/CHokanMgr.cpp +++ b/sakura_core/CHokanMgr.cpp @@ -556,8 +556,6 @@ BOOL CHokanMgr::DoHokan( int nVKey ) pcEditView->GetCommander().HandleCommand( F_WordDeleteToStart, false, 0, 0, 0, 0 ); pcEditView->GetCommander().HandleCommand( F_INSTEXT_W, true, (LPARAM)strLabel.data(), strLabel.length(), TRUE, 0 ); - // Until here -// pcEditView->GetCommander().HandleCommand( F_INSTEXT_W, true, (LPARAM)(strLabel.data() + m_cmemCurWord.GetLength()), TRUE, 0, 0 ); Hide(); return TRUE; From 6d9cb045da0433f43ebf3696a9325e207f6c8710 Mon Sep 17 00:00:00 2001 From: Mari Sano Date: Mon, 26 Oct 2020 12:21:40 +0900 Subject: [PATCH 10/18] =?UTF-8?q?strprintf/vstrprintf=E3=82=92=E8=BF=BD?= =?UTF-8?q?=E5=8A=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- sakura_core/debug/Debug1.cpp | 9 ++--- sakura_core/util/string_ex.h | 47 ++++++++++++++++++++++++++ tests/unittests/test-string_ex.cpp | 42 +++++++++++++++++++++++ tests/unittests/tests1.vcxproj | 1 + tests/unittests/tests1.vcxproj.filters | 3 ++ 5 files changed, 96 insertions(+), 6 deletions(-) create mode 100644 tests/unittests/test-string_ex.cpp diff --git a/sakura_core/debug/Debug1.cpp b/sakura_core/debug/Debug1.cpp index f53b5b7b2c..b745d18012 100644 --- a/sakura_core/debug/Debug1.cpp +++ b/sakura_core/debug/Debug1.cpp @@ -21,6 +21,8 @@ #include #include +#include "util/string_ex.h" + #if defined(_DEBUG) || defined(USE_RELPRINT) // -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- // @@ -54,13 +56,8 @@ void DebugOutW( LPCWSTR lpFmt, ...) ::DebugBreak(); - const int count = _vscwprintf( lpFmt, argList ); - std::wstring strTooLongMessage; - strTooLongMessage.reserve( count ); - - ::_vsnwprintf_s( strTooLongMessage.data(), count + 1, _TRUNCATE, lpFmt, argList ); - strTooLongMessage.assign( strTooLongMessage.data(), count ); + vstrprintf( strTooLongMessage, lpFmt, argList ); ::OutputDebugStringW( strTooLongMessage.c_str() ); } diff --git a/sakura_core/util/string_ex.h b/sakura_core/util/string_ex.h index 263ea4d460..d0c41273b5 100644 --- a/sakura_core/util/string_ex.h +++ b/sakura_core/util/string_ex.h @@ -26,6 +26,8 @@ #define SAKURA_STRING_EX_87282FEB_4B23_4112_9C5A_419F43618705_H_ #pragma once +#include + // 2007.10.19 kobake // string.h で定義されている関数を拡張したようなモノ達 @@ -200,6 +202,51 @@ inline int auto_vsprintf(WCHAR* buf, const WCHAR* format, va_list& v){ return tc inline int auto_vsprintf_s(ACHAR* buf, size_t nBufCount, const ACHAR* format, va_list& v){ return tchar_vsprintf_s(buf, nBufCount, format, v); } inline int auto_vsprintf_s(WCHAR* buf, size_t nBufCount, const WCHAR* format, va_list& v){ return tchar_vsprintf_s(buf, nBufCount, format, v); } +template +inline int vstrprintf( std::basic_string& strOut, const ChType* pszFormat, va_list& argList ) +{ + static_assert( 0, "not implemented" ); + return -1; +} + +template +inline int strprintf( std::basic_string& strOut, const ChType* pszFormat, ... ) +{ + static_assert( 0, "not implemented" ); + return -1; +} + +template<> +inline int vstrprintf( std::wstring& strOut, const WCHAR* pszFormat, va_list& argList ) +{ + strOut.clear(); + + const int cchOut = _vscwprintf( pszFormat, argList ); + if( cchOut > 0 ){ + + strOut.reserve( cchOut ); + + ::vswprintf_s( strOut.data(), strOut.capacity(), pszFormat, argList ); + + strOut.assign( strOut.data(), cchOut ); + } + + return cchOut; +} + +template<> +inline int strprintf( std::wstring& strOut, const WCHAR* pszFormat, ... ) +{ + va_list argList; + va_start( argList, pszFormat ); + + const int nRet = vstrprintf( strOut, pszFormat, argList ); + + va_end( argList ); + + return nRet; +} + // -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- // // 文字コード変換 // // -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- // diff --git a/tests/unittests/test-string_ex.cpp b/tests/unittests/test-string_ex.cpp new file mode 100644 index 0000000000..97d04cb8fe --- /dev/null +++ b/tests/unittests/test-string_ex.cpp @@ -0,0 +1,42 @@ +/*! @file */ +/* + Copyright (C) 2018-2020 Sakura Editor Organization + + This software is provided 'as-is', without any express or implied + warranty. In no event will the authors be held liable for any damages + arising from the use of this software. + + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; + you must not claim that you wrote the original software. + If you use this software in a product, an acknowledgment + in the product documentation would be appreciated but is + not required. + + 2. Altered source versions must be plainly marked as such, + and must not be misrepresented as being the original software. + + 3. This notice may not be removed or altered from any source + distribution. +*/ +#include + +#ifndef NOMINMAX +#define NOMINMAX +#endif /* #ifndef NOMINMAX */ + +#include +#include + +#include "basis/primitive.h" +#include "util/string_ex.h" + +TEST(string_ex, strprintf) +{ + std::wstring text; + strprintf(text, L"%s-%d", L"test", 101); + ASSERT_STREQ(L"test-101", text.c_str()); +} diff --git a/tests/unittests/tests1.vcxproj b/tests/unittests/tests1.vcxproj index 2da2e36862..eaa21c461b 100644 --- a/tests/unittests/tests1.vcxproj +++ b/tests/unittests/tests1.vcxproj @@ -123,6 +123,7 @@ + diff --git a/tests/unittests/tests1.vcxproj.filters b/tests/unittests/tests1.vcxproj.filters index 0ffb1ec742..68f0f2697f 100644 --- a/tests/unittests/tests1.vcxproj.filters +++ b/tests/unittests/tests1.vcxproj.filters @@ -77,6 +77,9 @@ Test Files + + Test Files + From 6401489808e5ed08931c5c6ac50deef266241abf Mon Sep 17 00:00:00 2001 From: Mari Sano Date: Mon, 26 Oct 2020 12:44:42 +0900 Subject: [PATCH 11/18] =?UTF-8?q?=E5=8F=96=E5=BE=97=E5=8F=AF=E8=83=BD?= =?UTF-8?q?=E3=82=B5=E3=82=A4=E3=82=BA=E3=81=AE=E6=8C=87=E5=AE=9A=E3=82=92?= =?UTF-8?q?=E4=BF=AE=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- sakura_core/apiwrap/StdControl.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sakura_core/apiwrap/StdControl.cpp b/sakura_core/apiwrap/StdControl.cpp index 3c7d8bc671..1e86b12c68 100644 --- a/sakura_core/apiwrap/StdControl.cpp +++ b/sakura_core/apiwrap/StdControl.cpp @@ -40,7 +40,7 @@ namespace ApiWrap{ // GetWindowText() はコピーした文字数を返す。 // https://docs.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-getwindowtextw - const int actualCopied = ::GetWindowText( hWnd, strText.data(), cchRequired ); + const int actualCopied = ::GetWindowText( hWnd, strText.data(), (int)strText.capacity() ); if( actualCopied < 0 ){ // 仕様上は負の場合はありえないが、念の為エラーチェックしておく。 return false; From d722d8cbcef5d82bdbe1175e2e59480d87952cc4 Mon Sep 17 00:00:00 2001 From: Mari Sano Date: Mon, 26 Oct 2020 20:45:48 +0900 Subject: [PATCH 12/18] =?UTF-8?q?=E3=83=AC=E3=83=93=E3=83=A5=E3=83=BC?= =?UTF-8?q?=E6=8C=87=E6=91=98(=E4=BA=8C=E9=87=8D=E5=BC=95=E7=94=A8?= =?UTF-8?q?=E7=AC=A6=E3=82=92=E5=8F=96=E3=82=8A=E9=99=A4=E3=81=8F=E5=87=A6?= =?UTF-8?q?=E7=90=86=E3=81=8C=E5=A4=89=E3=82=8F=E3=81=A3=E3=81=A6=E3=82=8B?= =?UTF-8?q?)=E3=81=AE=E5=AF=BE=E5=BF=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 前後の '"" を取り除くように実装してたのを パスに含まれる '"' を削除するように修正。 --- sakura_core/CGrepAgent.cpp | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/sakura_core/CGrepAgent.cpp b/sakura_core/CGrepAgent.cpp index 0176a69a2a..b036702667 100644 --- a/sakura_core/CGrepAgent.cpp +++ b/sakura_core/CGrepAgent.cpp @@ -121,9 +121,8 @@ void CGrepAgent::CreateFolders( const WCHAR* pszPath, std::vector& int nPathPos = 0; while( NULL != (token = my_strtok( strPath.data(), nPathLen, &nPathPos, L";")) ){ std::wstring strTemp( token ); - if( strTemp.length() >= 2 && strTemp.front() == L'"' && strTemp.back() == strTemp.front() ){ - strTemp = strTemp.substr( 1, strTemp.length() - 2 ); - } + // パスに含まれる '"' を削除する + strTemp.erase( std::remove( strTemp.begin(), strTemp.end(), L'"' ), strTemp.end() ); /* ロングファイル名を取得する */ WCHAR szTmp2[_MAX_PATH]; if( ::GetLongFileName( strTemp.c_str(), szTmp2 ) ){ From 7f349904df6aedbdfbc03b58542671a0dfff16e6 Mon Sep 17 00:00:00 2001 From: Mari Sano Date: Mon, 26 Oct 2020 20:55:57 +0900 Subject: [PATCH 13/18] =?UTF-8?q?=E3=83=AC=E3=83=93=E3=83=A5=E3=83=BC?= =?UTF-8?q?=E6=8C=87=E6=91=98=E5=AF=BE=E5=BF=9C(reserve=E3=82=88=E3=82=8Ar?= =?UTF-8?q?esize=E3=81=AE=E3=81=8C=E8=89=AF=E3=81=95=E3=81=9D=E3=81=86)?= =?UTF-8?q?=E3=81=AE=E5=AF=BE=E5=BF=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit std::wstringのsize()が返すインデックス以降をアクセスした場合の動作は保証されない。 reserveだけだとsizeが変更されないのでresizeに変更しておく。 --- sakura_core/apiwrap/StdControl.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/sakura_core/apiwrap/StdControl.cpp b/sakura_core/apiwrap/StdControl.cpp index 1e86b12c68..79701c8ace 100644 --- a/sakura_core/apiwrap/StdControl.cpp +++ b/sakura_core/apiwrap/StdControl.cpp @@ -36,7 +36,7 @@ namespace ApiWrap{ } // ウィンドウテキストを取得するのに必要なバッファを確保する - strText.reserve( cchRequired ); + strText.resize( cchRequired ); // GetWindowText() はコピーした文字数を返す。 // https://docs.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-getwindowtextw @@ -83,8 +83,8 @@ namespace ApiWrap{ return true; } - // ウィンドウタイトルを設定するのに必要なバッファを確保する - strText.reserve( cchRequired ); + // アイテムテキストを設定するのに必要なバッファを確保する + strText.resize( cchRequired ); // ListBox_GetText() はコピーした文字数を返す。 const int actualCopied = ListBox_GetText( hList, nIndex, strText.data() ); From 3c0a2f44b576bc1867a3b2dcc5a290dcb1dffa08 Mon Sep 17 00:00:00 2001 From: Mari Sano Date: Mon, 26 Oct 2020 21:21:16 +0900 Subject: [PATCH 14/18] =?UTF-8?q?=E3=83=AC=E3=83=93=E3=83=A5=E3=83=BC?= =?UTF-8?q?=E6=8C=87=E6=91=98(strprintf/vstrprintf=E3=81=AF=E3=83=86?= =?UTF-8?q?=E3=83=B3=E3=83=97=E3=83=AC=E3=83=BC=E3=83=88=E3=81=98=E3=82=83?= =?UTF-8?q?=E3=81=AA=E3=81=84=E3=81=BB=E3=81=86=E3=81=8C=E3=81=84=E3=81=84?= =?UTF-8?q?)=E3=81=AE=E5=AF=BE=E5=BF=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- sakura_core/util/string_ex.cpp | 58 ++++++++++++++++++++++++++++++++++ sakura_core/util/string_ex.h | 47 ++------------------------- 2 files changed, 61 insertions(+), 44 deletions(-) diff --git a/sakura_core/util/string_ex.cpp b/sakura_core/util/string_ex.cpp index aab047c37b..138b0c812d 100644 --- a/sakura_core/util/string_ex.cpp +++ b/sakura_core/util/string_ex.cpp @@ -1,6 +1,9 @@ /*! @file */ #include "StdAfx.h" #include "string_ex.h" + +#include + #include "charset/charcode.h" #include "util/std_macro.h" #include @@ -211,6 +214,61 @@ const char* stristr_j( const char* s1, const char* s2 ) return NULL; } +/*! + @brief C-Styleのフォーマット文字列を使ってデータを文字列化する。 + @param[out] strOut フォーマットされたテキストを受け取る変数 + @param[in] pszFormat フォーマット文字列 + @param[in] argList 引数リスト + @returns 出力された文字数。NUL終端を含まない。 + @retval >= 0 正常終了 + @retval < 0 異常終了 +*/ +int vstrprintf( std::wstring& strOut, const WCHAR* pszFormat, va_list& argList ) +{ + // バッファをクリアしておく + strOut.clear(); + + // _vscwprintf() はフォーマットに必要な文字数を返す。 + const int cchOut = ::_vscwprintf( pszFormat, argList ); + if( cchOut <= 0 ){ + // 出力文字数が0なら後続処理は要らない。また、エラー時は-1が返る。 + return cchOut; + } + + // フォーマットに必要なバッファを確保する + strOut.resize( cchOut ); + + // vswprintf_s() はコピーした文字数を返す。 + const int actualCopied = ::vswprintf_s( strOut.data(), strOut.capacity(), pszFormat, argList ); + if( actualCopied < 0 ){ + // データサイズを反映する + strOut.assign( strOut.data(), cchOut ); + } + + return actualCopied; +} + +/*! + @brief C-Styleのフォーマット文字列を使ってデータを文字列化する。 + @param[out] strOut フォーマットされたテキストを受け取る変数 + @param[in] pszFormat フォーマット文字列 + @param[in] ... 引数リスト + @returns 出力された文字数。NUL終端を含まない。 + @retval >= 0 正常終了 + @retval < 0 異常終了 +*/ +int strprintf( std::wstring& strOut, const WCHAR* pszFormat, ... ) +{ + va_list argList; + va_start( argList, pszFormat ); + + const int nRet = vstrprintf( strOut, pszFormat, argList ); + + va_end( argList ); + + return nRet; +} + // -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- // // 文字コード変換 // // -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- // diff --git a/sakura_core/util/string_ex.h b/sakura_core/util/string_ex.h index d0c41273b5..ddf07e1ccf 100644 --- a/sakura_core/util/string_ex.h +++ b/sakura_core/util/string_ex.h @@ -26,6 +26,7 @@ #define SAKURA_STRING_EX_87282FEB_4B23_4112_9C5A_419F43618705_H_ #pragma once +#include #include // 2007.10.19 kobake @@ -202,50 +203,8 @@ inline int auto_vsprintf(WCHAR* buf, const WCHAR* format, va_list& v){ return tc inline int auto_vsprintf_s(ACHAR* buf, size_t nBufCount, const ACHAR* format, va_list& v){ return tchar_vsprintf_s(buf, nBufCount, format, v); } inline int auto_vsprintf_s(WCHAR* buf, size_t nBufCount, const WCHAR* format, va_list& v){ return tchar_vsprintf_s(buf, nBufCount, format, v); } -template -inline int vstrprintf( std::basic_string& strOut, const ChType* pszFormat, va_list& argList ) -{ - static_assert( 0, "not implemented" ); - return -1; -} - -template -inline int strprintf( std::basic_string& strOut, const ChType* pszFormat, ... ) -{ - static_assert( 0, "not implemented" ); - return -1; -} - -template<> -inline int vstrprintf( std::wstring& strOut, const WCHAR* pszFormat, va_list& argList ) -{ - strOut.clear(); - - const int cchOut = _vscwprintf( pszFormat, argList ); - if( cchOut > 0 ){ - - strOut.reserve( cchOut ); - - ::vswprintf_s( strOut.data(), strOut.capacity(), pszFormat, argList ); - - strOut.assign( strOut.data(), cchOut ); - } - - return cchOut; -} - -template<> -inline int strprintf( std::wstring& strOut, const WCHAR* pszFormat, ... ) -{ - va_list argList; - va_start( argList, pszFormat ); - - const int nRet = vstrprintf( strOut, pszFormat, argList ); - - va_end( argList ); - - return nRet; -} +int vstrprintf( std::wstring& strOut, const WCHAR* pszFormat, va_list& argList ); +int strprintf( std::wstring& strOut, const WCHAR* pszFormat, ... ); // -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- // // 文字コード変換 // From 984094707441ef43f7db352082bfe8e65953509c Mon Sep 17 00:00:00 2001 From: Mari Sano Date: Mon, 26 Oct 2020 22:02:21 +0900 Subject: [PATCH 15/18] =?UTF-8?q?CodeFactor=E8=AD=A6=E5=91=8A(CMainToolBar?= =?UTF-8?q?::CreateToolBar)=E3=81=AE=E5=AF=BE=E5=BF=9C=E6=BA=96=E5=82=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit メソッドの複雑度を低減させるリファクタリングの準備として、利用箇所から遠く離れた変数宣言を利用箇所にくっ付ける。 --- sakura_core/window/CMainToolBar.cpp | 40 +++++++++-------------------- 1 file changed, 12 insertions(+), 28 deletions(-) diff --git a/sakura_core/window/CMainToolBar.cpp b/sakura_core/window/CMainToolBar.cpp index eb6a14c001..fb59d330f4 100644 --- a/sakura_core/window/CMainToolBar.cpp +++ b/sakura_core/window/CMainToolBar.cpp @@ -123,17 +123,9 @@ void CMainToolBar::CreateToolBar( void ) { if( m_hwndToolBar )return; - REBARINFO rbi; - REBARBANDINFO rbBand; - int nFlag; - TBBUTTON tbb; - int i; - int nIdx; - LONG_PTR lToolType; - nFlag = 0; - // 2006.06.17 ryoji // Rebar ウィンドウの作成 + DWORD dwAddtionalStyle = 0; if( IsVisualStyle() ){ // ビジュアルスタイル有効 m_hwndReBar = ::CreateWindowEx( WS_EX_TOOLWINDOW, @@ -157,11 +149,10 @@ void CMainToolBar::CreateToolBar( void ) PreventVisualStyle( m_hwndReBar ); // ビジュアルスタイル非適用のフラットな Rebar にする } - ::ZeroMemory(&rbi, sizeof(rbi)); - rbi.cbSize = sizeof(rbi); + REBARINFO rbi = { sizeof(REBARINFO) }; Rebar_SetbarInfo(m_hwndReBar, &rbi); - nFlag = CCS_NORESIZE | CCS_NODIVIDER | CCS_NOPARENTALIGN | TBSTYLE_FLAT; // ツールバーへの追加スタイル + dwAddtionalStyle = CCS_NORESIZE | CCS_NODIVIDER | CCS_NOPARENTALIGN | TBSTYLE_FLAT; // ツールバーへの追加スタイル } /* ツールバーウィンドウの作成 */ @@ -169,13 +160,7 @@ void CMainToolBar::CreateToolBar( void ) 0, TOOLBARCLASSNAME, NULL, - WS_CHILD/* | WS_VISIBLE*/ | WS_CLIPCHILDREN | /*WS_BORDER | */ // 2006.06.17 ryoji WS_CLIPCHILDREN 追加 // 2007.03.08 ryoji WS_VISIBLE 除去 -/* WS_EX_WINDOWEDGE| */ - TBSTYLE_TOOLTIPS | -// TBSTYLE_WRAPABLE | -// TBSTYLE_ALTDRAG | -// CCS_ADJUSTABLE | - nFlag, + WS_CHILD | WS_CLIPCHILDREN | TBSTYLE_TOOLTIPS | dwAddtionalStyle, 0, 0, 0, 0, m_pOwner->GetHwnd(), @@ -217,9 +202,10 @@ void CMainToolBar::CreateToolBar( void ) int nToolBarButtonNum = 0;// 2005/8/29 aroka // From Here 2005.08.29 aroka // はじめにツールバー構造体の配列を作っておく - TBBUTTON *pTbbArr = new TBBUTTON[GetDllShareData().m_Common.m_sToolBar.m_nToolBarButtonNum]; - for( i = 0; i < GetDllShareData().m_Common.m_sToolBar.m_nToolBarButtonNum; ++i ){ - nIdx = GetDllShareData().m_Common.m_sToolBar.m_nToolBarButtonIdxArr[i]; + std::vector vTbButtons(GetDllShareData().m_Common.m_sToolBar.m_nToolBarButtonNum); + TBBUTTON *pTbbArr = vTbButtons.data();; + for( int i = 0; i < GetDllShareData().m_Common.m_sToolBar.m_nToolBarButtonNum; ++i ){ + int nIdx = GetDllShareData().m_Common.m_sToolBar.m_nToolBarButtonIdxArr[i]; pTbbArr[nToolBarButtonNum] = m_pOwner->GetMenuDrawer().getButton(nIdx); // セパレータが続くときはひとつにまとめる // 折り返しボタンもTBSTYLE_SEP属性を持っているので @@ -241,8 +227,8 @@ void CMainToolBar::CreateToolBar( void ) } // To Here 2005.08.29 aroka - for( i = 0; i < nToolBarButtonNum; ++i ){ - tbb = pTbbArr[i]; + for( int i = 0; i < nToolBarButtonNum; ++i ){ + auto tbb = pTbbArr[i]; //@@@ 2002.06.15 MIK start switch( tbb.fsStyle ) @@ -359,12 +345,11 @@ void CMainToolBar::CreateToolBar( void ) //@@@ 2002.06.15 MIK end } if( GetDllShareData().m_Common.m_sToolBar.m_bToolBarIsFlat ){ /* フラットツールバーにする/しない */ - lToolType = ::GetWindowLongPtr(m_hwndToolBar, GWL_STYLE); + LONG_PTR lToolType = ::GetWindowLongPtr(m_hwndToolBar, GWL_STYLE); lToolType |= (TBSTYLE_FLAT); ::SetWindowLongPtr(m_hwndToolBar, GWL_STYLE, lToolType); ::InvalidateRect(m_hwndToolBar, NULL, TRUE); } - delete []pTbbArr;// 2005/8/29 aroka } // 2006.06.17 ryoji @@ -375,8 +360,7 @@ void CMainToolBar::CreateToolBar( void ) DWORD dwRows = Toolbar_GetRows( m_hwndToolBar ); // バンド情報を設定する - // 以前のプラットフォームに _WIN32_WINNT >= 0x0600 で定義される構造体のフルサイズを渡すと失敗する // 2007.12.21 ryoji - rbBand.cbSize = CCSIZEOF_STRUCT( REBARBANDINFO, wID ); + REBARBANDINFO rbBand = { CCSIZEOF_STRUCT(REBARBANDINFO, cxHeader) }; rbBand.fMask = RBBIM_STYLE | RBBIM_CHILD | RBBIM_CHILDSIZE | RBBIM_SIZE; rbBand.fStyle = RBBS_CHILDEDGE; rbBand.hwndChild = m_hwndToolBar; // ツールバー From 49d69f3a1786c185a6189b2dec479f5c5f637ae4 Mon Sep 17 00:00:00 2001 From: Mari Sano Date: Tue, 27 Oct 2020 22:10:51 +0900 Subject: [PATCH 16/18] =?UTF-8?q?CodeFactor=E8=AD=A6=E5=91=8A(CMainToolBar?= =?UTF-8?q?::CreateToolBar)=E3=81=AE=E5=AF=BE=E5=BF=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit メソッドの複雑度を低減させるため、ツールバー作成に失敗したら関数を抜けるように変更。 --- sakura_core/window/CMainToolBar.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/sakura_core/window/CMainToolBar.cpp b/sakura_core/window/CMainToolBar.cpp index fb59d330f4..5cca59bea5 100644 --- a/sakura_core/window/CMainToolBar.cpp +++ b/sakura_core/window/CMainToolBar.cpp @@ -174,6 +174,8 @@ void CMainToolBar::CreateToolBar( void ) } TopWarningMessage( m_pOwner->GetHwnd(), LS(STR_ERR_DLGEDITWND05) ); DestroyToolBar(); // 2006.06.17 ryoji + + return; } else{ // 2006.09.06 ryoji ツールバーをサブクラス化する @@ -354,7 +356,7 @@ void CMainToolBar::CreateToolBar( void ) // 2006.06.17 ryoji // ツールバーを Rebar に入れる - if( m_hwndReBar && m_hwndToolBar ){ + if( m_hwndReBar ){ // ツールバーの高さを取得する DWORD dwBtnSize = Toolbar_GetButtonSize( m_hwndToolBar ); DWORD dwRows = Toolbar_GetRows( m_hwndToolBar ); From 3f36e068d185961798e1fa15f292c7f3f860c80f Mon Sep 17 00:00:00 2001 From: Mari Sano Date: Mon, 26 Oct 2020 22:26:54 +0900 Subject: [PATCH 17/18] =?UTF-8?q?CodeFactor=E8=AD=A6=E5=91=8A(CMainToolBar?= =?UTF-8?q?::CreateToolBar)=E3=81=AE=E5=AF=BE=E5=BF=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit メソッドの複雑度を低減させるため、ツールバーボタンの作成処理を分離する。 --- sakura_core/window/CMainToolBar.cpp | 53 ++++++++++++++++------------- sakura_core/window/CMainToolBar.h | 5 ++- 2 files changed, 33 insertions(+), 25 deletions(-) diff --git a/sakura_core/window/CMainToolBar.cpp b/sakura_core/window/CMainToolBar.cpp index 5cca59bea5..cfa80d0f43 100644 --- a/sakura_core/window/CMainToolBar.cpp +++ b/sakura_core/window/CMainToolBar.cpp @@ -185,6 +185,35 @@ void CMainToolBar::CreateToolBar( void ) (LONG_PTR)ToolBarWndProc ); + NewFunction(); + } + + // 2006.06.17 ryoji + // ツールバーを Rebar に入れる + if( m_hwndReBar ){ + // ツールバーの高さを取得する + DWORD dwBtnSize = Toolbar_GetButtonSize( m_hwndToolBar ); + DWORD dwRows = Toolbar_GetRows( m_hwndToolBar ); + + // バンド情報を設定する + REBARBANDINFO rbBand = { CCSIZEOF_STRUCT(REBARBANDINFO, cxHeader) }; + rbBand.fMask = RBBIM_STYLE | RBBIM_CHILD | RBBIM_CHILDSIZE | RBBIM_SIZE; + rbBand.fStyle = RBBS_CHILDEDGE; + rbBand.hwndChild = m_hwndToolBar; // ツールバー + rbBand.cxMinChild = 0; + rbBand.cyMinChild = HIWORD(dwBtnSize) * dwRows; + rbBand.cx = 250; + + // バンドを追加する + Rebar_InsertBand( m_hwndReBar, -1, &rbBand ); + ::ShowWindow( m_hwndToolBar, SW_SHOW ); + } + + return; +} + +void CMainToolBar::NewFunction() +{ // pixel数をベタ書きするとHighDPI環境でずれるのでシステム値を取得して使う const int cxBorder = DpiScaleX( 1 ); const int cyBorder = DpiScaleY( 1 ); @@ -352,30 +381,6 @@ void CMainToolBar::CreateToolBar( void ) ::SetWindowLongPtr(m_hwndToolBar, GWL_STYLE, lToolType); ::InvalidateRect(m_hwndToolBar, NULL, TRUE); } - } - - // 2006.06.17 ryoji - // ツールバーを Rebar に入れる - if( m_hwndReBar ){ - // ツールバーの高さを取得する - DWORD dwBtnSize = Toolbar_GetButtonSize( m_hwndToolBar ); - DWORD dwRows = Toolbar_GetRows( m_hwndToolBar ); - - // バンド情報を設定する - REBARBANDINFO rbBand = { CCSIZEOF_STRUCT(REBARBANDINFO, cxHeader) }; - rbBand.fMask = RBBIM_STYLE | RBBIM_CHILD | RBBIM_CHILDSIZE | RBBIM_SIZE; - rbBand.fStyle = RBBS_CHILDEDGE; - rbBand.hwndChild = m_hwndToolBar; // ツールバー - rbBand.cxMinChild = 0; - rbBand.cyMinChild = HIWORD(dwBtnSize) * dwRows; - rbBand.cx = 250; - - // バンドを追加する - Rebar_InsertBand( m_hwndReBar, -1, &rbBand ); - ::ShowWindow( m_hwndToolBar, SW_SHOW ); - } - - return; } void CMainToolBar::DestroyToolBar( void ) diff --git a/sakura_core/window/CMainToolBar.h b/sakura_core/window/CMainToolBar.h index b27ff43a1b..e6a3de09ae 100644 --- a/sakura_core/window/CMainToolBar.h +++ b/sakura_core/window/CMainToolBar.h @@ -39,7 +39,7 @@ class CMainToolBar{ void Create( CImageListMgr* pcIcons ); //作成・破棄 - void CreateToolBar( void ); //!< ツールバー作成 + void CreateToolBar( void ); //!< ツールバー作成 void DestroyToolBar( void ); //!< ツールバー破棄 //メッセージ @@ -65,6 +65,9 @@ class CMainToolBar{ //操作 void SetFocusSearchBox( void ) const; /* ツールバー検索ボックスへフォーカスを移動 */ // 2006.06.04 yukihane +protected: + void CreateTools( void ); + private: CEditWnd* m_pOwner; HWND m_hwndToolBar; From 883eee4ca80f1bf791cd8451bd4af89dd072e675 Mon Sep 17 00:00:00 2001 From: Mari Sano Date: Mon, 26 Oct 2020 22:30:14 +0900 Subject: [PATCH 18/18] =?UTF-8?q?=E3=82=A4=E3=83=B3=E3=83=87=E3=83=B3?= =?UTF-8?q?=E3=83=88=E8=A8=82=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- sakura_core/window/CMainToolBar.cpp | 322 ++++++++++++++-------------- 1 file changed, 161 insertions(+), 161 deletions(-) diff --git a/sakura_core/window/CMainToolBar.cpp b/sakura_core/window/CMainToolBar.cpp index cfa80d0f43..a3241f9770 100644 --- a/sakura_core/window/CMainToolBar.cpp +++ b/sakura_core/window/CMainToolBar.cpp @@ -177,16 +177,16 @@ void CMainToolBar::CreateToolBar( void ) return; } - else{ - // 2006.09.06 ryoji ツールバーをサブクラス化する - g_pOldToolBarWndProc = (WNDPROC)::SetWindowLongPtr( - m_hwndToolBar, - GWLP_WNDPROC, - (LONG_PTR)ToolBarWndProc - ); - NewFunction(); - } + // 2006.09.06 ryoji ツールバーをサブクラス化する + g_pOldToolBarWndProc = (WNDPROC)::SetWindowLongPtr( + m_hwndToolBar, + GWLP_WNDPROC, + (LONG_PTR)ToolBarWndProc + ); + + // ツールバーにボタンを追加する + CreateToolBarButtons(); // 2006.06.17 ryoji // ツールバーを Rebar に入れる @@ -212,175 +212,175 @@ void CMainToolBar::CreateToolBar( void ) return; } -void CMainToolBar::NewFunction() +void CMainToolBar::CreateToolBarButtons() { - // pixel数をベタ書きするとHighDPI環境でずれるのでシステム値を取得して使う - const int cxBorder = DpiScaleX( 1 ); - const int cyBorder = DpiScaleY( 1 ); - const int cxEdge = DpiScaleX( 1 ); - const int cyEdge = DpiScaleY( 1 ); - const int cxSmIcon = DpiScaleX( 16 ); - const int cySmIcon = DpiScaleY( 16 ); - const int cxToolButton = cxBorder + cxEdge + cxSmIcon + cxEdge + cxBorder; //22 - const int cyToolButton = cyBorder + cyEdge + cySmIcon + cyEdge + cyBorder; //22 - Toolbar_SetButtonSize( m_hwndToolBar, cxToolButton, cyToolButton ); // 2009.10.01 ryoji 高DPI対応スケーリング - Toolbar_ButtonStructSize( m_hwndToolBar, sizeof(TBBUTTON) ); - // Oct. 12, 2000 genta - // 既に用意されているImage Listをアイコンとして登録 - m_pcIcons->SetToolBarImages( m_hwndToolBar ); - /* ツールバーにボタンを追加 */ - int count = 0; //@@@ 2002.06.15 MIK - int nToolBarButtonNum = 0;// 2005/8/29 aroka - // From Here 2005.08.29 aroka - // はじめにツールバー構造体の配列を作っておく - std::vector vTbButtons(GetDllShareData().m_Common.m_sToolBar.m_nToolBarButtonNum); - TBBUTTON *pTbbArr = vTbButtons.data();; - for( int i = 0; i < GetDllShareData().m_Common.m_sToolBar.m_nToolBarButtonNum; ++i ){ - int nIdx = GetDllShareData().m_Common.m_sToolBar.m_nToolBarButtonIdxArr[i]; - pTbbArr[nToolBarButtonNum] = m_pOwner->GetMenuDrawer().getButton(nIdx); - // セパレータが続くときはひとつにまとめる - // 折り返しボタンもTBSTYLE_SEP属性を持っているので - // 折り返しの前のセパレータは全て削除される. - if( (pTbbArr[nToolBarButtonNum].fsStyle & TBSTYLE_SEP) && (nToolBarButtonNum!=0)){ - if( (pTbbArr[nToolBarButtonNum-1].fsStyle & TBSTYLE_SEP) ){ - pTbbArr[nToolBarButtonNum-1] = pTbbArr[nToolBarButtonNum]; - nToolBarButtonNum--; - } + // pixel数をベタ書きするとHighDPI環境でずれるのでシステム値を取得して使う + const int cxBorder = DpiScaleX( 1 ); + const int cyBorder = DpiScaleY( 1 ); + const int cxEdge = DpiScaleX( 1 ); + const int cyEdge = DpiScaleY( 1 ); + const int cxSmIcon = DpiScaleX( 16 ); + const int cySmIcon = DpiScaleY( 16 ); + const int cxToolButton = cxBorder + cxEdge + cxSmIcon + cxEdge + cxBorder; //22 + const int cyToolButton = cyBorder + cyEdge + cySmIcon + cyEdge + cyBorder; //22 + Toolbar_SetButtonSize( m_hwndToolBar, cxToolButton, cyToolButton ); // 2009.10.01 ryoji 高DPI対応スケーリング + Toolbar_ButtonStructSize( m_hwndToolBar, sizeof(TBBUTTON) ); + // Oct. 12, 2000 genta + // 既に用意されているImage Listをアイコンとして登録 + m_pcIcons->SetToolBarImages( m_hwndToolBar ); + /* ツールバーにボタンを追加 */ + int count = 0; //@@@ 2002.06.15 MIK + int nToolBarButtonNum = 0;// 2005/8/29 aroka + // From Here 2005.08.29 aroka + // はじめにツールバー構造体の配列を作っておく + std::vector vTbButtons(GetDllShareData().m_Common.m_sToolBar.m_nToolBarButtonNum); + TBBUTTON *pTbbArr = vTbButtons.data();; + for( int i = 0; i < GetDllShareData().m_Common.m_sToolBar.m_nToolBarButtonNum; ++i ){ + int nIdx = GetDllShareData().m_Common.m_sToolBar.m_nToolBarButtonIdxArr[i]; + pTbbArr[nToolBarButtonNum] = m_pOwner->GetMenuDrawer().getButton(nIdx); + // セパレータが続くときはひとつにまとめる + // 折り返しボタンもTBSTYLE_SEP属性を持っているので + // 折り返しの前のセパレータは全て削除される. + if( (pTbbArr[nToolBarButtonNum].fsStyle & TBSTYLE_SEP) && (nToolBarButtonNum!=0)){ + if( (pTbbArr[nToolBarButtonNum-1].fsStyle & TBSTYLE_SEP) ){ + pTbbArr[nToolBarButtonNum-1] = pTbbArr[nToolBarButtonNum]; + nToolBarButtonNum--; } - // 仮想折返しボタンがきたら直前のボタンに折返し属性を付ける - if( pTbbArr[nToolBarButtonNum].fsState & TBSTATE_WRAP ){ - if( nToolBarButtonNum!=0 ){ - pTbbArr[nToolBarButtonNum-1].fsState |= TBSTATE_WRAP; - } - continue; + } + // 仮想折返しボタンがきたら直前のボタンに折返し属性を付ける + if( pTbbArr[nToolBarButtonNum].fsState & TBSTATE_WRAP ){ + if( nToolBarButtonNum!=0 ){ + pTbbArr[nToolBarButtonNum-1].fsState |= TBSTATE_WRAP; } - nToolBarButtonNum++; + continue; } - // To Here 2005.08.29 aroka + nToolBarButtonNum++; + } + // To Here 2005.08.29 aroka - for( int i = 0; i < nToolBarButtonNum; ++i ){ - auto tbb = pTbbArr[i]; + for( int i = 0; i < nToolBarButtonNum; ++i ){ + auto tbb = pTbbArr[i]; - //@@@ 2002.06.15 MIK start - switch( tbb.fsStyle ) + //@@@ 2002.06.15 MIK start + switch( tbb.fsStyle ) + { + case TBSTYLE_DROPDOWN: //ドロップダウン + //拡張スタイルに設定 + Toolbar_SetExtendedStyle( m_hwndToolBar, TBSTYLE_EX_DRAWDDARROWS ); + Toolbar_AddButtons( m_hwndToolBar, 1, &tbb ); + count++; + break; + + case TBSTYLE_COMBOBOX: //コンボボックス { - case TBSTYLE_DROPDOWN: //ドロップダウン - //拡張スタイルに設定 - Toolbar_SetExtendedStyle( m_hwndToolBar, TBSTYLE_EX_DRAWDDARROWS ); - Toolbar_AddButtons( m_hwndToolBar, 1, &tbb ); - count++; - break; - - case TBSTYLE_COMBOBOX: //コンボボックス - { - RECT rc; - TBBUTTONINFO tbi; - TBBUTTON my_tbb; - LOGFONT lf; + RECT rc; + TBBUTTONINFO tbi; + TBBUTTON my_tbb; + LOGFONT lf; - switch( tbb.idCommand ) + switch( tbb.idCommand ) + { + case F_SEARCH_BOX: + if( m_hwndSearchBox ) { - case F_SEARCH_BOX: - if( m_hwndSearchBox ) - { - break; - } + break; + } - //セパレータ作る - memset_raw( &my_tbb, 0, sizeof(my_tbb) ); - my_tbb.fsStyle = TBSTYLE_BUTTON; //ボタンにしないと描画が乱れる 2005/8/29 aroka - my_tbb.idCommand = tbb.idCommand; //同じIDにしておく - if( tbb.fsState & TBSTATE_WRAP ){ //折り返し 2005/8/29 aroka - my_tbb.fsState |= TBSTATE_WRAP; - } - Toolbar_AddButtons( m_hwndToolBar, 1, &my_tbb ); - count++; - - //サイズを設定する - tbi.cbSize = sizeof(tbi); - tbi.dwMask = TBIF_SIZE; - tbi.cx = (WORD)DpiScaleX(160); //ボックスの幅 // 2009.10.01 ryoji 高DPI対応スケーリング - Toolbar_SetButtonInfo( m_hwndToolBar, tbb.idCommand, &tbi ); - - //位置とサイズを取得する - rc.right = rc.left = rc.top = rc.bottom = 0; - Toolbar_GetItemRect( m_hwndToolBar, count-1, &rc ); - - //コンボボックスを作る - m_hwndSearchBox = CreateWindow( WC_COMBOBOX, L"Combo", - WS_CHILD | WS_VISIBLE | WS_TABSTOP | WS_VSCROLL | CBS_DROPDOWN - /*| CBS_SORT*/ | CBS_AUTOHSCROLL /*| CBS_DISABLENOSCROLL*/, - rc.left, rc.top, rc.right - rc.left, (rc.bottom - rc.top) * 10, - m_hwndToolBar, (HMENU)(INT_PTR)tbb.idCommand, CEditApp::getInstance()->GetAppInstance(), NULL ); - if( m_hwndSearchBox ) + //セパレータ作る + memset_raw( &my_tbb, 0, sizeof(my_tbb) ); + my_tbb.fsStyle = TBSTYLE_BUTTON; //ボタンにしないと描画が乱れる 2005/8/29 aroka + my_tbb.idCommand = tbb.idCommand; //同じIDにしておく + if( tbb.fsState & TBSTATE_WRAP ){ //折り返し 2005/8/29 aroka + my_tbb.fsState |= TBSTATE_WRAP; + } + Toolbar_AddButtons( m_hwndToolBar, 1, &my_tbb ); + count++; + + //サイズを設定する + tbi.cbSize = sizeof(tbi); + tbi.dwMask = TBIF_SIZE; + tbi.cx = (WORD)DpiScaleX(160); //ボックスの幅 // 2009.10.01 ryoji 高DPI対応スケーリング + Toolbar_SetButtonInfo( m_hwndToolBar, tbb.idCommand, &tbi ); + + //位置とサイズを取得する + rc.right = rc.left = rc.top = rc.bottom = 0; + Toolbar_GetItemRect( m_hwndToolBar, count-1, &rc ); + + //コンボボックスを作る + m_hwndSearchBox = CreateWindow( WC_COMBOBOX, L"Combo", + WS_CHILD | WS_VISIBLE | WS_TABSTOP | WS_VSCROLL | CBS_DROPDOWN + /*| CBS_SORT*/ | CBS_AUTOHSCROLL /*| CBS_DISABLENOSCROLL*/, + rc.left, rc.top, rc.right - rc.left, (rc.bottom - rc.top) * 10, + m_hwndToolBar, (HMENU)(INT_PTR)tbb.idCommand, CEditApp::getInstance()->GetAppInstance(), NULL ); + if( m_hwndSearchBox ) + { + m_pOwner->SetCurrentFocus(0); + + lf = m_pOwner->GetLogfont(); + //memset_raw( &lf, 0, sizeof(lf) ); + lf.lfHeight = DpiPointsToPixels(-9); // Jan. 14, 2003 genta ダイアログにあわせてちょっと小さく // 2009.10.01 ryoji 高DPI対応(ポイント数から算出) + lf.lfWidth = 0; + lf.lfEscapement = 0; + lf.lfOrientation = 0; + lf.lfWeight = FW_NORMAL; + lf.lfItalic = FALSE; + lf.lfUnderline = FALSE; + lf.lfStrikeOut = FALSE; + //lf.lfCharSet = GetDllShareData().m_Common.m_sView.m_lf.lfCharSet; + lf.lfOutPrecision = OUT_TT_ONLY_PRECIS; // Raster Font を使わないように + //lf.lfClipPrecision = GetDllShareData().m_Common.m_sView.m_lf.lfClipPrecision; + //lf.lfQuality = GetDllShareData().m_Common.m_sView.m_lf.lfQuality; + //lf.lfPitchAndFamily = GetDllShareData().m_Common.m_sView.m_lf.lfPitchAndFamily; + //wcsncpy( lf.lfFaceName, GetDllShareData().m_Common.m_sView.m_lf.lfFaceName, _countof(lf.lfFaceName)); // 画面のフォントに設定 2012/11/27 Uchi + m_hFontSearchBox = ::CreateFontIndirect( &lf ); + if( m_hFontSearchBox ) { - m_pOwner->SetCurrentFocus(0); - - lf = m_pOwner->GetLogfont(); - //memset_raw( &lf, 0, sizeof(lf) ); - lf.lfHeight = DpiPointsToPixels(-9); // Jan. 14, 2003 genta ダイアログにあわせてちょっと小さく // 2009.10.01 ryoji 高DPI対応(ポイント数から算出) - lf.lfWidth = 0; - lf.lfEscapement = 0; - lf.lfOrientation = 0; - lf.lfWeight = FW_NORMAL; - lf.lfItalic = FALSE; - lf.lfUnderline = FALSE; - lf.lfStrikeOut = FALSE; - //lf.lfCharSet = GetDllShareData().m_Common.m_sView.m_lf.lfCharSet; - lf.lfOutPrecision = OUT_TT_ONLY_PRECIS; // Raster Font を使わないように - //lf.lfClipPrecision = GetDllShareData().m_Common.m_sView.m_lf.lfClipPrecision; - //lf.lfQuality = GetDllShareData().m_Common.m_sView.m_lf.lfQuality; - //lf.lfPitchAndFamily = GetDllShareData().m_Common.m_sView.m_lf.lfPitchAndFamily; - //wcsncpy( lf.lfFaceName, GetDllShareData().m_Common.m_sView.m_lf.lfFaceName, _countof(lf.lfFaceName)); // 画面のフォントに設定 2012/11/27 Uchi - m_hFontSearchBox = ::CreateFontIndirect( &lf ); - if( m_hFontSearchBox ) - { - ::SendMessage( m_hwndSearchBox, WM_SETFONT, (WPARAM)m_hFontSearchBox, MAKELONG (TRUE, 0) ); - } - - // //入力長制限 - // Combo_LimitText( m_hwndSearchBox, (WPARAM)_MAX_PATH - 1 ); - - //検索ボックスを更新 // 関数化 2010/6/6 Uchi - AcceptSharedSearchKey(); - - m_comboDel = SComboBoxItemDeleter(); // 再表示用の初期化 - m_comboDel.pRecent = &m_cRecentSearch; - CDialog::SetComboBoxDeleter(m_hwndSearchBox, &m_comboDel); - - // コンボボックスの位置と幅を調整する - CMyRect rcCombo; - ::GetWindowRect( m_hwndSearchBox, &rcCombo ); - ::SetWindowPos( m_hwndSearchBox, NULL, - rc.left + cxBorder, - rc.top + (rc.bottom - rc.top - rcCombo.Height()) / 2, - rcCombo.Width() - cxBorder * 2, - rcCombo.Height(), - SWP_NOZORDER | SWP_NOACTIVATE | SWP_NOOWNERZORDER | SWP_NOSENDCHANGING ); + ::SendMessage( m_hwndSearchBox, WM_SETFONT, (WPARAM)m_hFontSearchBox, MAKELONG (TRUE, 0) ); } - break; - default: - break; + // //入力長制限 + // Combo_LimitText( m_hwndSearchBox, (WPARAM)_MAX_PATH - 1 ); + + //検索ボックスを更新 // 関数化 2010/6/6 Uchi + AcceptSharedSearchKey(); + + m_comboDel = SComboBoxItemDeleter(); // 再表示用の初期化 + m_comboDel.pRecent = &m_cRecentSearch; + CDialog::SetComboBoxDeleter(m_hwndSearchBox, &m_comboDel); + + // コンボボックスの位置と幅を調整する + CMyRect rcCombo; + ::GetWindowRect( m_hwndSearchBox, &rcCombo ); + ::SetWindowPos( m_hwndSearchBox, NULL, + rc.left + cxBorder, + rc.top + (rc.bottom - rc.top - rcCombo.Height()) / 2, + rcCombo.Width() - cxBorder * 2, + rcCombo.Height(), + SWP_NOZORDER | SWP_NOACTIVATE | SWP_NOOWNERZORDER | SWP_NOSENDCHANGING ); } + break; + + default: + break; } - break; - - case TBSTYLE_BUTTON: //ボタン - case TBSTYLE_SEP: //セパレータ - default: - Toolbar_AddButtons( m_hwndToolBar, 1, &tbb ); - count++; - break; } - //@@@ 2002.06.15 MIK end - } - if( GetDllShareData().m_Common.m_sToolBar.m_bToolBarIsFlat ){ /* フラットツールバーにする/しない */ - LONG_PTR lToolType = ::GetWindowLongPtr(m_hwndToolBar, GWL_STYLE); - lToolType |= (TBSTYLE_FLAT); - ::SetWindowLongPtr(m_hwndToolBar, GWL_STYLE, lToolType); - ::InvalidateRect(m_hwndToolBar, NULL, TRUE); + break; + + case TBSTYLE_BUTTON: //ボタン + case TBSTYLE_SEP: //セパレータ + default: + Toolbar_AddButtons( m_hwndToolBar, 1, &tbb ); + count++; + break; } + //@@@ 2002.06.15 MIK end + } + if( GetDllShareData().m_Common.m_sToolBar.m_bToolBarIsFlat ){ /* フラットツールバーにする/しない */ + LONG_PTR lToolType = ::GetWindowLongPtr(m_hwndToolBar, GWL_STYLE); + lToolType |= (TBSTYLE_FLAT); + ::SetWindowLongPtr(m_hwndToolBar, GWL_STYLE, lToolType); + ::InvalidateRect(m_hwndToolBar, NULL, TRUE); + } } void CMainToolBar::DestroyToolBar( void )