tutorials.de Buch-Aktion 05/2012
Seite 1 von 2 12 LetzteLetzte
ERLEDIGT
NEIN
ANTWORTEN
23
ZUGRIFFE
1245
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    üäpöol üäpöol ist offline Mitglied Gold
    Registriert seit
    Feb 2011
    Beiträge
    189
    Liebe Forummitglieder,

    ich gerade mit Winapi angefangen und schreibe gerade an einem Programm, mit dem man eine Linie zeichnen kann.
    Man klickt auf einen Punkt mit der linken Maustaste und dann auf einen Punkt mit der rechten Maustaste. Diese habe ich jetzt mit Variablen definiert.

    Wie kann ich jetzt aber diese Variable in die Funktionen LineTo() und MoveToEx() "tun" ?
    Ich hab schon ewig gesucht, finde aber nicht hilfreiches dazu.

    Lg

    üäpöol
     

  2. #2
    Avatar von sheel
    sheel sheel ist offline Moderator
    tutorials.de Moderator
    Registriert seit
    Jul 2007
    Beiträge
    4.501
    Hi

    was meinst du damit, dass du die Maustasten mit Variablen definiert hast?
    Kannst du den Code zeigen? Damit könnte man dir besser helfen...

    Gruß
    üäpöol bedankt sich. 

  3. #3
    üäpöol üäpöol ist offline Mitglied Gold
    Registriert seit
    Feb 2011
    Beiträge
    189
    Hi,

    erstmal vielen Dank für die An twort.
    Hier der Code:

    Code :
    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
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    223
    224
    225
    226
    227
    228
    229
    230
    231
    232
    233
    234
    235
    236
    237
    238
    239
    240
    241
    242
    243
    244
    245
    246
    247
    248
    
    // Linie zeichnen.cpp : Definiert den Einstiegspunkt für die Anwendung.
    //
     
    #include "stdafx.h"
    #include "Linie zeichnen.h"
     
    bool Zeichnen = false;
     
    #define MAX_LOADSTRING 100
     
     
    // Globale Variablen:
    HINSTANCE hInst;                                // Aktuelle Instanz
    TCHAR szTitle[MAX_LOADSTRING];                  // Titelleistentext
    TCHAR szWindowClass[MAX_LOADSTRING];            // Klassenname des Hauptfensters
     
    // Vorwärtsdeklarationen der in diesem Codemodul enthaltenen Funktionen:
    ATOM                MyRegisterClass(HINSTANCE hInstance);
    BOOL                InitInstance(HINSTANCE, int);
    LRESULT CALLBACK    WndProc(HWND, UINT, WPARAM, LPARAM);
    INT_PTR CALLBACK    About(HWND, UINT, WPARAM, LPARAM);
     
    int APIENTRY _tWinMain(HINSTANCE hInstance,
                         HINSTANCE hPrevInstance,
                         LPTSTR    lpCmdLine,
                         int       nCmdShow)
    {
        UNREFERENCED_PARAMETER(hPrevInstance);
        UNREFERENCED_PARAMETER(lpCmdLine);
     
        // TODO: Hier Code einfügen.
        MSG msg;
        HACCEL hAccelTable;
     
        // Globale Zeichenfolgen initialisieren
        LoadString(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING);
        LoadString(hInstance, IDC_LINIEZEICHNEN, szWindowClass, MAX_LOADSTRING);
        MyRegisterClass(hInstance);
     
        // Anwendungsinitialisierung ausführen:
        if (!InitInstance (hInstance, nCmdShow))
        {
            return FALSE;
        }
     
        hAccelTable = LoadAccelerators(hInstance, MAKEINTRESOURCE(IDC_LINIEZEICHNEN));
     
        // Hauptnachrichtenschleife:
        while (GetMessage(&msg, NULL, 0, 0))
        {
            if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))
            {
                TranslateMessage(&msg);
                DispatchMessage(&msg);
            }
        }
     
        return (int) msg.wParam;
    }
     
     
     
    //
    //  FUNKTION: MyRegisterClass()
    //
    //  ZWECK: Registriert die Fensterklasse.
    //
    //  KOMMENTARE:
    //
    //    Sie müssen die Funktion verwenden,  wenn Sie möchten, dass der Code
    //    mit Win32-Systemen kompatibel ist, bevor die RegisterClassEx-Funktion
    //    zu Windows 95 hinzugefügt wurde. Der Aufruf der Funktion ist wichtig,
    //    damit die kleinen Symbole, die mit der Anwendung verknüpft sind,
    //    richtig formatiert werden.
    //
    ATOM MyRegisterClass(HINSTANCE hInstance)
    {
        WNDCLASSEX wcex;
     
        wcex.cbSize = sizeof(WNDCLASSEX);
     
        wcex.style          = CS_HREDRAW | CS_VREDRAW;
        wcex.lpfnWndProc    = WndProc;
        wcex.cbClsExtra     = 0;
        wcex.cbWndExtra     = 0;
        wcex.hInstance      = hInstance;
        wcex.hIcon          = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_LINIEZEICHNEN));
        wcex.hCursor        = LoadCursor(NULL, IDC_ARROW);
        wcex.hbrBackground  = (HBRUSH)(COLOR_WINDOW+1);
        wcex.lpszMenuName   = MAKEINTRESOURCE(IDC_LINIEZEICHNEN);
        wcex.lpszClassName  = szWindowClass;
        wcex.hIconSm        = LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_SMALL));
     
        return RegisterClassEx(&wcex);
    }
     
    //
    //   FUNKTION: InitInstance(HINSTANCE, int)
    //
    //   ZWECK: Speichert das Instanzenhandle und erstellt das Hauptfenster.
    //
    //   KOMMENTARE:
    //
    //        In dieser Funktion wird das Instanzenhandle in einer globalen Variablen gespeichert, und das
    //        Hauptprogrammfenster wird erstellt und angezeigt.
    //
    BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
    {
       HWND hWnd;
     
       hInst = hInstance; // Instanzenhandle in der globalen Variablen speichern
     
       hWnd = CreateWindow(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW,
          CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL);
     
       if (!hWnd)
       {
          return FALSE;
       }
     
       ShowWindow(hWnd, nCmdShow);
       UpdateWindow(hWnd);
     
       return TRUE;
    }
     
    //
    //  FUNKTION: WndProc(HWND, UINT, WPARAM, LPARAM)
    //
    //  ZWECK:  Verarbeitet Meldungen vom Hauptfenster.
    //
    //  WM_COMMAND  - Verarbeiten des Anwendungsmenüs
    //  WM_PAINT    - Zeichnen des Hauptfensters
    //  WM_DESTROY  - Beenden-Meldung anzeigen und zurückgeben
    //
    //
    LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
    {
        int wmId, wmEvent;
        PAINTSTRUCT ps;
        HDC hdc;
     
        switch (message)
        {
        case WM_LBUTTONDOWN:
            if (Zeichnen)
        {
        {
        int iPosX = LOWORD(lParam);
        int iPosY = HIWORD(lParam);
        wchar_t waCoord[20];
        }
        break;
        }
       case WM_RBUTTONDOWN:
            if (Zeichnen)
        {
        {
        int jPosX = LOWORD(lParam);
        int jPosY = HIWORD(lParam);
        wchar_t waCoord[20];
        }
        break;
        }
        case WM_COMMAND:
            wmId    = LOWORD(wParam);
            wmEvent = HIWORD(wParam);
            // Menüauswahl bearbeiten:
            switch (wmId)
            {
            case IDM_ABOUT:
                DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, About);
                break;
            case IDM_EXIT:
                DestroyWindow(hWnd);
                break;
            default:
                return DefWindowProc(hWnd, message, wParam, lParam);
            }
            break;
        case WM_PAINT:
            hdc = BeginPaint(hWnd, &ps);
            // TODO: Hier den Zeichnungscode hinzufügen.
            HPEN hPenOld;
     
            {
     
            int Linie = MessageBox(hWnd, _T("Möchtest du eine Linie ziehen?"), _T("Zeichnen?"), MB_YESNO);
     
            switch (Linie)
            {
            case IDYES: 
                MessageBox(hWnd, _T("Du kannst jetzt eine Linie ziehen, indem du mit der linken Maustaste auf den Startpunkt und mit der rechten Maustaste auf den Endpunkt klickst!"), _T("Linie zeichnen"), MB_OK);
                HPEN hLinePen;
                COLORREF qLineColor;
                qLineColor = RGB(255, 0, 0);
                hLinePen = CreatePen(PS_SOLID, 7, qLineColor);
                hPenOld = (HPEN)SelectObject(hdc, hLinePen);
     
                MoveToEx(hdc, /* hier soll die Variable iPosX rein */  100 , /* hier soll die Variable iPosY rein */  100, NULL);
                LineTo(hdc, /* hier soll die Variable jPosX rein */ 500, /* hier soll die Variable jPosY rein */ 250);
     
                SelectObject(hdc, hPenOld);
                DeleteObject(hLinePen);
     
                break;
            case IDNO:  
                MessageBox(hWnd, _T("Und wofür hast du dann das Programm geöffnet?"), _T("****?"), MB_OK);
                break;
     
            }
     
            }
     
        
     
            
     
            EndPaint(hWnd, &ps);
            break;
        case WM_DESTROY:
            PostQuitMessage(0);
            break;
        default:
            return DefWindowProc(hWnd, message, wParam, lParam);
        }
        return 0;
    }
     
    // Meldungshandler für Infofeld.
    INT_PTR CALLBACK About(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
    {
        UNREFERENCED_PARAMETER(lParam);
        switch (message)
        {
        case WM_INITDIALOG:
            return (INT_PTR)TRUE;
     
        case WM_COMMAND:
            if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL)
            {
                EndDialog(hDlg, LOWORD(wParam));
                return (INT_PTR)TRUE;
            }
            break;
        }
        return (INT_PTR)FALSE;
    }

    Der müsste eigentlich so funktionieren.

    Lg

    üäpöol
     

  4. #4
    Avatar von sheel
    sheel sheel ist offline Moderator
    tutorials.de Moderator
    Registriert seit
    Jul 2007
    Beiträge
    4.501
    Wenn du die Variable erst im L/R-BUTTONDOWN anlegst, kannst du außerhalb davon (außerhalb der {} ) nicht darauf zugreifen.

    Mach die zwei ints außerhalb von L/R-BUTTONDOWN, gerade noch innerhalb von WndProc.
    Dann kannst du auch in der restlichen Funktion darauf zugreifen.

    Gruß
    üäpöol bedankt sich. 

  5. #5
    Avatar von Endurion
    Endurion Endurion ist offline Mitglied Diamant
    Registriert seit
    Apr 2004
    Beiträge
    2.151
    Äh, in WndProc hilft aber auch nicht, die wird für jede Windows-Nachricht neu durchlaufen. Damit sind die alten Werte futsch.
    Du kannst die als

    static int

    innerhalb der WndProc anlegen, dann bleiben die Werte auch stehen.
    sheel und üäpöol bedanken sich. 

  6. #6
    Avatar von sheel
    sheel sheel ist offline Moderator
    tutorials.de Moderator
    Registriert seit
    Jul 2007
    Beiträge
    4.501
    Stimmt...
    (man könnte aber auch ein goto zu WM_PAINT machen und sich darauf verlassen, dass das Zeichnen Funktioniert )

    Danke für die Korrektur.
    üäpöol bedankt sich. 

  7. #7
    üäpöol üäpöol ist offline Mitglied Gold
    Registriert seit
    Feb 2011
    Beiträge
    189
    Hm ...
    Also wie gesagt, ich bin Anfänger und verstehe leider gerade nicht ganz bzw. überhaupt nicht worüber euch unterhaltet.
    Wäre super, wenn ihr mir das ganze so erklären könnten, dass ich es verstehe.
     

  8. #8
    Avatar von Muepe32
    Muepe32 Muepe32 ist offline Mitglied Brokat
    Registriert seit
    Mar 2011
    Beiträge
    353
    Code cpp:
    1
    2
    3
    4
    5
    6
    7
    8
    
    int x = 2;
    /// x ist hier sichtbar
    {
       int y = 4;
       x = y;
       /// x und y sind hier sichtbar
    }
    /// y ist hier nicht mehr sichtbar, x schon

    Deine Variabeln müssten also an einem Ort deklariert werden an dem sie sowohl für WM_PAINT als auch für WM_RBUTTONDOWN ersichtlich sind. Das Problem ist aber, dass diese Variabeln dann in jedem Funktionsaufruf neu angelegt würden und somit ihre alten Werte nicht mehr hätten. Um das zu "umgehen" kannst du sie zum Beispiel statisch deklarieren.
    üäpöol bedankt sich. 
    Viele Tutorials und Artikel zur Programmierung unter Windows mit C++ und C#. Tägliche Updates und Antworten auf eure Fragen:
    Win32Easy - Blog
    Es würde mich freuen, wenn ihr einen Kommentar postet!

  9. #9
    üäpöol üäpöol ist offline Mitglied Gold
    Registriert seit
    Feb 2011
    Beiträge
    189
    Ah. Vielen Dank!
    Aber wie was bedeutet "eine Variable statisch deklarieren"?
    Ich hoffe ich geh euch nicht mit meinen Anfängerproblemen auf ide Nerven!
     

  10. #10
    Avatar von Muepe32
    Muepe32 Muepe32 ist offline Mitglied Brokat
    Registriert seit
    Mar 2011
    Beiträge
    353
    Das bedeutet, dass es von dieser Variabeln nur ein Exemplar gibt. Gleichzeitig wird aber durch den Ort der Deklaration bestimmt wo sie sichtbar ist. Das funktioniert folgendermassen:
    Code cpp:
    1
    2
    3
    4
    5
    6
    7
    
    void foo()
    {
       /// Davon existiert nur eine globale Version
       static float sFloat;
       /// Davon wird in jedem Funktionsaufruf eine neue Version erstellt.
       float vFloat;
    }
    üäpöol bedankt sich. 
    Viele Tutorials und Artikel zur Programmierung unter Windows mit C++ und C#. Tägliche Updates und Antworten auf eure Fragen:
    Win32Easy - Blog
    Es würde mich freuen, wenn ihr einen Kommentar postet!

  11. #11
    Avatar von sheel
    sheel sheel ist offline Moderator
    tutorials.de Moderator
    Registriert seit
    Jul 2007
    Beiträge
    4.501
    Wenn du eine Variable in einer Funktion hast, kannst du der ja irgendwelche Werte zuweisen.
    Wenn die Funktion aber fertig ist und ein zweites Mal aufgerufen wird, steht in der Variable nicht mehr der Wert, den sie am Ende der ersten Funktion gehabt hat. Der wird jedesmal am Funktionsende weggeputzt.

    Wenn du die Variable aber als static anlegst, behält sie nach einem Funktionsdurchgang ihren zuletzt aktuellen Wert und hat den beim nächsten Aufruf noch immer.
    Dann kann sie wieder normal gelesen und verändert werden, und behält sich am Ende vom zweiten Durchgang ihren aktuellen Wert für den dritten Aufruf ...usw.
    Sie wird also am Funktionsende nicht gelöscht.

    Anlegen kannst du sowas, indem du einfach static vorne hinschreibst, zB:
    Code cpp:
    1
    
    static int i;

    Nur noch als Hinweis: Außer bei funktionsinternen Variablen gibts static auch noch bei Strukturen/Klassen. Hat dort aber einen leicht anderen Sinn.

    Gruß
    üäpöol bedankt sich. 

  12. #12
    üäpöol üäpöol ist offline Mitglied Gold
    Registriert seit
    Feb 2011
    Beiträge
    189
    Ich glaub, langsam kapiere ich´s.
    Aber ich verstehe nicht ganz, wie ich das jetzt im einem Programm lösen kann.

    Wäre echt super von euch, wenn ihr mir da noch helfen könntet.

    Lg

    PS: Sorry, dass ich so spät antworte.
     

  13. #13
    Avatar von Muepe32
    Muepe32 Muepe32 ist offline Mitglied Brokat
    Registriert seit
    Mar 2011
    Beiträge
    353
    Du solltest die Variabeln, die du in verschiedenen Nachrichten verwendest als statische Variabeln der Funktion deklarieren damit du überall darauf zugreifen kannst.
    üäpöol bedankt sich. 
    Viele Tutorials und Artikel zur Programmierung unter Windows mit C++ und C#. Tägliche Updates und Antworten auf eure Fragen:
    Win32Easy - Blog
    Es würde mich freuen, wenn ihr einen Kommentar postet!

  14. #14
    üäpöol üäpöol ist offline Mitglied Gold
    Registriert seit
    Feb 2011
    Beiträge
    189
    Hi,

    erstmal ´tschuldigung, dass ich wieder so spät antworte. Ich war und bin ziemlich krank.
    Jetzt wieder zurück zu Thema:


    Wenn ich die meine Variablen vor "switch(message)" deklariere, erkennt WM_PAINT es zwar, es ist aber einfach nur 0.

    Viele Grüße und nochmal danke!
     

  15. #15
    üäpöol üäpöol ist offline Mitglied Gold
    Registriert seit
    Feb 2011
    Beiträge
    189
    Ach ja! Noch was.
    Ich hab vorher versucht mit einer if-Schleife zu programmieren, dass er nur zeichnet, wenn iPosX etc. nicht null sind. Er akzeptiert aber nur Variablen vom Typ const char.
    Das versteh ich nicht!
     

Ähnliche Themen

  1. JS Funktionsaufruf
    Von rintintintin im Forum Javascript & Ajax
    Antworten: 1
    Letzter Beitrag: 13.06.07, 02:31
  2. Funktionsaufruf
    Von Yudansha im Forum Borland CBuilder und VCL
    Antworten: 10
    Letzter Beitrag: 18.10.06, 15:51
  3. Funktionsaufruf
    Von Seelenfang im Forum C/C++
    Antworten: 0
    Letzter Beitrag: 22.03.06, 11:05
  4. Funktionsaufruf
    Von a400 im Forum C/C++
    Antworten: 3
    Letzter Beitrag: 06.05.05, 13:34
  5. Funktionsaufruf
    Von DuCaNe im Forum HTML & XHTML
    Antworten: 3
    Letzter Beitrag: 22.11.04, 10:22

Stichworte