Форум программистов, компьютерный форум, киберфорум
C/C++: WinAPI
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/8: Рейтинг темы: голосов - 8, средняя оценка - 5.00
0 / 0 / 1
Регистрация: 08.07.2013
Сообщений: 47

Частые ошибки winapi

01.02.2015, 15:30. Показов 1698. Ответов 9
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Подскажите, что я делаю не так. Программа запускается без ошибок, но кнопку, которую я создаю, не видно, не видно иконку и изображение, загруженное как фон.
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
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
#include <windows.h>
 
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
ATOM RegMyWindowClass(HINSTANCE, LPCTSTR);
 
 
//а вот собственно и сама BackgroundDraw
void BackgroundDraw(HWND hwnd)
{
    RECT R;
    
    HBITMAP img = (HBITMAP)LoadImage (GetModuleHandle(NULL), (LPCWSTR)("pr.jpg"), IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE);
    HBRUSH mBrush = CreatePatternBrush(img);
    GetClientRect (hwnd, &R); 
    FillRect (GetDC(hwnd), &R, mBrush); 
    DeleteObject (mBrush);
    DeleteObject (img);
}
 
// функция вхождений программы WinMain
int APIENTRY WinMain(HINSTANCE hInstance,
             HINSTANCE         hPrevInstance,
             LPSTR             lpCmdLine,
             int               nCmdShow)
{
       // имя будущего класса
  LPCTSTR lpzClass = TEXT("My Window Class!"); 
    WNDCLASS wndclass; 
 
    wndclass.style = CS_HREDRAW | CS_VREDRAW;
    wndclass.lpfnWndProc = WndProc;
    wndclass.cbClsExtra = 0;
    wndclass.cbWndExtra = 0;
    wndclass.hInstance = hInstance;
    wndclass.hIcon =(HICON) LoadImage (NULL, (LPCWSTR)("nure.ico"), IMAGE_ICON, 10, 10, LR_LOADFROMFILE);
    wndclass.hCursor = LoadCursor(NULL, IDC_ARROW);
    wndclass.lpszClassName =  lpzClass; 
    wndclass.hbrBackground =(HBRUSH) GetStockObject(WHITE_BRUSH);
    wndclass.lpszMenuName = NULL;
 
    RegisterClass(&wndclass); 
 
    HWND hwnd = CreateWindow(
                lpzClass,
                TEXT("Регистрация абитуриентов"), // window caption
                WS_OVERLAPPEDWINDOW | WS_VISIBLE, // window style
                CW_USEDEFAULT, // initial x position
                CW_USEDEFAULT, // initial y position
                CW_USEDEFAULT, // initial x size
                CW_USEDEFAULT, // initial y size
                NULL, // parent window handle
                NULL, // window menu handle
                hInstance, // program instance handle
                NULL
                ); // creation parameters 
 
    // если окно не создано, описатель будет равен 0
     if(!hwnd) return 2;
 
    HMENU hmenu1 = CreateMenu();
 
    AppendMenu(hmenu1, MF_STRING, 0, L"&File"); 
    AppendMenu(hmenu1, MF_STRING, 0, L"&Edit"); 
    AppendMenu(hmenu1, MF_STRING, 0, L"&Help"); 
 
    SetMenu(hwnd, hmenu1);
 
    HWND button = CreateWindow((LPCWSTR)("button"), TEXT("Начать"), WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON,10, 10, 80, 30, hwnd, (HMENU)10000, hInstance, NULL);
 
    
    ShowWindow(hwnd, nCmdShow);
    UpdateWindow(hwnd);
 
    MSG msg; 
 
    while(GetMessage(&msg, NULL, 0, 0))
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
    return msg.wParam;
} 
 
 
LRESULT CALLBACK WndProc(
  HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
  // выборка и обработка сообщений
  switch (message)
  { 
  case WM_DESTROY:
    PostQuitMessage(0);  // реакция на сообщение
    break;
 
    case WM_PAINT:
   BackgroundDraw (hWnd);
 
  default:  
    // все сообщения не обработанные Вами обработает сама Windows
    return DefWindowProc(hWnd, message, wParam, lParam);
  }
  return 0;
}
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
01.02.2015, 15:30
Ответы с готовыми решениями:

WinAPI+HID: WriteFile генерирует код ошибки 1 ("Неверная функция")
Пишу обертку над собственным классом HID. Устройство нахожу, хендл к нему открывается, но при попытке записи в него получаю ошибку...

Стал изучать WinAPI по Петцольду и сразу "неразрешенный внешний символ ." подскажите где ошибки пж
Стал я изучать DirectX по Луне и там были ошибки типа неразрешенный внешний символ и бла бла иероглифы но теперь решил сначала WINAPI ...

Частые ошибки
Есть проблема и уверен что системная, а не программная. Проблема в том что во время установки программ, они устанавливаются не правильно,...

9
3 / 3 / 0
Регистрация: 02.01.2015
Сообщений: 39
01.02.2015, 16:57
Вот починенный код (починить показ иконки я не могу, т.к. у меня нет её в файле проекта):

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
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
#include <windows.h>
 
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
ATOM RegMyWindowClass(HINSTANCE, LPCTSTR);
 
 
//а вот собственно и сама BackgroundDraw
void BackgroundDraw(HWND hwnd)
{
    RECT R;
 
    HBITMAP img = (HBITMAP)LoadImage(GetModuleHandle(NULL), (LPCWSTR)("pr.jpg"), IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE);
    HBRUSH mBrush = CreatePatternBrush(img);
    GetClientRect(hwnd, &R);
    FillRect(GetDC(hwnd), &R, mBrush);
    DeleteObject(mBrush);
    DeleteObject(img);
}
 
// функция вхождений программы WinMain
int APIENTRY WinMain(HINSTANCE hInstance,
    HINSTANCE         hPrevInstance,
    LPSTR             lpCmdLine,
    int               nCmdShow)
{
    // имя будущего класса
    LPCTSTR lpzClass = TEXT("My Window Class!");
    WNDCLASS wndclass;
 
    wndclass.style = CS_HREDRAW | CS_VREDRAW;
    wndclass.lpfnWndProc = WndProc;
    wndclass.cbClsExtra = 0;
    wndclass.cbWndExtra = 0;
    wndclass.hInstance = hInstance;
    wndclass.hIcon = (HICON)LoadImage(NULL, (LPCWSTR)("nure.ico"), IMAGE_ICON, 10, 10, LR_LOADFROMFILE);
    wndclass.hCursor = LoadCursor(NULL, IDC_ARROW);
    wndclass.lpszClassName = lpzClass;
    wndclass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
    wndclass.lpszMenuName = NULL;
 
    RegisterClass(&wndclass);
 
    HWND hwnd = CreateWindow(
        lpzClass,
        TEXT("Регистрация абитуриентов"), // window caption
        WS_OVERLAPPEDWINDOW | WS_VISIBLE, // window style
        CW_USEDEFAULT, // initial x position
        CW_USEDEFAULT, // initial y position
        CW_USEDEFAULT, // initial x size
        CW_USEDEFAULT, // initial y size
        NULL, // parent window handle
        NULL, // window menu handle
        hInstance, // program instance handle
        NULL
        ); // creation parameters 
 
    // если окно не создано, описатель будет равен 0
    if (!hwnd) return 2;
 
    HMENU hmenu1 = CreateMenu();
 
    AppendMenu(hmenu1, MF_STRING, 0, L"&File");
    AppendMenu(hmenu1, MF_STRING, 0, L"&Edit");
    AppendMenu(hmenu1, MF_STRING, 0, L"&Help");
 
    SetMenu(hwnd, hmenu1);
 
    HWND button = CreateWindow(lpzClass, TEXT("Начать"), WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON | WS_OVERLAPPEDWINDOW, 10, 10, 80, 30, hwnd, (HMENU)10000, hInstance, NULL);
 
 
    ShowWindow(hwnd, nCmdShow);
    UpdateWindow(hwnd);
 
    ShowWindow(button, nCmdShow);
    UpdateWindow(button);
 
    SetParent(button, hwnd);
 
    MSG msg;
 
    while (GetMessage(&msg, NULL, 0, 0))
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
    return msg.wParam;
}
 
 
LRESULT CALLBACK WndProc(
    HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    // выборка и обработка сообщений
    switch (message)
    {
    case WM_DESTROY:
        PostQuitMessage(0);  // реакция на сообщение
        break;
 
    case WM_PAINT:
        BackgroundDraw(hWnd);
 
    default:
        // все сообщения не обработанные Вами обработает сама Windows
        return DefWindowProc(hWnd, message, wParam, lParam);
    }
    return 0;
}
Без комментариев

Если возникнут вопросы, пишите.
1
0 / 0 / 1
Регистрация: 08.07.2013
Сообщений: 47
01.02.2015, 17:30  [ТС]
Спасибо. Есть еще несколько вопросов.
То есть для каждой кнопки нужно отдельно вызывать функцию ShowWindow?
И как быть с иконкой? Она добавлена в ресурсы, но все равно загружается стандартная(
0
3 / 3 / 0
Регистрация: 02.01.2015
Сообщений: 39
01.02.2015, 17:34
Для каждого окна нужен свой ShowWindow и UpdateWindow.

Также нужно вызвать функцию SetParent, для установки дочернего окна на родительское.
0
0 / 0 / 1
Регистрация: 08.07.2013
Сообщений: 47
01.02.2015, 17:37  [ТС]
Вы уверены, что создаете кнопку как окно нужного класса?
0
3 / 3 / 0
Регистрация: 02.01.2015
Сообщений: 39
01.02.2015, 17:40
С иконкой я помочь не могу, т.к. не разбираюсь. Google и MSDN в помощь

Добавлено через 3 минуты
Упс, нашел ошибку. Удалите функцию BackgroundDraw. Просто дочернее окно из-за нее исчезает при перемещении.
0
0 / 0 / 1
Регистрация: 08.07.2013
Сообщений: 47
01.02.2015, 17:41  [ТС]
Изображение на фон и так не грузится(
А если удалю, как загружать его?
0
3 / 3 / 0
Регистрация: 02.01.2015
Сообщений: 39
01.02.2015, 17:49
Вот в этом самая проблема. Если удалить функцию, изображение не будет загружаться. А если не удалять, дочернее окно будет зависать. Я предлагаю сделать это окно не дочерним (button), просто убрав модификатор WS_CHILD и убрав функцию SetParent. Также, можно регулировать значения размеров окна button.
1
Программист
 Аватар для prZzZ
119 / 97 / 11
Регистрация: 22.03.2011
Сообщений: 244
02.02.2015, 23:41
Анна Лето, здравствуйте.
Цитата Сообщение от Анна Лето Посмотреть сообщение
HWND button = CreateWindow((LPCWSTR)("button")
так делать не надо. Надо делать так:
C++
1
HWND button = CreateWindow(TEXT("button")...
В вашем случае вы подводите (!!!не преобразовываете!!!) ASCII к Unicode, хотя функции нужно другое - L"button"
Тоже самое с иконкой... и, что это за размеры 10х10? Таких в системе нет. Разберитесь.
Далее: в сообщении WM_PAINT для получения контекста используется только BeginPaint/EndPaint, а в других - всё что угодно (кроме, естественно, BeginPaint/EndPaint). MSDN вам в помощь...
0
32 / 30 / 4
Регистрация: 01.02.2014
Сообщений: 878
03.02.2015, 12:31
Анна Лето,
1) иконка у меня грузится, возможно вы не положили её в папке с проэктом, поэтому она и не показывается.
2)насчёт кнопки согласен с prZzZ
3) фон, в сообщения WM_PAINT всё начинается с функции BeginPaint , а заканчивается функцией EndPaint, также у вас есть ошибки в функции LoadImage, вы невнимательно читали документацию, во первых оно вам jpg незагрузит, только bmp,ico, во вторых предпоследнии 2 параметра, это размеры картинки, а у вас там стоит 0.
далее после загрузки изображения вообще происходит непонятно что, вернее непонятно с каким умыслом,
тоесть рисование изображения будет выглядеть так

C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
void BackgroundDraw(HWND hwnd)
{
    PAINTSTRUCT ps;
    HDC hdc = BeginPaint(hwnd, &ps);
    HBITMAP img = (HBITMAP)LoadImage(NULL, L"1.bmp", IMAGE_BITMAP, 640, 400, LR_SHARED|  LR_LOADFROMFILE);
    HDC     memDC  = CreateCompatibleDC(hdc); //создаём копию hdc в памяти
    DeleteObject((HBITMAP)SelectObject ( memDC, img )); //вбираем в memdc нашу картинку 
    SetStretchBltMode(hdc,HALFTONE); 
    StretchBlt(hdc, 0, 0, ps.rcPaint.right, ps.rcPaint.bottom, memDC, 0, 0, 640, 400, SRCCOPY); // копируем в hDC картинку из memDC, при этом разтягивая её под ширину и высоту окна
    EndPaint(hwnd,&ps);
}
4) И вообще мой вам совет, загрузку изображения вынесите за пределы функции, картинка каждый раз при перересовке окна оно будет заново грузится и сжирать вашу оперативную память
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
03.02.2015, 12:31
Помогаю со студенческими работами здесь

Частые BSOD и разные ошибки
Здравствуйте, помогите с проблемой: уже на протяжении где-то 2 месяцев постоянно выпадает BSOD (раньше никогда такого не было), ошибки в...

Частые ошибки в работе компьютера
Доброго времени суток. Перейду сразу к делу: После включения компьютера никакая программа не работает более 5-10 минут. Сразу закрывается...

Частые системные ошибки windows 8
Что то уж слишком часто начали появляться системные ошибки, почти все разные, ноут HP ENVY M6, ему всего 2 месяца. Подскажите в чем может...

частые внезапные перезагрузки, ошибки в explorer.exe
Компьютер внезапно перезагружается, после включения всплывает окна &quot;Система восстановлена после серьёзной ошибки&quot;, периодически...

Частые ошибки HDD и крах операционной системы
Недавно устроился админом в компанию, где компы стоят с 2009 года. Примерно раз - два в неделю восстанавливаю ОС с помощью chdsk. Из 30 за...


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

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Новые блоги и статьи
Музыка, написанная Искусственным Интеллектом
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
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
Фото: Daniel Greenwood
kumehtar 13.11.2025
Расскажи мне о Мире, бродяга
kumehtar 12.11.2025
— Расскажи мне о Мире, бродяга, Ты же видел моря и метели. Как сменялись короны и стяги, Как эпохи стрелою летели. - Этот мир — это крылья и горы, Снег и пламя, любовь и тревоги, И бескрайние. . .
PowerShell Snippets
iNNOKENTIY21 11.11.2025
Модуль PowerShell 5. 1+ : Snippets. psm1 У меня модуль расположен в пользовательской папке модулей, по умолчанию: \Documents\WindowsPowerShell\Modules\Snippets\ А в самом низу файла-профиля. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru