IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

 C++ Discussion :

Créer une fênetre sans bordure avec image de fond


Sujet :

C++

  1. #1
    Nouveau Candidat au Club Avatar de Trepliev1.0
    Homme Profil pro
    Webdesigner
    Inscrit en
    Juin 2016
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Webdesigner

    Informations forums :
    Inscription : Juin 2016
    Messages : 2
    Points : 1
    Points
    1
    Par défaut Créer une fênetre sans bordure avec image de fond
    Bonjour,
    débutant en c++ j'ai pour projet de réaliser un launcher pour une application tierce.

    Je souhaiterais que cette application soit sans bordure avec simplement une image de fond png en partie transparente.
    J'ai trouvé comment afficher mon png avec GDI+ et retirer les bordures et menus de ma fenêtre avec le flag WS_POPUP mais du coup plus rien ne s'affiche. L'application et pourtant bien en cours d’exécution puisque visible dans le gestionnaire de tâches.

    Ci-joint le code de mon application :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    #include <windows.h>
    #include <objidl.h>
    #include <gdiplus.h>
    using namespace Gdiplus;
    #pragma comment (lib,"Gdiplus.lib")
     
    VOID OnPaint(HDC hdc)
    {
       Graphics graphics(hdc);
    	Image image(L"launcher.png");
    graphics.DrawImage(&image, 0, 0);
    }
     
    LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
     
    INT WINAPI WinMain(HINSTANCE hInstance, HINSTANCE, PSTR, INT iCmdShow)
    {
       HWND                hWnd;
       MSG                 msg;
       WNDCLASS            wndClass;
       GdiplusStartupInput gdiplusStartupInput;
       ULONG_PTR           gdiplusToken;
     
       // Initialize GDI+.
       GdiplusStartup(&gdiplusToken, &gdiplusStartupInput, NULL);
     
       wndClass.style          = CS_HREDRAW | CS_VREDRAW;
       wndClass.lpfnWndProc    = WndProc;
       wndClass.cbClsExtra     = 0;
       wndClass.cbWndExtra     = 0;
       wndClass.hInstance      = hInstance;
       wndClass.hIcon          = LoadIcon(NULL, IDI_APPLICATION);
       wndClass.hCursor        = LoadCursor(NULL, IDC_ARROW);
       wndClass.hbrBackground  = (HBRUSH)GetStockObject(WHITE_BRUSH);
       wndClass.lpszMenuName   = NULL;
       wndClass.lpszClassName  = TEXT("BFTRLauncher");
     
       RegisterClass(&wndClass);
     
       hWnd = CreateWindow(
          TEXT("BFTRLauncher"),   // window class name
          TEXT("BFTRLauncher"),  // window caption
          WS_POPUP,      // window style WS_OVERLAPPEDWINDOW
          0,            // initial x position CW_USEDEFAULT
          0,            // initial y position CW_USEDEFAULT
          800,            // initial x size CW_USEDEFAULT
          600,            // initial y size CW_USEDEFAULT
          NULL,                     // parent window handle
          NULL,                     // window menu handle
          hInstance,                // program instance handle
          NULL);                    // creation parameters
     
       ShowWindow(hWnd, iCmdShow);
       UpdateWindow(hWnd);
       HRGN hrgn = CreateRectRgn( 0, 0, 800, 600 );
     
    SetWindowRgn( hWnd, hrgn, TRUE );
     
       while(GetMessage(&msg, NULL, 0, 0))
       {
          TranslateMessage(&msg);
          DispatchMessage(&msg);
       }
     
       GdiplusShutdown(gdiplusToken);
       return msg.wParam;
    }  // WinMain
     
    LRESULT CALLBACK WndProc(HWND hWnd, UINT message, 
       WPARAM wParam, LPARAM lParam)
    {
       HDC          hdc;
       PAINTSTRUCT  ps;
     
       switch(message)
       {
       case WM_PAINT:
          hdc = BeginPaint(hWnd, &ps);
          OnPaint(hdc);
          EndPaint(hWnd, &ps);
          return 0;
       case WM_DESTROY:
          PostQuitMessage(0);
          return 0;
       default:
          return DefWindowProc(hWnd, message, wParam, lParam);
       }
    } // WndProc
    J'utilise VC++ 2010 Express. De ce que je comprend c'est le flag WS_POPUP qui enlève les bordures & co est-ce qu'il y en aurait un à ajouter (ou le remplacer) pour que la fonction qui affiche l'image apparaisse tout de même ?

    J'espère poster dans la bonne section, d'avance merci et désolé si ma demande est hors charte ou section.

  2. #2
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    J'ai du mal à comprendre pourquoi tu passes par un SetWindowRgn(région rectangulaire), alors que simplement créer la fenêtre sans bordure etc. suffit.

    Pour le coup du style de fenêtre:
    WS_POPUP sans WS_BORDER ni WS_CAPTION donne une fenêtre sans bordure. WS_OVERLAPPEDWINDOW cumulait un certain nombre de flags, dont WS_CAPTION.

    Par contre, il me semble que ceci n'est pas recommandé:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    wndClass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
    La méthode recommandée pour le hbrBackground est d'utiliser directement une des constantes acceptées par GetSysColor(), incrémentée de 1 (pour une question de zéro). Ce qui donnerait, par exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    wndClass.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  3. #3
    Nouveau Candidat au Club Avatar de Trepliev1.0
    Homme Profil pro
    Webdesigner
    Inscrit en
    Juin 2016
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Webdesigner

    Informations forums :
    Inscription : Juin 2016
    Messages : 2
    Points : 1
    Points
    1
    Par défaut
    Merci pour ta réponse,
    j'ai trouvé le SetWindowRgn(région rectangulaire) en faisant une recherche google de mon problème, c'était appartement pour que la fenêtre s'affiche malgré le statut de popup.

    Le flag WS_OVERLAPPEDWINDOW affiche la barre de menu et le contour de la fenêtre. JE continu à creuser pour voir quel flag pourrait correspondre.

Discussions similaires

  1. xcb : créer une fenêtre sans bordure
    Par echantillon dans le forum Bibliothèques
    Réponses: 2
    Dernier message: 17/03/2011, 23h39
  2. [Débutant] créer une bibliothéque de traitement d'image avec MATLAB
    Par maissaab dans le forum Interfaces Graphiques
    Réponses: 2
    Dernier message: 19/07/2010, 20h06
  3. Aucun SystemMenu avec une Form sans bordure. Comment faire ?
    Par arnofly dans le forum Windows Forms
    Réponses: 4
    Dernier message: 18/06/2009, 15h11
  4. Réponses: 1
    Dernier message: 04/05/2005, 11h43
  5. Appeler une API sans liaison avec une DLL
    Par mat.M dans le forum x86 32-bits / 64-bits
    Réponses: 10
    Dernier message: 13/07/2004, 02h22

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo