bool CardLib::InitCardsDll32() { if ( hCardDll ) return true; //this only works with NT if(GetVersion() >= 0x80000000) return false; if ( ( hCardDll = ::LoadLibrary("cards.dll") ) == 0 ) return false; readProcAddress( hCardDll , cdtInit , "cdtInit" ); readProcAddress( hCardDll , cdtDraw , "cdtDraw" ); readProcAddress( hCardDll , cdtDrawExt , "cdtDrawExt" ); readProcAddress( hCardDll , cdtAnimate , "cdtAnimate" ); readProcAddress( hCardDll , cdtTerm , "cdtTerm" ); cdtInit( &CardSizeX , &CardSizeY ); return true; }
long FAR PASCAL BinDemoWndProc(HWND hWnd, unsigned message, WORD wParam, LONG lParam) { PAINTSTRUCT ps; HDC hDC; RECT rect; switch (message) { case WM_CREATE: cdtInit(&csx,&csy); /* Get the card size */ csize = 1; /* display normal size */ cardoffset = 4; firstcard = 0; /* clubs */ cardback = 0; /* show front */ SetCardMarks(hWnd, IDM_CLUBS); SetCardMarks(hWnd, IDM_NORMAL); carddx = (int) (csize * csx); carddy = (int) (csize * csy); break; case WM_SIZE: InvalidateRect(hWnd, NULL, TRUE); break; case WM_COMMAND: switch(wParam) { case IDM_EXIT: DestroyWindow(hWnd); break; case IDM_ABOUT: { HICON hIcon; hIcon = LoadIcon(hInst, "BinDemoIcon"); ShellAbout(hWnd, "BinDemo Sample Application", "BinDemo", hIcon); DestroyIcon(hIcon); break; } case IDM_CLUBS: case IDM_DIAMONDS: case IDM_HEARTS: case IDM_SPADES: ClearCardMarks(hWnd, ID_FIRSTCARDID, ID_LASTCARDID); SetCardMarks(hWnd, wParam); firstcard = wParam - ID_FIRSTCARDID; cardoffset =4; cardback = 0; InvalidateRect(hWnd, NULL, TRUE); break; case IDM_BACKSIDES: ClearCardMarks(hWnd, ID_FIRSTCARDID, ID_LASTCARDID); SetCardMarks(hWnd, IDM_BACKSIDES); cardback = 1; cardoffset =1; firstcard = 53; InvalidateRect(hWnd, NULL, TRUE); break; case IDM_SMALL: case IDM_NORMAL: case IDM_LARGE: csize = sizes[wParam - ID_FIRSTSIZEID]; carddx = (int) (csize*csx); carddy = (int) (csize*csy); ClearCardMarks(hWnd, ID_FIRSTSIZEID, ID_LASTSIZEID); SetCardMarks(hWnd, wParam); InvalidateRect(hWnd, NULL, TRUE); break; } break; case WM_PAINT: { int i, d, x0, y0, dx, dy, dd; double phi, dphi; RECT r1, r2; hDC = BeginPaint(hWnd,&ps); GetClientRect(hWnd, &rect); /* calculate the starting position */ phi = 0; d = 0; x0 = (rect.right-carddx) /2; y0 = (rect.bottom-carddy)/2; dd = min(x0, y0) / 12; dphi = 3.1415926535 / 12; for(i=0;i<13;i++) { dy = (int) (d * cos(phi)); dx = (int) (d * sin(phi)); SetRect(&r1, x0+dx, y0+dy, x0+dx+carddx, y0+dy+carddy); if(IntersectRect(&r2, &r1, &ps.rcPaint)) cdtDrawExt(hDC,x0+dx,y0+dy,carddx, carddy, i*cardoffset+firstcard,cardback,RGBBKND); if(i!=0) /* the first card is the same for both directions */ { SetRect(&r1, x0-dx, y0-dy, x0-dx+carddx, y0-dy+carddy); if(IntersectRect(&r2, &r1, &ps.rcPaint)) cdtDrawExt(hDC,x0-dx,y0-dy,carddx, carddy, i*cardoffset+firstcard,cardback,RGBBKND); } phi += dphi; d += dd; } EndPaint(hWnd,&ps); } break; case WM_DESTROY: PostQuitMessage(0); break; default: return (DefWindowProc(hWnd, message, wParam, lParam)); } return (0); }