Avatar billede looppen Nybegynder
07. august 2005 - 13:20 Der er 9 kommentarer

Tutorial om at programmere screensaver i C++

Hejsa,

Er der nogen der kan fortælle mig hvor jeg finder en tutorial om programmering af screensavere (til winXP) i C++. Meget gerne i Borland C++ Builder.

Jeg har prøvet at lave en almindelig .EXE fil om til en .SCR fil - det virker, men ikke særlig godt.
Avatar billede bertelbrander Praktikant
08. august 2005 - 19:44 #1
Jeg har kikket lidt på screensavere.
For at lave ordentlige screensavere skal man bruge scrnsave.lib, dette bibliotek kan jeg ikke finde til Borland. Hverken Builder 5 eller X eller kommandolinie versionen.

Mingw/dev-cpp har dette bibliotek. Jeg kan godt forklare hvordan man laver screensavere med mingw.
Avatar billede rednex Nybegynder
09. august 2005 - 17:53 #2
Man kan konvertere .lib-filer fra COFF format til Borlands OMF format med coff2omf.exe som findes i bin-mappen under din BCB installation (f.eks. C:\Program Files\Borland\CBuilder6\Bin)
Avatar billede looppen Nybegynder
09. august 2005 - 18:14 #3
Til bertelbrander: Jeg vil nu meget gøre det med Borland C++ Builder. Jeg er tæmmelig grøn i C++ og BCB er det værktøj jeg har det bedst med; men tak for tilbudet :-)

Til rednex: kan du forklare det lidt nærmere?
Avatar billede bertelbrander Praktikant
09. august 2005 - 21:44 #4
>rednex, Jeg har forsøgt at konvertere Microsoft VisualC++'s scrnsave.lib med coff2omf men det ser ikke ud til at virke. Den .lib fil den laver indeholder ikke noget brugbart.
Ved du hvordan man gør?
Avatar billede rednex Nybegynder
09. august 2005 - 22:01 #5
Jeg må indrømme at jeg ikke selv har haft behov for det. Jeg bruger normalt enten VC++ eller Delphi alt efter opgaven. Var bare faldet over det på et tidligere tidspunkt og tænkte det måske kunne hjælpe.

Kan kan godt prøve om jeg kan grave noget mere brugbart info op et eller andet sted.
Avatar billede rednex Nybegynder
09. august 2005 - 22:16 #6
Jeg faldt lige over et par sites som måske kunne være værd at kigge på i forbindelse med konvertering fra VC++ til BCB:

http://www.geocities.com/foetsch/bcbfaq/bcbdx8.htm
http://www.digitalmars.com/ctg/coff2omf.html

Håber det bringer jer videre.
Avatar billede bertelbrander Praktikant
09. august 2005 - 23:25 #7
Det bringer mig ikke videre. Jeg har prøvet alt hvad kan finde på, ingen success :-(
Jeg har søgt på google, men ikke fundet noget brugbart :-(
Medmindre der er nogen der har en god idé må jeg nok opgive.

Til looppen, det er er ikke ret besværligt at bruge Dev-C++, måske skulle du prøve?
Avatar billede looppen Nybegynder
11. august 2005 - 07:57 #8
Jeg er velvillig til at prøve :-)
Avatar billede bertelbrander Praktikant
11. august 2005 - 20:04 #9
Start med at downloade og instalere Dev-Cpp (inklusive kompiler) fra:
http://www.bloodshed.net/devcpp.html
(Jeg bruger version 4.xx)

Så kører du programmet (devcpp.exe) og vælger "New Source File".
Så sletter du den kode den laver og indsætter denne:
#include <windows.h>
#include <scrnsave.h>

BITMAPINFOHEADER CreateHeader(int aWidth, int aHeight, WORD aBitPixel)
{
  BITMAPINFOHEADER BitmapInfoHeader;
  BitmapInfoHeader.biSize = sizeof(BITMAPINFOHEADER);
  BitmapInfoHeader.biWidth = aWidth;
  BitmapInfoHeader.biHeight = aHeight;
  BitmapInfoHeader.biPlanes = 1;
  BitmapInfoHeader.biBitCount = aBitPixel;
  BitmapInfoHeader.biCompression = BI_RGB;
  BitmapInfoHeader.biSizeImage = 0;
  BitmapInfoHeader.biXPelsPerMeter = 0;
  BitmapInfoHeader.biYPelsPerMeter = 0;
  BitmapInfoHeader.biClrUsed = 0;
  BitmapInfoHeader.biClrImportant = 0;

  return BitmapInfoHeader;
}

BITMAPINFOHEADER Header;
char *Buffer;
int Width, Height, BytesPixel;
unsigned int Idx;

void Draw(HDC dc)
{
  StretchDIBits(dc,
                0, Idx, Width, Height - Idx,        // Dest
                0, Idx, Width, Height - Idx,        // Src
                Buffer,
                (LPBITMAPINFO)&Header, DIB_RGB_COLORS, SRCCOPY);
  StretchDIBits(dc,
                0, 0, Width, Idx,        // Dest
                0, 0, Width, Idx,        // Src
                Buffer,
                (LPBITMAPINFO)&Header, DIB_RGB_COLORS, SRCCOPY);
}

LRESULT WINAPI ScreenSaverProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
  switch(message)
  {
  case WM_CREATE:
      {
        HDC dc = GetDC(0);
        Width = GetDeviceCaps(dc, HORZRES);
        Height = GetDeviceCaps(dc, VERTRES);
        HDC MemDc = CreateCompatibleDC(dc);
        HBITMAP BitMap = CreateCompatibleBitmap(dc, Width, Height);
        SelectObject(MemDc, BitMap);
        BitBlt(MemDc, 0, 0, Width, Height, dc, 0, 0, SRCCOPY);
        BITMAP Bm;
        GetObject(BitMap, sizeof(Bm), &Bm);
        Header = CreateHeader(Width, Height, Bm.bmBitsPixel);
        Buffer = new char [Width*Height*Bm.bmBitsPixel/8];
        BytesPixel = Bm.bmBitsPixel/8;
        GetDIBits(MemDc, BitMap, 0, Height, Buffer, (BITMAPINFO *)&Header, DIB_RGB_COLORS);
        ReleaseDC(0, dc);
        ReleaseDC(0, MemDc);
        DeleteObject(BitMap);
        SetTimer(hwnd, 1025, 100, 0);
      }
      break;
  case WM_DESTROY:
      delete Buffer;
      PostQuitMessage(0);
      break;
  case WM_TIMER:
      {
        HDC dc = GetDC(0);
        Idx = (Idx + 2)%Height;
        Draw(dc);
        ReleaseDC(0, dc);
      }
      break;
  case WM_PAINT:
      {
        BITMAP bm; /* Bitmap structure as seen in bmWidth & bmHeight */
        PAINTSTRUCT ps;
        HDC dc = BeginPaint(hwnd, &ps);
        Draw(dc);
        EndPaint(hwnd, &ps);
      }
      break;
  default:
      return DefScreenSaverProc(hwnd, message, wParam, lParam);
  }
  return 0;
}

BOOL WINAPI ScreenSaverConfigureDialog(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
    return FALSE;
}

BOOL WINAPI RegisterDialogClasses(HANDLE hInst)
{
    return TRUE;
}

Så vælger du Options->Compiler Options i menu'en
På directories tabben sætter du X ud for "Add the following commands when calling the compiler" Og i boxen under skriver du: -lscrnsave

På Linker tabben sætter du X i "Compile for Win32 (no console)"

Så trykker du Ctrl+F9 for at kompilere.

Når det er overstået skal du omdøbe programmet fra xxx.exe til xxx.scr og køre programmet. Jeg har ikke regnet ud om man kan gøre dette fra DevCpp.

ScreenSaveren skulle gerne scrolle skærmen.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester