Clickereignis auf Image

sunflower84

Erfahrenes Mitglied
Hallo

Ich benutze VS 2005 und programmiere C++(MFC). Da das Programm auch ohne Framework laufen soll. Ich habe ein Image erstellt. Jetzt würde ich gerne ein Click Ereignis auf dieses Image haben. Wenn man auf das Image clickt soll eine exe gestartet werden. Geht das?
Kenn mich nicht so gut aus mit MFC. Bin Windows Forms gewöhnt.:confused:

Liebe Grüße
Sunflower84
 

sunflower84

Erfahrenes Mitglied
Hier mein Code:
Code:
LRESULT CALLBACK WindowProcedure (HWND, UINT, WPARAM, LPARAM);
char szClassName[ ] = "test";

int WINAPI WinMain (HINSTANCE hThisInstance,HINSTANCE hPrevInstance,
                    LPSTR lpszArgument,int nFunsterStil)
{
    HWND hwnd;              
    MSG messages;         
    WNDCLASSEX wincl; 
    
    wincl.hInstance = hThisInstance;
    wincl.lpszClassName = szClassName;
    wincl.lpfnWndProc = WindowProcedure;      
    wincl.style = CS_DBLCLKS;                 
    wincl.cbSize = sizeof (WNDCLASSEX);
    wincl.hIcon = LoadIcon (NULL, IDI_APPLICATION);
    wincl.hIconSm = LoadIcon (NULL, IDI_APPLICATION);
    wincl.hCursor = LoadCursor (NULL, IDC_ARROW);
    wincl.lpszMenuName = NULL;                
    wincl.cbClsExtra = 0;                      
    wincl.cbWndExtra = 0;      
    wincl.hbrBackground = (HBRUSH) COLOR_BACKGROUND;
    
    if (!RegisterClassEx (&wincl))
        return 0;

    hwnd = CreateWindowEx (0, szClassName, szClassName,
           WS_OVERLAPPEDWINDOW,CW_USEDEFAULT,
           CW_USEDEFAULT,544,350,HWND_DESKTOP,
           NULL,hThisInstance,NULL);
  
    ShowWindow (hwnd, nFunsterStil);
   
    while (GetMessage (&messages, NULL, 0, 0))
    { 
        TranslateMessage(&messages);
        DispatchMessage(&messages);
    }   
	return messages.wParam;
}

LRESULT CALLBACK WindowProcedure 
(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam)
{ 
HDC                       hdc, hdcMem;
static HBITMAP      hBitMap;
static HBITMAP		hBitMap2;
static BITMAP       bitmap ;
static BITMAP       bitmap2 ;

PAINTSTRUCT        ps ;

    switch (message)                 
    {   
        case WM_CREATE:
          hBitMap = (HBITMAP)LoadImage(0,"test.bmp",IMAGE_BITMAP, 0, 0,
                 LR_DEFAULTSIZE|LR_LOADFROMFILE|LR_CREATEDIBSECTION);
          hBitMap2 = (HBITMAP)LoadImage(0,"test.bmp",IMAGE_BITMAP, 0, 0,
                LR_DEFAULTSIZE|LR_LOADFROMFILE|LR_CREATEDIBSECTION);
     
          if(hBitMap==NULL)
          {
            MessageBox(hwnd,"Bild konnte nicht geladen werden","Error",0);
          return -1;
          }
		  if(hBitMap2==NULL)
          {
            MessageBox(hwnd,"Bild2 konnte nicht geladen werden","Error",0);
          return -1;
          }
          GetObject (hBitMap, sizeof (BITMAP), &bitmap) ;
		  GetObject (hBitMap2, sizeof (BITMAP), &bitmap2) ;          
          return 0;
		  
       case WM_PAINT:
         hdc = BeginPaint (hwnd, &ps) ;
         hdcMem = CreateCompatibleDC (hdc) ;
         SelectObject (hdcMem, hBitMap) ;
		 BitBlt (hdc, 0, 0, bitmap.bmWidth, bitmap.bmHeight, 
                                    hdcMem, 0, 0, SRCCOPY) ;
		 SelectObject (hdcMem, hBitMap2) ;
         BitBlt (hdc, 324, 237, bitmap2.bmWidth, bitmap2.bmHeight, 
                                    hdcMem, 0, 0, SRCCOPY) ;
         DeleteDC (hdcMem) ;
         EndPaint (hwnd, &ps) ;        
         return 0 ;

       case WM_DESTROY:
         DeleteObject (hBitMap) ;
		 DeleteObject (hBitMap2) ; 
         PostQuitMessage (0);      
         break;
       default:                     
         return DefWindowProc (hwnd, message, wParam, lParam);
    }

    return 0;
}
 
T

Trouble Shooter

Hi,

bei mir hat folgende Variante funktioniert (MFC-Anwendungsassistent->Dialogfeldbasierend):

1. Image-Objekt aus der Toolbox aufs Dialogfeld ziehen
2. Rechtsklick auf das Image-Objekt->Eigenschaften
3. Tab "Allgemein" ID= IDC_Bitmap, Typ= Bitmap
4. Tab "Formate" ein Häkchen bei Benachrichtigungen (=notify)
5. Eigenschaften schließen

6. Rechtsklick auf Image-Objekt->Klassen-Assistent
7. IDC_Bitmap markieren und eine Funktion für BN_CLICKED hinzufügen
8. auf Code bearbeiten klicken und folgende Codezeile eingeben (Verzeichnispfad muss näturlich angepasst werden):
Code:
WinExec("C:\\windows\\system32\\mspaint.exe", SW_SHOW);

Hoffe es hilft.

MfG
Trouble Shooter
 
Zuletzt bearbeitet von einem Moderator:

jokey2

Erfahrenes Mitglied
Wenn Du kein Image-Control für die Bilder verwenden willst (oder ohne Ressourceneditor arbeitest), kannst Du auch die WM_LBUTTONDOWN (oder WM_LBUTTONUP oder WM_LBUTTONDBLCLK) Nachrichten des Hauptfensters (in das Du die Bilder zeichnest, wenn ich das richtig gesehen habe) verarbeiten. Dann mußt Du nur naoch mit GetMessagePos() die Mauskoordinaten zu Zeitpunkt des Klicks ermitteln und sehen in welchem Bild dieser Punkt liegt (z.B. mit PtInRect()). Dann kannst Du damit weitermachen.

Code:
DWORD dwMessagePos;
POINT ptMessagePoint;
RECT rectBitmap1;
RECT rectBitmap2;

...
case WM_LBUTTONDOWN:
    dwMessagePos = GetMessagePos();
    ptMessagePoint.x = GET_X_LPARAM(dwMessagePos);
    ptMessagePoint.y = GET_Y_LPARAM(dwMessagePos);

    if(PtInRect(rectBitmap1, ptMessagePoint))
    {
        //hier Code für Bild 1
    }
    else if(PtInRect(rectBitmap2, ptMessagePoint))
    {
        //hier Code für Bild 2
    }
    else
    {
        //hier Code für die anderen Linksklicks
    }
    break;
Die RECT-Variablen mußt Du natürlich mit den korrekten Werten füllen.