Avatar billede borrisholt Novice
24. november 2000 - 11:36 Der er 6 kommentarer og
1 løsning

Win32 i DLL

Nå ny opgave til de kloge hoveder..

Jeg skal bruge en splash screen skrevet i REN win32 der ligger i en DLL


til det formål har jeg det følgende kode :


//--------------------------------------
//  DLL Kode
//--------------------------------------

#include <windows.h>
#define WIN32_LEAN_AND_MEAN

#ifdef ATOMIC_VC6 //VC++ 6.0
  #define EXPORT __declspec(dllexport)
#else //Borland 5.0x
  #define EXPORT _export
#endif

    WNDCLASS WinClass;
    HINSTANCE Inst;
    HRGN hRegion;
    HWND Handle;
    MSG  Msg;
    HANDLE AppFrameLogo;
    int xoff,yoff,xsize,ysize;
    long bmxsize,bmysize;
    PAINTSTRUCT ps;
    BITMAPV4HEADER bmhdr;
    int bcountx;
    int bcounty;
    int brestx;
    int bresty;


    LRESULT CALLBACK SPASHWndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
    {
        switch(uMsg)
        {
        case WM_PAINT:
            {

                    BeginPaint(Handle,&ps);
                    RECT wr;

                    GetClientRect(Handle,&wr);
                    xoff=0;
                    yoff=0;
                    xsize=wr.right;
                    ysize=wr.bottom;

                    HDC hdc = ps.hdc;
                    HDC cdc = CreateCompatibleDC(hdc);
                    SelectObject(cdc,AppFrameLogo);

                    ZeroMemory(&bmhdr,sizeof(bmhdr));
                    bmhdr.bV4Size=sizeof(bmhdr);
                    GetDIBits(cdc, (HBITMAP)AppFrameLogo,0,0,0,(tagBITMAPINFO *) &bmhdr,DIB_PAL_COLORS);
                    bmxsize=bmhdr.bV4Width;
                    bmysize=bmhdr.bV4Height;

                    bcountx=(xsize / bmxsize)+1;
                    bcounty=(ysize / bmysize)+1;
                    brestx=(xsize % bmxsize);
                    bresty=(ysize % bmysize);

                    for (int cw=0;cw<bcountx;cw++)
                      for (int ch=0;ch<bcounty;ch++)
                        BitBlt(hdc,xoff+(cw*bmxsize),yoff+(ch*bmysize),bmxsize,bmysize,cdc,0,0,SRCCOPY);

                    DeleteDC(cdc);
                    EndPaint(Handle,&ps);
                return 0;
            }
/*
        case WM_DESTROY:
            PostQuitMessage(0);
            break;
*/
        default:

            return DefWindowProc(hwnd, uMsg, wParam, lParam);
      }
      return 0;
    }

    #define BITMAPWIDTH  500
    #define BITMAPHEIGHT 100

extern \"C\" int EXPORT LaunchSplashScreen(HINSTANCE hInstance)
    {
      Inst = hInstance;

      WinClass.style              = CS_CLASSDC | CS_PARENTDC;
      WinClass.lpfnWndProc        = &SPASHWndProc;
      WinClass.hInstance          = Inst;
      WinClass.lpszClassName      = \"KBA_SPLASH_SCREEN\";
      WinClass.hCursor            = LoadCursor(0, IDC_ARROW);

      RegisterClass(&WinClass);

      POINT ScreenCenter;
      ScreenCenter.x = GetSystemMetrics(SM_CXSCREEN) /2;
      ScreenCenter.y = GetSystemMetrics(SM_CYSCREEN) /2;

      int Left = ScreenCenter.x -  (BITMAPWIDTH / 2);
      int Top = ScreenCenter.y - (BITMAPHEIGHT /2);

      Handle = CreateWindowEx(WS_EX_DLGMODALFRAME, \"KBA_SPLASH_SCREEN\", \"\",  WS_VISIBLE | WS_POPUP , Left, Top, BITMAPWIDTH, BITMAPHEIGHT, 0, 0, Inst, 0);


      AppFrameLogo=LoadImage(0,\"KeyBalance Logo.bmp\",IMAGE_BITMAP,0,0,LR_LOADFROMFILE);

      if (!AppFrameLogo)
          return 0;

      UpdateWindow(Handle);

      while(GetMessage(&Msg, 0, 0, 0))
      {
          TranslateMessage(&Msg);
          DispatchMessage(&Msg);
      }

      return Msg.wParam;

  return 0;
}


BOOL APIENTRY DllMain( HANDLE hModule,  DWORD  ul_reason_for_call, LPVOID lpReserved)
{
    return TRUE;
}


Til at kalde det her skidt med har jeg den følgende exe fil :

//------------------------------------------
//EXE Fil
//------------------------------------------


#include <windows.h>

typedef int (CALLBACK* LaunchSplashScreenProc)(HINSTANCE);

MSG  Msg;


int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,  LPSTR lpCmdLine, int nCmdShow)
{
  HMODULE DllHandle = LoadLibrary(\"SplashScreen.dll\");
  LaunchSplashScreenProc LaunchSplashScreen= (LaunchSplashScreenProc)GetProcAddress(DllHandle,\"_LaunchSplashScreen\");
  LaunchSplashScreen(hInstance);
  FreeLibrary(DllHandle);

  return 0;
}

problemet er når jeg lokker min Spash Screen, enten ved at dende en WM_DESTROY efter den eller ved at trykke ALT + F4 så dør det hele.

Jeg vil gerne vide hvad jeg gørgalt siden jeg ikke kan lukke den igen.

Jens B
Avatar billede lbs Nybegynder
25. november 2000 - 04:19 #1
har du prøvet at destroye dit vindue og af registrere din klasse?
det kan du gøre sådan her:

DestroyWindow(hWnd)

UnregisterClass(klasseNavn,hInstance)

jeg kunne forestille mig at det var det.

Jonas
Avatar billede borrisholt Novice
27. november 2000 - 08:32 #2
lbs > Det er ikke det der er i vejen (Jeg har lige prøvet det) ... Så jeg afviser dit svar ...


Jens B
Avatar billede lbs Nybegynder
28. november 2000 - 14:07 #3
fair nok
Avatar billede lbs Nybegynder
28. november 2000 - 14:10 #4
når jeg lige kigger på din kode, så kan jeg se at du gemmer dit window handle i en lokal var..
jeg har tit haft problemer med det, så jeg er blevet nødt til at opdatere den lokale variabel hver gang callback funktionen bliver kaldt

altså.. en mistanke om at dit windowshandle ikke er konsistent.. prøv det?
Avatar billede reficul Nybegynder
29. november 2000 - 16:26 #5
Prøv f.eks. at skrive WM_CLOSE istedet for WM_DESTROY...

MVH
  [ReFiCuL]
Avatar billede borrisholt Novice
29. november 2000 - 16:31 #6
lbs  > Er prøver og det virker ikke ... Problemer opstår når jeg lukker min splash Screen. Hvad enten jeg trykket ALT+F4 eller jeg sender et WM_CLOSE efter den, efter først at have skaffet et handle med FindWindow().

reficul  > Om det er WM_DESTROY eller WM_CLOSE er et fedt ... Hvis der ikke er en handler for WM_CLSe hvad der ikke er i mit tilfælde bliver den blot smidt ned i Windows som så lidt senere sender et WM_DESTROY til applicationen ...

Jens B
Avatar billede borrisholt Novice
04. december 2000 - 17:11 #7
:-(
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