ReactOS 0.4.15-dev-8393-g61b7fb9
solgame.cpp
Go to the documentation of this file.
1#include "solitaire.h"
2
3#if 1
4#define TRACE(s)
5#else
6#define TRACE(s) printf("%s(%i): %s",__FILE__,__LINE__,s)
7#endif
8
9extern TCHAR MsgWin[128];
10extern TCHAR MsgDeal[128];
11
15bool fGameStarted = false;
16bool bAutoroute = false;
17
18void NewGame(void)
19{
20 TRACE("ENTER NewGame()\n");
21 int i, j;
22
24 {
26 lScore = lScore - 52;
27 else
28 lScore = -52;
29
32 else
34
35 }
36 else
37 {
40 else
42
43 lScore = 0;
44 }
45
46 dwTime = 0;
47 dwWasteCount = 0;
48 LastId = 0;
49
51
52 //create a new card-stack
54 deck.NewDeck();
55 deck.Shuffle();
58
59 //deal to each row stack..
60 for(i = 0; i < NUM_ROW_STACKS; i++)
61 {
63 temp.Clear();
64
66
67 for(j = 0; j <= i; j++)
68 {
69 temp.Push(deck.Pop());
70 }
71
73 }
74
75 //put the other cards onto the deck
77 pDeck->Update();
78
79 // For the 1-card-mode, all cards need to be completely overlapped
81 pPile->SetOffsets(0, 0);
82
83 SolWnd.Redraw();
84
85 fGameStarted = false;
86
88
90 ClearUndo();
91
92 TRACE("EXIT NewGame()\n");
93
94}
95
96//
97// Now follow the stack callback functions. This is where we
98// provide the game functionality and rules
99//
100
101//
102// Can only drag face-up cards
103//
104bool CARDLIBPROC RowStackDragProc(CardRegion &stackobj, int iNumDragCards)
105{
106 TRACE("ENTER RowStackDragProc()\n");
107 int numfacedown;
108 int numcards;
109
110 SetPlayTimer();
111
112 stackobj.GetFaceDirection(&numfacedown);
113
114 numcards = stackobj.NumCards();
115
116 TRACE("EXIT RowStackDragProc()\n");
117 if(iNumDragCards <= numcards-numfacedown)
118 return true;
119 else
120 return false;
121
122}
123
124//
125// Row a row-stack, we can only drop cards
126// that are lower / different colour
127//
129{
130 TRACE("ENTER RowStackDropProc()\n");
131 Card dragcard = dragcards[dragcards.NumCards() - 1];
132
133 SetPlayTimer();
134
135 //if we are empty, can only drop a stack with a King at bottom
136 if(stackobj.NumCards() == 0)
137 {
138 if(dragcard.LoVal() != 13)
139 {
140 TRACE("EXIT RowStackDropProc(false)\n");
141 return false;
142 }
143 }
144 else
145 {
146 const CardStack &mystack = stackobj.GetCardStack();
147
148 //can only drop if card is 1 less
149 if(mystack[0].LoVal() != dragcard.LoVal() + 1)
150 {
151 TRACE("EXIT RowStackDropProc(false)\n");
152 return false;
153 }
154
155 //can only drop if card is different colour
156 if( (mystack[0].IsBlack() && !dragcard.IsRed()) ||
157 (!mystack[0].IsBlack() && dragcard.IsRed()) )
158 {
159 TRACE("EXIT RowStackDropProc(false)\n");
160 return false;
161 }
162 }
163
164 fGameStarted = true;
165
166 SetUndo(LastId, stackobj.Id(), dragcards.NumCards(), lScore, VisiblePileCards);
167
168 if (LastId == PILE_ID)
169 {
170 if (GetScoreMode() == SCORE_STD)
171 {
172 lScore = lScore + 5;
173 }
174 }
175 else if ((LastId >= SUIT_ID) && (LastId <= SUIT_ID + 3))
176 {
177 if (GetScoreMode() == SCORE_STD)
178 {
179 lScore = lScore >= 15 ? lScore - 15 : 0;
180 }
181 else if (GetScoreMode() == SCORE_VEGAS)
182 {
183 lScore = lScore >= -47 ? lScore - 5 : -52;
184 }
185 }
186
188
189 TRACE("EXIT RowStackDropProc(true)\n");
190 return true;
191}
192
193//
194// Can only drop a card onto a suit-stack if the
195// card is 1 higher, and is the same suit
196//
197bool CanDrop(CardRegion &stackobj, Card card)
198{
199 TRACE("ENTER CanDrop()\n");
200 int topval;
201
202 const CardStack &cardstack = stackobj.GetCardStack();
203
204 SetPlayTimer();
205
206 if(cardstack.NumCards() > 0)
207 {
208 if(card.Suit() != cardstack[0].Suit())
209 {
210 TRACE("EXIT CanDrop()\n");
211 return false;
212 }
213
214 topval = cardstack[0].LoVal();
215 }
216 else
217 {
218 topval = 0;
219 }
220
221 //make sure 1 higher
222 if(card.LoVal() != (topval + 1))
223 {
224 TRACE("EXIT CanDrop()\n");
225 return false;
226 }
227
228 TRACE("EXIT CanDrop()\n");
229 return true;
230}
231
232//
233// Can only drop a card onto suit stack if it is same suit, and 1 higher
234//
236{
237 TRACE("ENTER SuitStackDropProc()\n");
238
239 SetPlayTimer();
240
241 //only drop 1 card at a time
242 if (!bAutoroute && dragcards.NumCards() != 1)
243 {
244 TRACE("EXIT SuitStackDropProc()\n");
245 return false;
246 }
247
248 bool b = CanDrop(stackobj, dragcards[0]);
249 TRACE("EXIT SuitStackDropProc()\n");
250
251 if (b)
252 {
253 SetUndo(LastId, stackobj.Id(), 1, lScore, VisiblePileCards);
254
255 if ((LastId == PILE_ID) || (LastId >= ROW_ID))
256 {
257 if (GetScoreMode() == SCORE_VEGAS)
258 {
259 lScore = lScore + 5;
260 }
261 else if (GetScoreMode() == SCORE_STD)
262 {
263 lScore = lScore + 10;
264 }
265
267 }
268 }
269
270 return b;
271}
272
273//
274// Single-click on one of the suit-stacks
275//
276void CARDLIBPROC SuitStackClickProc(CardRegion &stackobj, int iNumClicked)
277{
278 TRACE("ENTER SuitStackClickProc()\n");
279
280 fGameStarted = true;
281
282 LastId = stackobj.Id();
283
284 TRACE("EXIT SuitStackClickProc()\n");
285}
286
287//
288// Single-click on one of the row-stacks
289// Turn the top-card over if they are all face-down
290//
291void CARDLIBPROC RowStackClickProc(CardRegion &stackobj, int iNumClicked)
292{
293 TRACE("ENTER RowStackClickProc()\n");
294 int numfacedown;
295
296 stackobj.GetFaceDirection(&numfacedown);
297
298 //if all face-down, then make top card face-up
299 if(stackobj.NumCards() == numfacedown)
300 {
301 if(numfacedown > 0) numfacedown--;
302 stackobj.SetFaceDirection(CS_FACE_DOWNUP, numfacedown);
303 stackobj.Redraw();
304
305 if (GetScoreMode() == SCORE_STD)
306 {
307 lScore = lScore + 5;
309 }
310 ClearUndo();
311 }
312
313 LastId = stackobj.Id();
314
315 fGameStarted = true;
316
317 TRACE("EXIT RowStackClickProc()\n");
318}
319
320//
321// Find the suit-stack that can accept the specified card
322//
324{
325 TRACE("ENTER FindSuitStackFromCard()\n");
326
327 for(int i = 0; i < 4; i++)
328 {
329 if(CanDrop(*pSuitStack[i], card))
330 {
331 TRACE("EXIT FindSuitStackFromCard()\n");
332 return pSuitStack[i];
333 }
334 }
335
336 TRACE("EXIT FindSuitStackFromCard()\n");
337 return 0;
338}
339
340//
341// What happens when we add a card to one of the suit stacks?
342// Well, nothing (it is already added), but we need to
343// check all four stacks (not just this one) to see if
344// the game has finished.
345//
347{
348 TRACE("ENTER SuitStackAddProc()\n");
349 bool fGameOver = true;
350
351 SetPlayTimer();
352
353 for(int i = 0; i < 4; i++)
354 {
355 if(pSuitStack[i]->NumCards() != 13)
356 {
357 fGameOver = false;
358
359 break;
360 }
361 }
362
363 if(fGameOver)
364 {
366 PlayTimer = 0;
367
369 {
370 lScore = lScore + (700000 / dwTime);
371 }
372
374 ClearUndo();
375
377
378 for(int i = 0; i < 4; i++)
379 {
380 pSuitStack[i]->Flash(11, 100);
381 }
382
384 {
385 NewGame();
386 }
387 else
388 {
390
391 fGameStarted = false;
392 }
393 }
394
395 TRACE("EXIT SuitStackAddProc()\n");
396}
397
398//
399// Double-click on one of the row stacks
400// The aim is to find a suit-stack to move the
401// double-clicked card to.
402//
403void CARDLIBPROC RowStackDblClickProc(CardRegion &stackobj, int iNumClicked)
404{
405 TRACE("ENTER RowStackDblClickProc()\n");
406
407 SetPlayTimer();
408
409 //can only move 1 card at a time
410 if(iNumClicked != 1)
411 {
412 TRACE("EXIT RowStackDblClickProc()\n");
413 return;
414 }
415
416 //find a suit-stack to move the card to...
417 const CardStack &cardstack = stackobj.GetCardStack();
418 CardRegion *pDest = FindSuitStackFromCard(cardstack[0]);
419
420 if(pDest != 0)
421 {
422 fGameStarted = true;
423 SetPlayTimer();
424
425 //stackobj.MoveCards(pDest, 1, true);
426 //use the SimulateDrag function, because we get the
427 //AddProc callbacks called for us on the destination stacks...
428 bAutoroute = true;
429 stackobj.SimulateDrag(pDest, 1, true);
430 bAutoroute = false;
431 }
432 TRACE("EXIT RowStackDblClickProc()\n");
433}
434
435//
436// Face-up pile single-click
437//
438void CARDLIBPROC PileClickProc(CardRegion &stackobj, int iNumClicked)
439{
440 TRACE("ENTER SuitStackClickProc()\n");
441
442 fGameStarted = true;
443
444 LastId = stackobj.Id();
445
446 TRACE("EXIT SuitStackClickProc()\n");
447}
448
449//
450// Face-up pile double-click
451//
452void CARDLIBPROC PileDblClickProc(CardRegion &stackobj, int iNumClicked)
453{
454 TRACE("ENTER PileDblClickProc()\n");
455
456 SetPlayTimer();
457
458 RowStackDblClickProc(stackobj, iNumClicked);
459 TRACE("EXIT PileDblClickProc()\n");
460}
461
462//
463// Fix for the 3-card play when only 1 card left on the pile.
464//
466{
467 // If there is just 1 card left, then modify the
468 // stack to contain ALL the face-up cards. The effect
469 // will be, the next time a card is dragged, all the
470 // previous card-triplets will be available underneath.
471 if ((dwOptions & OPTION_THREE_CARDS) && pPile->NumCards() == 1)
472 {
473 pPile->SetOffsets(0, 0);
475 }
476}
477
478//
479// What happens when a card is removed from face-up pile?
480//
481void CARDLIBPROC PileRemoveProc(CardRegion &stackobj, int iItems)
482{
483 TRACE("ENTER PileRemoveProc()\n");
484
485 SetPlayTimer();
486
487 //modify our "virtual" pile by removing the same card
488 //that was removed from the physical card stack
489 activepile.Pop(iItems);
491 {
493 }
494
496
497 TRACE("EXIT PileRemoveProc()\n");
498}
499
500//
501// Double-click on the deck
502// Move 3 cards to the face-up pile
503//
504void CARDLIBPROC DeckClickProc(CardRegion &stackobj, int iNumClicked)
505{
506 TRACE("ENTER DeckClickProc()\n");
507
508 SetPlayTimer();
509
510 CardStack cardstack = stackobj.GetCardStack();
511 CardStack pile = pPile->GetCardStack();
512
513 fGameStarted = true;
514 SetPlayTimer();
515
516 //reset the face-up pile to represent 3 cards
519
520 if(cardstack.NumCards() == 0)
521 {
522 if (GetScoreMode() == SCORE_VEGAS)
523 {
525 {
526 pile.Clear();
527
529 cardstack.Push(activepile);
533 }
534 }
535 else if (GetScoreMode() == SCORE_STD)
536 {
538 if ((dwWasteCount >= dwWasteTreshold) && (activepile.NumCards() != 0))
539 {
541 lScore = lScore >= 20 ? lScore - 20 : 0;
542 else
543 lScore = lScore >= 100 ? lScore - 100 : 0;
544 }
545
546 pile.Clear();
547
549 cardstack.Push(activepile);
552
554 }
555 else
556 {
557 pile.Clear();
558
560 cardstack.Push(activepile);
564 }
565
566 dwWasteCount++;
567 }
568 else
569 {
570 int numcards = min((dwOptions & OPTION_THREE_CARDS) ? 3 : 1, cardstack.NumCards());
571
573
574 //make a "visible" copy of these cards
576 temp = cardstack.Pop(numcards);
577 temp.Reverse();
578
580 pile.Clear();
581
582 pile.Push(temp);
583
584 //remove the top 3 from deck
586
587 VisiblePileCards = numcards;
588 }
589
591
592 pDeck->SetCardStack(cardstack);
593 pPile->SetCardStack(pile);
594
596
597 SolWnd.Redraw();
598 TRACE("EXIT DeckClickProc()\n");
599}
#define CARDLIBPROC
Definition: cardlib.h:13
#define CS_DEFXOFF
Definition: cardlib.h:23
#define CS_FACE_DOWNUP
Definition: cardlib.h:53
void Flash(int count, int timeout)
Definition: cardregion.cpp:322
void Redraw()
void SetFaceDirection(UINT uDirType, int nOption)
Definition: cardregion.cpp:258
void SetCardStack(const CardStack &cs)
Definition: cardregion.cpp:390
const CardStack & GetCardStack()
Definition: cardregion.cpp:399
void SetOffsets(int x, int y)
Definition: cardregion.cpp:228
int NumCards() const
Definition: cardregion.cpp:544
void Update()
Definition: cardregion.cpp:207
UINT GetFaceDirection(int *pnOption)
Definition: cardregion.cpp:273
bool SimulateDrag(CardRegion *pDestStack, int nNumCards, bool fAnimate)
Definition: cardregion.cpp:636
void NewDeck()
Definition: cardstack.cpp:42
int NumCards() const
Definition: cardstack.h:14
void Push(const Card card)
Definition: cardstack.cpp:83
void Clear()
Definition: cardstack.cpp:37
void Print()
Definition: cardstack.cpp:222
void Reverse()
Definition: cardstack.cpp:73
void Shuffle()
Definition: cardstack.cpp:50
Card Pop()
Definition: cardstack.cpp:127
void EmptyStacks(void)
Definition: cardwindow.cpp:607
void Redraw(void)
Definition: cardwindow.cpp:553
Definition: card.h:28
int Suit() const
Definition: card.h:54
bool IsRed() const
Definition: card.h:94
int LoVal() const
Definition: card.h:59
GLboolean GLboolean GLboolean b
Definition: glext.h:6204
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
Definition: glfuncs.h:248
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint GLint GLint j
Definition: glfuncs.h:250
#define b
Definition: ke_i.h:79
#define min(a, b)
Definition: monoChain.cc:55
static calc_node_t temp
Definition: rpn_ieee.c:38
CardRegion * pSuitStack[4]
Definition: solcreate.cpp:5
CardRegion * pDeck
Definition: solcreate.cpp:3
CardRegion * pPile
Definition: solcreate.cpp:4
CardRegion * pRowStack[NUM_ROW_STACKS]
Definition: solcreate.cpp:6
void CARDLIBPROC RowStackClickProc(CardRegion &stackobj, int iNumClicked)
Definition: solgame.cpp:291
int LastId
Definition: solgame.cpp:14
#define TRACE(s)
Definition: solgame.cpp:4
CardRegion * FindSuitStackFromCard(Card card)
Definition: solgame.cpp:323
void CARDLIBPROC PileRemoveProc(CardRegion &stackobj, int iItems)
Definition: solgame.cpp:481
TCHAR MsgDeal[128]
Definition: solitaire.cpp:24
void CARDLIBPROC PileDblClickProc(CardRegion &stackobj, int iNumClicked)
Definition: solgame.cpp:452
TCHAR MsgWin[128]
Definition: solitaire.cpp:23
void CARDLIBPROC SuitStackClickProc(CardRegion &stackobj, int iNumClicked)
Definition: solgame.cpp:276
bool CARDLIBPROC RowStackDragProc(CardRegion &stackobj, int iNumDragCards)
Definition: solgame.cpp:104
void NewGame(void)
Definition: solgame.cpp:18
bool CARDLIBPROC SuitStackDropProc(CardRegion &stackobj, CardStack &dragcards)
Definition: solgame.cpp:235
bool CARDLIBPROC RowStackDropProc(CardRegion &stackobj, CardStack &dragcards)
Definition: solgame.cpp:128
void CARDLIBPROC SuitStackAddProc(CardRegion &stackobj, const CardStack &added)
Definition: solgame.cpp:346
int VisiblePileCards
Definition: solgame.cpp:13
void CARDLIBPROC RowStackDblClickProc(CardRegion &stackobj, int iNumClicked)
Definition: solgame.cpp:403
bool fGameStarted
Definition: solgame.cpp:15
bool CanDrop(CardRegion &stackobj, Card card)
Definition: solgame.cpp:197
CardStack activepile
Definition: solgame.cpp:12
void CARDLIBPROC PileClickProc(CardRegion &stackobj, int iNumClicked)
Definition: solgame.cpp:438
void CARDLIBPROC DeckClickProc(CardRegion &stackobj, int iNumClicked)
Definition: solgame.cpp:504
bool bAutoroute
Definition: solgame.cpp:16
void FixIfOneCardLeft(void)
Definition: solgame.cpp:465
TCHAR szAppName[128]
Definition: solitaire.cpp:18
DWORD dwWasteCount
Definition: solitaire.cpp:28
DWORD dwWasteTreshold
Definition: solitaire.cpp:29
void SetPlayTimer(void)
Definition: solitaire.cpp:172
HWND hwndMain
Definition: solitaire.cpp:13
DWORD dwOptions
Definition: solitaire.cpp:25
void UpdateStatusBar(void)
Definition: solitaire.cpp:150
DWORD dwTime
Definition: solitaire.cpp:27
DWORD dwPrevMode
Definition: solitaire.cpp:30
int GetScoreMode(void)
Definition: solitaire.cpp:130
CardWindow SolWnd
Definition: solitaire.cpp:34
long lScore
Definition: solitaire.cpp:31
UINT_PTR PlayTimer
Definition: solitaire.cpp:32
#define PILE_ID
Definition: solitaire.h:40
#define IDT_PLAYTIMER
Definition: solitaire.h:33
#define ROW_ID
Definition: solitaire.h:42
#define SUIT_ID
Definition: solitaire.h:41
#define OPTION_THREE_CARDS
Definition: solitaire.h:11
#define OPTION_KEEP_SCORE
Definition: solitaire.h:13
#define NUM_ROW_STACKS
Definition: solitaire.h:38
#define OPTION_SHOW_TIME
Definition: solitaire.h:12
#define SCORE_STD
Definition: solitaire.h:45
#define SCORE_VEGAS
Definition: solitaire.h:46
void SetUndo(int set_source_id, int set_destination_id, int set_number_of_cards, int set_prev_score, int set_prev_visible_pile_cards)
Definition: solundo.cpp:27
#define DECK_ID
Definition: solitaire.h:39
void ClearUndo(void)
Definition: solundo.cpp:45
CardStack deck
Definition: spigame.cpp:18
#define MB_YESNO
Definition: winuser.h:817
#define MB_OK
Definition: winuser.h:790
#define MB_ICONQUESTION
Definition: winuser.h:789
#define MessageBox
Definition: winuser.h:5831
#define MB_ICONINFORMATION
Definition: winuser.h:802
#define IDYES
Definition: winuser.h:835
BOOL WINAPI KillTimer(_In_opt_ HWND, _In_ UINT_PTR)
char TCHAR
Definition: xmlstorage.h:189