С Новым годом! Форум программистов, компьютерный форум, киберфорум
C/C++: WinAPI
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.50/26: Рейтинг темы: голосов - 26, средняя оценка - 4.50
 Аватар для mcgee
1 / 1 / 1
Регистрация: 27.04.2010
Сообщений: 10

Создание простейшего окна средствами WinApi

27.04.2010, 23:55. Показов 4951. Ответов 7
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте.

Читаю книгу "Проектирование интерфейса пользователя средствами Win32 API" Ганеева, в которой рассматривается следующий пример:
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
#include <windows.h>
 
//объявление функций
BOOL RegClass(WNDPROC,LPCSTR,UINT);
LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);
 
//описание глобальных переменных
HINSTANCE hInst;
char szClassName[]="WindowAppClass";
 
//описание главной функции
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpszCmdLine, int nCmdShow)
{
    MSG msg;
    HWND hwnd;
    hInst=hInstance;
    if(!RegClass(WndProc,szClassName,COLOR_WINDOW))
        return FALSE;
    hwnd = CreateWindow(szClassName, "Elemental application", WS_OVERLAPPEDWINDOW|WS_VISIBLE,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,0,0,hInstance,NULL);
    if(!hwnd) return FALSE;
    while(GetMessage(&msg,0,0,0)) DispatchMessage(&msg);
    return msg.wParam;
}
 
//описание функции регистрации классов
BOOL RegClass(WNDPROC Proc, LPCTSTR szName, UINT brBackground)
{
    WNDCLASS wc;
    wc.style=wc.cbClsExtra=wc.cbClsExtra=0;
    wc.lpfnWndProc = Proc;
    wc.hInstance = hInst;
    wc.hIcon = LoadIcon(NULL,IDI_APPLICATION);
    wc.hCursor = LoadCursor(NULL, IDC_ARROW);
    wc.hbrBackground = (HBRUSH)(brBackground + 1);
    wc.lpszMenuName = NULL;
    wc.lpszClassName = szName;
    return(RegisterClass(&wc) != 0);
}
 
//описание функции окон
LRESULT CALLBACK WndProc(HWND hwnd,UINT msg,WPARAM wParam,LPARAM lParam)
{
    switch(msg)
    { case WM_DESTROY:{PostQuitMessage(0); return 0;} }
    return DefWindowProc(hwnd, msg, wParam, lParam);
}
Но функция RegisterClass почему-то возвращает 0, т.е., как я понимаю, класс wc создать она не может. Почему, не ясно.

Я использую Visual Studio 2010.

Помогите разобраться с этой проблемой, пожалуйста.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
27.04.2010, 23:55
Ответы с готовыми решениями:

Создание тулбара средствами WinAPI
Привет Я осваиваю WinApi, а точнее создание mdi его средствами, вот дошел создания туллбара и... короче, я в шоке :) Пишу я в VC++...

Создание Panel средствами WinApi
Здравствуйте! Подскажите каким образом можно создать Panel средствами Win Api. (см. вложение) Желательно второй вариант панели!...

Создание таблицы средствами WinAPI VS 2010
InitCommonControls(); /*Растяним таблицу по ширине окна*/ RECT rc; GetClientRect(hWnd, &amp;rc); /*Создаем...

7
 Аватар для Hell Knight
230 / 60 / 17
Регистрация: 11.03.2010
Сообщений: 294
28.04.2010, 00:14
а что если попробовать другой функцией регистрировать класс ?
попробуй в 38 строке заменить:
C++
1
return(RegisterClass(&wc) != 0);
на:
C++
1
return(RegisterClassEx(&wc) != 0);
и еще...
незнаю влияет или нет... но попробуй полностью заполнить этот класс...
все значения проинициализируй...
вот пример:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
WNDCLASSEX windowsclass;
windowsclass.cbSize = sizeof(WNDCLASSEX);
windowsclass.style = CS_VREDRAW|CS_HREDRAW|CS_OWNDC|CS_DBLCLKS;
windowsclass.lpfnWndProc = MainWinProc;
windowsclass.cbClsExtra = 0;
windowsclass.cbWndExtra = 0;
windowsclass.hInstance = hinstance;
windowsclass.hIcon = LoadIcon(NULL, IDI_APPLICATION);
windowsclass.hCursor = LoadCursor(NULL, IDC_ARROW);
windowsclass.hbrBackground = (HBRUSH)GetStockObject(GRAY_BRUSH);
windowsclass.lpszMenuName = NULL;
windowsclass.lpszClassName = "WINDOWSCLASS";
windowsclass.hIconSm = LoadIcon(NULL, IDI_APPLICATION);
0
 Аватар для mcgee
1 / 1 / 1
Регистрация: 27.04.2010
Сообщений: 10
28.04.2010, 00:40  [ТС]
Спасибо, но не помогло.
RegisterClassEx тоже почему-то возвращает 0.
Даже при полном описании класса.
0
2343 / 499 / 22
Регистрация: 01.04.2009
Сообщений: 2,200
28.04.2010, 10:55
Цитата Сообщение от mcgee Посмотреть сообщение
Спасибо, но не помогло.
RegisterClassEx тоже почему-то возвращает 0.
Даже при полном описании класса.
либо класс с таким именем уже существует, либо что-то заполнено неправильно.
для начала - смените имя классу
0
 Аватар для Hell Knight
230 / 60 / 17
Регистрация: 11.03.2010
Сообщений: 294
28.04.2010, 11:03
для RegisterClassEx
класс должен быть такого типа: WNDCLASSEX
у вас так было ?
0
 Аватар для mcgee
1 / 1 / 1
Регистрация: 27.04.2010
Сообщений: 10
28.04.2010, 11:16  [ТС]
Цитата Сообщение от Hell Knight Посмотреть сообщение
для RegisterClassEx
класс должен быть такого типа: WNDCLASSEX
у вас так было ?
Конечно, иначе он вообще отказывался компилироваться.

Добавлено через 10 минут
Цитата Сообщение от Patch Посмотреть сообщение
для начала - смените имя классу
Имя класса я менял, согласно примеру выше, на windowsclass. Называл и fuckthat, всё равно ничего не поменялось

Цитата Сообщение от Patch Посмотреть сообщение
либо что-то заполнено неправильно.
Вот это мне как раз интересно узнать, что именно там неправильно.
0
2343 / 499 / 22
Регистрация: 01.04.2009
Сообщений: 2,200
28.04.2010, 13:11
Цитата Сообщение от mcgee Посмотреть сообщение
Вот это мне как раз интересно узнать, что именно там неправильно.
да легко.

смотрим поля структуры WNDCLASS:
UINT style - зполнено 0
WNDPROC lpfnWndProc; - заполнено LRESULT CALLBACK WndProc
int cbClsExtra; - заполнео 0
int cbWndExtra; - упс! не заполнено!!! случайное значение с непредсказуемым результатом.

дальше смотреть не буду.

будьте внимательнее, а то такого можно нагородить... программирование не терпит небрежности.
2
 Аватар для mcgee
1 / 1 / 1
Регистрация: 27.04.2010
Сообщений: 10
29.04.2010, 20:37  [ТС]
Да, действительно, исправил косяки и всё получилось. Спасибо всем огромное.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
29.04.2010, 20:37
Помогаю со студенческими работами здесь

Примитив. Создание окна на WinApi
Доброго вечера, форумчане! Специализируюсь на PHP, решил научиться делать программы в окнах :) Поюзал гугл, много информации, но беда в...

Создание окна на C++ WinAPI с нуля. Подробное разъяснение
Я устал создавать оконные программы на .NET технологии, и хочется попробовать C++ и WinAPI . Читал документацию на MSDN , и нифига не...

Создание окна без WinAPI
Хотелось узнать, как создавать окна без использования WinAPI.

Код для простейшего окна
Я ещё далёк от WinAPI, но окна свои создавать хочется). Может кто нибудь даст код для простейшего окна?:tomatos:

Многопоточность средствами WinAPI
#include &lt;iostream&gt; #include &lt;cstdlib&gt; #include &lt;Windows.h&gt; using namespace std; HANDLE threads; DWORD _stdcall proc1(CONST...


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

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Новые блоги и статьи
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru