PAINT_FI.C
上传用户:cncajx
上传日期:2007-01-03
资源大小:190k
文件大小:13k
源码类别:

GDI/图象编程

开发平台:

Visual C++

  1.   1 #include <windows.h>
  2.   2 #include "paint.h"
  3.   3 
  4.   4 BOOL FAR PASCAL OpenDlgProc(HWND, unsigned, WORD, LONG);
  5.   5 BOOL FAR PASCAL SaveAsDlgProc(HWND, unsigned, WORD, LONG);
  6.   6 
  7.   7 FARPROC lpOpenDlgProc;
  8.   8 FARPROC lpSaveAsDlgProc;
  9.   9 
  10.  10 int QuerySave(HWND hWnd);
  11.  11 
  12.  12 OFSTRUCT ofs;
  13.  13 char     szCurPathName[80] = "";
  14.  14 char     szName[] = "My Paint";
  15.  15 
  16.  16 /*  Declared in paint.c  */
  17.  17 extern HANDLE  hInst;
  18.  18 extern HDC     hMemDC;
  19.  19 extern int     MemX, MemY;
  20.  20 extern BOOL    CanUndo;
  21.  21 
  22.  22 void NewFile(HWND hWnd, BOOL bFirst)
  23.  23 {
  24.  24    HDC   hDC;
  25.  25    HMENU hMenu;
  26.  26    char  str[100];
  27.  27 
  28.  28    if (! bFirst)
  29.  29      {
  30.  30        if (QuerySave(hWnd) == IDCANCEL)
  31.  31          return ;
  32.  32      }
  33.  33 
  34.  34    hDC   = GetDC(hWnd);
  35.  35    hMenu = GetMenu(hWnd);
  36.  36    CancelBound(hDC, hMenu);
  37.  37    ReleaseDC(hWnd, hDC);
  38.  38 
  39.  39    PatBlt(hMemDC, 0, 0, MemX, MemY, WHITENESS);
  40.  40 
  41.  41    EnableMenuItem(hMenu, IDM_UNDO, MF_GRAYED);
  42.  42    CanUndo = FALSE;
  43.  43 
  44.  44    szCurPathName[0] = 0;
  45.  45    lstrcpy(str, szName);
  46.  46    lstrcat(str, " -- (Untitled)");
  47.  47    SetWindowText (hWnd, str);
  48.  48 }
  49.  49 
  50.  50 
  51.  51 void ChangeTitle(HWND hWnd)
  52.  52 {
  53.  53   char str[100];
  54.  54 
  55.  55   lstrcpy(szCurPathName, ofs.szPathName);
  56.  56   lstrcpy(str, szName);
  57.  57   lstrcat(str, " -- ");
  58.  58   lstrcat(str, szCurPathName);
  59.  59   SetWindowText (hWnd, str);
  60.  60 }
  61.  61 
  62.  62 
  63.  63 LPSTR lstrchr (LPSTR str, char ch)
  64.  64 {
  65.  65   while (*str)
  66.  66       if ( *str++ == ch )
  67.  67                  return str;
  68.  68   return NULL;
  69.  69 }
  70.  70 
  71.  71 
  72.  72 BOOL FAR PASCAL OpenDlgProc (HWND hDlg, WORD message,
  73.  73                              WORD wParam, LONG lParam)
  74.  74 {
  75.  75   static char szDefExt[5] = ".GPH";
  76.  76   static char szFileSpec[20] = "*.GPH";
  77.  77 
  78.  78   char LastChar, szFileName[96];
  79.  79   WORD EditLen;
  80.  80 
  81.  81   switch (message)
  82.  82     {
  83.  83       case WM_INITDIALOG:
  84.  84 
  85.  85        SendDlgItemMessage (hDlg, DI_NAME, EM_LIMITTEXT, 80, 0);
  86.  86        DlgDirList (hDlg, szFileSpec, DI_FILES,
  87.  87                                      DI_PATH, FILEATTR);
  88.  88        DlgDirList (hDlg, szFileSpec, DI_DIRS, 0, DIRATTR);
  89.  89        SetDlgItemText (hDlg, DI_NAME, szFileSpec);
  90.  90        return TRUE;
  91.  91 
  92.  92       case WM_COMMAND:
  93.  93 
  94.  94         switch (wParam)
  95.  95           {
  96.  96             case DI_FILES:
  97.  97               switch ( HIWORD (lParam) )
  98.  98                 {
  99.  99                   case LBN_SELCHANGE:
  100. 100 
  101. 101                     DlgDirSelect (hDlg, szFileName, DI_FILES);
  102. 102                     SetDlgItemText (hDlg, DI_NAME, szFileName);
  103. 103                     return TRUE;
  104. 104 
  105. 105                   case LBN_DBLCLK:
  106. 106 
  107. 107                     DlgDirSelect (hDlg, szFileName, DI_FILES);
  108. 108                     SetDlgItemText (hDlg, DI_NAME, szFileName);
  109. 109                     SendMessage (hDlg, WM_COMMAND, DI_OPEN, 0);
  110. 110                     return TRUE;
  111. 111                 }
  112. 112               break;
  113. 113 
  114. 114             case DI_DIRS:
  115. 115               switch ( HIWORD (lParam) )
  116. 116                 {
  117. 117                   case LBN_SELCHANGE:
  118. 118 
  119. 119                     DlgDirSelect (hDlg, szFileName, DI_DIRS);
  120. 120                     lstrcat (szFileName, szFileSpec);
  121. 121                     SetDlgItemText (hDlg, DI_NAME, szFileName);
  122. 122                     return TRUE;
  123. 123 
  124. 124                   case LBN_DBLCLK:
  125. 125 
  126. 126                     DlgDirSelect (hDlg, szFileName, DI_DIRS);
  127. 127                     lstrcat (szFileName, szFileSpec);
  128. 128                     DlgDirList (hDlg, szFileName, DI_FILES,
  129. 129                                         DI_PATH, FILEATTR);
  130. 130                     DlgDirList (hDlg, szFileName, DI_DIRS,
  131. 131                                         0, DIRATTR);
  132. 132                     SetDlgItemText (hDlg, DI_NAME, szFileSpec);
  133. 133                     return TRUE;
  134. 134                 }
  135. 135               break;
  136. 136 
  137. 137             case IDOK :
  138. 138             case DI_OPEN:
  139. 139 
  140. 140               GetDlgItemText (hDlg, DI_NAME, szFileName, 80);
  141. 141 
  142. 142               EditLen = lstrlen (szFileName);
  143. 143               LastChar = szFileName [ EditLen - 1 ];
  144. 144 
  145. 145               if ( LastChar == '\' || LastChar == ':' )
  146. 146                 lstrcat (szFileName, szFileSpec);
  147. 147 
  148. 148               if ( lstrchr (szFileName, '*')
  149. 149                       || lstrchr (szFileName, '?') )
  150. 150                 {
  151. 151                  if ( DlgDirList (hDlg, szFileName, DI_DIRS,
  152. 152                                             DI_PATH, DIRATTR) )
  153. 153                   {
  154. 154                     DlgDirList (hDlg, szFileName, DI_FILES,
  155. 155                                                    0, FILEATTR);
  156. 156                     lstrcpy (szFileSpec, szFileName);
  157. 157                     SetDlgItemText (hDlg, DI_NAME, szFileSpec);
  158. 158                   }
  159. 159                  else MessageBeep (0);
  160. 160 
  161. 161                  return TRUE;
  162. 162                 }
  163. 163 
  164. 164               lstrcat (lstrcat (szFileName, "\"), szFileSpec);
  165. 165               if ( DlgDirList (hDlg, szFileName, DI_DIRS,
  166. 166                                          DI_PATH, DIRATTR) )
  167. 167                 {
  168. 168                   DlgDirList (hDlg, szFileName, DI_FILES,
  169. 169                                                  0, FILEATTR);
  170. 170                   SetDlgItemText (hDlg, DI_NAME, szFileSpec);
  171. 171                   return TRUE;
  172. 172                 }
  173. 173 
  174. 174               szFileName [EditLen] = '';
  175. 175               if ( -1 == OpenFile ( szFileName, &ofs,
  176. 176                                     OF_EXIST | OF_READ ) )
  177. 177                 {
  178. 178                   lstrcat (szFileName, szDefExt);
  179. 179                   if ( -1 == OpenFile ( szFileName, &ofs,
  180. 180                                         OF_EXIST | OF_READ ) )
  181. 181                     {
  182. 182                       MessageBeep (0);
  183. 183                       return TRUE;
  184. 184                     }
  185. 185                 }
  186. 186               EndDialog (hDlg, TRUE);
  187. 187               return TRUE;
  188. 188 
  189. 189             case DI_CANCEL:
  190. 190               EndDialog (hDlg, FALSE);
  191. 191               return TRUE;
  192. 192           }
  193. 193         break;
  194. 194     }
  195. 195   return FALSE;
  196. 196 }
  197. 197 
  198. 198 
  199. 199 void ReadFileData(HWND hWnd)
  200. 200 {
  201. 201   // Read graph data from file 'szCurPathName',
  202. 202   //      and copy to hMemDC;
  203. 203 }
  204. 204 
  205. 205 
  206. 206 void FileOpen(HWND hWnd)
  207. 207 {
  208. 208   char  str[100];
  209. 209 
  210. 210   if (QuerySave(hWnd) == IDCANCEL)
  211. 211     return ;
  212. 212 
  213. 213   lpOpenDlgProc = MakeProcInstance((FARPROC) OpenDlgProc,
  214. 214                                    hInst);
  215. 215   if (DialogBox (hInst, "OPENDLG",
  216. 216                  hWnd, lpOpenDlgProc) )
  217. 217     {
  218. 218        ChangeTitle (hWnd);
  219. 219        ReadFileData (hWnd);
  220. 220     }
  221. 221   FreeProcInstance(lpOpenDlgProc);
  222. 222 }
  223. 223 
  224. 224 
  225. 225 BOOL FAR PASCAL SaveAsDlgProc (HWND hDlg, WORD message,
  226. 226                                WORD wParam, LONG lParam)
  227. 227 {
  228. 228   static char szDefExt[5] = ".GPH";
  229. 229   static char szFileSpec[20] = "*.GPH";
  230. 230 
  231. 231   char LastChar, szFileName[96];
  232. 232   WORD EditLen;
  233. 233 
  234. 234   switch (message)
  235. 235     {
  236. 236       case WM_INITDIALOG:
  237. 237 
  238. 238        SendDlgItemMessage (hDlg, DI_NAME2, EM_LIMITTEXT, 80, 0);
  239. 239        DlgDirList (hDlg, szFileSpec, DI_FILES2,
  240. 240                                      DI_PATH2, FILEATTR);
  241. 241        DlgDirList (hDlg, szFileSpec, DI_DIRS2, 0, DIRATTR);
  242. 242        SetDlgItemText (hDlg, DI_NAME2, szFileSpec);
  243. 243        return TRUE;
  244. 244 
  245. 245       case WM_COMMAND:
  246. 246 
  247. 247         switch (wParam)
  248. 248           {
  249. 249             case DI_FILES2:
  250. 250               switch ( HIWORD (lParam) )
  251. 251                 {
  252. 252                   case LBN_SELCHANGE:
  253. 253 
  254. 254                     DlgDirSelect (hDlg, szFileName, DI_FILES2);
  255. 255                     SetDlgItemText (hDlg, DI_NAME2, szFileName);
  256. 256                     return TRUE;
  257. 257 
  258. 258                   case LBN_DBLCLK:
  259. 259 
  260. 260                     DlgDirSelect (hDlg, szFileName, DI_FILES2);
  261. 261                     SetDlgItemText (hDlg, DI_NAME2, szFileName);
  262. 262                     SendMessage (hDlg, WM_COMMAND, DI_SAVE, 0);
  263. 263                     return TRUE;
  264. 264                 }
  265. 265               break;
  266. 266 
  267. 267             case DI_DIRS2:
  268. 268               switch ( HIWORD (lParam) )
  269. 269                 {
  270. 270                   case LBN_SELCHANGE:
  271. 271 
  272. 272                     DlgDirSelect (hDlg, szFileName, DI_DIRS2);
  273. 273                     lstrcat (szFileName, szFileSpec);
  274. 274                     SetDlgItemText (hDlg, DI_NAME2, szFileName);
  275. 275                     return TRUE;
  276. 276 
  277. 277                   case LBN_DBLCLK:
  278. 278 
  279. 279                     DlgDirSelect (hDlg, szFileName, DI_DIRS2);
  280. 280                     lstrcat (szFileName, szFileSpec);
  281. 281                     DlgDirList (hDlg, szFileName, DI_FILES2,
  282. 282                                         DI_PATH2, FILEATTR);
  283. 283                     DlgDirList (hDlg, szFileName, DI_DIRS2,
  284. 284                                         0, DIRATTR);
  285. 285                     SetDlgItemText (hDlg, DI_NAME2, szFileSpec);
  286. 286                     return TRUE;
  287. 287                 }
  288. 288               break;
  289. 289 
  290. 290             case IDOK :
  291. 291             case DI_SAVE:
  292. 292 
  293. 293               GetDlgItemText (hDlg, DI_NAME2, szFileName, 80);
  294. 294 
  295. 295               EditLen = lstrlen (szFileName);
  296. 296               LastChar = szFileName [ EditLen - 1 ];
  297. 297 
  298. 298               if ( LastChar == '\' || LastChar == ':' )
  299. 299                 lstrcat (szFileName, szFileSpec);
  300. 300 
  301. 301               if ( lstrchr (szFileName, '*')
  302. 302                       || lstrchr (szFileName, '?') )
  303. 303                 {
  304. 304                  if ( DlgDirList (hDlg, szFileName, DI_DIRS2,
  305. 305                                             DI_PATH2, DIRATTR) )
  306. 306                   {
  307. 307                     DlgDirList (hDlg, szFileName, DI_FILES2,
  308. 308                                                    0, FILEATTR);
  309. 309                     lstrcpy (szFileSpec, szFileName);
  310. 310                     SetDlgItemText (hDlg, DI_NAME2, szFileSpec);
  311. 311                   }
  312. 312                  else MessageBeep (0);
  313. 313 
  314. 314                  return TRUE;
  315. 315                 }
  316. 316 
  317. 317               lstrcat (lstrcat (szFileName, "\"), szFileSpec);
  318. 318               if ( DlgDirList (hDlg, szFileName, DI_DIRS2,
  319. 319                                          DI_PATH2, DIRATTR) )
  320. 320                 {
  321. 321                   DlgDirList (hDlg, szFileName, DI_FILES2,
  322. 322                                                  0, FILEATTR);
  323. 323                   SetDlgItemText (hDlg, DI_NAME2, szFileSpec);
  324. 324                   return TRUE;
  325. 325                 }
  326. 326 
  327. 327               szFileName [EditLen] = '';
  328. 328               if ( -1 == OpenFile ( szFileName, &ofs,
  329. 329                                     OF_EXIST | OF_READ ) )
  330. 330                 EndDialog (hDlg, 1);
  331. 331               else
  332. 332                 EndDialog (hDlg, 2);
  333. 333               return TRUE;
  334. 334 
  335. 335             case DI_CANCEL:
  336. 336               EndDialog (hDlg, FALSE);
  337. 337               return TRUE;
  338. 338           }
  339. 339         break;
  340. 340     }
  341. 341   return FALSE;
  342. 342 }
  343. 343 
  344. 344 
  345. 345 void WriteFileData(HWND hWnd)
  346. 346 {
  347. 347   // Copy the graph data in hMemDC to file 'szCurPathName'
  348. 348 }
  349. 349 
  350. 350 
  351. 351 void FileSaveAs(HWND hWnd)
  352. 352 {
  353. 353   int Status;
  354. 354 
  355. 355   lpSaveAsDlgProc = MakeProcInstance((FARPROC) SaveAsDlgProc,
  356. 356                                      hInst);
  357. 357   Status = DialogBox (hInst, "SAVEASDLG",
  358. 358                       hWnd, lpSaveAsDlgProc);
  359. 359 
  360. 360   if (Status == 1)
  361. 361     {
  362. 362        ChangeTitle(hWnd);
  363. 363        WriteFileData(hWnd);
  364. 364     }
  365. 365   else if (Status == 2)
  366. 366     {
  367. 367        if (IDYES==MessageBox(hWnd, "File already exist !n"
  368. 368                                    "  Overwrite it ?",
  369. 369                                    "Save File",
  370. 370                              MB_YESNO | MB_ICONQUESTION))
  371. 371          {
  372. 372            ChangeTitle(hWnd);
  373. 373            WriteFileData(hWnd);
  374. 374          }
  375. 375     }
  376. 376   FreeProcInstance(lpSaveAsDlgProc);
  377. 377 }
  378. 378 
  379. 379 
  380. 380 void FileSave(HWND hWnd)
  381. 381 {
  382. 382    if (szCurPathName[0] == 0)
  383. 383      FileSaveAs(hWnd);
  384. 384    else
  385. 385      WriteFileData(hWnd);
  386. 386 }
  387. 387 
  388. 388 
  389. 389 int QuerySave(HWND hWnd)
  390. 390 {
  391. 391    int status;
  392. 392 
  393. 393    status = MessageBox(hWnd, "Save old file ?",
  394. 394                              "Save File",
  395. 395                          MB_YESNOCANCEL | MB_ICONQUESTION);
  396. 396 
  397. 397    if (status == IDYES)
  398. 398       FileSave(hWnd);
  399. 399 
  400. 400    return (status);
  401. 401 }