Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.82/11: Рейтинг темы: голосов - 11, средняя оценка - 4.82
0 / 0 / 0
Регистрация: 09.12.2011
Сообщений: 20

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

24.01.2012, 19:35. Показов 2251. Ответов 3
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Начал осваивать 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;
 }
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
24.01.2012, 19:35
Ответы с готовыми решениями:

Передача параметров в функцию
void f(int a) ; // передача по значению void f(int *a);//передача по ссылке void f(int &amp;a) ; // а если так написано - что это...

Передача параметров в функцию
Люди помогите, пожалуйста. Есть такая простая задачка: В одномерном массиве, состоящем из n элементов вычислить произведение...

Передача параметров в функцию
Помогите решить ещё одну проблему) Пароль в хэшированном виде хранится в HashData. И пока выводится на экран после хэширования. Как мне его...

3
быдлокодер
 Аватар для kravam
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,705
24.01.2012, 22:33
Ну если эти переменные объявлены в функциий, отличной от 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;
}
0
0 / 0 / 0
Регистрация: 09.12.2011
Сообщений: 20
24.01.2012, 23:03  [ТС]
Проблема в том, что я не могу так сделать - ведь тогда придётся переопределять функцию WndProc, чего делать нельзя - в ней параметры по умолчанию и вызывается она функцией DispatcheMessage, для этого придётся лезть в библиотеку(sic!), от чего я бы воздержался.
0
быдлокодер
 Аватар для kravam
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,705
24.01.2012, 23:41
Не, переопределять не надо. Тут с функцией CRASH на самом деле проблем быть не должно, действительно, параметры стандартных типа она примет без проблем. Если тип нестандартный (указатель на массив хитрого типа), то опять же, просто надо познакомить CRASH с таким типом- это практикуется сплошь и рядом, и тогда она без проблем примет указатель на его массив и будет с ним работать
C++
1
2
3
struct CAR {
};
void* CRASH (CAR*);
НО вот что дейтствительно вызывает затруднения, как передать этот массив в оконную процедуру? Хз, наверное действительно придётся делать массив глобальным. Чё-то больше ничё в голову не приходит.

Ну тут я бы поковырядся ещё на предмет параметров WPARAM wParam и LPARAM lParam, ведь как я понял ты будешь CRASH вызывать только при определёных сообщениях, а насколько я знаю, не все сообщения используют эти параметры. А если нам хоть один параметр будет доступен это то что надо, ведь через него можно передавать любой указатель, на какую угодно структуру или массив. Если край неохота массивы делать глобальными, то надо пробовать.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
24.01.2012, 23:41
Помогаю со студенческими работами здесь

Передача параметров в функцию
при вызове одной и той же функции несколько раз нужно менять одну переменную на другую, как это можно сделать, чтоб не вводить вручную...

передача параметров в функцию
Здарвствуйте! Неделю изучаю С++, и в книге по которой изучаю сказано: &quot;Передавать параметры по значению только при необходимости и...

Передача параметров в функцию
Кто может помочь объяснить как это должно выглядеть? Создайте приложение, в котором объявлено функцию, принимает три параметра ...

Передача параметров в функцию
Как понять , что передаётся в функцию при такой записи : void Fun(str* &amp;r) при этом есть такие данные: struct str {int b; ...

Передача параметров в функцию
Толи я чего-то туплю, толи всё же в мейн ошибка. Итак: есть функция, которая должна сообщать о результатах поиска изменением переменных...


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

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Новые блоги и статьи
Идея фильтра интернета (сервер = слой+фильтр).
Hrethgir 31.03.2026
Суть идеи заключается в том, чтобы запустить свой сервер, о чём я если честно мечтал давно и давно приобрёл книгу как это сделать. Но не было причин его запускать. Очумелые учёные напечатали на. . .
Модель здравосоХранения 6. ESG-повестка и устойчивое развитие; углублённый анализ кадрового бренда
anaschu 31.03.2026
В прикрепленном документе раздумья о том, как можно поменять модель в будущем
10 пpимет, которые всегда сбываются
Maks 31.03.2026
1. Чтобы, наконец, пришла маршрутка, надо закурить. Если сигарета последняя, маршрутка придет еще до второй затяжки даже вопреки расписанию. 2. Нaдоели зима и снег? Не надо переезжать. Достаточно. . .
Перемещение выделенных строк ТЧ из одного документа в другой
Maks 31.03.2026
Реализация из решения ниже выполнена на примере нетипового документа "ВыдачаОборудованияНаСпецтехнику" с единственной табличной частью "ОборудованиеИКомплектующие" разработанного в конфигурации КА2. . . .
Functional First Web Framework Suave
DevAlt 30.03.2026
Sauve. IO Апнулись до NET10. Из зависимостей один пакет, работает одинаково хорошо как в режиме проекта так и в интерактивном режиме. из сложностей - чисто функциональный подход. Решил. . .
Автоматическое создание документа при проведении другого документа
Maks 29.03.2026
Реализация из решения ниже выполнена на нетиповых документах, разработанных в конфигурации КА2. Есть нетиповой документ "ЗаявкаНаРемонтСпецтехники" и нетиповой документ "ПланированиеСпецтехники". В. . .
Настройка движения справочника по регистру сведений
Maks 29.03.2026
Решение ниже реализовано на примере нетипового справочника "ТарифыМобильнойСвязи" разработанного в конфигурации КА2, с целью учета корпоративной мобильной связи в коммерческом предприятии. . . .
Автозаполнение реквизита при выборе элемента справочника
Maks 27.03.2026
Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. При выборе "Спецтехники" (Тип Справочник. Спецтехника), заполняется. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru