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

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

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

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

23.11.2013, 22:33. Просмотров 446. Ответов 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);
}
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
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);
programina
1913 / 598 / 37
Регистрация: 23.10.2011
Сообщений: 4,468
Записей в блоге: 2
23.11.2013, 23:26  [ТС]     Вызов обратной функции в классе #3
Здесь пишут о том, что нужно создавать второй метод: http://cboard.cprogramming.com/windo...tml#post297131
Jupiter
Каратель
Эксперт С++
6549 / 3969 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
24.11.2013, 00:34     Вызов обратной функции в классе #4
1. не надо делать WinMain членом класса, даже статическим, потому что это костыльно
2. не надо делать WinMain точкой входа, потому что это не переносимо. точку входа как main можно задать линковщику при сборке.
3. не надо юзать UPPER_CASE для названий классов и методов, потому что это не отличимо от WinAPI-шниых названий.
programina
1913 / 598 / 37
Регистрация: 23.10.2011
Сообщений: 4,468
Записей в блоге: 2
24.11.2013, 01:13  [ТС]     Вызов обратной функции в классе #5
Цитата Сообщение от Jupiter Посмотреть сообщение
не надо делать WinMain точкой входа, потому что это не переносимо
делать main() ?
Jupiter
Каратель
Эксперт С++
6549 / 3969 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
24.11.2013, 02:36     Вызов обратной функции в классе #6
Цитата Сообщение от programina Посмотреть сообщение
делать main() ?
да.
stima
447 / 296 / 20
Регистрация: 22.03.2011
Сообщений: 961
Завершенные тесты: 2
24.11.2013, 04:00     Вызов обратной функции в классе #7
нужно полностью определить метод
C++
1
wcx.lpfnWndProc   = (WNDPROC)PROGRAM::WinProc;
п.с О какой переносимости winapi идет речь?)
Max Dark
шКодер самоучка
1655 / 1456 / 526
Регистрация: 09.10.2013
Сообщений: 3,310
Записей в блоге: 8
Завершенные тесты: 2
24.11.2013, 05:20     Вызов обратной функции в классе #8
Вот нарыл у себя, может пригодится...
Вложения
Тип файла: 7z links.7z (4.3 Кб, 4 просмотров)
programina
1913 / 598 / 37
Регистрация: 23.10.2011
Сообщений: 4,468
Записей в блоге: 2
24.11.2013, 10:04  [ТС]     Вызов обратной функции в классе #9
Цитата Сообщение от Jupiter Посмотреть сообщение
да.
Не понимаю. Точка входа вин32-приложений должна быть винмайн. Ну ладно. Под виндой еще посмотрю откуда у винмайна ноги растут.
Nick Alte
Эксперт С++
1605 / 997 / 118
Регистрация: 27.09.2009
Сообщений: 1,923
Завершенные тесты: 1
24.11.2013, 10:25     Вызов обратной функции в классе #10
Цитата Сообщение от Jupiter Посмотреть сообщение
не надо делать WinMain точкой входа, потому что это не переносимо. точку входа как main можно задать линковщику при сборке.
Учитывая, что вся программа состоит в основном из использования WinAPI, я бы не беспокоился о переносимости.
Jupiter
Каратель
Эксперт С++
6549 / 3969 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
24.11.2013, 15:03     Вызов обратной функции в классе #11
Цитата Сообщение от programina Посмотреть сообщение
Точка входа вин32-приложений должна быть винмайн.
точкой входа можно сделать любую функцию

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

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

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

C++ Рекурсивные функции в классе
Вызов оператора= в производном классе C++
Не работают функции в классе C++
C++ В производном классе вызов приватного метода базового класса
Ошибка в классе: функции не декларированы C++

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

Или воспользуйтесь поиском по форуму:
programina
25.11.2013, 07:48  [ТС]     Вызов обратной функции в классе
  #16

Не по теме:

Создам новую тему про extern.

Yandex
Объявления
25.11.2013, 07:48     Вызов обратной функции в классе
Ответ Создать тему
Опции темы

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