Форум программистов, компьютерный форум CyberForum.ru

Проблемы с много-файловыми объявлениями - C++

Восстановить пароль Регистрация
 
Xipxop
 Аватар для Xipxop
481 / 9 / 2
Регистрация: 28.12.2011
Сообщений: 150
10.08.2013, 15:47     Проблемы с много-файловыми объявлениями #1
Добрый день!
У меня возникла небольшая проблема после того как я стал изучать Win API, мне стало неудобно хранить весь код в одном файле main.cpp
И вот я решил разбить мой проект на несколько частей: Иницилизация окна, main, GameMain
И вот тут я встретился с некоторыми проблемами... (определял в заголовочных файлах)
После этого я разбил Иницилизацию, GameMain по 2 файла .h и .cpp
И вот от этого посыпалось очень много ошибок, причем по факту такими не являются!

Вот кодНенужные тела функций я обрезал)
CreateWindowClass.cpp
C++
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
#if !CRWNDDEF
#define CRWNDDEF
 
#include <windows.h>
#include "CreateWindowClass.h"
 
//LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
 
class CreateWindowClass{
public:
    WNDCLASS    wndclass;
    UINT        style;                      //Стиль окна
    int         cbClsExtra;int cbWndExtra;  //Доп память
    HICON       hIcon;                      //Иконка
    HCURSOR     hCursor;                    //Мышка
    LPCSTR      lpszMenuName;               //имя меню(???)
    HBRUSH      hbrBackground;              //Цвет фона(серый)
    //-----------------------------------------------------------------------
    LPCTSTR     szAppNam;                   //Указатель на имя класса окна
    LPCTSTR     lpWindowName;               //Указатель на имя окна
    DWORD       dwStyle;                    //Стиль окна
    int         x;int y;                    //Начальное положение экрана
    int         xWidth;int yHeight;         //Ширина и высота экрана
    HWND        hWndParent;                 //Родитель
    HMENU       hMenu;                      //Меню
    HINSTANCE   hInstance;                  //Дескриптор экземпляра приложения
    LPVOID      lpParam;                    //Указатель на данные созданного окна
    //-----------------------------------------------------------------------
    HWND        hwnd;
    int         iCmdShow;
    //-----------------------------------------------------------------------
 
    CreateWindowClass(HINSTANCE hInst, int iCmdSh, LPCTSTR AppName=TEXT("TEXT1"), LPCTSTR WndName=TEXT("Dialog Window"), int xM=800, int yM=600){
        style = CS_HREDRAW|CS_VREDRAW|CS_DBLCLKS; 
        cbClsExtra = 0;
        cbWndExtra = 0;             
        hIcon = LoadIcon(NULL, IDI_APPLICATION); 
        hCursor = LoadCursor(NULL, IDC_ARROW);   
        lpszMenuName = NULL;
        hbrBackground =(HBRUSH)1;
        //-----------------------------------------------------------------------
        szAppNam    = AppName;         
        lpWindowName = WndName; 
        dwStyle = WS_SYSMENU|WS_MINIMIZEBOX; //CS_HREDRAW|CS_VREDRAW|CS_DBLCLKS
        x = 100; 
        y = 100;                            
        xWidth = xM; 
        yHeight = yM;            
        hWndParent = NULL;                    
        hMenu = NULL;                         
        lpParam = NULL;  
        hInstance = hInst;
        iCmdShow = iCmdSh;
    }
 
    ATOM RegMyWindowClass()
    {
        wndclass.lpfnWndProc    = WndProc;
        wndclass.style          = style;
        wndclass.cbClsExtra     = cbClsExtra;
        wndclass.cbWndExtra     = cbWndExtra;
        wndclass.hInstance      = hInstance;
        wndclass.hIcon          = hIcon;
        wndclass.hCursor        = hCursor;
        wndclass.lpszMenuName   = NULL;
        wndclass.lpszClassName  = szAppNam;
        wndclass.hbrBackground  = hbrBackground;
 
        return RegisterClass(&wndclass);
    }
    bool CrWindow()
    {
        hwnd=CreateWindow(szAppNam, lpWindowName, dwStyle, x, y, xWidth, yHeight, hWndParent, hMenu, hInstance, lpParam);
        ShowWindow(hwnd, iCmdShow);
        UpdateWindow(hwnd);
        return (hwnd != NULL);
    }
};
 
#endif

CreateWindowClass.h
C++
1
2
3
4
5
6
7
8
9
#if !WNDCLASS
#define WNDCLASS
 
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
class CreateWindowClass;
 
 
 
#endif

main.cpp
C++
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
//Обзор возможностей WinAPI
#pragma comment(lib,"Winmm.lib") //Библиотека произведения звуков
#include <windows.h>
#include "CreateWindowClass.h"
#include "GameMain.h"
#include <cstring>
//--Определения
//
#define OHWND CrWind.hwnd
//
//----Globals-----
CreateWindowClass* pntWndClass; //Указатель на класс
//
 
LRESULT CALLBACK WndProc(HWND hWnd, UINT iMsg, WPARAM wParam, LPARAM lParam){
        HDC             hdc;
        PAINTSTRUCT     ps;
        RECT            rect;
        int             iNextString=0;
        int             x=0,y=0;
 
        switch(iMsg){
        case WM_CREATE:
            //PlaySound(L"ding.wav", NULL, SND_FILENAME|SND_SYNC);
        break;
        case WM_LBUTTONDOWN :
            x = LOWORD(lParam);
            y = HIWORD(lParam);
            if(x>=450 && x<=480 && y>=45 && y<=515)
            {
                for(int i=1; i<MAX_STAGE+1; i++)
                {
                    if(y>=520-(i*40)+5 && y<=520-(i*40)+35)
                    {
                        if(y<520-(i*40)+20)
                        {btns[i-1].CallBtn(UP);}
                        else {btns[i-1].CallBtn(DOWN);}
                        break;
                    }
                }
            }
        break;
        case WM_PAINT:
            cHouse.Draw();
            hdc=BeginPaint(hWnd, &ps);
 
            GetClientRect(hWnd, &rect);
 
            //TextOut(hdc, 600, y, "Hello", 5);
 
            EndPaint(hWnd, &ps);
        break;
        case WM_DESTROY:
            PostQuitMessage(0);
        break;
        default:
            return DefWindowProc(hWnd, iMsg, wParam, lParam);
        break;
        }
        return 0;
}
 
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow)
{
    CreateWindowClass CrWind(hInstance, iCmdShow, TEXT("HelloWin32"), TEXT("Main Window"));
    pntWndClass=&CrWind;
    MSG         msg;
    
    //-----------
    if(!CrWind.RegMyWindowClass()) return 1;
    if(!CrWind.CrWindow()) return 2;
    //----------------------------------------------------------
    /*while(GetMessage(&msg, NULL, 0, 0))
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }*/
    while(TRUE)
    {
        if (PeekMessage(&msg,NULL,0,0,PM_REMOVE))
        {
            if (msg.message == WM_QUIT) break;
            TranslateMessage(&msg);
            DispatchMessage(&msg);
            }
        // Вывод очередного кадра игры
        GameMain();
    }
    return msg.wParam;
}

GameMain.cpp
C++
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
#if !GAMEMAINO
#define GAMEMAINO
//
#include <windows.h>
#include "CreateWindowClass.h"
#include "GameMain.h"
extern CreateWindowClass* pntWndClass; //Указатель на класс эта переменая используется как: pntWndClass.hwnd  В Draw()
 
class House
{
private:
    HBRUSH  hBrush;
    HDC     hdc;
    RECT    rect;
public:
    House()
    {
        SetRect(&rect, 10, 10, 500, 540);
        hBrush = CreateSolidBrush(RGB(189, 255, 178));
    }
    void Draw()
    {
    }
};
 
//extern Buttons btns[MAX_STAGE];
 
class Lift
{
private:
    HBRUSH  hBrush;
    HDC     hdc;
    RECT    rect;
    int     x;
    int     y;
    int     Stage;
    int     Active;
    int     KydaStage;
public:
    Lift(int red=100, int green=100, int blue=100): x(300), y(480), Stage(1), Active(NONE), KydaStage(1)
    {
        SetRect(&rect, x, y, x+30, y+40);
        hBrush = CreateSolidBrush(RGB(red, green, blue));
    }
    void MimoStage()//Мимо этого этажа пролетаю
    {
        if(Stage==KydaStage)
        {
            btns[Stage-1].LiftOver();
        }
    }
    void MoveLift()//Двигаем лифт
    {
    }
    void Draw()//Рисуем лифт
    {
    }
    void CallLift(int stg, int mode)//Лифт вызвала кнопка
    {
    }
};
 
class Buttons
{
private:
    HBRUSH  hBrush;
    HDC     hdc;
    RECT    rect;
    int     x;
    int     y;
    int     Active;
    int     MyStage;
    HBRUSH  AcBrush;
public:
    static int Stage;
    Buttons(): Active(NONE), MyStage(Stage)
    {
        x=450; y=520-(Stage*40)+5;
        SetRect(&rect, x, y, x+30, y+30);
        hBrush = CreateSolidBrush(RGB(30, 90, 50));
        AcBrush = CreateSolidBrush(RGB(78, 255, 34));
        Stage++;
    }
    void Draw()
    {
    }
    void CallBtn(int modeCall)
    {
        if(Active!=modeCall && Active!=UPDOWN)
        {
            switch(Active)
            {
            case NONE: 
                if((modeCall==DOWN && MyStage!=1)||(modeCall==UP && MyStage!=MAX_STAGE)) 
                    {Active=modeCall; cLt.CallLift(MyStage, Active);}
            break;
            case UP: case DOWN:   Active=UPDOWN;    cLt.CallLift(MyStage, Active);  break;
            }
        }
    }
    void LiftOver()
    {
    }
};
int Buttons::Stage=1;
 
//--Globals-Class
House cHouse;
Lift cLt;
Buttons btns[MAX_STAGE];
//-----------------------
void DrawAllBtn()
{
    for(int i=0; i<btns->Stage; i++)
    {
        btns[i].Draw();
    }
}
 
void GameMain()
{
    DWORD start_time = GetTickCount();
    //-------------------
    cHouse.Draw();
    cLt.Draw();
    DrawAllBtn();
 
    
    //-------------------
    while((GetTickCount() - start_time) < 66);
}
 
 
 
#endif

GameMain.h
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#if !GAMEMAIN
#define GAMEMAIN
//
#define MAX_STAGE 12
#define MAX_SPEED_LIFT 5
//
enum {NONE, UP, DOWN, UPDOWN};
 
class House;
class Lift;
class Buttons;
 
extern House    cHouse;
extern Lift     cLt;
extern Buttons  btns[MAX_STAGE];
 
void DrawAllBtn();
void GameMain();
 
#endif



Вот сами ошибки, но они просто несуразные...
Кликните здесь для просмотра всего текста
C++
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
createwindowclass.cpp(11) : error C4430: отсутствует спецификатор типа - предполагается int. Примечание. C++ не поддерживает int по умолчанию
createwindowclass.cpp(58) : error C2065: wndclass: необъявленный идентификатор
createwindowclass.cpp(58) : error C2228: выражение слева от ".lpfnWndProc" должно представлять класс, структуру или объединение
        тип: 'unknown-type'
createwindowclass.cpp(59) : error C2065: wndclass: необъявленный идентификатор
createwindowclass.cpp(59) : error C2228: выражение слева от ".style" должно представлять класс, структуру или объединение
        тип: 'unknown-type'
createwindowclass.cpp(60) : error C2065: wndclass: необъявленный идентификатор
createwindowclass.cpp(60) : error C2228: выражение слева от ".cbClsExtra" должно представлять класс, структуру или объединение
        тип: 'unknown-type'
createwindowclass.cpp(61) : error C2065: wndclass: необъявленный идентификатор
createwindowclass.cpp(61) : error C2228: выражение слева от ".cbWndExtra" должно представлять класс, структуру или объединение
        тип: 'unknown-type'
createwindowclass.cpp(62) : error C2065: wndclass: необъявленный идентификатор
createwindowclass.cpp(62) : error C2228: выражение слева от ".hInstance" должно представлять класс, структуру или объединение
        тип: 'unknown-type'
createwindowclass.cpp(63) : error C2065: wndclass: необъявленный идентификатор
createwindowclass.cpp(63) : error C2228: выражение слева от ".hIcon" должно представлять класс, структуру или объединение
        тип: 'unknown-type'
createwindowclass.cpp(64) : error C2065: wndclass: необъявленный идентификатор
createwindowclass.cpp(64) : error C2228: выражение слева от ".hCursor" должно представлять класс, структуру или объединение
        тип: 'unknown-type'
createwindowclass.cpp(65) : error C2065: wndclass: необъявленный идентификатор
createwindowclass.cpp(65) : error C2228: выражение слева от ".lpszMenuName" должно представлять класс, структуру или объединение
        тип: 'unknown-type'
createwindowclass.cpp(66) : error C2065: wndclass: необъявленный идентификатор
createwindowclass.cpp(66) : error C2228: выражение слева от ".lpszClassName" должно представлять класс, структуру или объединение
        тип: 'unknown-type'
createwindowclass.cpp(67) : error C2065: wndclass: необъявленный идентификатор
createwindowclass.cpp(67) : error C2228: выражение слева от ".hbrBackground" должно представлять класс, структуру или объединение
        тип: 'unknown-type'
createwindowclass.cpp(69) : error C2065: wndclass: необъявленный идентификатор
GameMain.cpp
GameMain.cpp(49) : error C2036: Buttons *: неизвестный размер
GameMain.cpp(49) : error C2027: использование неопределенного типа "Buttons"
        gamemain.h(11): см. объявление 'Buttons'
GameMain.cpp(49) : error C2228: выражение слева от ".LiftOver" должно представлять класс, структуру или объединение
main.cpp
main.cpp(36) : error C2036: Buttons *: неизвестный размер
main.cpp(36) : error C2027: использование неопределенного типа "Buttons"
        gamemain.h(11): см. объявление 'Buttons'
main.cpp(36) : error C2228: выражение слева от ".CallBtn" должно представлять класс, структуру или объединение
main.cpp(37) : error C2036: Buttons *: неизвестный размер
main.cpp(37) : error C2027: использование неопределенного типа "Buttons"
        gamemain.h(11): см. объявление 'Buttons'
main.cpp(37) : error C2228: выражение слева от ".CallBtn" должно представлять класс, структуру или объединение
main.cpp(44) : error C2027: использование неопределенного типа "House"
        gamemain.h(9): см. объявление 'House'
main.cpp(44) : error C2228: выражение слева от ".Draw" должно представлять класс, структуру или объединение
main.cpp(65) : error C2079: "CrWind" использует неопределенный class "CreateWindowClass"
main.cpp(65) : error C2078: слишком много инициализаторов
main.cpp(65) : error C2440: инициализация: невозможно преобразовать 'const char [12]' в 'int'
        Не существует контекста, в котором такое преобразование возможно
main.cpp(66) : error C2440: =: невозможно преобразовать 'int *' в 'CreateWindowClass *'
        Типы, на которые указывают указатели, не связаны; для преобразования требуется reinterpret_cast, приведение в стиле С или приведение в стиле функции
main.cpp(70) : error C2228: выражение слева от ".RegMyWindowClass" должно представлять класс, структуру или объединение
        тип: int
main.cpp(71) : error C2228: выражение слева от ".CrWindow" должно представлять класс, структуру или объединение
        тип: int


Подскажите в чем проблема?
P.S. Как только все пихаю в 1 файл, то все становится нормально!

Добавлено через 27 минут
Есть еще одна проблема:
Видно я еще и неправильно объявляю классы Buttons и Lift между собой, так как обоим классам нужен доступ к друг-другу.(Buttons класс кнопок ВНЕ лифта, поэтому объединять их нету смысла)
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
0x10
2425 / 1597 / 232
Регистрация: 24.11.2012
Сообщений: 3,919
10.08.2013, 15:54     Проблемы с много-файловыми объявлениями #2
1. Объявления классов недостаточно для того, чтобы можно было их использовать. В заголовочных файлах должны быть определения.
2. В cpp-файлах не нужны include guards.

Пример:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
// @file A.h
#pragma once
 
class A
{
public:
    A(int value);
    void f() const;
 
private:
    int value_;
};
 
// @file A.cpp
#include "A.h"
 
A::A(int value):
    value_{value}
{  }
 
void A::f() const
{
    // do smth
}
Надо привести все к такому виду, а то сейчас какая-то каша.
Xipxop
 Аватар для Xipxop
481 / 9 / 2
Регистрация: 28.12.2011
Сообщений: 150
10.08.2013, 16:53  [ТС]     Проблемы с много-файловыми объявлениями #3
Сделал, но новые ошибки не перестали появлятся... (Хоть до того как я разбил файл ошибок не было, все отлично работало)
Стал жаловаться на:
Неправильную защиту от повторного подключения...
Переиницилизацию классов, и несовпадение аргументов!

Кликните здесь для просмотра всего текста
C++
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
// @file CreateWindows.h
//#if !CrtWindClasOP
#define CrtWindClasOP
#include <windows.h>
 
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
class CreateWindowClass
{
public:
    WNDCLASS    wndclass;
    UINT        style;                      //Стиль окна
    int         cbClsExtra;int cbWndExtra;  //Доп память
    HICON       hIcon;                      //Иконка
    HCURSOR     hCursor;                    //Мышка
    LPCSTR      lpszMenuName;               //имя меню(???)
    HBRUSH      hbrBackground;              //Цвет фона(серый)
    //-----------------------------------------------------------------------
    LPCTSTR     szAppNam;                   //Указатель на имя класса окна
    LPCTSTR     lpWindowName;               //Указатель на имя окна
    DWORD       dwStyle;                    //Стиль окна
    int         x;int y;                    //Начальное положение экрана
    int         xWidth;int yHeight;         //Ширина и высота экрана
    HWND        hWndParent;                 //Родитель
    HMENU       hMenu;                      //Меню
    HINSTANCE   hInstance;                  //Дескриптор экземпляра приложения
    LPVOID      lpParam;                    //Указатель на данные созданного окна
    //-----------------------------------------------------------------------
    HWND        hwnd;
    int         iCmdShow;
    //-----------------------------------------------------------------------
    CreateWindowClass(HINSTANCE, int, LPCTSTR, LPCTSTR, int, int);
    //CreateWindowClass(HINSTANCE hInst, int iCmdSh, LPCTSTR AppName=TEXT("TEXT1"), LPCTSTR WndName=TEXT("Dialog Window"), int xM=800, int yM=600);
    ATOM RegMyWindowClass();
    bool CrWindow();
};
 
extern CreateWindowClass* pntWndClass; //Указатель на класс
 
//#endif
 
 
 
 
 
 
// @file CreateWindows.cpp
//#include <windows.h>
#include "CreateWindowClass.h"
 
//LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
 
CreateWindowClass::CreateWindowClass(HINSTANCE hInst, int iCmdSh, LPCTSTR AppName=TEXT("TEXT1"), LPCTSTR WndName=TEXT("Dialog Window"), int xM=800, int yM=600){
        style = CS_HREDRAW|CS_VREDRAW|CS_DBLCLKS; 
        cbClsExtra = 0;
        cbWndExtra = 0;             
        hIcon = LoadIcon(NULL, IDI_APPLICATION); 
        hCursor = LoadCursor(NULL, IDC_ARROW);   
        lpszMenuName = NULL;
        hbrBackground =(HBRUSH)1;
        //-----------------------------------------------------------------------
        szAppNam    = AppName;         
        lpWindowName = WndName; 
        dwStyle = WS_SYSMENU|WS_MINIMIZEBOX; //CS_HREDRAW|CS_VREDRAW|CS_DBLCLKS
        x = 100; 
        y = 100;                            
        xWidth = xM; 
        yHeight = yM;            
        hWndParent = NULL;                    
        hMenu = NULL;                         
        lpParam = NULL;  
        hInstance = hInst;
        iCmdShow = iCmdSh;
    }
ATOM CreateWindowClass::RegMyWindowClass()
    {
        wndclass.lpfnWndProc    = WndProc;
        wndclass.style          = style;
        wndclass.cbClsExtra     = cbClsExtra;
        wndclass.cbWndExtra     = cbWndExtra;
        wndclass.hInstance      = hInstance;
        wndclass.hIcon          = hIcon;
        wndclass.hCursor        = hCursor;
        wndclass.lpszMenuName   = NULL;
        wndclass.lpszClassName  = szAppNam;
        wndclass.hbrBackground  = hbrBackground;
 
        return RegisterClass(&wndclass);
    }
bool CreateWindowClass::CrWindow()
    {
        hwnd=CreateWindow(szAppNam, lpWindowName, dwStyle, x, y, xWidth, yHeight, hWndParent, hMenu, hInstance, lpParam);
        ShowWindow(hwnd, iCmdShow);
        UpdateWindow(hwnd);
        return (hwnd != NULL);
    }
 
CreateWindowClass* pntWndClass; //Указатель на класс


Кликните здесь для просмотра всего текста
C++
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
// @file GameMain.h
//#if !GAMEMAIN
#define GAMEMAIN
//
#include <windows.h>
#include "CreateWindowClass.h"
extern CreateWindowClass* pntWndClass; //Указатель на класс
//
#define MAX_STAGE 12
#define MAX_SPEED_LIFT 5
//
enum {NONE, UP, DOWN, UPDOWN};
 
class House
{
private:
    HBRUSH  hBrush;
    HDC     hdc;
    RECT    rect;
public:
    House();
    void Draw();
};
 
class Lift
{
private:
    HBRUSH  hBrush;
    HDC     hdc;
    RECT    rect;
    int     x;
    int     y;
    int     Stage;
    int     Active;
    int     KydaStage;
public:
    Lift(int red=100, int green=100, int blue=100);
    void MimoStage();//Мимо этого этажа пролетаю
    void MoveLift();//Двигаем лифт
    void Draw();//Рисуем лифт
    void CallLift(int stg, int mode);//Лифт вызвала кнопка
};
 
class Buttons
{
private:
    HBRUSH  hBrush;
    HDC     hdc;
    RECT    rect;
    int     x;
    int     y;
    int     Active;
    int     MyStage;
    HBRUSH  AcBrush;
public:
    static int Stage;
    Buttons();
    void Draw();
    void CallBtn(int modeCall);
    void LiftOver();
};
 
extern House    cHouse;
extern Lift     cLt;
extern Buttons  btns[MAX_STAGE];
 
void DrawAllBtn();
void GameMain();
 
//#endif
 
 
 
 
// @file GameMain.cpp
//#include <windows.h>
//extern CreateWindowClass* pntWndClass; //Указатель на класс
#include"GameMain.h"
 
//Class HOUSE
House::House()
    {
        SetRect(&rect, 10, 10, 500, 540);
        hBrush = CreateSolidBrush(RGB(189, 255, 178));
    }
void House::Draw()
    {
        hdc = GetDC(pntWndClass->hwnd);
        //--
        ReleaseDC(pntWndClass->hwnd, hdc);
    }
//END House
 
//Class Lift
Lift::Lift(int red=100, int green=100, int blue=100): x(300), y(480), Stage(1), Active(NONE), KydaStage(1)
    {
        SetRect(&rect, x, y, x+30, y+40);
        hBrush = CreateSolidBrush(RGB(red, green, blue));
    }
void Lift::MimoStage()//Мимо этого этажа пролетаю
    {
        if(Stage==KydaStage)
        {
            btns[Stage-1].LiftOver();
        }
    }
void Lift::MoveLift()//Двигаем лифт
    {
    }
void Lift::Draw()//Рисуем лифт
    {
        hdc = GetDC(pntWndClass->hwnd);
        //--
        //FillRect(hdc, &rect, NULL);
        InvalidateRect(pntWndClass->hwnd, &rect, true);
        SetRect(&rect, x, y, x+30, y+40);
        FillRect(hdc, &rect, hBrush);
        //--
        ReleaseDC(pntWndClass->hwnd, hdc);
        MoveLift();
    }
void Lift::CallLift(int stg, int mode)//Лифт вызвала кнопка
    {
    }
//END Lift
 
//Class Buttons
Buttons::Buttons(): Active(NONE), MyStage(Stage)
    {
        x=450; y=520-(Stage*40)+5;
        SetRect(&rect, x, y, x+30, y+30);
        hBrush = CreateSolidBrush(RGB(30, 90, 50));
        AcBrush = CreateSolidBrush(RGB(78, 255, 34));
        Stage++;
    }
void Buttons::Draw()
    {
    }
void Buttons::CallBtn(int modeCall)
    {
        if(Active!=modeCall && Active!=UPDOWN)
        {
            switch(Active)
            {
            case NONE: 
                if((modeCall==DOWN && MyStage!=1)||(modeCall==UP && MyStage!=MAX_STAGE)) 
                    {Active=modeCall; cLt.CallLift(MyStage, Active);}
            break;
            case UP: case DOWN:   Active=UPDOWN;    cLt.CallLift(MyStage, Active);  break;
            }
        }
    }
void Buttons::LiftOver()
    {
    }
int Buttons::Stage=1;
//END Buttons
 
//--Globals-Class
House cHouse;
Lift cLt;
Buttons btns[MAX_STAGE];
//-----------------------
void DrawAllBtn()
{
    for(int i=0; i<btns->Stage; i++)
    {
        btns[i].Draw();
    }
}
 
void GameMain()
{
    DWORD start_time = GetTickCount();
    //-------------------
    cHouse.Draw();
    cLt.Draw();
    DrawAllBtn();
 
    
    //-------------------
    while((GetTickCount() - start_time) < 66);
}


Кликните здесь для просмотра всего текста
C++
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
// @file Main.cpp
//Обзор возможностей WinAPI
#pragma comment(lib,"Winmm.lib") //Библиотека произведения звуков
#include <windows.h>
#include "CreateWindowClass.h"
#include "GameMain.h"
//--Определения
//
//#define OHW CrWind.hwnd
//
//----Globals-----
//extern CreateWindowClass* pntWndClass; //Указатель на класс
//
 
LRESULT CALLBACK WndProc(HWND hWnd, UINT iMsg, WPARAM wParam, LPARAM lParam){
        HDC             hdc;
        PAINTSTRUCT     ps;
        RECT            rect;
        int             iNextString=0;
        int             x=0,y=0;
 
        switch(iMsg){
        case WM_CREATE:
            //PlaySound(L"ding.wav", NULL, SND_FILENAME|SND_SYNC);
        break;
        case WM_LBUTTONDOWN :
            x = LOWORD(lParam);
            y = HIWORD(lParam);
            if(x>=450 && x<=480 && y>=45 && y<=515)
            {
                for(int i=1; i<MAX_STAGE+1; i++)
                {
                    if(y>=520-(i*40)+5 && y<=520-(i*40)+35)
                    {
                        if(y<520-(i*40)+20)
                        {btns[i-1].CallBtn(UP);}
                        else {btns[i-1].CallBtn(DOWN);}
                        break;
                    }
                }
            }
        break;
        case WM_PAINT:
            cHouse.Draw();
            hdc=BeginPaint(hWnd, &ps);
 
            GetClientRect(hWnd, &rect);
 
            //TextOut(hdc, 600, y, "Hello", 5);
 
            EndPaint(hWnd, &ps);
        break;
        case WM_DESTROY:
            PostQuitMessage(0);
        break;
        default:
            return DefWindowProc(hWnd, iMsg, wParam, lParam);
        break;
        }
        return 0;
}
 
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow)
{
    CreateWindowClass CrWind(hInstance, iCmdShow, TEXT("HelloWin32"), TEXT("Main Window"));
    pntWndClass=&CrWind;
    MSG         msg;
    
    //-----------
    if(!CrWind.RegMyWindowClass()) return 1;
    if(!CrWind.CrWindow()) return 2;
    //----------------------------------------------------------
    /*while(GetMessage(&msg, NULL, 0, 0))
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }*/
    while(TRUE)
    {
        if (PeekMessage(&msg,NULL,0,0,PM_REMOVE))
        {
            if (msg.message == WM_QUIT) break;
            TranslateMessage(&msg);
            DispatchMessage(&msg);
            }
        // Вывод очередного кадра игры
        GameMain();
    }
    return msg.wParam;
}


Я просто в ауте иногда от компилятора Visual c++, я б давно от него отказался, но редактор кода уж больно удобен...
gray_fox
What a waste!
 Аватар для gray_fox
1244 / 1127 / 53
Регистрация: 21.04.2012
Сообщений: 2,350
Завершенные тесты: 3
10.08.2013, 17:12     Проблемы с много-файловыми объявлениями #4
Xipxop, иклюд-гуарды в заголовочных файлах зачем закомментировал?
Цитата Сообщение от 0x10 Посмотреть сообщение
2. В cpp-файлах не нужны include guards.
Xipxop
 Аватар для Xipxop
481 / 9 / 2
Регистрация: 28.12.2011
Сообщений: 150
10.08.2013, 17:18  [ТС]     Проблемы с много-файловыми объявлениями #5
gray_fox,
Стал жаловаться на:
Неправильную защиту от повторного подключения...
Как тока их закоментировал появились следующие ошибки
0x10
2425 / 1597 / 232
Регистрация: 24.11.2012
Сообщений: 3,919
10.08.2013, 17:25     Проблемы с много-файловыми объявлениями #6
Xipxop,
#pragma once в начало каждого хедера, и выкинуть нафиг #ifndef-define-endif.

Аргументы по умолчанию у методов - в заголовочные файлы.

Добавлено через 4 минуты

Не по теме:

На будущее: глобальные переменные - зло.

Xipxop
 Аватар для Xipxop
481 / 9 / 2
Регистрация: 28.12.2011
Сообщений: 150
10.08.2013, 17:28  [ТС]     Проблемы с много-файловыми объявлениями #7
Цитата Сообщение от 0x10 Посмотреть сообщение
Аргументы по умолчанию у методов - в заголовочные файлы.
А вот тут по подробнее, то я не понимаю, с примером(включая конструктор)
Заранее спс.

Не по теме:

За глобалками я слежу... (А статик переменые, какбудто нет...)

0x10
2425 / 1597 / 232
Регистрация: 24.11.2012
Сообщений: 3,919
10.08.2013, 17:30     Проблемы с много-файловыми объявлениями #8
C++
1
2
3
4
5
6
7
8
9
// file A.h
#pragma once
 
class A
{
public:
    // тут пишем
    A(int value = 0);
};
C++
1
2
3
4
5
6
7
// file A.cpp
 
#include "A.h"
 
// тут - не пишем
A::A(int value)
{  }
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
10.08.2013, 17:52     Проблемы с много-файловыми объявлениями
Еще ссылки по теме:

C++ Указатели на массивы: В чем принципиальное различие между объявлениями указателей?
C++ Какая разница между разными объявлениями объектов?
Работа с файловыми потоками. Считать информацию C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Xipxop
 Аватар для Xipxop
481 / 9 / 2
Регистрация: 28.12.2011
Сообщений: 150
10.08.2013, 17:52  [ТС]     Проблемы с много-файловыми объявлениями #9
Хорошо с этой мини-ошибкой разобрался.
Теперь говорит, что CreateWindowClass переопределен... (Но где именно переопределен, молчит)
(Код почти что неизменился, кроме поправки которую подсказали)

Добавлено через 9 минут
А нет все спасибо!
Забыл #pragma once включить!
Большое вам спасибо!
Yandex
Объявления
10.08.2013, 17:52     Проблемы с много-файловыми объявлениями
Ответ Создать тему
Опции темы

Текущее время: 02:39. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru