Форум программистов, компьютерный форум, киберфорум
C/C++: WinAPI
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.91/23: Рейтинг темы: голосов - 23, средняя оценка - 4.91
 Аватар для bretba
63 / 58 / 13
Регистрация: 24.07.2011
Сообщений: 343

Помогите создать окно на WinAPI c помощью классов

24.07.2011, 01:00. Показов 4850. Ответов 10
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день всем.Хочу создать окно на основе классов,то есть регистрацию окна,создание,показ на экран и тд заключить в классы

Решил создать с помощью двух классов:
1.регистрация окна,создание,показ на экран -class WINDOWMAIN
2.главная функция,оконная функция -class WIN


сначала решил написать первый класс(WINDOWMAIN) и проверить.Все работает отлично.Но вот когда создал второй класс(WIN) и заключил туда две функции-WinMain и WndProc ,то сразу пошли ошибки

Ладно не буду тянуть,вот мой код собственно:



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
#include <windows.h> 
#include <windowsx.h> 
#include<stdlib.h> 
#include <wchar.h> 
 
class WIN 
{ 
public: 
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE, LPSTR, int ); 
LRESULT CALLBACK WndProc(HWND hWnd,UINT uMsg, WPARAM wParam, LPARAM lParam); 
}; 
 
class WINDOWMAIN 
{ 
public: 
 
HWND hwnd; 
 void Create_Window(LPCWSTR Name_Prog); 
 void Show_Window(); 
 WNDCLASS we; 
 bool Reg_Window(HINSTANCE hInstance,LPCWSTR lpzClassName,WNDPROC lpfnWndProc); 
 
}; 
 
bool WINDOWMAIN::Reg_Window(HINSTANCE hInstance, LPCWSTR lpzClassName,WNDPROC lpfnWndProc) 
 { 
 ZeroMemory(&we,sizeof(we)); 
 we.lpfnWndProc=lpfnWndProc; 
 we.hInstance=hInstance; 
 we.hIcon=LoadIcon(NULL,IDI_APPLICATION); 
 we.hCursor=LoadCursor(NULL,IDC_ARROW); 
 we.hbrBackground=GetStockBrush(GRAY_BRUSH); 
 we.lpszClassName= lpzClassName; 
 if (RegisterClass(&we)!=0) 
 return true; 
 else 
 return false; 
 } 
 
 void WINDOWMAIN::Create_Window(LPCWSTR Name_Prog) 
 { 
 hwnd=CreateWindow(L"MyWindowClass",Name_Prog, 
WS_OVERLAPPEDWINDOW,445,200,525,250, 
HWND_DESKTOP,NULL,NULL,NULL); 
 } 
 
 void WINDOWMAIN::Show_Window() 
 { 
 ShowWindow(hwnd,SW_SHOWNORMAL); 
 
 } 
 
int WINAPI WIN:: WinMain(HINSTANCE hInstance, HINSTANCE, LPSTR, int ) 
 
 { 
 
 MSG Msg; //структура всех сообщений 
 WINDOWMAIN MyObject; //объект класса создание окна 
 
if (MyObject.Reg_Window(hInstance,L"MyWindowClass",WndProc)) 
 { 
 MyObject.Create_Window(L"Project"); 
 MyObject.Show_Window(); 
 
while(GetMessage(&Msg,NULL,0,0)) 
 { 
 DispatchMessage(&Msg); 
 TranslateMessage(&Msg); 
 } 
 } 
return 0; 
} 
 
LRESULT CALLBACK WIN:: WndProc(HWND hWnd,UINT uMsg, WPARAM wParam, LPARAM lParam) 
{ 
 switch(uMsg) 
{ 
 
case WM_DESTROY: 
PostQuitMessage(0); 
break; 
 
default: 
return(DefWindowProc(hWnd,uMsg,wParam,lParam)) ; 
} 
}

Итак,возникает ошибка в функции WinMain на строчке:
C++
1
if (MyObject.Reg_Window(hInstance,L"MyWindowClass",WndProc))
А именно на аргументе WndProc:
C++
1
1>c:\c++\calculate_class\calculate\main.cpp(74): error C3867: 'WIN::WndProc': function call missing argument list; use '&WIN::WndProc' to create a pointer to member
Я помню,что когда без классов пишешь окно,то нужно оконную функцию переопределять вначале.Но как организовать такое на классах?Или не в этом проблема ошибки?В общем помогите пожалуйста,все таки второй день мучаюсь
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
24.07.2011, 01:00
Ответы с готовыми решениями:

Создать иерархию классов окно и окно с заголовком
class window { public int up, left, low, right; public window()//конструктор по умолчанию { ...

Создать окно WinAPI
выдает ошибку с2059: синтаксическая ошибка:, ругается на эту строчку hwnd = CreateWindow(szAppName, ... про данную ошибку читал но...

Как создать окно на WinAPI
Здравствуйте ,я хочу создать окно на WinAPI ,как я выяснил есть такая функция как CreateWindow(); ,и еще есть такая структура как ...

10
Каратель
Эксперт С++
6610 / 4029 / 401
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
24.07.2011, 07:39
функцию WinMain невозможно инкапсулировать в класс так как она является точкой входа
0
 Аватар для VadimTagil
54 / 44 / 11
Регистрация: 15.07.2011
Сообщений: 160
24.07.2011, 15:38
неля инкапсулировать но можно сделать обертку:

C++
1
2
3
4
5
6
7
8
WIN::MyWinMain(HINSTANCE,...){ //своя функция
//здесь все действия...
}
 
DWORD WINAPI WinMain(HINSTANCE,...){//систечная функцмя
MyClassObject.MyWinMain(...);//вызов своей функции
...
}
та же канитель с WndProc. Проблема в том что при регистрации класса нужен тип WNDPROC (сишный указатель на функцию) , а указатель на функцию WndProc, запиханнаю в класс имеет тип WIN::WndProc, который несовместим с типом WNDPROC. В итоге компилятор с++ просто не понимает что мы передаем указатель на функцию, и отказывается компилировать!
Если хотите по-нормальному, используйте MFC, это тот же WINAPI, толькло обьекто-ориентированный
0
 Аватар для bretba
63 / 58 / 13
Регистрация: 24.07.2011
Сообщений: 343
24.07.2011, 17:01  [ТС]
Значит все таки нельзя запихнуть главную функцию в класс?

А как же тогда работает системный класс CWinApp?

Я читал о нем,и написано что в нем содержится и главная функция,и оконная функция,и цикл сообщений-в общем все все,что нужно для создания окна.Как же этот класс работает?
0
 Аватар для VadimTagil
54 / 44 / 11
Регистрация: 15.07.2011
Сообщений: 160
25.07.2011, 00:03
возможно он работает по тому же методу, который я описал, просто WinMain скрыта. В различных технологиях программирования бывают такие классы, но нигде напрямую точеа входа не инкапсулируется, максимум делается статичесским методом, как в WinForms например
0
 Аватар для soft.creator
106 / 106 / 11
Регистрация: 17.10.2010
Сообщений: 283
25.07.2011, 01:25
Цитата Сообщение от bretba Посмотреть сообщение
Значит все таки нельзя запихнуть главную функцию в класс?

А как же тогда работает системный класс CWinApp?

Я читал о нем,и написано что в нем содержится и главная функция,и оконная функция,и цикл сообщений-в общем все все,что нужно для создания окна.Как же этот класс работает?
Врут. Функция определена внутри MFC именно как глобальный WinMain.

По теме - не советовал бы включать код WinMain внутрь класса - это неправильный подход.
Что касается функции WndProc, ее надо сделать статической. А при вызове CreateWindow передать в последнем параметре указатель this.
Вот здесь гляньте - я сам так же делаю обычно: http://forum.codenet.ru/archiv... 10160.html, последний пост
0
 Аватар для bretba
63 / 58 / 13
Регистрация: 24.07.2011
Сообщений: 343
27.07.2011, 14:29  [ТС]
все ясно)значит буду делать главную и оконную функцию отдельно от моего ООП
0
 Аватар для soft.creator
106 / 106 / 11
Регистрация: 17.10.2010
Сообщений: 283
27.07.2011, 14:59
Оконная функция будет статической для класса.
А уже внутри нее указатель на конкретный экземпляр получается вызовом GetProp.
Дальше для экземпляра уже вызывается его виртуальная функция onWndMessage или что-то в этом роде.
Записывать туда это значение нужно через SetProp внутри обработчика WM_CREATE.
Сам указатель this надо передавать при вызове CreateWindow.
Только сразу от одной ошибки хочу Вас предостеречь, на отладке которой пришлось помучиться.
Нельзя вызывать CreateWindow в конструкторе, поскольку onWndMessage будет невиртуальной в этот момент.
0
 Аватар для bretba
63 / 58 / 13
Регистрация: 24.07.2011
Сообщений: 343
27.07.2011, 15:10  [ТС]
А можете по подробнее пожалуйста...я просто с WinApi только недавно начал знакомится и не очень так все понимаю

что значит статической для класса?И что за указатель внутри?и вообще че то не очень все понял)
0
 Аватар для soft.creator
106 / 106 / 11
Регистрация: 17.10.2010
Сообщений: 283
27.07.2011, 17:36
Посмотрите мою ссылку с примером
0
 Аватар для bretba
63 / 58 / 13
Регистрация: 24.07.2011
Сообщений: 343
28.07.2011, 01:06  [ТС]
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
class SC {
 public :
 SC();
 ~SC();
 virtual bool Create(HWND parent, int x, int y, int w, int h, char *name);
 static LRESULT CALLBACK SXStaticProc(HWND, UINT, WPARAM, LPARAM);
 virtual LRESULT SXProc(HWND, UINT, WPARAM, LPARAM);
 
 char *name;
 HWND handle;
 };
 
 //имя свойства
 #define THIS_PROP _T("this")
 
 //Статический обработчик для системы
 LRESULT CALLBACK SC::SXStaticProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam){
 LRESULT lResult;
 SC *me = (SC *)GetProp(hWnd, THIS_PROP);
 if(!me) {
 return DefWindowProc(hWnd, uMsg, wParam, lParam);
 }
 
 lResult = me->SXProc(hWnd, uMsg, wParam, lParam); //Свой обработчик класса
 
 if(uMsg == WM_DESTROY) {
 RemoveProp(hWnd, THIS_PROP);
 }
 
 return lResult;
 }
 
 bool SXBase::Create(HWND parent, int x, int y, int w, int h, char *name) {
 
 //Создаём окно, хвнд сохраняем в SС::handle
 SetProp(::handle, THIS_PROP, this);
 
 return true;
 }
это да?что-то тут много непонятного для меня

вот к примеру что это и для чего нужно:
C++
1
#define THIS_PROP _T("this")
или это:
C++
1
LRESULT lResult;
вот это вообще не понял,что такое me и тд:
C++
1
2
3
4
SC *me = (SC *)GetProp(hWnd, THIS_PROP);
 if(!me) {
 return DefWindowProc(hWnd, uMsg, wParam, lParam);
 }
по идее в оконной функции просто ловим сообщения windows...а там написано много чего не понятного...и только после встретил что то знакомое:
C++
1
2
if(uMsg == WM_DESTROY) {
 RemoveProp(hWnd, THIS_PROP);
как я понял это-если послано сообщение WM_DESTROY то закрываем приложение

В общем если не сложно,то расскажите мне по подробнее об этом всем...параллельно почитаю в google
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
28.07.2011, 01:06
Помогаю со студенческими работами здесь

Создать окно аналог WinApi
Вопрос наверное глупый,но пока нет понимания. С недавних пор стал счастливым обладателем Ubuntu ) и не знаю как создать окно не...

Не могу создать окно WINAPI
#define WIN32_LEAN_AND_MEAN #include&lt;cstdlib&gt; #include&lt;math.h&gt; #include&lt;windows.h&gt; #include&lt;windowsx.h&gt; LRESULT CALLBACK...

Как создать окно в WinAPI
У кого среда Rad Studio помогите!!! почему не создаётся окно через WinAPI, компиль ругается на 2 файла OBJ, кому не трудно напишите код...

Как создать блокирующее окно используя WinAPI?
Необходимо создать окно, которое будет полностью блокировать работу пользователя, пока он его не закроет. Возможно ли такое средствами...

Создать меню с 6-ю элементами с помощью классов и списков
Нужно создать меню с 6-ю элементами с помощью классов и списков. 1.&lt;что-то&gt; 2.&lt;что-то&gt; 3.&lt;что-то&gt; 4.&lt;что-то&gt; ...


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

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Новые блоги и статьи
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь постоянного тока с R, L, C, k(ключ), U, E, J. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа, решает её и находит переходные токи и напряжения на элементах схемы. . . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru