中国象棋控件 2.0.15
载入中...
�索中...
未找到
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
452{
453 if(m_pActiveX)
454 m_pActiveX->EventGoChess(i, j, chess);
455 return 0;
456}
ÖйúÏóÆå ActiveX ¿Ø¼þµÄ½çÃæÊµÏÖÀà
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)
走棋
enum CPiece::_ENUM_QiZi ENUM_QiZi
棋�枚举值 四个�表示棋�,最左1�表示颜色