Images sur dialogbox par dll (win32)

Soyez le premier à donner votre avis sur cette source.

Vue 6 545 fois - Téléchargée 671 fois

Description

Les images sur dialogbox changent grace a un timer.
On alterne JPG, GIF et BMP.
Une DLL perso de 4 Ko donne un HBITMAP avec les donnees du fichier.
Ces donnees pourraient etre en ressource aussi bien, serait idem.
#include "bnJpg32.h" suffit pour se servir de la DLL.

Source / Exemple :


#include <windows.h>
#include "resource.h"
#include "bnJpg32.h"

HBITMAP hbmp;
int cxDib, cyDib, idximg;
char *szimages[3] = {"Chat.jpg","Evol.gif","Verdi.bmp"};

void __stdcall ImgLoad()
{
  HANDLE hfl;
  DWORD lenfl, val;
  HANDLE hheap;
  BYTE *pmem;
  BITMAP bmp;
  if(hbmp) {DeleteObject(hbmp); hbmp = 0;}
  hfl = CreateFile(szimages[idximg], GENERIC_READ, 0, 0, OPEN_EXISTING,
                   FILE_FLAG_SEQUENTIAL_SCAN, 0);
  if(hfl == INVALID_HANDLE_VALUE) return;
  lenfl = GetFileSize(hfl, 0);
  hheap = GetProcessHeap();
  pmem = (BYTE*) HeapAlloc(hheap, 0, lenfl);
  if(pmem) ReadFile(hfl, pmem, lenfl, &val, 0);
  CloseHandle(hfl);
  if(!pmem) return;
  hbmp = bnBmpFromMemory(pmem, lenfl);
  HeapFree(hheap, 0, pmem);
  if(hbmp) {
    if(GetObject(hbmp, sizeof(bmp), &bmp)) {
      cxDib = bmp.bmWidth; cyDib = bmp.bmHeight;
    }
  }
}

void __stdcall onPaint(HWND hdlg)
{
  PAINTSTRUCT ps;
  HDC hdc, memdc;
  RECT rct;
  hdc = BeginPaint(hdlg, &ps);
  if(hbmp) {
    GetClientRect(hdlg, &rct);
    memdc = CreateCompatibleDC(hdc);
    SelectObject(memdc, hbmp);
    StretchBlt(hdc, 0, 0, rct.right, rct.bottom, memdc, 0, 0, cxDib, cyDib, SRCCOPY);
    DeleteDC(memdc);
  }
  EndPaint(hdlg, &ps);
}

BOOL CALLBACK AppDlgProc(HWND hdlg, UINT mssg, WPARAM wParam, LPARAM lParam)
{
  switch(mssg) {
    case WM_PAINT:
      onPaint(hdlg);
      break;
    case WM_TIMER:
      if(++idximg > 2) idximg = 0;
      ImgLoad();
      InvalidateRect(hdlg, 0, 0);
      break;
    case WM_INITDIALOG:
      SetClassLong(hdlg, GCL_HICON, (long)LoadIcon(0, IDI_APPLICATION));
      idximg = 0;
      ImgLoad();
      SetTimer(hdlg, 1, 1500, 0);
      return 1;
    case WM_COMMAND:
      if(wParam == IDCANCEL) {KillTimer(hdlg, 1); EndDialog(hdlg, 0);}
  }
  return 0;
}

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE, PSTR, int)
{
  DialogBoxParam(hInstance, MAKEINTRESOURCE(IDD_APP), 0, AppDlgProc, 0);
  return 0;
}

Conclusion :


Le zip contient le projet complet au format VS 2003.

Codes Sources

A voir également

Ajouter un commentaire Commentaires
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
29
Un lib d'une dll ne contient pas le code comme celui d'un proj compilé en lib statique, il ne sert qu'à l'édition des liens pour le linker.
Messages postés
12
Date d'inscription
samedi 24 janvier 2004
Statut
Membre
Dernière intervention
22 mars 2007

Étant donné qu'il y a le fichier .lib qui contient deja les symboles, est-ce qu'il y a un moyen de lui dire de ne pas charger la .dll mais plutot la .lib lors de la compilation. Ceci est fait par le mot clé extern, mais comment lui dire d'utiliser la .lib lors de l'édition des liens au lieu de trainer un fichier .dll a coté de l'application.

Merci
Messages postés
14
Date d'inscription
samedi 22 mai 2004
Statut
Membre
Dernière intervention
29 avril 2005

salut, J'ai testé l'exe pas de probm ca marche mais par contre qd j veux m' en servir pour une appli... ca ne marche pas!!
ca me dit : bnJpg32.lib : fatal error LNK1106: invalid file or disk full: cannot seek to 0x3ee105d1
Ca vient de moi ??

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.