WINDW.H
上传用户:wszmarenbt
上传日期:2013-04-26
资源大小:2552k
文件大小:11k
源码类别:

Windows编程

开发平台:

Visual C++

  1. //File Windw.h
  2. #include <string.h>
  3. #include <graphics.h>
  4. #include <alloc.h>
  5. #include <stdio.h>
  6. #include <stdlib.h>
  7. #include "Event.H"
  8. #define TRUE      1
  9. #define FALSE     0
  10. #define OK        1
  11. #define YES       2
  12. #define NO        3
  13. #define CANCEL    4
  14. #define OKALT     0x1c0d
  15. #define CANCELALT 0x011b
  16. Mouse mouse;
  17. class Windw
  18. {
  19. private :
  20. int *buffer;
  21. protected :
  22. int wx,wy,ww,wh;
  23. int border,buffered;
  24. EventMsg eventMsg;
  25. public :
  26. Windw(int x,int y,int w,int h,int bdr,int buf);
  27. virtual ~Windw(void);
  28. virtual void DrawWindow(void);
  29. virtual void RunWindow(void);
  30. private :
  31. void WindwError(char *s);
  32. };
  33. class CapWindw : public Windw
  34. {
  35. protected :
  36. char label[61];
  37. public :
  38. CapWindw(int x,int y,int w,int h,int bdr,int buf,char *s);
  39. virtual void DrawWindow(void);
  40. void SetCaption(char *s);
  41. private :
  42. void DrawCapBar(void);
  43. };
  44. class CapTWindw : public CapWindw
  45. {
  46. protected :
  47. char *line1,*line2;
  48. int button;
  49. public :
  50. CapTWindw(char *s1,char *s2,char *s3);
  51. virtual void DrawWindow(void);
  52. int GetButton(void) {return button;}
  53. };
  54. class Button : public Windw
  55. {
  56. private :
  57. char label[20];
  58. unsigned hotkey;
  59. int altkey;
  60. public :
  61. Button(int x,int y,char *s);
  62. void DrawWindow(void);
  63. int Clicked(EventMsg eventMsg);
  64. void ClickButton(void);
  65. };
  66. class OKWindw : public CapTWindw
  67. {
  68. private :
  69. Button *butn;
  70. public :
  71. OKWindw(char *s1,char *s2,char *s3);
  72. virtual ~OKWindw(void);
  73. virtual void DrawWindow(void);
  74. virtual void RunWindow(void);
  75. };
  76. class YesNoWindw : public CapTWindw
  77. {
  78. protected :
  79. Button *butn1,*butn2;
  80. public :
  81. YesNoWindw(char *s1,char *s2,char *s3);
  82. virtual ~YesNoWindw(void);
  83. virtual void DrawWindow(void);
  84. virtual void RunWindow(void);
  85. };
  86. class YesNoCanWindw : public CapTWindw
  87. {
  88. private :
  89. Button *butn1,*butn2,*butn3;
  90. public :
  91. YesNoCanWindw(char *s1,char *s2,char *s3);
  92. virtual ~YesNoCanWindw(void);
  93. virtual void DrawWindow(void);
  94. virtual void RunWindow(void);
  95. };
  96. class InputWindw : public CapTWindw
  97. {
  98. private :
  99. char input[81];
  100. Button *butn1,*butn2;
  101. public :
  102. InputWindw(char *s1,char *s2,char *s3);
  103. virtual ~InputWindw(void);
  104. void GetInput(char *s) {strcpy(s,input);}
  105. virtual void DrawWindow(void);
  106. virtual void RunWindow(void);
  107. private :
  108. void HandleInput(char k);
  109. };
  110. //All Implementations
  111. unsigned ctrlkeys[]={
  112. 0x1e01,0x3002,0x2e03,0x2004,0x1205,0x2106,
  113. 0x2207,0x2308,0x1709,0x240a,0x250b,0x260c,
  114. 0x320d,0x310e,0x180f,0x1910,0x1011,0x1312,
  115. 0x1f13,0x1414,0x1615,0x2f16,0x1117,0x2d18,
  116. 0x1519,0x2c1a
  117. };
  118. //Class Windw Implementation
  119. Windw::Windw(int x,int y,int w,int h,int bdr,int buf)
  120. {
  121. wx=x;wy=y;ww=w;wh=h;
  122. border=bdr;
  123. buffered=buf;
  124. buffer=NULL;
  125. }
  126. Windw::~Windw(void)
  127. {
  128. if(buffer!=NULL)
  129. {
  130. mouse.HideMouse();
  131. putimage(wx,wy,buffer,COPY_PUT);
  132. free(buffer);
  133. mouse.ShowMouse();
  134. }
  135. }
  136. void Windw::DrawWindow(void)
  137. {
  138. int size;
  139. mouse.HideMouse();
  140. if(buffered)
  141. if ((size=imagesize(wx,wy,wx+ww,wy+wh))<0)
  142. WindwError("Image too largeto store.");
  143. else
  144. {
  145. if((buffer=(int *)malloc(size))==NULL)
  146. WindwError("Not enough memory.");
  147. else getimage(wx,wy,wx+ww,wy+wh,buffer);
  148.  }
  149. setcolor(WHITE);
  150. moveto(wx+ww,wy);
  151. lineto(wx,wy);
  152. lineto(wx,wy+wh);
  153. moveto(wx+ww-1,wy+1);
  154. lineto(wx+1,wy+1);
  155. lineto(wx+1,wy+wh-1);
  156. setcolor(DARKGRAY);
  157. moveto(wx+1,wy+wh);
  158. lineto(wx+ww,wy);
  159. moveto(wx+2,wy+wh-1);
  160. lineto(wx+ww-1,wy+wh-1);
  161. lineto(wx+ww-1,wy+1);
  162. setfillstyle(SOLID_FILL,LIGHTGRAY);
  163. bar(wx+2,wy+2,wx+ww-2,wy+wh-2);
  164. if(border)
  165. {
  166. setcolor(DARKGRAY);
  167. moveto(wx+ww-10,wy+10);
  168. lineto(wx+10,wy+10);
  169. lineto(wx+10,wy+wh-10);
  170. setcolor(WHITE);
  171. lineto(wx+ww-10,wy+wh-10);
  172. lineto(wx+ww-10,wy+10);
  173. }
  174. mouse.ShowMouse();
  175. }
  176. void Windw::RunWindow(void)
  177. {
  178. GetEvent(eventMsg);
  179. }
  180. void Windw::WindwError(char *s)
  181. {
  182. printf("Error:n");
  183. printf("Press any key ...");
  184. printf("%s",*s);
  185. getch();
  186. abort();
  187. }
  188. //Class CapWindw Implementation
  189. CapWindw::CapWindw(int x,int y,int w,int h,int bdr,
  190.     int buf,char *s) : Windw(x,y,w,h,bdr,buf)
  191. {
  192. strcpy(label,s);
  193. }
  194. void CapWindw::DrawWindow(void)
  195. {
  196. Windw::DrawWindow();
  197. DrawCapBar();
  198. }
  199. void CapWindw::SetCaption(char *s)
  200. {
  201. strcpy(label,s);
  202. DrawCapBar();
  203. }
  204. void CapWindw::DrawCapBar(void)
  205. {
  206. mouse.HideMouse();
  207. setcolor(WHITE);
  208. moveto(wx+20,wy+40);
  209. lineto(wx+20,wy+20);
  210. lineto(wx+ww-20,wy+20);
  211. setcolor(BLACK);
  212. lineto(wx+ww-20,wy+40);
  213. lineto(wx+20,wy+40);
  214. setfillstyle(SOLID_FILL,DARKGRAY);
  215. bar(wx+21,wy+21,wx+ww-21,wy+39);
  216. setcolor(WHITE);
  217. int x=(wx+ww/2)-(strlen(label)*4);
  218. outtextxy(x,wy+27,label);
  219. mouse.ShowMouse();
  220. }
  221. //Class CapTWindw Implementation
  222. CapTWindw::CapTWindw(char *s1,char *s2,char *s3) :
  223. CapWindw(0,0,0,150,FALSE,TRUE,s1)
  224. {
  225. int w=strlen(s1)*8+60;
  226. if(strlen(s2)>strlen(s3))
  227. ww=strlen(s2)*8+60;
  228. else ww=strlen(s3)*8+60;
  229. if(w>ww) ww=w;
  230. if(ww<230) ww=230;
  231. wx=320-ww/2;
  232. wy=164;
  233. line1=s2;
  234. line2=s3;
  235. }
  236. void CapTWindw::DrawWindow(void)
  237. {
  238. CapWindw::DrawWindow();
  239. mouse.HideMouse();
  240. int x=(wx+ww/2)-(strlen(line1)*8)/2;
  241. setcolor(BLACK);
  242. if(strlen(line2)==0)
  243. outtextxy(x,wy+68,line1);
  244. else
  245. {
  246. outtextxy(x,wy+56,line1);
  247. x=(wx+ww/2)-(strlen(line2)*8)/2;
  248. outtextxy(x,wy+71,line2);
  249. }
  250. mouse.ShowMouse();
  251. }
  252. //Class OKWindw Implementation
  253. OKWindw::OKWindw(char *s1,char *s2,char *s3):CapTWindw(s1,s2,s3)
  254. {
  255. butn=NULL;
  256. }
  257. OKWindw::~OKWindw(void)
  258. {
  259. if(butn!=NULL) delete butn;
  260. }
  261. void OKWindw::DrawWindow(void)
  262. {
  263. CapTWindw::DrawWindow();
  264. butn=new Button(wx+ww/2-32,wy+wh-42,"^OK");
  265. butn->DrawWindow();
  266. }
  267. void OKWindw::RunWindow(void)
  268. {
  269. button=0;
  270. while(!button)
  271. {
  272. GetEvent(eventMsg);
  273. if(butn->Clicked(eventMsg))
  274. button=OK;
  275. else if(eventMsg.type==KEYBD)
  276. {
  277. char k=eventMsg.key&0x00ff;
  278. if(k==ESC) button=CANCEL;
  279. }
  280. }
  281. }
  282. //Class YesNoWindw Implementation
  283. YesNoWindw::YesNoWindw(char *s1,char *s2,char *s3) : CapTWindw(s1,s2,s3)
  284. {
  285. butn1=butn2=NULL;
  286. }
  287. YesNoWindw::~YesNoWindw(void)
  288. {
  289. if (butn1!=NULL) delete butn1;
  290. if (butn2!=NULL) delete butn2;
  291. }
  292. void YesNoWindw::DrawWindow(void)
  293. {
  294. CapTWindw::DrawWindow();
  295. butn1=new Button(wx+ww/2-70,wy+108,"^YES");
  296. butn1->DrawWindow();
  297. butn2=new Button(wx+ww/2+6,wy+108,"^NO");
  298. butn2->DrawWindow();
  299. }
  300. void YesNoWindw::RunWindow(void)
  301. {
  302. button=0;
  303. while (!button)
  304. {
  305. GetEvent(eventMsg);
  306. if (butn1->Clicked(eventMsg))
  307. button=YES;
  308. else if (butn2->Clicked(eventMsg))
  309. button=NO;
  310. else if (eventMsg.type==KEYBD)
  311. {
  312. char k=eventMsg.key&0x00ff;
  313. if (k==ESC) button=CANCEL;
  314. }
  315. }
  316. }
  317. //Class YesNoCanWindw Implementation
  318. YesNoCanWindw::YesNoCanWindw(char *s1,char *s2,char *s3) : CapTWindw(s1,s2,s3)
  319. {
  320. butn1=butn2=butn3=NULL;
  321. }
  322. YesNoCanWindw::~YesNoCanWindw(void)
  323. {
  324. if (butn1!=NULL) delete butn1;
  325. if (butn2!=NULL) delete butn2;
  326. if (butn3!=NULL) delete butn3;
  327. }
  328. void YesNoCanWindw::DrawWindow(void)
  329. {
  330. CapTWindw::DrawWindow();
  331. butn1=new Button(wx+ww/2-105,wy+wh-42,"^YES");
  332. butn1->DrawWindow();
  333. butn2=new Button(wx+ww/2-32,wy+wh-42,"^NO");
  334. butn2->DrawWindow();
  335. butn3=new Button(wx+ww/2+41,wy+wh-42,"^CANCEL");
  336. butn3->DrawWindow();
  337. }
  338. void YesNoCanWindw::RunWindow(void)
  339. {
  340. button=0;
  341. while (!button)
  342. {
  343. GetEvent(eventMsg);
  344. if (butn1->Clicked(eventMsg))
  345. button=YES;
  346. else if (butn2->Clicked(eventMsg))
  347. button=NO;
  348. else if (butn3->Clicked(eventMsg))
  349. button=CANCEL;
  350. }
  351. }
  352. //Class InputWindw Implementation
  353. InputWindw::InputWindw(char *s1,char *s2,char *s3):CapTWindw(s1,s2,s3)
  354. {
  355. input[0]=0;
  356. butn1=butn2=NULL;
  357. }
  358. InputWindw::~InputWindw(void)
  359. {
  360. if(butn1==NULL) delete butn1;
  361. if(butn2==NULL) delete butn2;
  362. }
  363. void InputWindw::DrawWindow(void)
  364. {
  365. CapTWindw::DrawWindow();
  366. butn1=new Button(wx+ww/2-70,wy+108,"^OK");
  367. butn1->DrawWindow();
  368. butn2=new Button(wx+ww/2+6,wy+108,"^CANCEL");
  369. butn2->DrawWindow();
  370. mouse.HideMouse();
  371. setfillstyle(SOLID_FILL,BLACK);
  372. bar(wx+15,wy+85,wx+ww-15,wy+99);
  373. mouse.ShowMouse();
  374. }
  375. void InputWindw::RunWindow(void)
  376. {
  377. button=0;
  378. while(!button)
  379. {
  380. GetEvent(eventMsg);
  381. if(butn1->Clicked(eventMsg))
  382. button=OK;
  383. else if(butn2->Clicked(eventMsg))
  384. button=CANCEL;
  385. else if(eventMsg.type==KEYBD)
  386. {
  387. char k=eventMsg.key&0x00ff;
  388. HandleInput(k);
  389. }
  390. }
  391. }
  392. void InputWindw::HandleInput(char k)
  393. {
  394. int l=strlen(input);
  395. int w=(ww-30)/8;
  396. settextjustify(LEFT_TEXT,TOP_TEXT);
  397. if((k>31)&&(k<127)&&(l<80))
  398. {
  399. input[l+1]=0;
  400. input[l]=k;
  401. setcolor(WHITE);
  402. if(l<w)
  403. outtextxy(wx+15,wy+88,input);
  404. else
  405. {
  406. int i=l-w+1;
  407. setfillstyle(SOLID_FILL,BLACK);
  408. bar(wx+15,wy+85,wx+ww-15,wy+99);
  409. outtextxy(wx+15,wy+88,&input[i]);
  410. }
  411. }
  412. else if((k==BACKSP)&&(l>0))
  413. {
  414. l-=1;
  415. input[l]=0;
  416. setfillstyle(SOLID_FILL,BLACK);
  417. bar(wx+15,wy+85,wx+ww-15,wy+99);
  418. setcolor(WHITE);
  419. if (l<w+1)
  420. outtextxy(wx+15,wy+88,input);
  421. else
  422. {
  423. int i=l-w;
  424. outtextxy(wx+15,wy+88,&input[i]);
  425. }
  426. }
  427. }
  428. Button::Button(int x,int y,char *s) : Windw(x,y,64,32,FALSE,FALSE)
  429. {
  430. strcpy(label,s);
  431. altkey=0;
  432. hotkey=0;
  433. }
  434. void Button::DrawWindow(void)
  435. {
  436. int pos=-1;
  437. char tlabel[20];
  438. Windw::DrawWindow();
  439. mouse.HideMouse();
  440. strcpy(tlabel,label);
  441. for(int i=0;i<strlen(tlabel);i++)
  442. {
  443. if(tlabel[i]=='^')
  444. {
  445. pos=i;
  446. hotkey=ctrlkeys[tlabel[i+1]-65];
  447. for(int j=i;j<strlen(tlabel);++j) tlabel[j]=tlabel[j+1];
  448. }
  449. }
  450. if(strcmp(tlabel,"OK")==0) altkey=OKALT;
  451. else if (strcmp(tlabel,"CANCEL")==0) altkey=CANCELALT;
  452. int x=(wx+ww/2)-(strlen(tlabel)*4);
  453. setcolor(BLACK);
  454. outtextxy(x,wy+12,tlabel);
  455. if (pos>=0) line(x+pos*8,wy+20,x+pos*8+6,wy+20);
  456. mouse.ShowMouse();
  457. }
  458. int Button::Clicked(EventMsg eventMsg)
  459. {
  460. int click=0;
  461. if((eventMsg.type==MBUTTON)&&(eventMsg.mx>wx)&&(eventMsg.mx<wx+ww)&&
  462. (eventMsg.my>wy)&&(eventMsg.my<wy+wh))
  463. {
  464. ClickButton();
  465. click=TRUE;
  466. }
  467. else if(eventMsg.type==KEYBD)
  468. {
  469. if((eventMsg.key==hotkey)||(eventMsg.key==altkey))
  470. {
  471. ClickButton();
  472. click=TRUE;
  473. }
  474. }
  475. return click;
  476. }
  477. void Button::ClickButton(void)
  478. {
  479. int *buff;
  480. mouse.HideMouse();
  481. int size=imagesize(wx+2,wy+2,wx+ww-2,wy+wh-2);
  482. buff=(int *)malloc(size);
  483. if (buff)
  484. {
  485. getimage(wx+2,wy+2,wx+ww-2,wy+wh-2,buff);
  486. putimage(wx+3,wy+3,buff,COPY_PUT);
  487. free(buff);
  488. }
  489. setcolor(DARKGRAY);
  490. moveto(wx+ww,wy);
  491. lineto(wx,wy);
  492. lineto(wx,wy+wh);
  493. moveto(wx+ww-1,wy+1);
  494. lineto(wx+1,wy+1);
  495. lineto(wx+1,wy+wh-1);
  496. setcolor(WHITE);
  497. moveto(wx+1,wy+wh);
  498. lineto(wx+ww,wy+wh);
  499. lineto(wx+ww,wy);
  500. moveto(wx+2,wy+wh-1);
  501. lineto(wx+ww-1,wy+wh-1);
  502. lineto(wx+ww-1,wy+1);
  503. sound(2000);
  504. delay(100);
  505. nosound();
  506. DrawWindow();
  507. mouse.ShowMouse();
  508. }