Я пытался напечатать .bmp, когда нажимал кнопку, но это изображение должно было иметь «прозрачность».
Я думал об изменении цвета каждого пикселя. Этот .bmp будет перед другим, поэтому я хочу сделать следующее: взять цвет пикселей из .bmp позади и закрасить ими фон переднего .
Проблема:
Думаю, это можно было бы сделать, учитывая, что фон .bmp белый, просто определяя, является ли пиксель белым, и меняя его цвет.
Однако у меня не получилось это сделать ... Я попробовал несколько ссылок для базы, ни одна из них не сработала.
Я попробовал этот : Я попробовал чтобы отредактировать его, чтобы изменить пиксели фона .bmp, когда они белые, на пиксели .bmp позади него. У меня ничего не получилось, все пиксели были зашифрованы.
Я также пробовал этот : изображение было черно-белым (это уже было объяснено в комментариях ниже).
Я не нашел примера использования функции TransparentBlt () с растровыми изображениями, на которой я мог бы основываться, я уже пытался использовать его, но изображение осталось прежним. вот мой весь код:
#define _WIN32_WINNT 0x0500 /* tem ficar na primeira linha do código */
#define WINVER 0x0600
#include <windows.h>
#include <wingdi.h>
#define WM_CREATE 0x0001
#define WM_DESTROY 0x0002
#define ID_IMAGE1 1
#define ID_IMAGE2 2
#define ID_IMAGE3 3
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
void LoadMyImage(void);
void LoadMyImage2(void);
void LoadMyImage3(void);
HBITMAP hBitmap;
HBITMAP hBitmap2;
HBITMAP hBitmap3;
POINT posicao;
int x, y;
HWND hWnd = GetConsoleWindow();
int WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
PSTR lpCmdLine, INT nCmdShow) {
MSG msg;
WNDCLASSW wc = {0};
wc.lpszClassName = L"Static image";
wc.hInstance = hInstance;
wc.hbrBackground = GetSysColorBrush(COLOR_3DFACE);
wc.lpfnWndProc = WndProc;
wc.hCursor = LoadCursor(0,IDC_ARROW);
RegisterClassW(&wc);
CreateWindowW(wc.lpszClassName, L"MLG antivirus",
WS_OVERLAPPEDWINDOW | WS_VISIBLE,
100, 100, 1001, 601, 0, 0, hInstance, 0);
ShowWindow(hWnd, SW_MINIMIZE);
//won't hide the window without SW_MINIMIZE
ShowWindow(hWnd, SW_HIDE);
while (GetMessage(&msg, NULL, 0, 0)) {
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return (int) msg.wParam;
}
LRESULT CALLBACK WndProc(HWND hwnd, UINT msg,
WPARAM wParam, LPARAM lParam) {
HWND hsti;
HWND hBitmapButton;
HWND hitm;
switch(msg) {
case WM_CREATE:
LoadMyImage();
hsti = CreateWindowW(L"Static", L"",
WS_CHILD | WS_VISIBLE | SS_BITMAP,
0, 0, 300, 300, hwnd, (HMENU) ID_IMAGE1, NULL, NULL);
SendMessage(hsti, STM_SETIMAGE,
(WPARAM) IMAGE_BITMAP, (LPARAM) hBitmap);
LoadMyImage2();
hBitmapButton = CreateWindowW(L"BUTTON", L"", WS_CHILD | WS_VISIBLE
| BS_PUSHBUTTON | BS_BITMAP,
334, 291, 316, 136, hwnd, (HMENU)ID_IMAGE2, NULL, NULL);
SendMessage(hBitmapButton, BM_SETIMAGE,
(WPARAM) IMAGE_BITMAP, (LPARAM) hBitmap2);
break;
case WM_COMMAND:
if (LOWORD(wParam) == ID_IMAGE2) {
GetCursorPos(&posicao);
x = posicao.x-127;
y = posicao.y-150;
LoadMyImage3();
hitm = CreateWindowW(L"Static", L"",
WS_CHILD | WS_VISIBLE | SS_BITMAP,
x, y, 38, 38, hwnd, (HMENU) ID_IMAGE3, NULL, NULL);
SendMessage(hitm, STM_SETIMAGE,
(WPARAM) IMAGE_BITMAP, (LPARAM) hBitmap3);
Sleep(80);
DeleteObject((HBITMAP)hBitmap3);
}
break;
case WM_DESTROY:
DeleteObject((HBITMAP)hBitmap);
DeleteObject((HBITMAP)hBitmap2);
PostQuitMessage(0);
PostMessage(hWnd, WM_CLOSE, 0, 0);
break;
}
return DefWindowProcW(hwnd, msg, wParam, lParam);
}
void LoadMyImage(void) {
hBitmap = (HBITMAP) LoadImage(NULL, "antvirus.bmp", IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE | LR_CREATEDIBSECTION);
if(hBitmap == NULL){
MessageBox(NULL, "Error while loading image", "Error", MB_OK|MB_ICONERROR);
}
}
void LoadMyImage2(void) {
hBitmap2 = (HBITMAP) LoadImage(NULL, "botao.bmp", IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE | LR_CREATEDIBSECTION);
if(hBitmap2 == NULL){
MessageBox(NULL, "Error while loading image", "Error", MB_OK|MB_ICONERROR);
}
}
void LoadMyImage3(void) {
hBitmap3 = (HBITMAP) LoadImage(NULL, "hitmarker.bmp", IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE | LR_CREATEDIBSECTION);
if(hBitmap3 == NULL){
MessageBox(NULL, "Error while loading image", "Error", MB_OK|MB_ICONERROR);
}
}
Я прикреплю .bmp:
hitmarker.bmp
antvirus.bmp
botao.bmp
Код в ответе ниже работает, но я хотел, чтобы изображение печаталось при нажатии кнопки, то есть Case WM_COMMAND
. Я все еще пытаюсь отредактировать его, но спасибо, вы очень любезно помогли мне. Заранее спасибо.