中国象棋控件 v2.0.13
载入中...
搜索中...
未找到
ChineseChessActiveXCtrl.cpp
1// ChineseChessActiveXCtrl.cpp : CChineseChessActiveXCtrl ActiveX ؼʵ֡
2
3#include "stdafx.h"
4#include "ChineseChessActiveX.h"
6#include "ChineseChessActiveXPropPage.h"
7#include "afxdialogex.h"
8
9#include <atlconv.h>
10
11#ifdef _DEBUG
12#define new DEBUG_NEW
13#endif
14
15IMPLEMENT_DYNCREATE(CChineseChessActiveXCtrl, COleControl)
16
17// Ϣӳ
18
19BEGIN_MESSAGE_MAP(CChineseChessActiveXCtrl, COleControl)
20 ON_OLEVERB(AFX_IDS_VERB_PROPERTIES, OnProperties)
21// ON_WM_KEYUP()
22// ON_WM_LBUTTONUP()
23 ON_WM_SIZE()
24 ON_WM_CREATE()
25END_MESSAGE_MAP()
26
27// ӳ
28
29BEGIN_DISPATCH_MAP(CChineseChessActiveXCtrl, COleControl)
30 DISP_FUNCTION_ID(CChineseChessActiveXCtrl, "AboutBox", DISPID_ABOUTBOX, AboutBox, VT_EMPTY, VTS_NONE)
31 DISP_PROPERTY_EX_ID(CChineseChessActiveXCtrl, "QiPangColor", dispidQiPangColor, GetQiPangColor, SetQiPangColor, VT_COLOR)
32 DISP_PROPERTY_EX_ID(CChineseChessActiveXCtrl, "TiShiBoxColor", dispidTiShiBoxColor, GetTiShiBoxColor, SetTiShiBoxColor, VT_COLOR)
33 DISP_PROPERTY_EX_ID(CChineseChessActiveXCtrl, "BoardLayout", dispidBoardLayout, GetBoardLayout, SetBoardLayout, VT_I2)
34
35 DISP_PROPERTY_EX_ID(CChineseChessActiveXCtrl, "RedName", dispidRedName, GetRedName, SetRedName, VT_BSTR)
36 DISP_PROPERTY_EX_ID(CChineseChessActiveXCtrl, "BlackName", dispidBlackName, GetBlackName, SetBlackName, VT_BSTR)
37 DISP_PROPERTY_EX_ID(CChineseChessActiveXCtrl, "StartTime", dispidStartTime, GetStartTime, SetStartTime, VT_I4)
38 DISP_PROPERTY_EX_ID(CChineseChessActiveXCtrl, "EndTime", dispidEndTime, GetEndTime, SetEndTime, VT_I4)
39
40 DISP_PROPERTY_NOTIFY_ID(CChineseChessActiveXCtrl, "EnablePromptSound", dispidEnablePromptSound, m_EnablePromptSound, OnEnablePromptSoundChanged, VT_BOOL)
41 DISP_PROPERTY_NOTIFY_ID(CChineseChessActiveXCtrl, "EnablePromptMessage", dispidEnablePromptMessage, m_EnablePromptMessage, OnEnablePromptMessageChanged, VT_BOOL)
42
43 DISP_FUNCTION_ID(CChineseChessActiveXCtrl, "NextStep", dispidNextStep, NextStep, VT_BOOL, VTS_NONE)
44 DISP_FUNCTION_ID(CChineseChessActiveXCtrl, "PreviouStep", dispidPreviouStep, PreviouStep, VT_BOOL, VTS_NONE)
45 DISP_FUNCTION_ID(CChineseChessActiveXCtrl, "GoChess", dispidGoChess, GoChess, VT_BOOL, VTS_I2 VTS_I2)
46 DISP_FUNCTION_ID(CChineseChessActiveXCtrl, "SaveChessGame", dispidSaveChessGame, SaveChessGame, VT_BOOL, VTS_BSTR)
47 DISP_FUNCTION_ID(CChineseChessActiveXCtrl, "LoadChessGame", dispidLoadChessGame, LoadChessGame, VT_BOOL, VTS_BSTR)
48 DISP_FUNCTION_ID(CChineseChessActiveXCtrl, "AddGameTag", dispidAddGameTag, AddGameTag, VT_BOOL, VTS_BSTR VTS_BSTR)
49 DISP_FUNCTION_ID(CChineseChessActiveXCtrl, "GetgameTag", dispidGetgameTag, GetgameTag, VT_BSTR, VTS_BSTR)
50END_DISPATCH_MAP()
51
52// ¼ӳ
53
54BEGIN_EVENT_MAP(CChineseChessActiveXCtrl, COleControl)
55 EVENT_CUSTOM_ID("EventGoChess", eventidEventGoChess, EventGoChess, VTS_I2 VTS_I2 VTS_I4)
56END_EVENT_MAP()
57
58// ҳ
59
60// TODO: ҪӸҳסӼ!
61BEGIN_PROPPAGEIDS(CChineseChessActiveXCtrl, 1)
62 PROPPAGEID(CChineseChessActiveXPropPage::guid)
63END_PROPPAGEIDS(CChineseChessActiveXCtrl)
64
65// ʼ๤ guid
66
67IMPLEMENT_OLECREATE_EX(CChineseChessActiveXCtrl, "ChineseChessActiveX.2.0.13",
68 0xe4e060cb,0xa3aa,0x4278,0xb1,0xed,0xce,0x50,0x20,0xc4,0x2e,0xc7)
69
70// ID Ͱ汾
71
72IMPLEMENT_OLETYPELIB(CChineseChessActiveXCtrl, _tlid, _wVerMajor, _wVerMinor)
73
74// ӿ ID
75
76const IID IID_DChineseChessActiveX = {0x7192fb6d,0x7455,0x4da8,{0xb3,0xac,0x64,0x5d,0xd6,0x05,0x57,0xf3}};
77const IID IID_DChineseChessActiveXEvents = {0x0850de98,0xfc76,0x4b94,{0x9b,0xbe,0xe2,0xe5,0x9e,0x0f,0xe0,0xea}};
78
79// ؼϢ
80
81static const DWORD _dwChineseChessActiveXOleMisc =
82 OLEMISC_ACTIVATEWHENVISIBLE |
83 OLEMISC_SETCLIENTSITEFIRST |
84 OLEMISC_INSIDEOUT |
85 OLEMISC_CANTLINKINSIDE |
86 OLEMISC_RECOMPOSEONRESIZE;
87
88IMPLEMENT_OLECTLTYPE(CChineseChessActiveXCtrl, IDS_CHINESECHESSACTIVEX, _dwChineseChessActiveXOleMisc)
89
90// CChineseChessActiveXCtrl::CChineseChessActiveXCtrlFactory::UpdateRegistry -
91// ӻƳ CChineseChessActiveXCtrl ϵͳע
92
93BOOL CChineseChessActiveXCtrl::CChineseChessActiveXCtrlFactory::UpdateRegistry(BOOL bRegister)
94{
95 // TODO: ֤ĿؼǷϵԪģ̴߳
96 // йظϢο MFC ˵ 64
97 // ĿؼϵԪģ͹
98 // ޸´룬
99 // afxRegApartmentThreading Ϊ 0
100
101 if (bRegister)
102 return AfxOleRegisterControlClass(
103 AfxGetInstanceHandle(),
104 m_clsid,
105 m_lpszProgID,
106 IDS_CHINESECHESSACTIVEX,
107 IDB_CHINESECHESSACTIVEX,
108 afxRegApartmentThreading,
109 _dwChineseChessActiveXOleMisc,
110 _tlid,
111 _wVerMajor,
112 _wVerMinor);
113 else
114 return AfxOleUnregisterClass(m_clsid, m_lpszProgID);
115}
116
117// CChineseChessActiveXCtrl::CChineseChessActiveXCtrl - 캯
118CChineseChessActiveXCtrl::CChineseChessActiveXCtrl()
119{
120 InitializeIIDs(&IID_DChineseChessActiveX, &IID_DChineseChessActiveXEvents);
121
122 m_pChess = NULL;
123 m_pHandler = new CChineseChessActiveXHandler(this);
124}
125
126// CChineseChessActiveXCtrl::~CChineseChessActiveXCtrl -
127
128CChineseChessActiveXCtrl::~CChineseChessActiveXCtrl()
129{
130 if (m_pHandler)
131 delete m_pHandler;
132
133}
134
135// CChineseChessActiveXCtrl::DoPropExchange - ־֧
136
137void CChineseChessActiveXCtrl::DoPropExchange(CPropExchange* pPX)
138{
139 ExchangeVersion(pPX, MAKELONG(_wVerMinor, _wVerMajor));
140 COleControl::DoPropExchange(pPX);
141
142 // TODO: Ϊÿ־õԶԵ PX_
143}
144
145
146// CChineseChessActiveXCtrl::OnResetState - ؼΪĬ״̬
147
148void CChineseChessActiveXCtrl::OnResetState()
149{
150 COleControl::OnResetState(); // DoPropExchange ҵĬֵ
151
152 // TODO: ڴؼ״̬
153}
154
155//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
156// === ӳ === ĺ
157//
158
159void CChineseChessActiveXCtrl::SetQiPangColor(OLE_COLOR val)
160{
161 AFX_MANAGE_STATE(AfxGetStaticModuleState());
162 if (m_pChess && m_pChess->GetSafeHwnd())
163 {
164 m_pChess->SetQiPangColor(val);
165 }
166 SetModifiedFlag();
167}
168
169OLE_COLOR CChineseChessActiveXCtrl::GetQiPangColor()
170{
171 AFX_MANAGE_STATE(AfxGetStaticModuleState());
172 if (m_pChess && m_pChess->GetSafeHwnd())
173 return m_pChess->GetQiPangColor();
174 return 0;
175}
176
177void CChineseChessActiveXCtrl::SetTiShiBoxColor(OLE_COLOR val)
178{
179 AFX_MANAGE_STATE(AfxGetStaticModuleState());
180 if (m_pChess && m_pChess->GetSafeHwnd())
181 m_pChess->SetTiShiBoxColor(val);
182 SetModifiedFlag();
183}
184
185OLE_COLOR CChineseChessActiveXCtrl::GetTiShiBoxColor()
186{
187 AFX_MANAGE_STATE(AfxGetStaticModuleState());
188 if (m_pChess && m_pChess->GetSafeHwnd())
189 return m_pChess->GetTiShiBoxColor();
190 return 0;
191}
192
193SHORT CChineseChessActiveXCtrl::GetBoardLayout()
194{
195 AFX_MANAGE_STATE(AfxGetStaticModuleState());
196 if (m_pChess && m_pChess->GetSafeHwnd())
197 return m_pChess->GetBoardLayout();
198 return 0;
199}
200void CChineseChessActiveXCtrl::SetBoardLayout(SHORT val)
201{
202 AFX_MANAGE_STATE(AfxGetStaticModuleState());
203 if (m_pChess && m_pChess->GetSafeHwnd())
204 {
205 m_pChess->SetBoardLayout((CChineseChess::ENUM_BoardLayout) val);
206 m_pChess->Invalidate();
207 }
208 SetModifiedFlag();
209 InvalidateControl();
210}
211
212void CChineseChessActiveXCtrl::OnEnablePromptSoundChanged()
213{
214 AFX_MANAGE_STATE(AfxGetStaticModuleState());
215
216 if (m_pChess && m_pChess->GetSafeHwnd())
217 m_pChess->EnablePromptSound(m_EnablePromptSound);
218 SetModifiedFlag();
219}
220
221void CChineseChessActiveXCtrl::OnEnablePromptMessageChanged()
222{
223 AFX_MANAGE_STATE(AfxGetStaticModuleState());
224
225 if (m_pChess)
226 m_pChess->EnablePromptMessage(m_EnablePromptMessage);
227
228 SetModifiedFlag();
229}
230
231BSTR CChineseChessActiveXCtrl::GetRedName()
232{
233 USES_CONVERSION;
234 AFX_MANAGE_STATE(AfxGetStaticModuleState());
235
236 CString strResult;
237
238 if (m_pChess && m_pChess->GetSafeHwnd())
239 strResult = A2CT(m_pChess->GetRedName().c_str());
240
241 return strResult.AllocSysString();
242}
243
244void CChineseChessActiveXCtrl::SetRedName(LPCTSTR newVal)
245{
246 AFX_MANAGE_STATE(AfxGetStaticModuleState());
247 if (m_pChess && m_pChess->GetSafeHwnd())
248 m_pChess->SetRedName(newVal);
249 SetModifiedFlag();
250}
251
252BSTR CChineseChessActiveXCtrl::GetBlackName()
253{
254 USES_CONVERSION;
255 AFX_MANAGE_STATE(AfxGetStaticModuleState());
256
257 CString strResult;
258
259 if (m_pChess && m_pChess->GetSafeHwnd())
260 strResult = A2CT(m_pChess->GetBlackName().c_str());
261
262 return strResult.AllocSysString();
263}
264
265void CChineseChessActiveXCtrl::SetBlackName(LPCTSTR val)
266{
267 AFX_MANAGE_STATE(AfxGetStaticModuleState());
268 if (m_pChess && m_pChess->GetSafeHwnd())
269 m_pChess->SetBlackName(val);
270 SetModifiedFlag();
271}
272
273LONG CChineseChessActiveXCtrl::GetStartTime()
274{
275 AFX_MANAGE_STATE(AfxGetStaticModuleState());
276
277 if (m_pChess && m_pChess->GetSafeHwnd())
278 return m_pChess->GetStartTime();
279
280 return 0;
281}
282
283void CChineseChessActiveXCtrl::SetStartTime(LONG val)
284{
285 AFX_MANAGE_STATE(AfxGetStaticModuleState());
286
287 if (m_pChess && m_pChess->GetSafeHwnd())
288 m_pChess->SetStartTime(val);
289
290 SetModifiedFlag();
291}
292
293LONG CChineseChessActiveXCtrl::GetEndTime()
294{
295 AFX_MANAGE_STATE(AfxGetStaticModuleState());
296
297 if (m_pChess && m_pChess->GetSafeHwnd())
298 return m_pChess->GetEndTime();
299
300 return 0;
301}
302
303void CChineseChessActiveXCtrl::SetEndTime(LONG val)
304{
305 AFX_MANAGE_STATE(AfxGetStaticModuleState());
306
307 if (m_pChess && m_pChess->GetSafeHwnd())
308 m_pChess->SetEndTime(val);
309
310 SetModifiedFlag();
311}
312
313// CChineseChessActiveXCtrl::AboutBox - ûʾڡ
314
315void CChineseChessActiveXCtrl::AboutBox()
316{
317 AFX_MANAGE_STATE(AfxGetStaticModuleState());
318 if (m_pChess && m_pChess->GetSafeHwnd())
319 m_pChess->AboutBox();
320}
321
322VARIANT_BOOL CChineseChessActiveXCtrl::NextStep()
323{
324 AFX_MANAGE_STATE(AfxGetStaticModuleState());
325
326 int nRet = 0;
327 if (m_pChess && m_pChess->GetSafeHwnd())
328 m_pChess->NextStep();
329 if (nRet)
330 return VARIANT_FALSE;
331 return VARIANT_TRUE;
332}
333
334VARIANT_BOOL CChineseChessActiveXCtrl::PreviouStep()
335{
336 AFX_MANAGE_STATE(AfxGetStaticModuleState());
337
338 int nRet = 0;
339 if (m_pChess && m_pChess->GetSafeHwnd())
340 nRet = m_pChess->PreviouStep();
341 if(nRet)
342 return VARIANT_FALSE;
343 return VARIANT_TRUE;
344}
345
346VARIANT_BOOL CChineseChessActiveXCtrl::GoChess(SHORT i, SHORT j)
347{
348 AFX_MANAGE_STATE(AfxGetStaticModuleState());
349
350 int nRet = 0;
351 if (m_pChess && m_pChess->GetSafeHwnd())
352 nRet = m_pChess->GoChess(i, j);
353 if(nRet)
354 return VARIANT_TRUE;
355 return VARIANT_FALSE;
356}
357
358VARIANT_BOOL CChineseChessActiveXCtrl::SaveChessGame(LPCTSTR szFile)
359{
360 AFX_MANAGE_STATE(AfxGetStaticModuleState());
361
362 int nRet = 0;
363 if (m_pChess && m_pChess->GetSafeHwnd())
364 m_pChess->SaveChessGame(szFile);
365 if(nRet)
366 return VARIANT_FALSE;
367 return VARIANT_TRUE;
368}
369
370VARIANT_BOOL CChineseChessActiveXCtrl::LoadChessGame(LPCTSTR szFile)
371{
372 AFX_MANAGE_STATE(AfxGetStaticModuleState());
373
374 int nRet = 0;
375 if (m_pChess && m_pChess->GetSafeHwnd())
376 {
377 nRet = m_pChess->LoadChessGame(szFile);
378 }
379 if(nRet)
380 return VARIANT_FALSE;
381
382 return VARIANT_TRUE;
383}
384
385VARIANT_BOOL CChineseChessActiveXCtrl::AddGameTag(LPCTSTR szTag, LPCTSTR szVal)
386{
387 AFX_MANAGE_STATE(AfxGetStaticModuleState());
388
389 int nRet = 0;
390 if (m_pChess && m_pChess->GetSafeHwnd())
391 {
392 nRet = m_pChess->AddGameTag(szTag, szVal);
393 }
394 if (nRet)
395 return VARIANT_FALSE;
396
397 return VARIANT_TRUE;
398}
399
400BSTR CChineseChessActiveXCtrl::GetgameTag(LPCTSTR szTag)
401{
402 USES_CONVERSION;
403 AFX_MANAGE_STATE(AfxGetStaticModuleState());
404
405 CString strResult;
406
407 if (m_pChess && m_pChess->GetSafeHwnd())
408 strResult = m_pChess->GetGameTag(szTag);
409
410 return strResult.AllocSysString();
411}
412
413//
414// === ӳ === ĺ
415//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
416
417//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
418// === Ϣ === ĺ
419//
420
421int CChineseChessActiveXCtrl::OnCreate(LPCREATESTRUCT lpCreateStruct)
422{
423 if (COleControl::OnCreate(lpCreateStruct) == -1)
424 return -1;
425
426 // TODO: ڴרõĴ
427 m_pChess = new CChineseChessView();
428 CRect rect;
429 GetClientRect(rect);
430 m_pChess->Create(NULL, _T("Chinese chess"), WS_CHILD, rect, this, IDV_CHINESE_CHESS);
431 m_pChess->ShowWindow(SW_SHOW);
432
433 m_pChess->SetChineseChessHandler(m_pHandler);
434 return 0;
435}
436
437void CChineseChessActiveXCtrl::OnSize(UINT nType, int cx, int cy)
438{
439 __super::OnSize(nType, cx, cy);
440
441 if (m_pChess && m_pChess->GetSafeHwnd())
442 m_pChess->MoveWindow(0, 0, cx, cy);
443
444}
445
446//
447// === Ϣ === ĺ
448//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
449
450
451int CChineseChessActiveXHandler::OnGoChess(int i, int j, CPiece::ENUM_QiZi chess)
452{
453 if(m_pActiveX)
454 m_pActiveX->EventGoChess(i, j, chess);
455 return 0;
456}
virtual int OnGoChess(int i, int j, CPiece::ENUM_QiZi chess)
Executes the go chess action
enum CChineseChess::_ENUM_BoardLayout ENUM_BoardLayout
标准棋盘布局:详见《象棋竞赛规则(2011)》第一章 第1条。红棋在下,黑棋在上。 界面可以支持非标准棋盘布局(红在上,黑在下)
int PreviouStep()
函数名:PreviouStep 功 能:上步棋 参 数:无 返回值:走棋步数 作 者:康 林 版 本:1.0.0.1 日 期:2004-10-5 时 间:10:19:51
int NextStep()
函数名:NextStep 功 能:下步棋 参 数:无 返回值:走棋步数 作 者:康 林 版 本:1.0.0.1 日 期:2004-10-5 时 间:10:19:33
bool GoChess(int i, int j, bool bNext=false)
走棋