WELCOME.CPP
上传用户:zhang8947
上传日期:2007-01-08
资源大小:1910k
文件大小:15k
源码类别:

多国语言处理

开发平台:

Visual C++

  1. #include "stdafx.h"
  2. #include "welcome.h"
  3. //显示欢迎画面
  4. BOOL WelcomeToYou(CSplashWnd& splashWnd ,LPSTR lpFileName)
  5. {
  6. char szDrive[_MAX_DRIVE],szDir[_MAX_DIR],szTemp[_MAX_FNAME], szFileName[128];
  7. GetModuleFileName(AfxGetApp()->m_hInstance, szFileName, 128);
  8. _splitpath(szFileName, szDrive, szDir, szTemp, szTemp);
  9. wsprintf(szFileName, "%s%s%s", szDrive, szDir, lpFileName);
  10. // CSplashWnd  splashWnd ;
  11. if( !splashWnd.Create( szFileName )){
  12. AfxMessageBox( "Create splash window fail !") ; 
  13. return FALSE ;
  14. }
  15. splashWnd.ShowWindow(SW_SHOW);
  16. splashWnd.UpdateWindow();
  17. return TRUE;
  18. }
  19. //--------------------------------------------------------------------------------------------//
  20. #define IS_WIN30_DIB(lpbi)  ((*(LPDWORD)(lpbi)) == sizeof(BITMAPINFOHEADER))
  21. #define RECTWIDTH(lpRect)     ((lpRect)->right - (lpRect)->left)
  22. #define RECTHEIGHT(lpRect)    ((lpRect)->bottom - (lpRect)->top)
  23. CImageFile::CImageFile()
  24. {
  25. m_hDib  = NULL ;
  26. m_hImageData = NULL ;
  27. m_nKindOfImage = IMAGE_UNKNOWN ;
  28. m_palDIB = NULL ;
  29. m_strFileName = "" ;
  30. }
  31. CImageFile::CImageFile(LPSTR cFileName)
  32. {
  33. m_hDib  = NULL ;
  34. m_hImageData = NULL ;
  35. m_nKindOfImage = IMAGE_UNKNOWN ;
  36. m_palDIB = NULL ;
  37. m_strFileName = cFileName ;
  38. }
  39. CImageFile::~CImageFile()
  40. {
  41. if(m_hDib != NULL )
  42. ::GlobalFree( m_hDib ) ; 
  43. if(m_palDIB)
  44. delete m_palDIB ;
  45. }
  46. BOOL  CImageFile::CreateImage( LPSTR cFileName )
  47. {
  48. m_hDib  = NULL ;
  49. m_hImageData = NULL ;
  50. m_nKindOfImage = IMAGE_UNKNOWN ;
  51. m_palDIB = NULL ;
  52. m_strFileName = cFileName ;                  
  53. return TRUE ;
  54. }
  55. BOOL  CImageFile:: PaintImage(HDC hDC , CRect *lpDCRect) 
  56. {
  57. LPSTR    lpDIBHdr;            // Pointer to BITMAPINFOHEADER
  58. LPSTR    lpDIBBits;           // Pointer to DIB bits
  59. BOOL     bSuccess=FALSE;      // Success/fail flag
  60. HPALETTE hPal=NULL;           // Our DIB's palette
  61. HPALETTE hOldPal=NULL;        // Previous palette
  62. /* Check for valid DIB handle */
  63. if (m_hDib == NULL)
  64. return FALSE;
  65.     
  66. int nDibWidth = ImageWidth()  ;
  67. int nDibHeight = ImageHeight() ;
  68.     
  69. /* Lock down the DIB, and get a pointer to the beginning of the bit
  70.  *  buffer
  71.  */
  72. lpDIBHdr  = (LPSTR) ::GlobalLock((HGLOBAL) m_hDib);
  73. lpDIBBits = (char far*)FindDIBBits(lpDIBHdr);
  74. // Get the DIB's palette, then select it into DC
  75. if (m_palDIB != NULL)
  76. {
  77. hPal = (HPALETTE) (m_palDIB->m_hObject);
  78. // Select as background since we have
  79. // already realized in forground if needed
  80. hOldPal = ::SelectPalette(hDC, hPal, TRUE);
  81. ::RealizePalette( hDC );
  82. }
  83. /* Make sure to use the stretching mode best for color pictures */
  84. ::SetStretchBltMode(hDC, COLORONCOLOR);
  85. /* Determine whether to call StretchDIBits() or SetDIBitsToDevice() */
  86. if ((RECTWIDTH(lpDCRect)  == nDibWidth) &&
  87.    (RECTHEIGHT(lpDCRect) == nDibHeight)) {
  88. bSuccess = ::SetDIBitsToDevice(hDC,                    // hDC
  89.    lpDCRect->left,             // DestX
  90.    lpDCRect->top,              // DestY
  91.    RECTWIDTH(lpDCRect),        // nDestWidth
  92.    RECTHEIGHT(lpDCRect),       // nDestHeight
  93.    0,
  94.    0,
  95.    0,                          // nStartScan
  96.    nDibHeight,   // nNumScans
  97.    lpDIBBits,                  // lpBits
  98.    (LPBITMAPINFO)lpDIBHdr,     // lpBitsInfo
  99.    DIB_RGB_COLORS);            // wUsage
  100.    }
  101.    else{
  102.   bSuccess = ::StretchDIBits(hDC,                          // hDC
  103.    lpDCRect->left,                 // DestX
  104.    lpDCRect->top,                  // DestY
  105.    RECTWIDTH(lpDCRect),            // nDestWidth
  106.    RECTHEIGHT(lpDCRect),           // nDestHeight
  107.    0,
  108.    0,
  109.    nDibWidth,            // wSrcWidth
  110.    nDibHeight ,          // wSrcHeight
  111.    lpDIBBits,                      // lpBits
  112.    (LPBITMAPINFO)lpDIBHdr,         // lpBitsInfo
  113.    DIB_RGB_COLORS,                 // wUsage
  114.    SRCCOPY);                       // dwROP
  115.    }
  116.    ::GlobalUnlock((HGLOBAL) m_hDib);
  117. /* Reselect old palette */
  118. if (hOldPal != NULL)
  119. {
  120. ::SelectPalette(hDC, hOldPal, TRUE);
  121. }
  122.    return bSuccess;
  123. }
  124. BOOL CImageFile::ReadImageFile()
  125. {
  126. return TRUE ;
  127. }
  128. BOOL CImageFile::TranslateImageToDIB()
  129. {
  130. return TRUE ;
  131. }
  132. BOOL CImageFile::CreatePalette(CPalette* pPal)
  133. {
  134. LPLOGPALETTE lpPal;      // pointer to a logical palette
  135. HANDLE hLogPal;          // handle to a logical palette
  136. HPALETTE hPal = NULL;    // handle to a palette
  137. int i;                   // loop index
  138. WORD wNumColors;         // number of colors in color table
  139. LPSTR lpbi;              // pointer to packed-DIB
  140. LPBITMAPINFO lpbmi;      // pointer to BITMAPINFO structure (Win3.0)
  141. LPBITMAPCOREINFO lpbmc;  // pointer to BITMAPCOREINFO structure (old)
  142. BOOL bWinStyleDIB;       // flag which signifies whether this is a Win3.0 DIB
  143. BOOL bResult = FALSE;
  144. /* if handle to DIB is invalid, return FALSE */
  145. if (m_hDib == NULL)
  146.   return FALSE;
  147.    lpbi = (LPSTR) ::GlobalLock((HGLOBAL) m_hDib);
  148.    /* get pointer to BITMAPINFO (Win 3.0) */
  149.    lpbmi = (LPBITMAPINFO)lpbi;
  150.    /* get pointer to BITMAPCOREINFO (old 1.x) */
  151.    lpbmc = (LPBITMAPCOREINFO)lpbi;
  152.    /* get the number of colors in the DIB */
  153. wNumColors = ImageNumColors();
  154.    if (wNumColors != 0)
  155.    {
  156. /* allocate memory block for logical palette */
  157. hLogPal = ::GlobalAlloc(GHND, sizeof(LOGPALETTE)
  158. + sizeof(PALETTEENTRY)
  159. * wNumColors);
  160. /* if not enough memory, clean up and return NULL */
  161. if (hLogPal == 0)
  162. {
  163. ::GlobalUnlock((HGLOBAL) m_hDib);
  164. return FALSE;
  165. }
  166. lpPal = (LPLOGPALETTE) ::GlobalLock((HGLOBAL) hLogPal);
  167. /* set version and number of palette entries */
  168. lpPal->palVersion = PALVERSION;
  169. lpPal->palNumEntries = (WORD)wNumColors;
  170. /* is this a Win 3.0 DIB? */
  171. bWinStyleDIB = IS_WIN30_DIB(lpbi);
  172. for (i = 0; i < (int)wNumColors; i++)
  173. {
  174. if (bWinStyleDIB)
  175. {
  176. lpPal->palPalEntry[i].peRed = lpbmi->bmiColors[i].rgbRed;
  177. lpPal->palPalEntry[i].peGreen = lpbmi->bmiColors[i].rgbGreen;
  178. lpPal->palPalEntry[i].peBlue = lpbmi->bmiColors[i].rgbBlue;
  179. lpPal->palPalEntry[i].peFlags = 0;
  180. }
  181. else
  182. {
  183. lpPal->palPalEntry[i].peRed = lpbmc->bmciColors[i].rgbtRed;
  184. lpPal->palPalEntry[i].peGreen = lpbmc->bmciColors[i].rgbtGreen;
  185. lpPal->palPalEntry[i].peBlue = lpbmc->bmciColors[i].rgbtBlue;
  186. lpPal->palPalEntry[i].peFlags = 0;
  187. }
  188. }
  189. /* create the palette and get handle to it */
  190. bResult = pPal->CreatePalette(lpPal);
  191. ::GlobalUnlock((HGLOBAL) hLogPal);
  192. ::GlobalFree((HGLOBAL) hLogPal);
  193. }
  194. ::GlobalUnlock((HGLOBAL) m_hDib);
  195. return bResult;
  196. }
  197. void far* CImageFile::FindDIBBits(LPSTR lpbi)
  198. {
  199. return (lpbi + *(LPDWORD)lpbi + PaletteSize());
  200. }
  201. int  CImageFile::ImageWidth()
  202. {
  203. ASSERT( m_hDib != NULL) ;
  204. char far* lpDIB =(char far*)::GlobalLock( m_hDib ) ;
  205. LPBITMAPINFOHEADER lpbmi;  // pointer to a Win 3.0-style DIB
  206. LPBITMAPCOREHEADER lpbmc;  // pointer to an other-style DIB
  207. /* point to the header (whether Win 3.0 and old) */
  208. lpbmi = (LPBITMAPINFOHEADER)lpDIB;
  209. lpbmc = (LPBITMAPCOREHEADER)lpDIB;
  210. long nWidth ;
  211. /* return the DIB width if it is a Win 3.0 DIB */
  212. if (IS_WIN30_DIB(lpDIB))
  213. nWidth = lpbmi->biWidth;
  214. else  /* it is an other-style DIB, so return its width */
  215. nWidth = (DWORD)lpbmc->bcWidth;
  216. ::GlobalUnlock( m_hDib ) ;
  217. return LOWORD(nWidth);
  218. }
  219. int  CImageFile::ImageHeight()
  220. {
  221. ASSERT(m_hDib != NULL);
  222. char far* lpDIB =(char far*)::GlobalLock( m_hDib ) ;
  223. LPBITMAPINFOHEADER lpbmi;  // pointer to a Win 3.0-style DIB
  224. LPBITMAPCOREHEADER lpbmc;  // pointer to an other-style DIB
  225. /* point to the header (whether old or Win 3.0 */
  226. lpbmi = (LPBITMAPINFOHEADER)lpDIB;
  227. lpbmc = (LPBITMAPCOREHEADER)lpDIB;
  228. long nHeight ;
  229. /* DIB height if it is a Win 3.0 DIB */
  230. if (IS_WIN30_DIB(lpDIB))
  231. nHeight = lpbmi->biHeight;
  232. else  /* it is an other-style DIB, so return its height */
  233. nHeight = (DWORD)lpbmc->bcHeight;
  234. ::GlobalUnlock( m_hDib ) ;
  235. return LOWORD(nHeight);
  236. }
  237. int  CImageFile::PaletteSize()
  238. {
  239. char far* lpbi =(char far*) ::GlobalLock( m_hDib ) ;
  240. int   nPaletteSize ;
  241. /* calculate the size required by the palette */
  242. if (IS_WIN30_DIB (lpbi))
  243. nPaletteSize = (WORD)( ImageNumColors() * sizeof(RGBQUAD));
  244.    else
  245. nPaletteSize = (WORD)( ImageNumColors() * sizeof(RGBTRIPLE));
  246.    ::GlobalUnlock( m_hDib ) ;
  247.    return nPaletteSize ;
  248. }  
  249. int  CImageFile::ImageNumColors()
  250. {
  251. WORD wBitCount;  // DIB bit count
  252. /*  If this is a Windows-style DIB, the number of colors in the
  253.  *  color table can be less than the number of bits per pixel
  254.  *  allows for (i.e. lpbi->biClrUsed can be set to some value).
  255.  *  If this is the case, return the appropriate value.
  256.  */
  257. char far* lpbi =(char far*)::GlobalLock( m_hDib ) ;
  258. if (IS_WIN30_DIB(lpbi))
  259. {
  260. DWORD dwClrUsed;
  261. dwClrUsed = ((LPBITMAPINFOHEADER)lpbi)->biClrUsed;
  262. if (dwClrUsed != 0)
  263. return (WORD)dwClrUsed;
  264. }
  265. /*  Calculate the number of colors in the color table based on
  266.  *  the number of bits per pixel for the DIB.
  267.  */
  268. if (IS_WIN30_DIB(lpbi))
  269. wBitCount = ((LPBITMAPINFOHEADER)lpbi)->biBitCount;
  270. else
  271. wBitCount = ((LPBITMAPCOREHEADER)lpbi)->bcBitCount;
  272. /* return number of colors based on bits per pixel */
  273. int nNumColors ;
  274. switch (wBitCount)
  275. {
  276. case 1:
  277. nNumColors = 2;
  278. break ;
  279. case 4:
  280. nNumColors = 16;
  281. break ;
  282. case 8:
  283. nNumColors =  256;
  284. break ;
  285. default:
  286. nNumColors = 0;
  287. break ;
  288. }
  289. ::GlobalUnlock( m_hDib ) ;
  290. return nNumColors ;
  291. //-------------------------------------------------------------------------------------//
  292. #define DIB_HEADER_MARKER   ((WORD) ('M' << 8) | 'B')
  293. #define INT_MAXNUM  65534
  294. CDibImage::CDibImage()
  295. {
  296. CDibImage::CDibImage(char* cFileName) : CImageFile(cFileName)
  297. {
  298. }
  299. CDibImage::~CDibImage()
  300. {
  301. }
  302. BOOL CDibImage::ReadImageFile() 
  303. {
  304. CFile file;
  305. CFileException fe;
  306. if (!file.Open(m_strFileName, CFile::modeRead | CFile::shareDenyWrite, &fe))
  307. {
  308. return FALSE;
  309. }
  310. // replace calls to Serialize with ReadDIBFile function
  311. TRY
  312. {
  313. ReadDIBFile(file);
  314. }
  315. CATCH (CFileException, eLoad)
  316. {
  317. file.Abort(); // will not throw an exception
  318. m_hDib = NULL;
  319. return FALSE;
  320. }
  321. END_CATCH
  322. InitDIBData();
  323. if (m_hDib == NULL)
  324. {
  325. // may not be DIB format
  326. MessageBox(NULL, "It is not DIB format !", NULL, MB_ICONINFORMATION | MB_OK);
  327. return FALSE;
  328. }
  329. return TRUE;
  330. }
  331. BOOL CDibImage::ReadDIBFile(CFile& file)
  332. {
  333. BITMAPFILEHEADER bmfHeader;
  334. DWORD dwBitsSize;
  335. LPSTR pDIB;
  336. /*
  337.  * get length of DIB in bytes for use when reading
  338.  */
  339. dwBitsSize = file.GetLength();
  340. /*
  341.  * Go read the DIB file header and check if it's valid.
  342.  */
  343. if (file.Read((LPSTR)&bmfHeader, sizeof(bmfHeader)) != sizeof(bmfHeader))
  344. return NULL;
  345. if (bmfHeader.bfType != DIB_HEADER_MARKER)
  346. return NULL;
  347. /*
  348.  * Allocate memory for DIB
  349.  */
  350. m_hDib = (HDIB)::GlobalAlloc(GMEM_MOVEABLE | GMEM_ZEROINIT, dwBitsSize);
  351. if (m_hDib == 0)
  352. {
  353. return FALSE;
  354. }
  355. pDIB = (LPSTR) ::GlobalLock((HGLOBAL) m_hDib);
  356. /*
  357.  * Go read the bits.
  358.  */
  359. if (file.ReadHuge(pDIB, dwBitsSize - sizeof(BITMAPFILEHEADER)) !=
  360. dwBitsSize - sizeof(BITMAPFILEHEADER) )
  361. {
  362. ::GlobalUnlock((HGLOBAL) m_hDib);
  363. ::GlobalFree((HGLOBAL) m_hDib);
  364. return FALSE;
  365. }
  366. ::GlobalUnlock((HGLOBAL) m_hDib);
  367. return TRUE ;
  368. }
  369. void CDibImage::InitDIBData()
  370. {
  371. if (m_palDIB != NULL)
  372. {
  373. delete m_palDIB;
  374. m_palDIB = NULL;
  375. }
  376. if (m_hDib == NULL)
  377. {
  378. return;
  379. }
  380. if (ImageWidth() > INT_MAXNUM ||ImageHeight() > INT_MAXNUM)
  381. {
  382. ::GlobalUnlock((HGLOBAL) m_hDib);
  383. ::GlobalFree((HGLOBAL) m_hDib);
  384. m_hDib = NULL;
  385. MessageBox(NULL, "DIB is too large", NULL,
  386.  MB_ICONINFORMATION | MB_OK);
  387. return;
  388. }
  389. // Create copy of palette
  390. m_palDIB = new CPalette;
  391. if (m_palDIB == NULL)
  392. {
  393. // we must be really low on memory
  394. ::GlobalFree((HGLOBAL) m_hDib);
  395. m_hDib = NULL;
  396. return;
  397. }
  398. if (CreatePalette( m_palDIB) == NULL)
  399. {
  400. // DIB may not have a palette
  401. delete m_palDIB;
  402. m_palDIB = NULL;
  403. return;
  404. }
  405. }
  406. /*
  407. void CDibImage::InitDIBData()
  408. {
  409. if (m_palDIB != NULL)
  410. {
  411. delete m_palDIB;
  412. m_palDIB = NULL;
  413. }
  414. if (m_hDib == NULL)
  415. {
  416. return;
  417. }
  418. if (ImageWidth() > INT_MAXNUM ||ImageHeight() > INT_MAXNUM)
  419. {
  420. ::GlobalUnlock((HGLOBAL) m_hDib);
  421. ::GlobalFree((HGLOBAL) m_hDib);
  422. m_hDib = NULL;
  423. MessageBox(NULL, "The image is too big !", NULL, MB_ICONINFORMATION | MB_OK);
  424. return;
  425. }
  426. // Create copy of palette
  427. m_palDIB = new CPalette;
  428. if (m_palDIB == NULL)
  429. {
  430. // we must be really low on memory
  431. ::GlobalFree((HGLOBAL) m_hDib);
  432. m_hDib = NULL;
  433. return;
  434. }
  435. if (CreatePalette(m_palDIB) == NULL)
  436. {
  437. // DIB may not have a palette
  438. delete m_palDIB;
  439. m_palDIB = NULL;
  440. return;
  441. }
  442. }
  443. */
  444. //----------------------------------------------------------------------------------------//
  445. // splash.cpp : implementation file
  446. //
  447. #ifdef _DEBUG
  448. #undef THIS_FILE
  449. static char BASED_CODE THIS_FILE[] = __FILE__;
  450. #endif
  451. /////////////////////////////////////////////////////////////////////////////
  452. // CSplashWnd
  453. IMPLEMENT_DYNCREATE(CSplashWnd, CView)
  454. CSplashWnd::CSplashWnd()
  455. {
  456. }
  457. CSplashWnd::~CSplashWnd()
  458. {
  459. DestroyWindow() ;
  460. }
  461. BOOL CSplashWnd::Create( LPSTR lpFileName)
  462. {   
  463. m_dibImage.CreateImage( lpFileName ) ;
  464. if(!m_dibImage.ReadImageFile()){
  465. AfxMessageBox( " Read DIB Image False ! " ) ;
  466.         return FALSE ;
  467.     }    
  468. int nImageWidth = m_dibImage.ImageWidth() ;
  469. int nImageHeight = m_dibImage.ImageHeight() ;
  470. CRect rect( 0,0,nImageWidth,nImageHeight);
  471. int nLeft,nTop ;
  472. nLeft = GetSystemMetrics( SM_CXSCREEN )/2 - nImageWidth/2 ;
  473. nTop = GetSystemMetrics( SM_CYSCREEN ) /2 - nImageHeight/2 ;
  474.     
  475.     CString str ;
  476.     str = AfxRegisterWndClass( NULL ) ;
  477. HWND hwnd = ::GetDesktopWindow() ;
  478. CWnd::CreateEx( WS_EX_TOPMOST,str , NULL , WS_POPUP , 
  479.                nLeft , nTop , nImageWidth , nImageHeight , NULL , NULL , NULL ) ;
  480.     return TRUE ;
  481. }                 
  482. BEGIN_MESSAGE_MAP(CSplashWnd, CWnd)
  483. //{{AFX_MSG_MAP(CSplashWnd)
  484. ON_WM_CREATE()
  485. ON_WM_PAINT()
  486. //}}AFX_MSG_MAP
  487. END_MESSAGE_MAP()
  488. /////////////////////////////////////////////////////////////////////////////
  489. // CSplashWnd message handlers
  490. int CSplashWnd::OnCreate(LPCREATESTRUCT lpCreateStruct)
  491. {
  492. if (CWnd::OnCreate(lpCreateStruct) == -1)
  493. return -1;
  494.     
  495.     return 0;
  496. }   
  497. void CSplashWnd::OnPaint()
  498. {
  499. CPaintDC dc(this); // device context for painting
  500. int nImageWidth = m_dibImage.ImageWidth() ;
  501. int nImageHeight = m_dibImage.ImageHeight() ;
  502. CRect rect( 0,0,nImageWidth,nImageHeight);
  503. m_dibImage.PaintImage( dc.m_hDC , &rect) ;
  504. }