Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Win Api
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 13.01.2016, 00:43   #1
Sterben
Форумчанин
 
Аватар для Sterben
 
Регистрация: 01.03.2015
Сообщений: 118
По умолчанию Загрузить Bitmap изображение на кнопку(WinApi)

Здравствуйте,хотел попробовать наложить на кнопку изображение формат bmp.
как правильно это сделать?
Код:
#include <windows.h>

LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);

BOOL InitApplication(HINSTANCE hInstance) {
	WNDCLASSEX wcx;
	wcx.cbSize = sizeof(wcx);
	wcx.style = CS_HREDRAW | CS_VREDRAW;
	wcx.lpszClassName = L"Anything";
	wcx.lpfnWndProc = WndProc;
	wcx.cbClsExtra = NULL;
	wcx.cbWndExtra = NULL;
	wcx.hInstance = hInstance;
	wcx.hIcon = LoadIcon(NULL, IDI_APPLICATION);
	wcx.hCursor = LoadCursor(NULL, IDC_ARROW);
	wcx.lpszMenuName = L"Anything Menu";
	wcx.hbrBackground = (HBRUSH)GetStockObject(BLACK_BRUSH);
	wcx.hIconSm = (HICON)LoadImage(hInstance, MAKEINTRESOURCE(5), IMAGE_ICON,
		GetSystemMetrics(SM_CXSMICON), GetSystemMetrics(SM_CYSMICON), LR_DEFAULTCOLOR);
	if (!RegisterClassEx(&wcx)) {
		MessageBox(NULL, L"Error Registered class!", L"Fatal Error", MB_OK | MB_ICONERROR);
		return FALSE;
	}
	return RegisterClassEx(&wcx);
}

BOOL InitInstance(HINSTANCE hInstance, int nCmdShow) {
	HWND hMainWnd;
	hMainWnd = CreateWindow(L"Anything", L"Computer Graphics", WS_OVERLAPPEDWINDOW | WS_VSCROLL, CW_USEDEFAULT, CW_USEDEFAULT,
		1366, 500, (HWND)NULL, HMENU(NULL), hInstance, (LPVOID)NULL);
	if (!hMainWnd) {
		MessageBox(NULL, L"Error Initialization Window", L"Fatal Error", MB_OK | MB_ICONERROR);
		return FALSE;
	}
	ShowWindow(hMainWnd, nCmdShow);
	UpdateWindow(hMainWnd);
	return TRUE;
}

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) {
	MSG msg;
	InitApplication(hInstance);
	InitInstance(hInstance, nCmdShow);
	while (GetMessage(&msg, NULL, NULL, NULL)) {
		TranslateMessage(&msg);
		DispatchMessage(&msg);
	}
	return 0;
}


LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) {
	HBITMAP hBitmap;
	HINSTANCE hInstance;
	PAINTSTRUCT ps;
	HWND hButton;
	switch (uMsg) {
	case WM_CREATE:
		hInstance = GetModuleHandle(NULL);
		hBitmap = LoadBitmap(hInstance, MAKEINTRESOURCE(L"Image.bmp"));
		hButton = CreateWindow(L"button", L"", WS_VISIBLE | WS_CHILD | BS_PUSHBUTTON | BS_BITMAP, 10, 10, 80, 30, hWnd, (HMENU)1000, hInstance, (LPVOID)NULL);
		break;
	case WM_CLOSE:
		DestroyWindow(hWnd);
		PostQuitMessage(NULL);
		break;
	case WM_COMMAND:
		SendMessage(hButton, BM_SETIMAGE, IMAGE_BITMAP, (LPARAM)hBitmap);
		break;
	}
	return DefWindowProc(hWnd, uMsg, wParam, lParam);
}
совсем не соображаю как это делать.
Sterben вне форума Ответить с цитированием
Старый 13.01.2016, 09:37   #2
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,493
По умолчанию

Откуда у WM_COMMAND возьмется в параметрах hBitmap?
Почему не послать BM_SETIMAGE сразу после создания кнопки?
waleri вне форума Ответить с цитированием
Старый 13.01.2016, 11:14   #3
Sterben
Форумчанин
 
Аватар для Sterben
 
Регистрация: 01.03.2015
Сообщений: 118
По умолчанию

Цитата:
Сообщение от waleri Посмотреть сообщение
Откуда у WM_COMMAND возьмется в параметрах hBitmap?
Почему не послать BM_SETIMAGE сразу после создания кнопки?
а если присваивать после нажатия ?Получилось сделать после создания,а если на кнопку нужно нанести изображение после клика,то как хранить hBitmap глобально?

Последний раз редактировалось Sterben; 13.01.2016 в 12:51.
Sterben вне форума Ответить с цитированием
Старый 13.01.2016, 13:12   #4
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,493
По умолчанию

https://en.wikipedia.org/wiki/Global_variable
waleri вне форума Ответить с цитированием
Старый 13.01.2016, 14:51   #5
Sterben
Форумчанин
 
Аватар для Sterben
 
Регистрация: 01.03.2015
Сообщений: 118
По умолчанию

объясните на примере , у меня есть кнопка если на нее клацнули то должна появится картинка,где это сделать,есть вероятность замены одной картинки другой?
case WM_COMMAND:
if (LOWORD(wParam) == 1000) {
hButton = GetDlgItem(hWnd, 1000);
hInstance = GetModuleHandle(NULL);
hBitmap = LoadBitmap(hInstance, MAKEINTRESOURCE(IDB_BITMAP1));
SendMessage(hButton, BM_SETIMAGE, IMAGE_BITMAP, (LPARAM)hBitmap);
}
break;
сделал так.

Последний раз редактировалось Sterben; 13.01.2016 в 15:15.
Sterben вне форума Ответить с цитированием
Старый 18.01.2016, 19:04   #6
troyan90
Пользователь
 
Регистрация: 23.06.2011
Сообщений: 54
По умолчанию

Можно использовать BCM_SETIMAGELIST.
Пример на C приложил
Вложения
Тип файла: zip Win32Project2.zip (38.0 Кб, 39 просмотров)
troyan90 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как на Bitmap добавить кнопку? leo55 ASP.NET 1 04.12.2011 15:46
Вывести Bitmap на WinAPI apromix Win Api 5 21.08.2011 10:00
Как загрузить изображения с использованием Bitmap Pilgrimm C++ Builder 2 24.03.2011 07:56
Загрузить изображение zont_11 Microsoft Office Excel 3 15.02.2011 12:24
Как перекинуть изображение из PictureBox в Bitmap(C#) Дамир Общие вопросы .NET 1 23.10.2009 07:15