Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
programina
1914 / 599 / 37
Регистрация: 23.10.2011
Сообщений: 4,468
Записей в блоге: 2
#1

Вызов обратной функции в классе - C++

23.11.2013, 22:33. Просмотров 495. Ответов 15
Метки нет (Все метки)

main.cpp

C++
// main.cpp
#include "func.h"
 
int WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int)
{
    CREATEWIN();
 
    bool bq = false;
    MSG msg;
 
    while (!bq)
    {
        if(PeekMessage(&msg, 0, 0, 0, PM_REMOVE)) {
            if(msg.message == WM_QUIT) { 
                bq = true; 
            }
            else { 
                TranslateMessage(&msg); 
                DispatchMessage(&msg); 
            }
        }
        else
        {
            if(GetAsyncKeyState(VK_ESCAPE)) PostQuitMessage(0); // Esc - выход
            Sleep(1);
        }
    }
}
func.h

C++
// func.h
#ifndef FUNC_H
#define FUNC_H
 
#include <windows.h>
 
class PROGRAM
{
public:
    HINSTANCE    hInst;
    HWND         hWnd;
    HDC          hDC;
 
    LRESULT CALLBACK WinProc(HWND, UINT, WPARAM, LPARAM);
    void CREATEWIN();
};
 
#endif // FUNC_H


C++
#include "func.h"
 
LRESULT CALLBACK PROGRAM::WinProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
    if(msg == WM_CLOSE)
    {
        PostQuitMessage(0);
        return false;
    }
    return DefWindowProc(hWnd, msg, wParam, lParam);
}
 
void PROGRAM::CREATEWIN()
{
    WNDCLASSEX wcx;
    hInst = (HINSTANCE)GetModuleHandle(0);
    memset(&wcx, 0, sizeof(wcx));
    wcx.cbSize        = sizeof(wcx);
    wcx.style         = CS_HREDRAW | CS_VREDRAW | CS_OWNDC;
    wcx.lpfnWndProc   = (WNDPROC)WinProc; /* ЗДЕСЬ ПИШЕТ ОШИБКУ О НЕПРАВИЛЬНОМ ИСПОЛЬЗОВАНИИ ФУНКЦИИ */
    wcx.hInstance     = hInst;
    wcx.lpszClassName = "app";
    wcx.hIcon         = LoadIcon(0, IDI_APPLICATION);
    wcx.hCursor       = LoadCursor(0, IDC_ARROW);
    RegisterClassEx(&wcx);
    hWnd = CreateWindowEx(WS_EX_APPWINDOW, "app", " ", WS_OVERLAPPEDWINDOW, 100, 100, 400, 300, 0, 0, hInst, 0);
    ShowWindow(hWnd, SW_SHOW);
    SetForegroundWindow(hWnd);
    SetFocus(hWnd);
    UpdateWindow(hWnd);
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
23.11.2013, 22:33
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Вызов обратной функции в классе (C++):

Вызов функции в классе - C++
Ребята помогите пожалуйста. Пишу консольную игрушку типо гоночек. При нажатии на кнопку &quot;W&quot; вызывается фукнция повышения скорости, но по...

Вызов оператора= в производном классе - C++
#include &lt;iostream&gt; #include &lt;vector&gt; #include &lt;numeric&gt; using namespace std; template &lt;class T&gt; class Vector: public...

Вызов метода в классе из другого - C++
Не получается выполнить следующую цепочку действий. Запускаю метод в классе B через main, он запускает метод в классе A который должен...

В производном классе вызов приватного метода базового класса - C++
Добрый вечер. Помогите понять одну вещь. Имеется такое наследование: class test1 { public: void pubF() { ...

С++ - map с указателями на функции и функции в классе - C++
Сразу скажу, не уверен, что это возможно осуществить моим способом и прошу указать мою ошибку или показать другое решение близкое к моему.....

Вызов функции внутри другой функции с передачей локальной переменной по ссылке - C++
Столкнулся с очень с интересной проблемой. Можно ли так делать? #include &lt;iostream&gt; using std::cout; void f(const int &amp;ref){...

15
fridi
-8 / 40 / 1
Регистрация: 21.09.2009
Сообщений: 145
23.11.2013, 22:46 #2
C++ (Qt)
1
static LRESULT CALLBACK WinProc(HWND, UINT, WPARAM, LPARAM);
1
programina
1914 / 599 / 37
Регистрация: 23.10.2011
Сообщений: 4,468
Записей в блоге: 2
23.11.2013, 23:26  [ТС] #3
Здесь пишут о том, что нужно создавать второй метод: http://cboard.cprogramming.com/windo...tml#post297131
0
Jupiter
Каратель
Эксперт С++
6559 / 3980 / 227
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
24.11.2013, 00:34 #4
1. не надо делать WinMain членом класса, даже статическим, потому что это костыльно
2. не надо делать WinMain точкой входа, потому что это не переносимо. точку входа как main можно задать линковщику при сборке.
3. не надо юзать UPPER_CASE для названий классов и методов, потому что это не отличимо от WinAPI-шниых названий.
1
programina
1914 / 599 / 37
Регистрация: 23.10.2011
Сообщений: 4,468
Записей в блоге: 2
24.11.2013, 01:13  [ТС] #5
Цитата Сообщение от Jupiter Посмотреть сообщение
не надо делать WinMain точкой входа, потому что это не переносимо
делать main() ?
0
Jupiter
Каратель
Эксперт С++
6559 / 3980 / 227
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
24.11.2013, 02:36 #6
Цитата Сообщение от programina Посмотреть сообщение
делать main() ?
да.
0
stima
490 / 342 / 40
Регистрация: 22.03.2011
Сообщений: 1,095
Завершенные тесты: 2
24.11.2013, 04:00 #7
нужно полностью определить метод
C++
1
wcx.lpfnWndProc   = (WNDPROC)PROGRAM::WinProc;
п.с О какой переносимости winapi идет речь?)
1
Max Dark
шКодер самоучка
1849 / 1649 / 603
Регистрация: 09.10.2013
Сообщений: 3,678
Записей в блоге: 6
Завершенные тесты: 2
24.11.2013, 05:20 #8
Вот нарыл у себя, может пригодится...
2
Вложения
Тип файла: 7z links.7z (4.3 Кб, 4 просмотров)
programina
1914 / 599 / 37
Регистрация: 23.10.2011
Сообщений: 4,468
Записей в блоге: 2
24.11.2013, 10:04  [ТС] #9
Цитата Сообщение от Jupiter Посмотреть сообщение
да.
Не понимаю. Точка входа вин32-приложений должна быть винмайн. Ну ладно. Под виндой еще посмотрю откуда у винмайна ноги растут.
0
Nick Alte
Эксперт С++
1640 / 1012 / 119
Регистрация: 27.09.2009
Сообщений: 1,945
Завершенные тесты: 1
24.11.2013, 10:25 #10
Цитата Сообщение от Jupiter Посмотреть сообщение
не надо делать WinMain точкой входа, потому что это не переносимо. точку входа как main можно задать линковщику при сборке.
Учитывая, что вся программа состоит в основном из использования WinAPI, я бы не беспокоился о переносимости.
0
Jupiter
Каратель
Эксперт С++
6559 / 3980 / 227
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
24.11.2013, 15:03 #11
Цитата Сообщение от programina Посмотреть сообщение
Точка входа вин32-приложений должна быть винмайн.
точкой входа можно сделать любую функцию

Цитата Сообщение от Nick Alte Посмотреть сообщение
Учитывая, что вся программа состоит в основном из использования WinAPI, я бы не беспокоился о переносимости.
Цитата Сообщение от stima Посмотреть сообщение
п.с О какой переносимости winapi идет речь?)
сразу пишем PIMPL
1
stima
490 / 342 / 40
Регистрация: 22.03.2011
Сообщений: 1,095
Завершенные тесты: 2
24.11.2013, 15:55 #12
piml это хорошо, но возможно kiss?
1
programina
1914 / 599 / 37
Регистрация: 23.10.2011
Сообщений: 4,468
Записей в блоге: 2
25.11.2013, 00:14  [ТС] #13
Пимплы, киссы У меня другая проблема, убрала весь ООП с классами, а все функции разместила в 7 cpp файлах, обьявления всех функций, переменных, констант, а также инклуды хедеров лежат в одном h файле. Теперь очень долго компилируется, около 10 сек.
Под компилированием я имею ввиду полную сборку проекта.
0
fridi
-8 / 40 / 1
Регистрация: 21.09.2009
Сообщений: 145
25.11.2013, 00:19 #14
Может быть несколько причин:
1)Слабое железо
2)Добавляли ли #define HEADER_H__? в заголовочных файлах?..
3)Различные ошибки с ос..
а вообще да, есть такое чем больше файлов тем больше время тратит сборщик на анализ и т.д так что привыкайте..
1
ct0r
Игогошка!
1776 / 678 / 42
Регистрация: 19.08.2012
Сообщений: 1,294
Завершенные тесты: 1
25.11.2013, 00:43 #15
Цитата Сообщение от programina Посмотреть сообщение
убрала весь ООП с классами, а все функции разместила в 7 cpp файлах, обьявления всех функций, переменных, констант, а также инклуды хедеров лежат в одном h файле.
Зачем? Это вообще не круто. pimpl, forward declarations, decoupling - вот это круто.

Цитата Сообщение от programina Посмотреть сообщение
Под компилированием я имею ввиду полную сборку проекта.
А смысл мерять полную сборку? Это разовое действие.

Цитата Сообщение от programina Посмотреть сообщение
Теперь очень долго компилируется, около 10 сек.
Тоже мне горе Если у меня компилируется 5 минут, я счастлив. Потому что потенциально может 1.5-2 часа.
1
25.11.2013, 00:43
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
25.11.2013, 00:43
Привет! Вот еще темы с ответами:

Вызов родовой функции (нужно передать массив в качестве аргумента функции через указатель) - C++
#include &lt;iostream&gt; using namespace std; template &lt;class T1&gt; class mas { public: T1 n; T1 a; void input() ...

Вызов функции в параметре другой функции - C++
программа: #include &lt;iostream&gt; using namespace std; struct E { E() {} }; void f(const E&amp; e)

Вызов функции в возврате значения функции - C++
Есть функция: int function1(a) { ...... return function2(function1(b),function1(c)); } Как работает такая хитрая система?

Рекурсивные функции в классе - C++
Я написал рабочий класс для работы с бинарным деревом поиска и в нём имеется много рекурсивных методов (по заданию). Из-за этого эти...


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru