Skip to content

Commit 5b520a2

Browse files
committed
Support Subclassing Controls Using ComCtl32.dll version 6
1 parent 0c8c77c commit 5b520a2

3 files changed

Lines changed: 15 additions & 32 deletions

File tree

sakura_core/typeprop/CDlgSameColor.cpp

Lines changed: 10 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -41,12 +41,7 @@ LPVOID CDlgSameColor::GetHelpIdTable( void )
4141
return (LPVOID)p_helpids;
4242
}
4343

44-
CDlgSameColor::CDlgSameColor() :
45-
m_wpColorStaticProc(NULL),
46-
m_wpColorListProc(NULL),
47-
m_wID(0),
48-
m_pTypes(NULL),
49-
m_cr(0)
44+
CDlgSameColor::CDlgSameColor()
5045
{
5146
return;
5247
}
@@ -119,10 +114,8 @@ BOOL CDlgSameColor::OnInitDialog( HWND hwndDlg, WPARAM wParam, LPARAM lParam )
119114
HWND hwndList = GetItemHwnd( IDC_LIST_COLORS );
120115

121116
// 指定色スタティック、色選択リストをサブクラス化
122-
::SetWindowLongPtr( hwndStatic, GWLP_USERDATA, (LONG_PTR)this );
123-
m_wpColorStaticProc = (WNDPROC)::SetWindowLongPtr( hwndStatic, GWLP_WNDPROC, (LONG_PTR)ColorStatic_SubclassProc );
124-
::SetWindowLongPtr( hwndList, GWLP_USERDATA, (LONG_PTR)this );
125-
m_wpColorListProc = (WNDPROC)::SetWindowLongPtr( hwndList, GWLP_WNDPROC, (LONG_PTR)ColorList_SubclassProc );
117+
::SetWindowSubclass(hwndStatic, &ColorStatic_SubclassProc, 0, (DWORD_PTR)this);
118+
::SetWindowSubclass(hwndList, &ColorList_SubclassProc, 0, 0);
126119

127120
WCHAR szText[30];
128121
int nItem;
@@ -364,13 +357,12 @@ BOOL CDlgSameColor::OnSelChangeListColors( HWND hwndCtl )
364357
/*! サブクラス化された指定色スタティックのウィンドウプロシージャ
365358
@date 2006.04.26 ryoji 新規作成
366359
*/
367-
LRESULT CALLBACK CDlgSameColor::ColorStatic_SubclassProc( HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam )
360+
LRESULT CALLBACK CDlgSameColor::ColorStatic_SubclassProc( HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam, UINT_PTR uIdSubclass, DWORD_PTR dwRefData )
368361
{
369362
HDC hDC;
370363
RECT rc;
371364

372-
CDlgSameColor* pCDlgSameColor;
373-
pCDlgSameColor = (CDlgSameColor*)::GetWindowLongPtr( hwnd, GWLP_USERDATA );
365+
auto pCDlgSameColor = (CDlgSameColor *)dwRefData;
374366

375367
switch( uMsg ){
376368
case WM_PAINT:
@@ -408,31 +400,27 @@ LRESULT CALLBACK CDlgSameColor::ColorStatic_SubclassProc( HWND hwnd, UINT uMsg,
408400

409401
case WM_DESTROY:
410402
// サブクラス化解除
411-
::SetWindowLongPtr( hwnd, GWLP_WNDPROC, (LONG_PTR)pCDlgSameColor->m_wpColorStaticProc );
412-
pCDlgSameColor->m_wpColorStaticProc = NULL;
403+
::RemoveWindowSubclass(hwnd, &ColorStatic_SubclassProc, uIdSubclass);
413404
return (LRESULT)0;
414405

415406
default:
416407
break;
417408
}
418409

419-
return CallWindowProc( pCDlgSameColor->m_wpColorStaticProc, hwnd, uMsg, wParam, lParam );
410+
return ::DefSubclassProc(hwnd, uMsg, wParam, lParam);
420411
}
421412

422413
/*! サブクラス化された色選択リストのウィンドウプロシージャ
423414
@date 2006.04.26 ryoji 新規作成
424415
*/
425-
LRESULT CALLBACK CDlgSameColor::ColorList_SubclassProc( HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam )
416+
LRESULT CALLBACK CDlgSameColor::ColorList_SubclassProc( HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam, UINT_PTR uIdSubclass, [[maybe_unused]] DWORD_PTR dwRefData )
426417
{
427418
POINT po;
428419
RECT rcItem;
429420
RECT rc;
430421
int nItemNum;
431422
int i;
432423

433-
CDlgSameColor* pCDlgSameColor;
434-
pCDlgSameColor = (CDlgSameColor*)::GetWindowLongPtr( hwnd, GWLP_USERDATA );
435-
436424
switch( uMsg ){
437425
case WM_LBUTTONUP:
438426
// マウスボタン下にある項目の選択/選択解除をトグルする
@@ -471,13 +459,12 @@ LRESULT CALLBACK CDlgSameColor::ColorList_SubclassProc( HWND hwnd, UINT uMsg, WP
471459

472460
case WM_DESTROY:
473461
// サブクラス化解除
474-
::SetWindowLongPtr( hwnd, GWLP_WNDPROC, (LONG_PTR)pCDlgSameColor->m_wpColorListProc );
475-
pCDlgSameColor->m_wpColorListProc = NULL;
462+
::RemoveWindowSubclass(hwnd, &ColorList_SubclassProc, uIdSubclass);
476463
return (LRESULT)0;
477464

478465
default:
479466
break;
480467
}
481468

482-
return ::CallWindowProc( pCDlgSameColor->m_wpColorListProc, hwnd, uMsg, wParam, lParam );
469+
return ::DefSubclassProc(hwnd, uMsg, wParam, lParam);
483470
}

sakura_core/typeprop/CDlgSameColor.h

Lines changed: 5 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -40,14 +40,11 @@ class CDlgSameColor final : public CDialog
4040
BOOL OnDrawItem( WPARAM wParam, LPARAM lParam ) override; //!< WM_DRAWITEM 処理
4141
BOOL OnSelChangeListColors( HWND hwndCtl ); //!< 色選択リストの LBN_SELCHANGE 処理
4242

43-
static LRESULT CALLBACK ColorStatic_SubclassProc( HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam ); //!< サブクラス化された指定色スタティックのウィンドウプロシージャ
44-
static LRESULT CALLBACK ColorList_SubclassProc( HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam ); //!< サブクラス化された色選択リストのウィンドウプロシージャ
43+
static LRESULT CALLBACK ColorStatic_SubclassProc( HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam, UINT_PTR uIdSubclass, DWORD_PTR dwRefData ); //!< サブクラス化された指定色スタティックのウィンドウプロシージャ
44+
static LRESULT CALLBACK ColorList_SubclassProc( HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam, UINT_PTR uIdSubclass, DWORD_PTR dwRefData ); //!< サブクラス化された色選択リストのウィンドウプロシージャ
4545

46-
WNDPROC m_wpColorStaticProc; //!< サブクラス化以前の指定色スタティックのウィンドウプロシージャ
47-
WNDPROC m_wpColorListProc; //!< サブクラス化以前の色選択リストのウィンドウプロシージャ
48-
49-
WORD m_wID; //!< タイプ別設定ダイアログ(親ダイアログ)で押されたボタンID
50-
STypeConfig* m_pTypes; //!< タイプ別設定データ
51-
COLORREF m_cr; //!< 指定色
46+
WORD m_wID = 0; //!< タイプ別設定ダイアログ(親ダイアログ)で押されたボタンID
47+
STypeConfig* m_pTypes = nullptr; //!< タイプ別設定データ
48+
COLORREF m_cr = 0; //!< 指定色
5249
};
5350
#endif /* SAKURA_CDLGSAMECOLOR_181C0F46_A420_4A62_A543_FE2B88C20FBE_H_ */

sakura_core/typeprop/CPropTypesWindow.cpp

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,6 @@
1515
#include "env/CShareData.h"
1616
#include "typeprop/CImpExpManager.h" // 2010/4/23 Uchi
1717
#include "dlg/CDlgOpenFile.h"
18-
#include "CDlgSameColor.h"
1918
#include "CDlgKeywordSelect.h"
2019
#include "view/colors/EColorIndexType.h"
2120
#include "charset/CCodePage.h"

0 commit comments

Comments
 (0)