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

Передача параметров в функцию WndProc - C++

Восстановить пароль Регистрация
 
GotoFreeMan
0 / 0 / 0
Регистрация: 09.12.2011
Сообщений: 20
24.01.2012, 19:35     Передача параметров в функцию WndProc #1
Начал осваивать WinAPI и столкнулся со следующей проблемой - необходимо передать в качестве параметров некоторые переменные в функцию WndProc:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
LRESULT CALLBACK WndProc(
  HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    cout<<"at bottom of message\n";
  switch (message)
  {
      cout<<"In msg\n";
 
  case WM_PAINT:
 
    cout<<"In paint";
    hdc=BeginPaint(hWnd, &ps);
    CRASH(timecount,CAR,n,ROAD,NumOfRoad);
 
    EndPaint(hWnd, &ps);
 
    break;
В функцию CRASH надо передать 2 массива объектов (CAR,ROAD) и 3 целочисленные переменные(n, NumOfRoad, timecount).
Собственно вопрос как это сделать, если возможно, и если это глупо и невостребовано, то как сделать так, чтобы функция CRASH "увидела" вышеперечисленные переменные, объявленные в другом месте программы?
Вот кусок кода, где они объявляются и происходит цикл отправки сообщений:

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
int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpszCmdLine, int nCmdShow)
{
        HDC hdc; //создаём контекст устройства
    PAINTSTRUCT ps; //создаём экземпляр структуры графического вывода
  // выборка и обработка сообщений
  srand(time(NULL));
    //Параметры дорог
        char inputfile[255];
        cout << "Input name of file with description of roads: ";
        cin >> inputfile;
        int NumOfRoad=numberroad(inputfile);
        cout<<NumOfRoad<<'\n';
        //Выход в случае, если файл не найден
            if (NumOfRoad<1)
            {
                cout << "There is no roads. Maybe you input wrong name of file" << '\n';
            };
        ROADS ROAD[NumOfRoad];
        cout<<"Make roads\n";
        inputroad(inputfile, ROAD, NumOfRoad);
    cout<<"out of NOR\n";
    //Параметры машин
        int n;
        cout << "Input number of cars: ";
        cin >> n;
        CARS CAR[n];
 
    //Распределяем машины по дорогам
        distribution(ROAD, NumOfRoad, CAR, n);
    //Параметры аварии
        float NumRoad,HMLine,NumLine;//Номер дороги, количество линий, Начальный номер линии
        //cout << "Input crash parametrs: number of road, how many lines busy, number of first busy line(from left to right) ";
        //cin >> NumRoad>>HMLine>>NumLine;
        int timecount;
        //cout << "Input time passing from accident in seconds: ";
        //cin >> timecount;
 
    //Создание окна для рисования
        LPCTSTR lpzClass = TEXT("My Window Class!");
        RegMyWindowClass(hInstance, lpzClass);
        HWND hWnd = CreateWindow(lpzClass, TEXT("Dialog Window"),
        WS_OVERLAPPEDWINDOW | WS_VISIBLE, 0, 0, XSCR, YSCR, NULL, NULL,
        hInstance, NULL);
        MSG msg = {0};    // структура сообщения
        int iGetOk = 0;   // переменная состояния
        while ((iGetOk = GetMessage(&msg, NULL, 0, 0 )) != 0) // цикл сообщений
        {
            if (iGetOk == -1) return 3;  // если GetMessage вернул ошибку - выход
            TranslateMessage(&msg);
            DispatchMessage(&msg);
        }
 
    return msg.wParam;
 }
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
24.01.2012, 19:35     Передача параметров в функцию WndProc
Посмотрите здесь:

C++ Передача параметров в функцию
C++ Передача параметров в функцию
C++ передача параметров в функцию
C++ Передача параметров в функцию
C++ Передача параметров в функцию
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
kravam
быдлокодер
 Аватар для kravam
1512 / 872 / 44
Регистрация: 04.06.2008
Сообщений: 5,271
24.01.2012, 22:33     Передача параметров в функцию WndProc #2
Ну если эти переменные объявлены в функциий, отличной от CRASH, последняя вряд ли их увидит. Ты их сделай глобальными и она их будет видеть.
...Хотя можно и передать, это не глупо. Главное объявить её с соответствующими параметрами. И передатся не сам массив, а указатель на него
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
#include <stdio.h>
 
void g (int* k) {
 k[0]= 76;
}
 
 
void k () {
 
 //Это воттвой массив
 int ss [24];
 ss[0]= 12;
 printf ("ss= %d\n", ss[0]);
 
 //Вот мы его передали в функцию.
 g(ss);
 //А вот результат.
 printf ("ss= %d\n", ss[0]);
}
 
 
int main () {
 printf ("hello, word!\n");
 k();
 getchar ();
 return 0;
}
GotoFreeMan
0 / 0 / 0
Регистрация: 09.12.2011
Сообщений: 20
24.01.2012, 23:03  [ТС]     Передача параметров в функцию WndProc #3
Проблема в том, что я не могу так сделать - ведь тогда придётся переопределять функцию WndProc, чего делать нельзя - в ней параметры по умолчанию и вызывается она функцией DispatcheMessage, для этого придётся лезть в библиотеку(sic!), от чего я бы воздержался.
kravam
быдлокодер
 Аватар для kravam
1512 / 872 / 44
Регистрация: 04.06.2008
Сообщений: 5,271
24.01.2012, 23:41     Передача параметров в функцию WndProc #4
Не, переопределять не надо. Тут с функцией CRASH на самом деле проблем быть не должно, действительно, параметры стандартных типа она примет без проблем. Если тип нестандартный (указатель на массив хитрого типа), то опять же, просто надо познакомить CRASH с таким типом- это практикуется сплошь и рядом, и тогда она без проблем примет указатель на его массив и будет с ним работать
C++
1
2
3
struct CAR {
};
void* CRASH (CAR*);
НО вот что дейтствительно вызывает затруднения, как передать этот массив в оконную процедуру? Хз, наверное действительно придётся делать массив глобальным. Чё-то больше ничё в голову не приходит.

Ну тут я бы поковырядся ещё на предмет параметров WPARAM wParam и LPARAM lParam, ведь как я понял ты будешь CRASH вызывать только при определёных сообщениях, а насколько я знаю, не все сообщения используют эти параметры. А если нам хоть один параметр будет доступен это то что надо, ведь через него можно передавать любой указатель, на какую угодно структуру или массив. Если край неохота массивы делать глобальными, то надо пробовать.
Yandex
Объявления
24.01.2012, 23:41     Передача параметров в функцию WndProc
Ответ Создать тему
Опции темы

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