anfänger braucht h.i.l.f.e.



  • ich lerne langsam windows-programmierung. da ich gerne an beispielen lerne, hat mir ein kumpel das folgende programm trocken erklärt - wie wo weshalb und warum - jedoch kriege ich eine Fehlermeldung, wenn ich das Programm mit Microsoft Visual C++ ans Laufen kriegen will:

    *: error C2664: 'DialogBoxParamA' : Konvertierung des Parameters 4 von 'int (__stdcall *)(void)' in 'int (__stdcall *)(struct HWND__ ,unsigned int,unsigned int,long)' nicht moe
    glich
    Diese Konvertierung erfordert einen reinterpret_cast-Operator oder eine Typumwandlung im C- oder Funktionsformat

    #include <windows.h>
    #include <stdio.h>
    
    HINSTANCE Instanz;
    COLORREF kreis1;
    COLORREF kreis2;
    const COLORREF k1def=RGB(255,255,255);
    const COLORREF k2def=RGB(255,0,0);
    
    HPEN hp;
    HPEN hp2;
    HWND MWIN;
    int PASCAL WinMain(HINSTANCE,HINSTANCE,LPSTR,int);
    LONG FAR PASCAL Fensterfunktion(HWND,UINT,WPARAM,LPARAM);
    BOOL FAR PASCAL DialogFunktion(HWND,UINT,WPARAM,LPARAM);
    
    int PASCAL WinMain(HINSTANCE di,HINSTANCE vi,LPSTR Komm,int Ftype){
      MSG Messy;
    
      Instanz=di;
      if(!vi){
        WNDCLASS wc;
        wc.style=CS_HREDRAW | CS_VREDRAW;
        wc.lpfnWndProc=Fensterfunktion;
        wc.cbClsExtra=0;
        wc.cbWndExtra=0;
        wc.hInstance=di;
        wc.hIcon=0;
        wc.hCursor=LoadIcon(NULL,NULL);;
        wc.hbrBackground=(HBRUSH)GetStockObject(GRAY_BRUSH);
        wc.lpszMenuName="SimpelMenue";
        wc.lpszClassName="Einfach";
        if(!RegisterClass(&wc)) return 255;
      }
      MWIN=CreateWindow("Einfach","Das Spiel mit den Farben",WS_OVERLAPPEDWINDOW,
      CW_USEDEFAULT,CW_USEDEFAULT,
      CW_USEDEFAULT,CW_USEDEFAULT,
      NULL,NULL,di,NULL);
      if(!MWIN)return 255;
      ShowWindow(MWIN,Ftype);
      UpdateWindow(MWIN);
      while(GetMessage(&Messy,0,0,0)){
        TranslateMessage(&Messy);
        DispatchMessage(&Messy);
      }
      return Messy.wParam;
    }
    BOOL FAR PASCAL DialogFunktion(HWND fenster,UINT nachricht,WPARAM p1,LPARAM p2){
      switch (nachricht){
         case WM_INITDIALOG:
                 MessageBeep(0);
                 SetDlgItemInt(fenster,101,GetRValue(kreis1),false);
                 SetDlgItemInt(fenster,102,GetGValue(kreis1),false);
                 SetDlgItemInt(fenster,103,GetBValue(kreis1),false);
                 SetDlgItemInt(fenster,104,GetRValue(kreis2),false);
                 SetDlgItemInt(fenster,105,GetGValue(kreis2),false);
                 SetDlgItemInt(fenster,106,GetBValue(kreis2),false);
    
              break;
         case WM_COMMAND:
    
              switch(p1){
                 case IDOK:
                 int r,g,b;
                 int ok=1;
                 r=GetDlgItemInt(fenster,101,&ok,false);
                 g=GetDlgItemInt(fenster,102,&ok,false);
                 b=GetDlgItemInt(fenster,103,&ok,false);
                 kreis1=RGB(r,g,b);
                 hp=CreatePen(PS_SOLID,2,kreis1);
                 r=GetDlgItemInt(fenster,104,&ok,false);
                 g=GetDlgItemInt(fenster,105,&ok,false);
                 b=GetDlgItemInt(fenster,106,&ok,false);
                 kreis2=RGB(r,g,b);
                 hp2=CreatePen(PS_SOLID,2,kreis2);
                 InvalidateRect(MWIN,NULL,false);
    
                 EndDialog(fenster,0);
    
              }
         break;
      }
      return DefWindowProc(fenster,nachricht,p1,p2);
    }
    LONG FAR PASCAL Fensterfunktion(HWND fenster,UINT nachricht,WPARAM p1,LPARAM p2){
      HDC hdc;
      PAINTSTRUCT ps;
      static RECT re;
      static int r1=50; //r1>r2
      static int r2=40;
      static int r1b=51; //r1>r2
      static int r2b=41;
      static int r1bi=49; //r1>r2
      static int r2bi=39;
    
      static int offs=80;
      const char mytext[57] = "Hallo, dies ist ein Text, falls sie's noch nicht wussten";
      static int textlen=56;
      static FARPROC DialogZeiger;
      static HPEN hpb;
      static HPEN hp2b;
      COLORREF hlp;
      int he;
      static HBRUSH hb;
      switch (nachricht){
        case WM_RBUTTONDOWN:
                     kreis1=k1def;
                     kreis2=k2def;
                     hp=CreatePen(PS_SOLID,2,kreis1);
                     hp2=CreatePen(PS_SOLID,2,kreis2);
                     InvalidateRect(fenster,NULL,false);
        break;
        case WM_CHAR:
                 switch (p1){
                    case 'r':
                     he=GetRValue(kreis2)+1;
                     if (he>255)he=255;
                     kreis2=RGB(he,GetGValue(kreis2),GetBValue(kreis2));
                     hp2=CreatePen(PS_SOLID,2,kreis2);
                     InvalidateRect(fenster,NULL,false);
                    return 0;
                    case 'g':
                     he=GetGValue(kreis2)+1;
                     if (he>255)he=255;
                     kreis2=RGB(GetRValue(kreis2),he,GetBValue(kreis2));
                     hp2=CreatePen(PS_SOLID,2,kreis2);
                     InvalidateRect(fenster,NULL,false);
                    return 0;
                    case 'b':
                     he=GetBValue(kreis2)+1;
                     if (he>255)he=255;
                     kreis2=RGB(GetRValue(kreis2),GetGValue(kreis2),he);
                     hp2=CreatePen(PS_SOLID,2,kreis2);
                     InvalidateRect(fenster,NULL,false);
                    return 0;
    
                 }
            return 0;
        break;
        case WM_PAINT:
    
                      hdc=BeginPaint(fenster,&ps);
    
                      SetBkMode(hdc, TRANSPARENT);
    
                      SetTextColor(hdc,RGB(0,0,255));
    
                      SelectObject(hdc,hb);
                      SelectObject(hdc,hpb);
      						Ellipse(hdc,(re.right/2)-r1b,(re.bottom/2)-r1b+offs,(re.right/2)+r1b,(re.bottom/2)+r1b+offs);
                      SelectObject(hdc,hp);
    						Ellipse(hdc,(re.right/2)-r1,(re.bottom/2)-r1+offs,(re.right/2)+r1,(re.bottom/2)+r1+offs);
                      SelectObject(hdc,hpb);
      						Ellipse(hdc,(re.right/2)-r1bi,(re.bottom/2)-r1bi+offs,(re.right/2)+r1bi,(re.bottom/2)+r1bi+offs);
    
                      SelectObject(hdc,hp2b);
     						Ellipse(hdc,(re.right/2)-r2b,(re.bottom/2)-r2b+offs,(re.right/2)+r2b,(re.bottom/2)+r2b+offs);
                      SelectObject(hdc,hp2);
     						Ellipse(hdc,(re.right/2)-r2,(re.bottom/2)-r2+offs,(re.right/2)+r2,(re.bottom/2)+r2+offs);
                      SelectObject(hdc,hp2b);
     						Ellipse(hdc,(re.right/2)-r2bi,(re.bottom/2)-r2bi+offs,(re.right/2)+r2bi,(re.bottom/2)+r2bi+offs);
    
                      TextOut(hdc,(re.right/2)-170,re.bottom/2,mytext,textlen);
                      EndPaint(fenster,&ps);
                      return 0;
        case WM_CREATE: 
                        DialogZeiger=MakeProcInstance((FARPROC) DialogFunktion, Instanz);
                        kreis1=k1def;//RGB(255,255,255);
                        kreis2=k2def;//RGB(255,0,0);
                        hp=CreatePen(PS_SOLID,2,kreis1);
                        hp2=CreatePen(PS_SOLID,2,kreis2);
                        hpb=CreatePen(PS_DOT,1,RGB(0,0,0));
                        hp2b=CreatePen(PS_DASHDOT,1,RGB(255,255,255));
    
                        hb=CreateSolidBrush(RGB(128,128,128));
                                          GetClientRect(fenster,&re);
    
                        return 0;
        case WM_COMMAND: switch(p1){
        			  case 11: DialogBox(Instanz,"Farben",fenster,DialogZeiger);
                  return 0;
                  case 12: SendMessage(fenster,WM_CLOSE,0,0L);return 0;
                  break;
        }
        case WM_LBUTTONDOWN:
                     hlp=kreis1;
                     kreis1=kreis2;
                     kreis2=hlp;
                     hp=CreatePen(PS_SOLID,2,kreis1);
                     hp2=CreatePen(PS_SOLID,2,kreis2);
    
                     InvalidateRect(fenster,NULL,FALSE);
    
                     return 0;
                  break;
        case WM_DESTROY:PostQuitMessage(0);
                        return 0;
        case WM_WINDOWPOSCHANGING:
                         InvalidateRect(fenster,NULL,true);    break;
      }
      return DefWindowProc(fenster,nachricht,p1,p2);
    }
    

    hoffe und danke für hilfe ....



  • Dein Problem ist, dass du zwei verschiedene Arten von Variabeln hast. Vollgender Code funktioniert bekantlich nicht:

    int x = 10;
    cMeineKlasse Object2; // Eine selbstentwickelte Klasse
    Object2.Verarbeiten();
    x = Object2;
    

    Genau das macht jedoch dein Code. Mit der folgenden Änderung in deinem Code sollte es funktionieren:

    case 11: DialogBox(Instanz,"Farben",fenster,(DLGPROC)DialogZeiger);
    

    Jedoch ist noch die Frage offen, ob das "sauber" ist. (Den Code habe ich nicht studiert)


Anmelden zum Antworten