Форум программистов, компьютерный форум, киберфорум
C/C++: WinAPI
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.68/19: Рейтинг темы: голосов - 19, средняя оценка - 4.68
45 / 45 / 15
Регистрация: 17.01.2013
Сообщений: 328

При нажатии на эту кнопку загружать картинку

22.06.2013, 14:00. Показов 4199. Ответов 10
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Снова картинка... народ подскажите пожалуйста как при нажатии на эту кнопку загружать картинку:
C++
1
2
3
4
5
6
7
    case WM_COMMAND:
        if (LOWORD(wParam)==100)
        {
            DestroyWindow(hButton);
            DestroyWindow(hButtonV);
            DestroyWindow(hButtonZ);
        }
Вот весь код если нужно. Заранее спасибо.
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
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
// Подключаем стандартную библиотеку
#include <Windows.h>
// #Pragma comment(lib...) можно использовать для задания параметров компоновщика в Microsoft C++
#pragma comment(lib, "winmm.lib")
 
// Глобальные переменные
// HWND описатель главного окна
HWND hMainWnd, hButton, hButtonV, hButtonZ;
//char символ. Создаем массив символов с названием класса
char szClassName[] = "MyClass";
//MSG сообщения. Создается для перехвата сообщений посылаемых программой
MSG msg;
//WNDCLASSEX WNDCLASSEX структура аналогична WNDCLASS структуры. 
//Есть два различия. WNDCLASSEX включает cbSize пользователя, который определяет размер структуры, 
//а hIconSm элемент, который содержит дескриптор небольшой значок, связанный с окном класса.
WNDCLASSEX wc;
 
// Определенных приложением функцию, которая обрабатывает сообщения, отправленные на окна. 
// WNDPROC типа определяет указатель на эту функцию повторного вызова.(обратный звонок)
// WindowProc является заполнителем для определяемого программой имени функции.
// UINT этот API поддерживает платформу .NET Framework и не должен вызываться непосредственно из вашего кода.
// Получает управляемый тип, соответствующий типу данных JScript uint.
// lParam - 32 - битовый парaметр (long в 16 битовой среде это 32 бита), wParam - word param, word это 16 бит. Сейчас понятия "WORD" и "DWORD" устарели.
// Ныне оба типа - это 32 или 64 битовые целые в зависимости от ОС - Win32 или Win64.
// Нести эти два параметра могут все что угодно: координаты мыши, код нажатой клавиши на клавиатуре, или указатель на интерфейс/функцию.
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
 
///////////////////////////////////////////////////////////////////////////////////////////////
// Основная функция, в ней создаются объекты и сама форма                                   //
// HINSTANCE Базовый класс, из которого вы черпаете объекты приложения Windows.                 //
// LPSTR LPCSTR означает "константный указатель строки", то есть константу char*            //
///////////////////////////////////////////////////////////////////////////////////////////////
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
    // Заполняем структуру класса окна
    // Выделяем память
    wc.cbSize = sizeof(wc);
    // Задаем стиль
    // CS_HREDRAW Перерисовывает все окно, если движение или регулировки размера изменяет ширину клиентской области.
    // CS_VREDRAW Перерисовывает все окно, если движение или регулировки размера изменяет высоту клиентской области.
    wc.style = CS_HREDRAW | CS_VREDRAW;
    // Указатель на оконную процедуру. Вы должны использовать CallWindowProc функцию вызова оконной процедуры.
    wc.lpfnWndProc = WndProc;
    // Количество дополнительных байт выделить следующие окно-классовой структуры. Система инициализирует байтов в ноль.
    wc.cbClsExtra = 0;
    // Количество дополнительных байт выделить следующие экземпляра окна. Система инициализирует байтов в ноль. 
    // Если приложение использует WNDCLASSEX зарегистрировать диалоговое окно создается с помощью класса директивы 
    // в файле ресурсов, она должна установить этот член для DLGWINDOWEXTRA .
    wc.cbWndExtra = 0;
    // Дескриптор экземпляра, который содержит оконную процедуру для класса.
    wc.hInstance = hInstance;
    // Дескриптор значка класса. Этот член структуры должен быть дескриптором ресурса значка. 
    // Если этот член NULL , система обеспечивает значок по умолчанию.
    wc.hIcon = LoadIcon(NULL, IDI_APPLICATION);
    // Ручка к классу курсора. Этот член структуры должен быть дескриптором ресурса курсора. 
    // Если этот член NULL , приложение должно явно устанавливать форму курсора, когда мышь перемещается в окне приложения.
    wc.hCursor = LoadCursor(NULL, IDC_ARROW);
    // Устанавливаем фон формы по умолчанию белая заливка
    wc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
    // Указатель на завершающуюся нулем строка символов, указывающая имя ресурса меню класса, 
    // как имя появится в файле ресурсов. Если вы используете целое число для идентификации меню, 
    // используйте MAKEINTRESOURCE макроса. Если этот член NULL , Windows, принадлежащая этому классу не имеют меню по умолчанию.
    wc.lpszMenuName = NULL;
    // Указатель на строку с завершающим нулем или атома. Если этот параметр представляет собой атом, он должен быть атом класса, 
    // созданный предыдущим вызовом RegisterClass или RegisterClassEx функции. Атом должен находиться в младшем слове lpszClassName ; 
    // старшее слово должно быть равно нулю.
    wc.lpszClassName = szClassName;
    // Ручка в небольшой значок, который связан с окном класса. Если этот член NULL , система ищет значок ресурса, 
    // указанного в Hicon пользователя для значка соответствующего размера для использования в качестве небольшой значок.
    wc.hIconSm = LoadIcon(NULL, IDI_APPLICATION);
 
    // Регистрируем класс окна
    if (!RegisterClassEx(&wc)) {
        // Если результат отрицательный, т.е. класс окна создать не удалось выводится сообщение c кнопкой OK
        MessageBox(NULL, "Cannot register class", "Error", MB_OK);
        return 0;
    }
 
    // Создаем основное окно приложения
    // CreateWindow функция создания объекта
    // szClassName присваеваем классу MyClass
    // Название Game
    // WS_OVERLAPPEDWINDOW    создает перекрывающее окно с 
    // Перекрывающее окно обычно имеет заголовок и границы , заголовком, имеет режим управления меню окна в строке заголовка , 
    // размером , свернуть и развернуть стилями.
    // Начальное горизонтальном положении окна по умолчанию CW_USEDEFAULT
    // 0 длина и ширина
    // Освобождаем (HWND)NULL, (HMENU)NULL,(HINSTANCE)hInstance, NULL);
    hMainWnd = CreateWindow(
        szClassName, "Game", WS_POPUPWINDOW,
        CW_USEDEFAULT, 0, CW_USEDEFAULT, 0,
        (HWND)NULL, (HMENU)NULL,
        (HINSTANCE)hInstance, NULL
        );
    
    // Усли не удасться создать форму
    if (!hMainWnd) {
        // Выдаст сообщение
        MessageBox(NULL, "Cannot create main window", "Error", MB_OK);
        return 0;
    }
 
    // Показываем наше окно
    ShowWindow(hMainWnd, SW_SHOWMAXIMIZED);//Окно во весь экран);
    // UpdateWindow(hMainWnd);
 
    //Создаем кнопку с размещением по середине
    // WS_CHILD указывает что кнопка будет распологаться на форме
    // WS_VISIBLE свойство отображения
    // GetSystemMetrics функция для изъятия системных параметров 
    // SM_CXSCREEN берет длину
    // SM_CYSCREEN берет ширину
    hButton = CreateWindow("BUTTON", "Начать", WS_CHILD | WS_VISIBLE,
        (GetSystemMetrics(SM_CXSCREEN)/2-60), (GetSystemMetrics(SM_CYSCREEN)/3+40), 119, 20, hMainWnd, (HMENU)100, hInstance, 0);
 
    hButtonZ = CreateWindow("BUTTON", "Звук", WS_CHILD | WS_VISIBLE | BS_AUTOCHECKBOX,
        (GetSystemMetrics(SM_CXSCREEN)/2-62), (GetSystemMetrics(SM_CYSCREEN)/3+70), 119, 20, hMainWnd, (HMENU)101, hInstance, 0);
 
    hButtonV = CreateWindow("BUTTON", "Выход", WS_CHILD | WS_VISIBLE,
        (GetSystemMetrics(SM_CXSCREEN)/2-60), (GetSystemMetrics(SM_CYSCREEN)/3+100), 119, 20, hMainWnd, (HMENU)102, hInstance, 0);
 
    // Выполняем цикл обработки сообщений до закрытия приложения
    // &msg ссылка
    // GetMessage Выполняет поиск в коллекции ServiceDescriptionCollection и возвращает объект Message с 
    // заданным именем, который является членом одного из экземпляров класса ServiceDescription, включенных в эту коллекцию.
    // Предоставляет возможности для создания и форматирования допустимых файлов документов WSDL, а также соответствующие 
    // пространства имен, элемент и атрибуты для описания веб-служб XML. Этот класс не может наследоваться.
    while (GetMessage(&msg, NULL, 0, 0)) {
        // Переводит виртуальной клавиши сообщений в характере сообщений. Характер сообщения, размещенные в очередь 
        // сообщений вызывающего потока, который будет читать в следующий раз, поток вызывает GetMessage или PeekMessage функции.
        TranslateMessage(&msg);
        // DispatchMessage Отправляет входящие удаленные вызовы.
        DispatchMessage(&msg);
    }
 
    // Возращает параметры сообщений
    return msg.wParam;
}
///////////////////////////////////////////////////////////////////////////////////////////////
LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
    // Переменные
    // HDC Используйте этот оператор, чтобы получить хэндл контекста устройства CDC объекта.
    /* CDC класс определяет класс контекста устройства объектов. CDC объект предоставляет функции-члены для 
        работы с контекстом устройства, такие как дисплей или принтер, а также членов для работы с контекстом 
        дисплея, связанные с клиентской области окна.*/ 
    HDC hDC;
    // PAINTSTRUCT структура содержит информацию, которая может быть использована, чтобы нарисовать клиентской области окна.
    PAINTSTRUCT ps;
    // RECT структура определяет координаты левого верхнего и нижнего правого углов прямоугольника.
 
// RECT rect; /////////////////////////////////////////////////////////////////////////////////////////////////////////////
 
    // Инкапсулирует точечный рисунок GDI+, состоящий из данных пикселей графического изображения 
    // и атрибутов рисунка. Объект Bitmap используется для работы с изображениями, определяемыми данными пикселей.
    static HBITMAP bmpSource = NULL;
    static HDC hdcSource = NULL;
 
    // Оператор выбора выбирает отправленные сообщения
    switch (msg)
    {
        // Выбор посылаемых программы событий
    case WM_CREATE:
        // Загружаем картинку
        // IMAGE_BITMAP указывает формат картинки
        // LR_LOADFROMFILE означает что файл грузится с диск, а не с ресурсов
            bmpSource = (HBITMAP)LoadImage(NULL, "images\\fon.bmp", IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE);
            //Функция CreateCompatibleDC создает контекст устройства в памяти  (DC), совместимый с заданным устройством.
            //GetDC функция извлекает дескриптор контекста устройства (DC) для клиентской области указанного окна или на весь экран 
            hdcSource = CreateCompatibleDC(GetDC(0));
            //Функция SelectObject выбирает объект в заданный контекст устройства (DC). 
            // Новый объект заменяет предыдущий объект того же самого типа.
            SelectObject(hdcSource, bmpSource);
            return 0;
 
    case WM_PAINT:
        // Прорисовываем её
            hDC = BeginPaint(hWnd, &ps);
            //Функция BitBlt выполняет передачу битовых блоков данных о цвете, соответствующих прямоугольнику пикселей из заданного исходного контекста устройства в целевой контекст устройства.
            BitBlt(hDC, 0, 0, 500, 500, hdcSource, 0, 0, SRCCOPY);
            StretchBlt(hDC,0 ,0, GetSystemMetrics(SM_CXSCREEN), GetSystemMetrics(SM_CYSCREEN),hdcSource,0,0,600,375,SRCCOPY);
            //Завершаем прорисовку
            EndPaint(hWnd, &ps);
            // Воспроизведение музыки
            mciSendString("pause sound\\1.mp3", NULL, 0, NULL);
            return 0;
    
    // Обрабатываем нажатия на кнопки
    case WM_COMMAND:
        if (LOWORD(wParam)==100)
        {
            DestroyWindow(hButton);
            DestroyWindow(hButtonV);
            DestroyWindow(hButtonZ);
        }
        // Кнопка выход
        if(LOWORD(wParam)==102)
        {
            exit(1);
        }
        // Кнопка звук
        if(LOWORD(wParam)==101)
        {
            // Пауза музыки
                // Получаем HWND нашего chechbox'а.
                HWND hwndCheck = GetDlgItem(hWnd, 101);
                // Выясняем текущее состояние chechbox'а.
                LRESULT res = SendMessage (hwndCheck, BM_GETCHECK, 0, 0);
                // Если галочка стоит.
                if(res == BST_CHECKED)
                {
                    mciSendString("play sound\\1.mp3", NULL, 0, NULL);
                }
                // Если галочка не стоит.
                if(res == BST_UNCHECKED)
                {
                    mciSendString("pause sound\\1.mp3", NULL, 0, NULL);
                }
        }
        break;
 
    case WM_CLOSE:
        //Освобождаем память
        DestroyWindow(hWnd);
        return 0;
 
    case WM_DESTROY:
        //Выход
        PostQuitMessage(0);
        return 0;
 
    default:
        /*Функция DefWindowProc вызывается оконной процедурой по умолчанию, чтобы обеспечить обработку 
        по умолчанию любого сообщения окна, которые приложение не обрабатывает. 
        Эта функция гарантирует то, что обрабатывается каждое сообщение. Функция DefWindowProc 
        вызывается с теми же самыми параметрами, принятыми оконной процедурой.*/
        return DefWindowProc(hWnd, msg, wParam, lParam);
    }
 
    return 0;
}
Добавлено через 16 часов 58 минут
Народ кто-нибудь пожалуйста, неужели никто не знает...
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
22.06.2013, 14:00
Ответы с готовыми решениями:

Замена кнопки на картинку при нажатии на кнопку
Здравствуйте, можете пожалуйста написать как при нажатии на кнопку эта кнопка меняется на картинку?

При нажатии на кнопку поменять картинку из элемента ImageList и поставить туда стандартную картинку
Всем привет! Как сделать кнопку и поставить пару картинок в ImageList я знаю. Осталось только запрограмировать кнопку так, чтобы те...

Как у кнопки (JButton) поменять иконку при нажатии на эту кнопку?
подскажите пожалуйста, как у кнопки (JButton) поменять иконку при нажатии на эту кнопку? Заранее спасибо!

10
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33398 / 21508 / 8236
Регистрация: 22.10.2011
Сообщений: 36,904
Записей в блоге: 12
22.06.2013, 14:28
Ну ты ж загружаешь картинку по WM_CREATE, в чем проблема перенести (или скопировать) этот код в WM_COMMAND, именно в то место, которое ты процитировал первым?
0
45 / 45 / 15
Регистрация: 17.01.2013
Сообщений: 328
22.06.2013, 14:47  [ТС]
Цитата Сообщение от UI Посмотреть сообщение
Ну ты ж загружаешь картинку по WM_CREATE, в чем проблема перенести (или скопировать) этот код в WM_COMMAND, именно в то место, которое ты процитировал первым?
Я пытался но в итоге у меня ничего не получилось, причем на месте где были кнопки появляются три полоски вот смотрите:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
    case WM_COMMAND:
        if (LOWORD(wParam)==100)
        {
            ShowWindow(hButton,SW_HIDE);
            MoveWindow(hButtonZ, (GetSystemMetrics(SM_CXSCREEN)-140), 
                (GetSystemMetrics(SM_CYSCREEN)/GetSystemMetrics(SM_CYSCREEN)+20), 119, 20, WM_PAINT);
            MoveWindow(hButtonV, (GetSystemMetrics(SM_CXSCREEN)-140), 
                (GetSystemMetrics(SM_CYSCREEN)/GetSystemMetrics(SM_CYSCREEN)+50), 119, 20, WM_PAINT);
            bmpSource1 = (HBITMAP)LoadImage(NULL, "images\\Igrok.bmp", IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE);
            //Функция CreateCompatibleDC создает контекст устройства в памяти  (DC), совместимый с заданным устройством.
            //GetDC функция извлекает дескриптор контекста устройства (DC) для клиентской области указанного окна или на весь экран 
            hdcSource1 = CreateCompatibleDC(GetDC(0));
            //Функция SelectObject выбирает объект в заданный контекст устройства (DC). 
            // Новый объект заменяет предыдущий объект того же самого типа.
            SelectObject(hdcSource1, bmpSource1);
            hdC = BeginPaint(hWnd, &ps);
            //Функция BitBlt выполняет передачу битовых блоков данных о цвете, соответствующих прямоугольнику пикселей из заданного исходного контекста устройства в целевой контекст устройства.
            BitBlt(hdC, 0, 0, 500, 500, hdcSource1, 0, 0, SRCCOPY);
            //Завершаем прорисовку
            EndPaint(hWnd, &pS);
        }
Миниатюры
При нажатии на эту кнопку загружать картинку  
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33398 / 21508 / 8236
Регистрация: 22.10.2011
Сообщений: 36,904
Записей в блоге: 12
22.06.2013, 15:06
BeginPaint/EndPaint тут вообще не надо делать:
An application should not call BeginPaint except in response to a WM_PAINT message. Each call to BeginPaint must have a corresponding call to the EndPaint function.
А ты где вызываешь? В WM_COMMAND?

Загрузил изображение, вызвал Invalidate для окна, окно перерисовалось, картинка отобразилась. Всё, не надо ничего придумывать с перерисовкой на месте загрузки картинки.
0
45 / 45 / 15
Регистрация: 17.01.2013
Сообщений: 328
22.06.2013, 15:30  [ТС]
Цитата Сообщение от UI Посмотреть сообщение
Загрузил изображение, вызвал Invalidate для окна, окно перерисовалось, картинка отобразилась. Всё, не надо ничего придумывать с перерисовкой на месте загрузки картинки.
Скорее всего я неправильно понял. Вот смотрите:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
    case WM_COMMAND:
        if (LOWORD(wParam)==100)
        {
            ShowWindow(hButton,SW_HIDE);
            MoveWindow(hButtonZ, (GetSystemMetrics(SM_CXSCREEN)-140), 
                (GetSystemMetrics(SM_CYSCREEN)/GetSystemMetrics(SM_CYSCREEN)+20), 119, 20, WM_PAINT);
            MoveWindow(hButtonV, (GetSystemMetrics(SM_CXSCREEN)-140), 
                (GetSystemMetrics(SM_CYSCREEN)/GetSystemMetrics(SM_CYSCREEN)+50), 119, 20, WM_PAINT);
            bmpSource1 = (HBITMAP)LoadImage(NULL, "images\\Igrok.bmp", IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE);
            //Функция CreateCompatibleDC создает контекст устройства в памяти  (DC), совместимый с заданным устройством.
            //GetDC функция извлекает дескриптор контекста устройства (DC) для клиентской области указанного окна или на весь экран 
            hdcSource1 = CreateCompatibleDC(GetDC(0));
            //Функция SelectObject выбирает объект в заданный контекст устройства (DC). 
            // Новый объект заменяет предыдущий объект того же самого типа.
            SelectObject(hdcSource1, bmpSource1);
            InvalidateRect(hWnd, &rect, TRUE);
            return 0;
Так ничего и не происходит. Можно поподробнее? Пожалуйста
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33398 / 21508 / 8236
Регистрация: 22.10.2011
Сообщений: 36,904
Записей в блоге: 12
22.06.2013, 16:19
Лучший ответ Сообщение было отмечено volvo как решение

Решение

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
        if (LOWORD(wParam)==100)
        {
            ShowWindow(hButton,SW_HIDE);
            MoveWindow(hButtonZ, (GetSystemMetrics(SM_CXSCREEN)-140),
                (GetSystemMetrics(SM_CYSCREEN)/GetSystemMetrics(SM_CYSCREEN)+20), 119, 20, WM_PAINT);
            MoveWindow(hButtonV, (GetSystemMetrics(SM_CXSCREEN)-140),
                (GetSystemMetrics(SM_CYSCREEN)/GetSystemMetrics(SM_CYSCREEN)+50), 119, 20, WM_PAINT);
 
            // Загрузили новый bitmap
            bmpSource1 = (HBITMAP)LoadImage(NULL, "images\\Igrok.bmp", IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE);
            // Выбрали его в ту же hdcSource, поскольку у тебя при отрисовке используется именно hdcSource,
            // а то, что было раньше связано с hdcSource - удаляем
            DeleteObject(SelectObject(hdcSource, bmpSource1));
            // и обновляем все окно...
            InvalidateRect(hWnd, NULL, TRUE);
        }
У меня сейчас компилятора Плюсового нет под рукой, проверь, по-моему, не ошибся нигде...
1
45 / 45 / 15
Регистрация: 17.01.2013
Сообщений: 328
22.06.2013, 16:31  [ТС]
Цитата Сообщение от UI Посмотреть сообщение
У меня сейчас компилятора Плюсового нет под рукой, проверь, по-моему, не ошибся нигде...
Спасибо Вам огромное, Вы мой спаситель... А можно еще вопрос можно ли сделать так чтобы вторая картинка не пропадала? Спасибо Вам еще раз.
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33398 / 21508 / 8236
Регистрация: 22.10.2011
Сообщений: 36,904
Записей в блоге: 12
22.06.2013, 16:39
Что значит "не пропадала"?
0
45 / 45 / 15
Регистрация: 17.01.2013
Сообщений: 328
22.06.2013, 16:44  [ТС]
Цитата Сообщение от UI Посмотреть сообщение
Что значит "не пропадала"?
Смотрите:
Миниатюры
При нажатии на эту кнопку загружать картинку   При нажатии на эту кнопку загружать картинку   При нажатии на эту кнопку загружать картинку  

0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33398 / 21508 / 8236
Регистрация: 22.10.2011
Сообщений: 36,904
Записей в блоге: 12
22.06.2013, 17:01
Лучший ответ Сообщение было отмечено volvo как решение

Решение

А, так у тебя вон чего происходит? Я думал, для игрока загружается его собственная карта, на весь экран... Тогда надо действительно новый DC, и как-то вот так:
C++
1
2
3
4
5
6
            bmpPlayer = (HBITMAP)LoadImage(NULL, "images\\Igrok.bmp", IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE);
            hdcPlayer = CreateCompatibleDC(GetDC(0)); // изначально hdcPlayer = 0
            SelectObject(hdcPlayer, bmpPlayer);
            // Можно перерисовать все окно, а можно - только ту его часть,
            // где будет изображение игрока...
            InvalidateRect(hWnd, NULL, TRUE);
, и при WM_PAINT:

C++
1
2
3
4
5
6
7
8
9
10
            hDC = BeginPaint(hWnd, &ps);
            BitBlt(hDC, 0, 0, 500, 500, hdcSource, 0, 0, SRCCOPY); // фон
            StretchBlt(hDC,0 ,0, GetSystemMetrics(SM_CXSCREEN), GetSystemMetrics(SM_CYSCREEN),hdcSource,0,0,600,375,SRCCOPY);
            if(hdcPlayer) // изображение игрока было загружено?
            {
                // тогда рисуем... (50,50) - позиция, (100,100) - размеры
                BitBlt(hDC, 50, 50, 100, 100, hdcPlayer, 0, 0, SRCCOPY);
            }
            //Завершаем прорисовку
            EndPaint(hWnd, &ps);
1
45 / 45 / 15
Регистрация: 17.01.2013
Сообщений: 328
22.06.2013, 17:06  [ТС]
Спасибоооооооооооооо огромнейше. Выручили
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
22.06.2013, 17:06
Помогаю со студенческими работами здесь

Получить картинку при нажатии на кнопку
Здравствуйте, окажите помощь по такому вот вопросу. Есть некая директива с картинками и есть база данных с id и с путем к картинке. Как...

При нажатии на кнопку изменить картинку на ней
как при нажатии на кнопку изменить ее картинку??

При нажатии на кнопку менять картинку в Image из ImageList
У меня есть 3 кнопки, 10 картинок в ImageList и картинка в Image. По идеи при разном нажатии на кнопки , могут появиться разные картинки....

Предложить пользователю сохранить картинку при нажатии на кнопку
Вообщем нужно это как то организовать, что бы было в одно нажатие... если делать ссылкой то просто переходит на эту картинку, а мне нужно...

Как подгрузить картинку в PictureBox при нажатии на кнопку
Доброго времени суток... Появилась проблема... Как можно подгрузить картинку в PictureBox при нажатии на кнопку?


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

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11680&amp;d=1772460536 Одним из. . .
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка библиотек: SDL3, Box2D, FreeType, SDL3_ttf, SDL3_mixer и SDL3_image из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru