GBBIG5.CPP
上传用户:dyjieshui
上传日期:2021-01-24
资源大小:1427k
文件大小:35k
源码类别:

多国语言处理

开发平台:

Visual C++

  1. // *****************************************************************************
  2. // GBBIG5.cpp
  3. // (C)2000 - YangTze presents
  4. // *****************************************************************************
  5. // =============================================================================
  6. // Head files
  7. // =============================================================================
  8. #include "stdafx.h"
  9. #include "resource.h"
  10. // =============================================================================
  11. // Constants
  12. // =============================================================================
  13. #define MAX_LOADSTRING 100
  14. #define WNDWIDTH 500
  15. #define WNDHEIGHT 308
  16. // =============================================================================
  17. // Global Variables
  18. // =============================================================================
  19. int ScreenX;
  20. int ScreenY;
  21. HINSTANCE hInst;
  22. TCHAR szTitle[ MAX_LOADSTRING ];
  23. TCHAR szWindowClass[ MAX_LOADSTRING ];
  24. HWND hWndVScroll;
  25. HDC hVDC;
  26. HBITMAP hVBmp;
  27. HICON hIconNum[ 16 ];
  28. HBITMAP hBMPGB;
  29. HBITMAP hBMPBIG5;
  30. HCURSOR hMyCursor;
  31. HCURSOR hSysCursor;
  32. BOOL bIsGBorBIG5; // TRUE,display GB code; FALSE,display BIG5 code
  33. HRSRC hTemp;
  34. DWORD dwDOCSize;
  35. DWORD dwGBHZLibSize;
  36. DWORD dwBIG5HZLibSize;
  37. DWORD dwGBBIG5TABSize;
  38. HGLOBAL hDOC;
  39. HGLOBAL hGBHZLib;
  40. HGLOBAL hBIG5HZLib;
  41. HGLOBAL hGBBIG5TAB;
  42. BYTE *pDOC;
  43. BYTE *pGBHZLib;
  44. BYTE *pBIG5HZLib;
  45. BYTE *pGBBIG5TAB;
  46. BOOL IsDOCOK = FALSE;
  47. BOOL IsGBHZLibOK = FALSE;
  48. BOOL IsBIG5HZLibOK = FALSE;
  49. BOOL IsGBBIG5TABOK = FALSE;
  50. BYTE xMakeFileType;
  51. BYTE GBQu;
  52. BYTE BIG5Qu;
  53. BYTE CurWei = 0;
  54. BYTE xxQu = 0;
  55. BYTE xxWei = 0;
  56. BOOL bDrawNothing;
  57. BOOL bPrint = FALSE;
  58. typedef struct {
  59. BYTE HasHZ;
  60. BYTE HZQu;
  61. BYTE HZWei;
  62. RECT rc;
  63. } tagHZRect;
  64. tagHZRect HZRect[ 12 ][ 16 ];
  65. BOOL IsLBDown = FALSE;
  66. BOOL IsInRect;
  67. RECT CurRc;
  68. RECT OldRc;
  69. // =============================================================================
  70. // Declarations of functions
  71. // =============================================================================
  72. ATOM MyRegisterClass( HINSTANCE );
  73. BOOL InitInstance( HINSTANCE,int );
  74. LRESULT CALLBACK WndProc( HWND,UINT,WPARAM,LPARAM );
  75. LRESULT CALLBACK About( HWND,UINT,WPARAM,LPARAM );
  76. void xMyDraw();
  77. void xGetHZDot( BYTE xQu,BYTE xWei,BYTE *Dot );
  78. void xDrawHZ( int x,int y,BYTE *Dot );
  79. void xDispSectionNum( HWND hWnd );
  80. void xFindCode( BYTE fQu,BYTE fWei,BOOL GBBIG5 );
  81. void xExportFile( BYTE MakeFileType );
  82. void xMakeSetFile( BYTE SetFlag );
  83. BOOL xPrint( HWND hWnd,HDC hdc );
  84. // =============================================================================
  85. // Functions
  86. // =============================================================================
  87. // -----------------------------------------------------------------------------
  88. // FUNCTION : WinMain()
  89. // PURPOSE  :
  90. // COMMENTS :
  91. // -----------------------------------------------------------------------------
  92. int APIENTRY WinMain( HINSTANCE hInstance,HINSTANCE hPrevInstance,
  93.  LPSTR lpCmdLine,int nCmdShow )
  94. {
  95. MSG msg;
  96. HACCEL hAccelTable;
  97. // TCHAR mm[ 1024 ];
  98. // GetModuleFileName( ( HMODULE )hInstance,mm,1024 );
  99. // MessageBox( NULL,mm,"Hello",MB_OK );
  100. // MessageBox( NULL,GetCommandLine(),"Hello",MB_OK );
  101. // Get screen metrics
  102. ScreenX = GetSystemMetrics( SM_CXSCREEN );
  103. ScreenY = GetSystemMetrics( SM_CYSCREEN );
  104. // Initialize global strings
  105. LoadString( hInstance,IDS_APP_TITLE,szTitle,MAX_LOADSTRING );
  106. LoadString( hInstance,IDC_GBBIG5,szWindowClass,MAX_LOADSTRING );
  107. MyRegisterClass( hInstance );
  108. // Perform application initialization
  109. if( !InitInstance( hInstance,nCmdShow ) ) {
  110. return FALSE;
  111. }
  112. hAccelTable = LoadAccelerators( hInstance,( LPCTSTR )IDC_GBBIG5 );
  113. // Main message loop
  114. while( GetMessage( &msg,NULL,0,0 ) ) {
  115. if( !TranslateAccelerator( msg.hwnd,hAccelTable,&msg ) ) {
  116. TranslateMessage( &msg );
  117. DispatchMessage( &msg );
  118. }
  119. }
  120. return msg.wParam;
  121. }
  122. // -----------------------------------------------------------------------------
  123. // FUNCTION : MyRegisterClass()
  124. // PURPOSE  : Registers the window class.
  125. // COMMENTS :
  126. // -----------------------------------------------------------------------------
  127. ATOM MyRegisterClass( HINSTANCE hInstance )
  128. {
  129. WNDCLASSEX wcex;
  130. wcex.cbSize        = sizeof( WNDCLASSEX );
  131. wcex.style         = CS_HREDRAW | CS_VREDRAW;
  132. wcex.lpfnWndProc   = ( WNDPROC )WndProc;
  133. wcex.cbClsExtra    = 0;
  134. wcex.cbWndExtra    = 0;
  135. wcex.hInstance     = hInstance;
  136. wcex.hIcon         = LoadIcon( hInstance,( LPCTSTR )"GBBIG5" );
  137. wcex.hCursor       = LoadCursor( NULL,IDC_ARROW );
  138. wcex.hbrBackground = ( HBRUSH )( COLOR_WINDOW + 1 );
  139. wcex.lpszMenuName  = ( LPCSTR )IDC_GBBIG5;
  140. wcex.lpszClassName = szWindowClass;
  141. wcex.hIconSm       = LoadIcon( wcex.hInstance,( LPCTSTR )IDI_SMALL );
  142. return RegisterClassEx( &wcex );
  143. }
  144. // -----------------------------------------------------------------------------
  145. // FUNCTION : InitInstance()
  146. // PURPOSE  : Saves instance handle and creates main window.
  147. // COMMENTS :
  148. // -----------------------------------------------------------------------------
  149. BOOL InitInstance( HINSTANCE hInstance,int nCmdShow )
  150. {
  151. HWND hWnd;
  152. hInst = hInstance;
  153. hWnd = CreateWindowEx(
  154. WS_EX_CLIENTEDGE,
  155. szWindowClass,
  156. szTitle,
  157. WS_OVERLAPPED | WS_SYSMENU | WS_VSCROLL,
  158. ( ScreenX - WNDWIDTH ) / 2,
  159. ( ScreenY - WNDHEIGHT ) / 2,
  160. WNDWIDTH,WNDHEIGHT,
  161. NULL,NULL,hInstance,NULL
  162. );
  163. if( !hWnd ) {
  164. return FALSE;
  165. }
  166. hWndVScroll = hWnd;
  167. SetScrollRange( hWndVScroll,SB_VERT,1,87,TRUE );
  168. SetScrollPos( hWndVScroll,SB_VERT,GBQu,TRUE );
  169. ShowWindow( hWnd,nCmdShow );
  170. UpdateWindow( hWnd );
  171.    return TRUE;
  172. }
  173. // -----------------------------------------------------------------------------
  174. // FUNCTION : WndProc()
  175. // PURPOSE  : Processes messages for the main window.
  176. // COMMENTS :
  177. // -----------------------------------------------------------------------------
  178. LRESULT CALLBACK WndProc( HWND hWnd,UINT message,WPARAM wParam,LPARAM lParam )
  179. {
  180. int wmId,wmEvent;
  181. int nScrollCode,nPos;
  182. PAINTSTRUCT ps;
  183. HDC hdc;
  184. HMENU hMainMenu;
  185. HMENU hSubMenu;
  186. BOOL bScroll;
  187. BOOL bRet;
  188. POINT pt;
  189. int i,j;
  190. TCHAR tmp[ 255 ];
  191. switch( message ) {
  192. case WM_CREATE:
  193. // Create compatiable Device Content
  194. hdc = GetDC( hWnd );
  195. hVDC = CreateCompatibleDC( hdc );
  196. hVBmp = CreateCompatibleBitmap( hdc,WNDWIDTH,WNDHEIGHT );
  197. SelectObject( hVDC,hVBmp );
  198. ReleaseDC( hWnd,hdc );
  199. // Load ICON number
  200. for( i = 0; i < 16; i ++ ) {
  201. wsprintf( tmp,"ICON_NUM_%X",i );
  202. // hIconNum[ i ] = LoadIcon( hInst,tmp );
  203. hIconNum[ i] = ( HICON )LoadImage( hInst,tmp,IMAGE_ICON,16,16,LR_DEFAULTCOLOR );
  204. }
  205. // Load cursor
  206. hMyCursor = LoadCursor( hInst,"MYCURSOR" );
  207. hSysCursor = LoadCursor( NULL,IDC_ARROW );
  208. // Load bitmap
  209. hBMPGB = LoadBitmap( hInst,"BITMAPGB" );
  210. hBMPBIG5 = LoadBitmap( hInst,"BITMAPBIG5" );
  211. // Menu initialization
  212. bIsGBorBIG5 = TRUE;
  213. hMainMenu = GetMenu( hWnd );
  214. hSubMenu = GetSubMenu( hMainMenu,1 );
  215. CheckMenuItem( hSubMenu,IDM_GBCODE,MF_BYCOMMAND | MF_CHECKED );
  216. GBQu = 1;
  217. BIG5Qu = 1;
  218. // Resource : DOC
  219. hTemp = FindResourceEx( ( HMODULE )hInst,"DOC","BIG5CODEDOC",MAKELANGID( LANG_NEUTRAL,SUBLANG_NEUTRAL ) );
  220. if( hTemp ) {
  221. hDOC = LoadResource( ( HMODULE )hInst,hTemp );
  222. if( hDOC ) {
  223. dwDOCSize = SizeofResource( ( HMODULE )hInst,hTemp );
  224. pDOC = ( BYTE * )LockResource( hDOC );
  225. IsDOCOK = TRUE;
  226. }
  227. }
  228. // Resource : GBHZLib
  229. hTemp = FindResourceEx( ( HMODULE )hInst,"HZLIB","GBHZLIB",MAKELANGID( LANG_NEUTRAL,SUBLANG_NEUTRAL ) );
  230. if( hTemp ) {
  231. hGBHZLib = LoadResource( ( HMODULE )hInst,hTemp );
  232. if( hGBHZLib ) {
  233. dwGBHZLibSize = SizeofResource( ( HMODULE )hInst,hTemp );
  234. pGBHZLib = ( BYTE * )LockResource( hGBHZLib );
  235. IsGBHZLibOK = TRUE;
  236. }
  237. }
  238. // Resource : BIG5HZLib
  239. hTemp = FindResourceEx( ( HMODULE )hInst,"HZLIB","BIG5HZLIB",MAKELANGID( LANG_NEUTRAL,SUBLANG_NEUTRAL ) );
  240. if( hTemp ) {
  241. hBIG5HZLib = LoadResource( ( HMODULE )hInst,hTemp );
  242. if( hBIG5HZLib ) {
  243. dwBIG5HZLibSize = SizeofResource( ( HMODULE )hInst,hTemp );
  244. pBIG5HZLib = ( BYTE * )LockResource( hBIG5HZLib );
  245. IsBIG5HZLibOK = TRUE;
  246. }
  247. }
  248. // Resource : GBBIG5TAB
  249. hTemp = FindResourceEx( ( HMODULE )hInst,"GBBIG5TAB","GB-BIG5TAB",MAKELANGID( LANG_NEUTRAL,SUBLANG_NEUTRAL ) );
  250. if( hTemp ) {
  251. hGBBIG5TAB = LoadResource( ( HMODULE )hInst,hTemp );
  252. if( hGBBIG5TAB ) {
  253. dwGBBIG5TABSize = SizeofResource( ( HMODULE )hInst,hTemp );
  254. pGBBIG5TAB = ( BYTE * )LockResource( hGBBIG5TAB );
  255. IsGBBIG5TABOK = TRUE;
  256. }
  257. }
  258. break;
  259. case WM_VSCROLL:
  260. bScroll = TRUE;;
  261. nScrollCode = ( int )LOWORD( wParam );
  262. switch( nScrollCode ) {
  263. case SB_PAGEDOWN:
  264. if( bIsGBorBIG5 ) GBQu += 2;
  265. else BIG5Qu += 2;
  266. case SB_LINEDOWN:
  267. // test
  268. // {
  269. // char tmp[ 100 ];
  270. // static int i=0;
  271. // RECT rc;
  272. // GetClientRect( hWnd,&rc );
  273. // wsprintf( tmp,"Hello : %d",i );
  274. // bScroll = FALSE;
  275. // i++;
  276. // ScrollWindow( hWnd,0,-20,NULL,NULL );
  277. // SetBkMode( hVDC,TRANSPARENT );
  278. // if( i % 2 ) {
  279. // SetTextColor( hVDC,RGB( 255,0,0 ) );
  280. // FillRect(hVDC, &rc, (HBRUSH)GetStockObject( LTGRAY_BRUSH ));
  281. // }
  282. // else {
  283. // SetTextColor( hVDC,RGB( 0,255,0 ) );
  284. // FillRect(hVDC, &rc, (HBRUSH)GetStockObject( GRAY_BRUSH ));
  285. // }
  286. // TextOut( hVDC,0,240,tmp,lstrlen(tmp ) );
  287. // break;
  288. // }
  289. // test
  290. if( bIsGBorBIG5 ) {
  291. GBQu ++;
  292. if( GBQu >= 87 ) GBQu = 87;
  293. SetScrollPos( hWndVScroll,SB_VERT,GBQu,TRUE );
  294. }
  295. else {
  296. BIG5Qu ++;
  297. if( BIG5Qu >= 89 ) BIG5Qu = 89;
  298. SetScrollPos( hWndVScroll,SB_VERT,BIG5Qu,TRUE );
  299. }
  300. break;
  301. case SB_PAGEUP:
  302. if( bIsGBorBIG5 ) GBQu -= 2;
  303. else BIG5Qu -= 2;
  304. case SB_LINEUP:
  305. if( bIsGBorBIG5 ) {
  306. GBQu --;
  307. if( GBQu <= 1 ) GBQu = 1;
  308. SetScrollPos( hWndVScroll,SB_VERT,GBQu,TRUE );
  309. }
  310. else {
  311. BIG5Qu --;
  312. if( BIG5Qu <= 1 ) BIG5Qu = 1;
  313. SetScrollPos( hWndVScroll,SB_VERT,BIG5Qu,TRUE );
  314. }
  315. break;
  316. case SB_THUMBPOSITION:
  317. nPos = ( short int )HIWORD( wParam );
  318. if( bIsGBorBIG5 ) GBQu = nPos;
  319. else BIG5Qu = nPos;
  320. SetScrollPos( hWndVScroll,SB_VERT,nPos,TRUE );
  321. break;
  322. default:
  323. bScroll = FALSE;
  324. break;
  325. }
  326. if( bScroll ) {
  327. xDispSectionNum( hWnd );
  328. xMyDraw();
  329. InvalidateRect( hWnd,NULL,TRUE );
  330. }
  331. break;
  332. case WM_NCACTIVATE:
  333. DefWindowProc( hWnd,message,wParam,lParam );
  334. xDispSectionNum( hWnd );
  335. return !( ( BOOL)wParam );
  336. case WM_NCPAINT:
  337. DefWindowProc( hWnd,message,wParam,lParam );
  338. xDispSectionNum( hWnd );
  339. break;
  340. case WM_COMMAND:
  341. wmId    = LOWORD( wParam );
  342. wmEvent = HIWORD( wParam );
  343. // Parse the menu selections
  344. switch( wmId ) {
  345. case IDM_GBCODE:
  346. bIsGBorBIG5 = TRUE;
  347. hMainMenu = GetMenu( hWnd );
  348. hSubMenu = GetSubMenu( hMainMenu,1 );
  349. CheckMenuItem( hSubMenu,IDM_GBCODE,MF_BYCOMMAND | MF_CHECKED );
  350. CheckMenuItem( hSubMenu,IDM_BIG5CODE,MF_BYCOMMAND | MF_UNCHECKED );
  351. SetScrollRange( hWndVScroll,SB_VERT,1,87,TRUE );
  352. SetScrollPos( hWndVScroll,SB_VERT,GBQu,TRUE );
  353. CurWei = 0;
  354. xxQu = 0;
  355. xxWei = 0;
  356. xDispSectionNum( hWnd );
  357. xMyDraw();
  358. InvalidateRect( hWnd,NULL,TRUE );
  359. break;
  360. case IDM_BIG5CODE:
  361. bIsGBorBIG5 = FALSE;
  362. hMainMenu = GetMenu( hWnd );
  363. hSubMenu = GetSubMenu( hMainMenu,1 );
  364. CheckMenuItem( hSubMenu,IDM_GBCODE,MF_BYCOMMAND | MF_UNCHECKED );
  365. CheckMenuItem( hSubMenu,IDM_BIG5CODE,MF_BYCOMMAND | MF_CHECKED );
  366. SetScrollRange( hWndVScroll,SB_VERT,1,89,TRUE );
  367. SetScrollPos( hWndVScroll,SB_VERT,BIG5Qu,TRUE );
  368. CurWei = 0;
  369. xxQu = 0;
  370. xxWei = 0;
  371. xDispSectionNum( hWnd );
  372. xMyDraw();
  373. InvalidateRect( hWnd,NULL,TRUE );
  374. break;
  375. case IDM_MAKEDOCFILE:
  376. xMakeFileType = 0;
  377. xExportFile( xMakeFileType );
  378. break;
  379. case IDM_MAKEGBHZLIBFILE:
  380. xMakeFileType = 1;
  381. xExportFile( xMakeFileType );
  382. break;
  383. case IDM_MAKEBIG5HZLIBFILE:
  384. xMakeFileType = 2;
  385. xExportFile( xMakeFileType );
  386. break;
  387. case IDM_MAKEGBBIG5TABFILE:
  388. xMakeFileType = 3;
  389. xExportFile( xMakeFileType );
  390. break;
  391. case IDM_MAKEGBSET:
  392. xMakeSetFile( 0 );
  393. break;
  394. case IDM_MAKEBIG5SET:
  395. xMakeSetFile( 1 );
  396. break;
  397. case IDM_PRINT:
  398. SetWindowText( hWnd,"Now printing..." );
  399. bPrint = TRUE;
  400. bRet = xPrint( hWnd,hVDC );
  401. if( bRet )
  402. MessageBox( hWnd,"Printing OK!",szTitle,MB_OK | MB_ICONINFORMATION );
  403. else
  404. MessageBox( hWnd,"Printing failure!",szTitle,MB_OK | MB_ICONINFORMATION );
  405. bPrint = FALSE;
  406. xMyDraw();
  407. SetWindowText( hWnd,szTitle );
  408. break;
  409. case IDM_ABOUT:
  410. DialogBox( hInst,( LPCTSTR )IDD_ABOUTBOX,hWnd,( DLGPROC )About );
  411. break;
  412. case IDM_EXIT:
  413. DestroyWindow( hWnd );
  414. break;
  415. default:
  416. return DefWindowProc( hWnd,message,wParam,lParam );
  417. }
  418. break;
  419. case WM_SIZE:
  420. xMyDraw();
  421. InvalidateRect( hWnd,NULL,TRUE );
  422. break;
  423. case WM_MOUSEMOVE:
  424. pt.x = LOWORD( lParam );
  425. pt.y = HIWORD( lParam );
  426. SetCursor( hSysCursor );
  427. IsInRect = FALSE;
  428. for( i = 0; i < 12; i ++ ) {
  429. for( j = 0; j < 16; j ++ ) {
  430. if( PtInRect( &HZRect[ i ][ j ].rc,pt ) ) {
  431. IsInRect     = TRUE;
  432. CurRc.left   = HZRect[ i ][ j ].rc.left;
  433. CurRc.top    = HZRect[ i ][ j ].rc.top;
  434. CurRc.right  = HZRect[ i ][ j ].rc.right;
  435. CurRc.bottom = HZRect[ i ][ j ].rc.bottom;
  436. if( HZRect[ i ][ j ].HasHZ ) {
  437. CurWei = HZRect[ i ][ j ].HZWei;
  438. SetCursor( hMyCursor );
  439. xFindCode( HZRect[ i ][ j ].HZQu,CurWei,bIsGBorBIG5 );
  440. }
  441. else {
  442. CurWei = 0;
  443. }
  444. xDispSectionNum( hWnd );
  445. }
  446. }
  447. }
  448. break;
  449. case WM_LBUTTONDOWN:
  450. if( !IsInRect ) break;
  451. IsLBDown = TRUE;
  452. SetCapture( hWnd );
  453. hdc = GetDC( hWnd );
  454. SetROP2( hdc,R2_NOT );
  455. OldRc.left   = CurRc.left;
  456. OldRc.top    = CurRc.top;
  457. OldRc.right  = CurRc.right;
  458. OldRc.bottom = CurRc.bottom;
  459. MoveToEx( hdc,OldRc.left,0,NULL );
  460. LineTo( hdc,OldRc.left,OldRc./*bottom*/top );
  461. MoveToEx( hdc,0,OldRc.top,NULL );
  462. LineTo( hdc,OldRc./*right*/left,OldRc.top );
  463. MoveToEx( hdc,OldRc.right,0,NULL );
  464. LineTo( hdc,OldRc.right,OldRc.bottom );
  465. MoveToEx( hdc,0,OldRc.bottom,NULL );
  466. LineTo( hdc,OldRc.right,OldRc.bottom );
  467. ReleaseDC( hWnd,hdc );
  468. break;
  469. case WM_LBUTTONUP:
  470. if( !IsLBDown ) break;
  471. IsLBDown = FALSE;
  472. ReleaseCapture();
  473. hdc = GetDC( hWnd );
  474. SetROP2( hdc,R2_NOT );
  475. MoveToEx( hdc,OldRc.left,0,NULL );
  476. LineTo( hdc,OldRc.left,OldRc.top );
  477. MoveToEx( hdc,0,OldRc.top,NULL );
  478. LineTo( hdc,OldRc.left,OldRc.top );
  479. MoveToEx( hdc,OldRc.right,0,NULL );
  480. LineTo( hdc,OldRc.right,OldRc.bottom );
  481. MoveToEx( hdc,0,OldRc.bottom,NULL );
  482. LineTo( hdc,OldRc.right,OldRc.bottom );
  483. ReleaseDC( hWnd,hdc );
  484. break;
  485. case WM_PAINT:
  486. hdc = BeginPaint( hWnd,&ps );
  487. BitBlt(
  488. hdc,
  489. ps.rcPaint.left,ps.rcPaint.top,
  490. ps.rcPaint.right,ps.rcPaint.bottom,
  491. hVDC,
  492. ps.rcPaint.left,ps.rcPaint.top,
  493. SRCCOPY
  494. );
  495. EndPaint( hWnd,&ps );
  496. break;
  497. case WM_DESTROY:
  498. if( hVDC ) DeleteDC( hVDC );
  499. if( hVBmp ) DeleteObject( hVBmp );
  500. PostQuitMessage( 0 );
  501. break;
  502. default:
  503. return DefWindowProc( hWnd,message,wParam,lParam );
  504. }
  505. return 0;
  506. }
  507. // -----------------------------------------------------------------------------
  508. // FUNCTION : xMyDraw()
  509. // PURPOSE  : Drawing client area in the compatiable DC.
  510. // COMMENTS :
  511. // -----------------------------------------------------------------------------
  512. void xMyDraw()
  513. {
  514. HDC hmemDC;
  515. BYTE nQu,nWei;
  516. int nRowNum;
  517. int i,j,k;
  518. BYTE HZDot[ 32 ];
  519. // Clear DC
  520. SelectObject( hVDC,GetStockObject( WHITE_BRUSH ) );
  521. PatBlt( hVDC,0,0,WNDWIDTH,WNDHEIGHT,PATCOPY );
  522. // Draw GB or BIG5 bitmap
  523. hmemDC = CreateCompatibleDC( hVDC );
  524. if( bIsGBorBIG5 ) SelectObject( hmemDC,hBMPGB );
  525. else SelectObject( hmemDC,hBMPBIG5 );
  526. BitBlt( hVDC,8,1,32,32,hmemDC,0,0,SRCCOPY );
  527. DeleteDC( hmemDC );
  528. // Draw horization line & icon number
  529. MoveToEx( hVDC,0,0,NULL );
  530. LineTo( hVDC,( 16 + 2 ) * 27 - 15,0 );
  531. MoveToEx( hVDC,0,18,NULL );
  532. LineTo( hVDC,( 16 + 2 ) * 27 - 15,18 );
  533. MoveToEx( hVDC,0,13 * 20 - 1,NULL );
  534. LineTo( hVDC,( 16 + 2 ) * 27 - 15,13 * 20 - 1 );
  535. for( i = 0; i < 16; i ++ ) {
  536. DrawIconEx( hVDC,i * ( 16 + 10 ) + 60 ,1,hIconNum[ i ],16,16,0,NULL,DI_NORMAL );
  537. }
  538. // Draw vertical line & icon number
  539. MoveToEx( hVDC,0,0,NULL );
  540. LineTo( hVDC,0,13 * 20 );
  541. MoveToEx( hVDC,( 16 + 2 ) * 3,0,NULL );
  542. LineTo( hVDC,( 16 + 2 ) * 3,13 * 20 );
  543. MoveToEx( hVDC,( 16 + 2 ) * 27 - 15,0,NULL );
  544. LineTo( hVDC,( 16 + 2 ) * 27 - 15,13 * 20 );
  545. if( bIsGBorBIG5 ) nQu = 0xA0 + GBQu;
  546. else nQu = 0xA0 + BIG5Qu;
  547. nRowNum = 12;
  548. for( j = 0; j < nRowNum; j ++ ) {
  549. DrawIconEx( hVDC,0 * ( 16 + 2 ) + 1, 20 * j + 20,hIconNum[ ( ( nQu & 0xf0 ) >> 4 ) ],16,16,0,NULL,DI_NORMAL );
  550. DrawIconEx( hVDC,1 * ( 16 + 2 ) + 1, 20 * j + 20,hIconNum[ ( nQu & 0x0f ) ],16,16,0,NULL,DI_NORMAL );
  551. DrawIconEx( hVDC,2 * ( 16 + 2 ) + 1, 20 * j + 20,hIconNum[ j + 4 ],16,16,0,NULL,DI_NORMAL );
  552. }
  553. // Draw HZ
  554. for( k = 0; k < nRowNum; k ++ ) {
  555. for( i = 0; i < 16; i ++ ) {
  556. nWei = 0x40 + k * 16 + i;
  557. memset( HZDot,0x00,32 );
  558. xGetHZDot( nQu,nWei,HZDot );
  559. HZRect[ k ][ i ].HasHZ = !bDrawNothing;
  560. HZRect[ k ][ i ].HZQu = nQu;
  561. HZRect[ k ][ i ].HZWei = nWei;
  562. HZRect[ k ][ i ].rc.left = i * ( 16 + 10 ) + 60;
  563. HZRect[ k ][ i ].rc.right = i * ( 16 + 10 ) + 60 + 16;
  564. HZRect[ k ][ i ].rc.top = ( k + 1 ) * 20;
  565. HZRect[ k ][ i ].rc.bottom = ( k + 1 ) * 20 + 16;
  566. xDrawHZ( i * ( 16 + 10 ) + 60,( k + 1 ) * 20,HZDot );
  567. }
  568. }
  569. }
  570. // -----------------------------------------------------------------------------
  571. // FUNCTION : xGetHZDot()
  572. // PURPOSE  : Get the HZ dot matrix from HZLib resource.
  573. // COMMENTS :
  574. // -----------------------------------------------------------------------------
  575. void xGetHZDot( BYTE xQu,BYTE xWei,BYTE *Dot )
  576. {
  577. DWORD offset;
  578. BYTE *ptr = NULL;
  579. int j;
  580. // For printing
  581. if( xQu > 0xf9 ) {
  582. bDrawNothing = TRUE;
  583. for( j = 0; j < 32; j ++ ) {
  584. Dot[ j ] = 0xff;
  585. }
  586. return;
  587. }
  588. if( bIsGBorBIG5 ) {
  589. if( xWei < 0xa1 || xWei > 0xfe ) {
  590. ptr = NULL;
  591. }
  592. else {
  593. ptr = pGBHZLib;
  594. offset = ( xQu - 0xa1 ) * 94 * 32 + ( xWei - 0xa1 ) * 32;
  595. }
  596. }
  597. else {
  598. ptr = pBIG5HZLib;
  599. if( xWei >= 0x40 && xWei <= 0x7e )
  600. offset = ( xQu - 0xa1 ) * 157 * 32 + ( xWei - 0x40 ) * 32;
  601. else if( xWei >= 0xa1 && xWei <= 0xfe )
  602. offset = ( xQu - 0xa1 ) * 157 * 32 + 63 * 32 + ( xWei - 0xa1 ) * 32;
  603. else
  604. ptr = NULL;
  605. }
  606. if( ptr ) {
  607. bDrawNothing = FALSE;
  608. for( j = 0; j < 32; j ++ ) {
  609. Dot[ j ] = *( ptr + offset + j );
  610. if( !bIsGBorBIG5 ) Dot[ j ] = Dot[ j ] ^ 0xff;
  611. }
  612. }
  613. else {
  614. bDrawNothing = TRUE;
  615. for( j = 0; j < 32; j ++ ) {
  616. Dot[ j ] = 0xff;
  617. }
  618. }
  619. }
  620. // -----------------------------------------------------------------------------
  621. // FUNCTION : DrawHZ()
  622. // PURPOSE  : Draw HZ in the compatiable DC.
  623. // COMMENTS :
  624. // -----------------------------------------------------------------------------
  625. void xDrawHZ( int x,int y,BYTE *Dot )
  626. {
  627. int i,j;
  628. int nCol,nRow;
  629. WORD wDot;
  630. WORD wMask;
  631. BYTE b1,b2;
  632. COLORREF cr;
  633. if( bDrawNothing ) cr = RGB( 192,192,192 );
  634. else {
  635. cr = RGB( 0,192,0 );
  636. if( bPrint ) cr = RGB( 0,0,0 );
  637. }
  638. nRow = y;
  639. for( i = 0; i < 32; i ++ ) {
  640. b1 = *( Dot + i + 0 );
  641. b2 = *( Dot + i + 1 );
  642. i ++;
  643. wDot = MAKEWORD( b2,b1 );
  644. nCol = x;
  645. wMask = 0x8000;
  646. for( j = 0; j < 16; j ++ ) {
  647. if( wDot & wMask ) {
  648. SetPixel( hVDC,nCol,nRow,cr );
  649. }
  650. //else SetPixel( hVDC,nCol,nRow,RGB( 0,128,0 ) );
  651. wMask >>= 1;
  652. nCol ++;
  653. }
  654. nRow ++;
  655. }
  656. }
  657. // -----------------------------------------------------------------------------
  658. // FUNCTION : xDispSectionNum()
  659. // PURPOSE  : Display the "Qu/total Qu -> GB : XXXX   BIG5 : XXXX" message in
  660. //          : menu bar.
  661. // COMMENTS :
  662. // -----------------------------------------------------------------------------
  663. void xDispSectionNum( HWND hWnd )
  664. {
  665. TCHAR str[ 255 ];
  666. HDC hdc;
  667. BYTE yQu;
  668. BYTE Page;
  669. BYTE Pages;
  670. if( bIsGBorBIG5 ) {
  671. yQu = GBQu;
  672. Pages = 87 / 3;
  673. }
  674. else {
  675. yQu = BIG5Qu;
  676. Pages = 89 / 3 + 1;
  677. }
  678. if( yQu % 3 == 0 ) Page = yQu / 3;
  679. else Page = yQu / 3 + 1;
  680. if( CurWei == 0 ) {
  681. if( bIsGBorBIG5 ) {
  682. wsprintf( str," %02d#87 -> GB : %02XXX    BIG5 : XXXX  P.%02d/%02d  ",yQu,yQu + 0xa0,Page,Pages );
  683. }
  684. else {
  685. wsprintf( str," %02d#89 -> GB : XXXX    BIG5 : %02XXX  P.%02d/%02d  ",yQu,yQu + 0xa0,Page,Pages );
  686. }
  687. }
  688. else {
  689. if( bIsGBorBIG5 ) {
  690. if( xxQu == 0xff && xxWei == 0xff ) {
  691. wsprintf( str," %02d#87 -> GB : %02X%02X    BIG5 : XXXX  P.%02d/%02d  ",yQu,yQu + 0xa0,CurWei,Page,Pages );
  692. }
  693. else {
  694. wsprintf( str," %02d#87 -> GB : %02X%02X    BIG5 : %02X%02X  P.%02d/%02d  ",yQu,yQu + 0xa0,CurWei,xxQu,xxWei,Page,Pages );
  695. }
  696. }
  697. else {
  698. if( xxQu == 0xff && xxWei == 0xff ) {
  699. wsprintf( str," %02d#89 -> GB : XXXX    BIG5 : %02X%02X  P.%02d/%02d  ",yQu,yQu + 0xa0,CurWei,Page,Pages );
  700. }
  701. else {
  702. wsprintf( str," %02d#89 -> GB : %02X%02X    BIG5 : %02X%02X  P.%02d/%02d  ",yQu,xxQu,xxWei,yQu + 0xa0,CurWei,Page,Pages );
  703. }
  704. }
  705. }
  706. hdc = GetWindowDC( hWnd );
  707. SetTextColor( hdc,RGB( 0,255,0 ) );
  708. SetBkColor( hdc,RGB( 0,0,0 ) );
  709. TextOut( hdc,180,24,str,lstrlen( str ) );
  710. ReleaseDC( hWnd,hdc );
  711. }
  712. // -----------------------------------------------------------------------------
  713. // FUNCTION : xFindCode()
  714. // PURPOSE  : Find GB/BIG5 code int the GB-BIG5 table.
  715. // COMMENTS :
  716. // -----------------------------------------------------------------------------
  717. void xFindCode( BYTE fQu,BYTE fWei,BOOL GBBIG5 )
  718. {
  719. BYTE *ptr;
  720. DWORD TableLen;
  721. DWORD i;
  722. BOOL bFind;
  723. bFind = FALSE;
  724. if( !GBBIG5 ) {
  725. ptr = pGBBIG5TAB;
  726. TableLen = 0x4000;
  727. }
  728. else {
  729. ptr = pGBBIG5TAB + 0x4508;
  730. TableLen = 0x6e08;
  731. }
  732. for( i = 0; i < TableLen; i ++ ) {
  733. if( ( fQu == *( ptr + i ) ) && ( fWei == *( ptr + i + 1 ) ) ) {
  734. bFind = TRUE;
  735. break;
  736. }
  737. i ++;
  738. }
  739. if( !bFind ) {
  740. xxQu = 0xff;
  741. xxWei = 0xff;
  742. return;
  743. }
  744. if( !GBBIG5 ) {
  745. xxWei = ( BYTE )( ( i / 2 ) % 94 + 0xa1 );
  746. xxQu = ( BYTE )( ( i / 2 ) / 94 + 0xa1 );
  747. }
  748. else {
  749. xxWei = ( BYTE )( ( i / 2 ) % 157 );
  750. if( xxWei < 64 ) xxWei += 0x40;
  751. else xxWei = xxWei - 63 + 0xa1;
  752. xxQu = ( BYTE )( ( i / 2 ) / 157 + 0xa1 );
  753. }
  754. }
  755. // -----------------------------------------------------------------------------
  756. // FUNCTION : About()
  757. // PURPOSE  : Mesage handler for about box.
  758. // COMMENTS :
  759. // -----------------------------------------------------------------------------
  760. LRESULT CALLBACK About( HWND hDlg,UINT message,WPARAM wParam,LPARAM lParam )
  761. {
  762. switch( message ) {
  763. case WM_INITDIALOG:
  764. SetWindowText( hDlg,szTitle );
  765. return TRUE;
  766. case WM_COMMAND:
  767. if( LOWORD( wParam ) == IDOK || LOWORD( wParam ) == IDCANCEL ) {
  768. EndDialog( hDlg,LOWORD( wParam ) );
  769. return TRUE;
  770. }
  771. break;
  772. }
  773. return FALSE;
  774. }
  775. // -----------------------------------------------------------------------------
  776. // FUNCTION : xExportFile()
  777. // PURPOSE  : Dump the resource to disk file.
  778. // COMMENTS :
  779. // -----------------------------------------------------------------------------
  780. void xExportFile( BYTE MakeFileType )
  781. {
  782. BYTE *ptr;
  783. DWORD dwFileSize;
  784. DWORD dwWrittenBytes;
  785. BOOL IsOK;
  786. OPENFILENAME ofn;
  787. TCHAR TheFileName[ 1024 * 2 ];
  788. TCHAR TheTitle[ 100 ];
  789. HANDLE hFile;
  790. TheFileName[ 0 ] = 0x00;
  791. switch( MakeFileType ) {
  792. case 0:
  793. IsOK = IsDOCOK;
  794. ptr = pDOC;
  795. dwFileSize = dwDOCSize;
  796. lstrcpy( TheTitle,"Export BIG5 code file" );
  797. break;
  798. case 1:
  799. IsOK = IsGBHZLibOK;
  800. ptr = pGBHZLib;
  801. dwFileSize = dwGBHZLibSize;
  802. lstrcpy( TheTitle,"Export GB HZLib(16x16) file" );
  803. break;
  804. case 2:
  805. IsOK = IsBIG5HZLibOK;
  806. ptr = pBIG5HZLib;
  807. dwFileSize = dwBIG5HZLibSize;
  808. lstrcpy( TheTitle,"Export BIG5 HZLib(16x16) file" );
  809. break;
  810. case 3:
  811. IsOK = IsGBBIG5TABOK;
  812. ptr = pGBBIG5TAB;
  813. dwFileSize = dwGBBIG5TABSize;
  814. lstrcpy( TheTitle,"Export GB-BIG5 index table file" );
  815. break;
  816. default:
  817. return;
  818. }
  819. if( !IsOK ) {
  820. MessageBox(
  821. NULL,
  822. "The data for the specified file is not OK!",
  823. szTitle,MB_OK | MB_ICONINFORMATION
  824. );
  825. return;
  826. }
  827.     ofn.lStructSize = sizeof( OPENFILENAME );
  828.     ofn.hwndOwner = NULL;
  829.     ofn.hInstance = hInst;
  830.     ofn.lpstrFilter = "All files*.*";
  831.     ofn.lpstrCustomFilter =NULL;
  832.     ofn.nMaxCustFilter = 0;
  833.     ofn.nFilterIndex = 0;
  834.     ofn.lpstrFile = TheFileName;
  835.     ofn.nMaxFile = 1024 * 2;
  836.     ofn.lpstrFileTitle = NULL;
  837.     ofn.nMaxFileTitle = 0;
  838.     ofn.lpstrInitialDir = NULL;
  839.     ofn.lpstrTitle = TheTitle;
  840.     ofn.Flags = OFN_HIDEREADONLY | OFN_LONGNAMES | OFN_OVERWRITEPROMPT;
  841.     ofn.nFileOffset = 0;
  842.     ofn.nFileExtension = 0; 
  843.     ofn.lpstrDefExt = NULL;
  844.     ofn.lCustData = 0;
  845.     ofn.lpfnHook =NULL ;
  846.     ofn.lpTemplateName = NULL;
  847. if( !GetSaveFileName( &ofn ) ) {
  848. MessageBox(
  849. NULL,"Fail to export file!",
  850. szTitle,MB_OK | MB_ICONINFORMATION
  851. );
  852. return;
  853. }
  854. hFile = CreateFile(
  855. TheFileName,
  856. GENERIC_WRITE,
  857. 0,
  858. NULL,
  859. CREATE_ALWAYS,
  860. FILE_ATTRIBUTE_NORMAL,
  861. NULL
  862. );
  863. if( hFile == INVALID_HANDLE_VALUE ) {
  864. MessageBox(
  865. NULL,"Fail to export file!",
  866. szTitle,MB_OK | MB_ICONINFORMATION
  867. );
  868. return;
  869. }
  870. if( !WriteFile( hFile,ptr,dwFileSize,&dwWrittenBytes,NULL ) ) {
  871. CloseHandle( hFile );
  872. MessageBox(
  873. NULL,"Fail to export file!",
  874. szTitle,MB_OK | MB_ICONINFORMATION
  875. );
  876. return;
  877. }
  878. if( dwWrittenBytes != dwFileSize ) {
  879. CloseHandle( hFile );
  880. MessageBox(
  881. NULL,"Fail to export file!",
  882. szTitle,MB_OK | MB_ICONINFORMATION
  883. );
  884. return;
  885. }
  886. lstrcat( TheTitle," OK!" );
  887. MessageBox(
  888. NULL,TheTitle,
  889. szTitle,MB_OK | MB_ICONINFORMATION
  890. );
  891. CloseHandle( hFile );
  892. }
  893. // -----------------------------------------------------------------------------
  894. // FUNCTION : xMakeSetFile()
  895. // PURPOSE  : Make the GB/BIG5 character set text file.
  896. // COMMENTS :
  897. // -----------------------------------------------------------------------------
  898. void xMakeSetFile( BYTE SetFlag )
  899. {
  900. DWORD dwSize;
  901. DWORD dwWrittenBytes;
  902. OPENFILENAME ofn;
  903. TCHAR TheFileName[ 1024 * 2 ];
  904. TCHAR TheTitle[ 100 ];
  905. HANDLE hFile;
  906. BYTE nQu,nWei;
  907. BYTE nRowNum;
  908. BYTE nQuNum = 0;
  909. BYTE HexSet[ 16 ] = {
  910. '0','1','2','3','4','5','6','7',
  911. '8','9','A','B','C','D','E','F'
  912. };
  913. #define LB 56
  914. char SetBuf[ 15 ][ LB ];
  915. int i,j,k,l;
  916. TheFileName[ 0 ] = 0x00;
  917. switch( SetFlag ) {
  918. case 0:
  919. nQuNum = 87;
  920. lstrcpy( TheTitle,"Make GB character set file" );
  921. break;
  922. case 1:
  923. nQuNum = 89;
  924. lstrcpy( TheTitle,"Make BIG5 character set file" );
  925. break;
  926. default:
  927. return;
  928. }
  929.     ofn.lStructSize = sizeof( OPENFILENAME );
  930.     ofn.hwndOwner = NULL;
  931.     ofn.hInstance = hInst;
  932.     ofn.lpstrFilter = "All files*.*";
  933.     ofn.lpstrCustomFilter =NULL;
  934.     ofn.nMaxCustFilter = 0;
  935.     ofn.nFilterIndex = 0;
  936.     ofn.lpstrFile = TheFileName;
  937.     ofn.nMaxFile = 1024 * 2;
  938.     ofn.lpstrFileTitle = NULL;
  939.     ofn.nMaxFileTitle = 0;
  940.     ofn.lpstrInitialDir = NULL;
  941.     ofn.lpstrTitle = TheTitle;
  942.     ofn.Flags = OFN_HIDEREADONLY | OFN_LONGNAMES | OFN_OVERWRITEPROMPT;
  943.     ofn.nFileOffset = 0;
  944.     ofn.nFileExtension = 0; 
  945.     ofn.lpstrDefExt = NULL;
  946.     ofn.lCustData = 0;
  947.     ofn.lpfnHook =NULL ;
  948.     ofn.lpTemplateName = NULL;
  949. if( !GetSaveFileName( &ofn ) ) {
  950. MessageBox(
  951. NULL,"Fail to make file!",
  952. szTitle,MB_OK | MB_ICONINFORMATION
  953. );
  954. return;
  955. }
  956. hFile = CreateFile(
  957. TheFileName,
  958. GENERIC_WRITE,
  959. 0,
  960. NULL,
  961. CREATE_ALWAYS,
  962. FILE_ATTRIBUTE_NORMAL,
  963. NULL
  964. );
  965. if( hFile == INVALID_HANDLE_VALUE ) {
  966. MessageBox(
  967. NULL,"Fail to make file!",
  968. szTitle,MB_OK | MB_ICONINFORMATION
  969. );
  970. return;
  971. }
  972. nQu = 0xA0;
  973. if( !SetFlag ) nRowNum = 6;
  974. else nRowNum = 12;
  975. //                               1         2         3         4         5
  976. //                     01234567890123456789012345678901234567890123456789012345
  977. lstrcpy( SetBuf[ 0  ],"    | 0  1  2  3  4  5  6  7  8  9  A  B  C  D  E  F |" );
  978. lstrcpy( SetBuf[ 1  ],"----+------------------------------------------------|" );
  979. lstrcpy( SetBuf[ 8  ],"----+------------------------------------------------|" );
  980. lstrcpy( SetBuf[ 14 ],"----+------------------------------------------------|" );
  981. SetBuf[ 0  ][ LB - 2 ] = 0x0d;
  982. SetBuf[ 0  ][ LB - 1 ] = 0x0a;
  983. SetBuf[ 1  ][ LB - 2 ] = 0x0d;
  984. SetBuf[ 1  ][ LB - 1 ] = 0x0a;
  985. SetBuf[ 8  ][ LB - 2 ] = 0x0d;
  986. SetBuf[ 8  ][ LB - 1 ] = 0x0a;
  987. SetBuf[ 14 ][ LB - 2 ] = 0x0d;
  988. SetBuf[ 14 ][ LB - 1 ] = 0x0a;
  989. for( l = 1; l <= nQuNum; l ++ ) {
  990. wsprintf( SetBuf[ 0 ]," %02d",l );
  991. SetBuf[ 0 ][ 3 ] = 0x20;
  992. for( j = 2; j < 14; j ++ ) {
  993. ZeroMemory( SetBuf[ j ],LB );
  994. if( !SetFlag ) {
  995. if( j == 7 ) break;
  996. }
  997. }
  998. for( j = 0; j < nRowNum; j ++ ) {
  999. SetBuf[ j + 2 ][ 0 ] = HexSet[ ( ( nQu + l ) & 0xf0 ) >> 4 ];
  1000. SetBuf[ j + 2 ][ 1 ] = HexSet[ ( nQu + l ) & 0x0f ];
  1001. SetBuf[ j + 2 ][ 2 ] = 0x20;
  1002. if( !SetFlag ) SetBuf[ j + 2 ][ 3 ] = HexSet[ j + 10 ];
  1003. else SetBuf[ j + 2 ][ 3 ] = HexSet[ j + 4 ];
  1004. SetBuf[ j + 2 ][ 4 ] = '|';
  1005. }
  1006. for( k = 0; k < nRowNum; k ++ ) {
  1007. j = 5;
  1008. for( i = 0; i < 16; i ++ ) {
  1009. if( !SetFlag ) nWei = 0xA0 + k * 16 + i;
  1010. else nWei = 0x40 + k * 16 + i;
  1011. if( !SetFlag ) {
  1012. if( nWei > 0xA0 && nWei < 0xff ) {
  1013. SetBuf[ k + 2 ][ j ++ ] = 0x20;
  1014. SetBuf[ k + 2 ][ j ++ ] = nQu + l;
  1015. SetBuf[ k + 2 ][ j ++ ] = nWei;
  1016. }
  1017. else {
  1018. SetBuf[ k + 2 ][ j ++ ] = 0x20;
  1019. SetBuf[ k + 2 ][ j ++ ] = 0x20;
  1020. SetBuf[ k + 2 ][ j ++ ] = 0x20;
  1021. }
  1022. }
  1023. else {
  1024. if( nWei < 0x7f || ( nWei > 0xA0 && nWei < 0xff ) ) {
  1025. SetBuf[ k + 2 ][ j ++ ] = 0x20;
  1026. SetBuf[ k + 2 ][ j ++ ] = nQu + l;
  1027. SetBuf[ k + 2 ][ j ++ ] = nWei;
  1028. }
  1029. else {
  1030. SetBuf[ k + 2 ][ j ++ ] = 0x20;
  1031. SetBuf[ k + 2 ][ j ++ ] = 0x20;
  1032. SetBuf[ k + 2 ][ j ++ ] = 0x20;
  1033. }
  1034. }
  1035. }
  1036. SetBuf[ k + 2 ][ j ++ ] = '|';
  1037. SetBuf[ k + 2 ][ j ++ ] = 0x0d;
  1038. SetBuf[ k + 2 ][ j ] = 0x0a;
  1039. }
  1040. if( !SetFlag ) dwSize = 9 * LB;
  1041. else dwSize = 15 * LB;
  1042. if( !WriteFile( hFile,( BYTE * )SetBuf,dwSize,&dwWrittenBytes,NULL ) ) {
  1043. CloseHandle( hFile );
  1044. MessageBox(
  1045. NULL,"Fail to make file!",
  1046. szTitle,MB_OK | MB_ICONINFORMATION
  1047. );
  1048. return;
  1049. }
  1050. if( dwWrittenBytes != dwSize ) {
  1051. CloseHandle( hFile );
  1052. MessageBox(
  1053. NULL,"Fail to make file!",
  1054. szTitle,MB_OK | MB_ICONINFORMATION
  1055. );
  1056. return;
  1057. }
  1058. }
  1059. lstrcat( TheTitle," OK!" );
  1060. MessageBox(
  1061. NULL,TheTitle,
  1062. szTitle,MB_OK | MB_ICONINFORMATION
  1063. );
  1064. CloseHandle( hFile );
  1065. }
  1066. // -----------------------------------------------------------------------------
  1067. // FUNCTION : xPrint()
  1068. // PURPOSE  : Print the current section.
  1069. // COMMENTS :
  1070. // -----------------------------------------------------------------------------
  1071. BOOL xPrint( HWND hWnd,HDC hdc )
  1072. {
  1073. PRINTDLG pd;
  1074. DOCINFO di;
  1075. int nRet;
  1076. int cWidthPels,cHeightPels;
  1077. int xLeft,yTop;
  1078. float fLogPelsX1,fLogPelsX2;
  1079. float fLogPelsY1,fLogPelsY2;
  1080. float fScaleX,fScaleY;
  1081. RECT rc;
  1082. BYTE oldQu,CurQu,pQu;
  1083. BYTE Pages,CurPages;
  1084. char tmp[ 255 ];
  1085. if( bIsGBorBIG5 ) {
  1086. oldQu = GBQu;
  1087. Pages = 87 / 3;
  1088. }
  1089. else {
  1090. oldQu = BIG5Qu;
  1091. Pages = 89 / 3 + 1;
  1092. }
  1093.     pd.lStructSize         = sizeof( PRINTDLG );
  1094.     pd.hwndOwner           = NULL;
  1095.     pd.hDevMode            = NULL;
  1096.     pd.hDevNames           = NULL;
  1097.     pd.hDC                 = NULL;
  1098.     pd.Flags               = PD_RETURNDC | PD_NOSELECTION | PD_DISABLEPRINTTOFILE;
  1099.     pd.nFromPage           = 1;
  1100.     pd.nToPage             = Pages;
  1101.     pd.nMinPage            = 1;
  1102.     pd.nMaxPage            = Pages;
  1103.     pd.nCopies             = 1;
  1104.     pd.hInstance           = NULL;
  1105.     pd.lCustData           = 0;
  1106.     pd.lpfnPrintHook       = NULL;
  1107.     pd.lpfnSetupHook       = NULL;
  1108.     pd.lpPrintTemplateName = NULL;
  1109.     pd.lpSetupTemplateName = NULL;
  1110.     pd.hPrintTemplate      = NULL;
  1111.     pd.hSetupTemplate      = NULL;
  1112. if( !PrintDlg( &pd ) ) return FALSE;
  1113. if( !( GetDeviceCaps( pd.hDC,RASTERCAPS ) & RC_BITBLT ) ) {
  1114. DeleteDC( pd.hDC );
  1115. return FALSE;
  1116. }
  1117. GetClientRect( hWnd,&rc );
  1118. di.cbSize = sizeof( DOCINFO );
  1119. di.lpszDocName = "Print GB/BIG5 character set";
  1120. di.lpszOutput = NULL;
  1121. di.lpszDatatype = NULL;
  1122. di.fwType = 0;
  1123. nRet = StartDoc( pd.hDC,&di );
  1124. if( nRet <= 0 ) {
  1125. DeleteDC( pd.hDC );
  1126. return FALSE;
  1127. }
  1128. fLogPelsX1 = ( float )GetDeviceCaps( hVDC,LOGPIXELSX );
  1129. fLogPelsY1 = ( float )GetDeviceCaps( hVDC,LOGPIXELSY );
  1130. fLogPelsX2 = ( float )GetDeviceCaps( pd.hDC,LOGPIXELSX );
  1131. fLogPelsY2 = ( float )GetDeviceCaps( pd.hDC,LOGPIXELSY );
  1132. if( fLogPelsX1 > fLogPelsX2 ) fScaleX = ( fLogPelsX1 / fLogPelsX2 );
  1133. else fScaleX = ( fLogPelsX2 / fLogPelsX1 );
  1134. if( fLogPelsY1 > fLogPelsY2 ) fScaleY = ( fLogPelsY1 / fLogPelsY2 );
  1135. else fScaleY = ( fLogPelsY2 / fLogPelsY1 );
  1136. cWidthPels = GetDeviceCaps( pd.hDC,HORZRES );
  1137. cHeightPels = GetDeviceCaps( pd.hDC,VERTRES );
  1138. xLeft = ( ( cWidthPels  / 2 ) - ( ( int )( ( ( float )rc.right  ) * fScaleX ) ) / 2 );
  1139. yTop  = ( ( cHeightPels / 2 ) - ( ( int )( ( ( float )rc.bottom ) * fScaleY * 3 ) ) / 2 );
  1140. CurQu = ( pd.nFromPage - 1 ) * 3;
  1141. for( CurPages = pd.nFromPage - 1; CurPages < pd.nToPage; CurPages ++ ) {
  1142. wsprintf( tmp,"Printing page %d of %d...",CurPages + 1,pd.nToPage );
  1143. SetWindowText( hWnd,tmp );
  1144. nRet = StartPage( pd.hDC );
  1145. if( nRet <= 0 ) {
  1146. DeleteDC( pd.hDC );
  1147. return FALSE;
  1148. }
  1149. pQu = CurQu;
  1150. for( int i = 0; i < 3; i ++ ) {
  1151. CurQu ++;
  1152. if( bIsGBorBIG5 ) GBQu = CurQu;
  1153. else BIG5Qu = CurQu;
  1154. xMyDraw();
  1155. if( ! StretchBlt(
  1156. pd.hDC,
  1157. xLeft,yTop+( int )( ( float )( rc.bottom * fScaleY ) ) * i,
  1158. ( int )( ( float )( rc.right * fScaleX ) ),( int )( ( float )( rc.bottom * fScaleY ) ),
  1159. hVDC,
  1160. 0,0,
  1161. rc.right,rc.bottom,
  1162. SRCCOPY
  1163. ) ) {
  1164. MessageBox( hWnd,"Printing failure!",szTitle,MB_OK | MB_ICONINFORMATION );
  1165. }
  1166. }
  1167. if( bIsGBorBIG5 )
  1168. wsprintf( tmp,"GB Character Set( Section %d to %d ) [ P.%d of %d ]",pQu + 1,CurQu,CurPages + 1,Pages );
  1169. else
  1170. wsprintf( tmp,"BIG5 Character Set( Section %d to %d ) [ P.%d of %d ]",pQu + 1,CurQu,CurPages + 1,Pages );
  1171. TextOut( pd.hDC,xLeft,cHeightPels - 150,tmp,lstrlen( tmp ) );
  1172. nRet = EndPage( pd.hDC );
  1173. if( nRet <= 0 ) {
  1174. DeleteDC( pd.hDC );
  1175. return FALSE;
  1176. }
  1177. }
  1178. if( bIsGBorBIG5 ) GBQu = oldQu;
  1179. else BIG5Qu = oldQu;
  1180. nRet = EndDoc( pd.hDC );
  1181. if( nRet <= 0 ) {
  1182. DeleteDC( pd.hDC );
  1183. return FALSE;
  1184. }
  1185. DeleteDC( pd.hDC );
  1186. return TRUE;
  1187. }