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

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

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

Author24 — интернет-сервис помощи студентам
Подскажите, что я делаю не так. Программа запускается без ошибок, но кнопку, которую я создаю, не видно, не видно иконку и изображение, загруженное как фон.
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
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
01.02.2015, 15:30
Ответы с готовыми решениями:

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

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

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

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

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

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  [ТС] 3
Спасибо. Есть еще несколько вопросов.
То есть для каждой кнопки нужно отдельно вызывать функцию ShowWindow?
И как быть с иконкой? Она добавлена в ресурсы, но все равно загружается стандартная(
0
3 / 3 / 0
Регистрация: 02.01.2015
Сообщений: 39
01.02.2015, 17:34 4
Для каждого окна нужен свой ShowWindow и UpdateWindow.

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

Добавлено через 3 минуты
Упс, нашел ошибку. Удалите функцию BackgroundDraw. Просто дочернее окно из-за нее исчезает при перемещении.
0
0 / 0 / 1
Регистрация: 08.07.2013
Сообщений: 47
01.02.2015, 17:41  [ТС] 7
Изображение на фон и так не грузится(
А если удалю, как загружать его?
0
3 / 3 / 0
Регистрация: 02.01.2015
Сообщений: 39
01.02.2015, 17:49 8
Вот в этом самая проблема. Если удалить функцию, изображение не будет загружаться. А если не удалять, дочернее окно будет зависать. Я предлагаю сделать это окно не дочерним (button), просто убрав модификатор WS_CHILD и убрав функцию SetParent. Также, можно регулировать значения размеров окна button.
1
Программист
119 / 97 / 11
Регистрация: 22.03.2011
Сообщений: 244
02.02.2015, 23:41 9
Анна Лето, здравствуйте.
Цитата Сообщение от Анна Лето Посмотреть сообщение
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 10
Анна Лето,
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
03.02.2015, 12:31
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
03.02.2015, 12:31
Помогаю со студенческими работами здесь

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru