英文:
Image generation in a New Window
问题
我正在制作一个程序,可以发送我想要的自定义通知。我有一个显示在屏幕上的窗口,但是图像没有加载。
我已经尝试使用Chat GPT来检查我的代码,但由于其知识限制是在2021年9月,它不知道API的新更新,无法给我正确的回答。
以下是您的代码部分:
#include <Windows.h>
#include <Shellapi.h>
// 常量
#define WM_CLOSENOTIFICATION (WM_USER + 1)
#define BUTTON_OPENURL_ID 100
#define BUTTON_CLOSE_ID 101
#define IDB_NOTIFICATION_BITMAP 108 // 用您的位图资源ID替换
// 全局变量
HWND hMainWindow;
HWND hNotificationWindow;
HBITMAP hBitmap;
// 创建和显示通知窗口的函数
void ShowNotification()
{
// 获取屏幕尺寸
int screenWidth = GetSystemMetrics(SM_CXSCREEN);
int screenHeight = GetSystemMetrics(SM_CYSCREEN);
// 计算通知窗口的中心位置
int notificationWidth = 400; // 设置您希望的宽度
int notificationHeight = 200; // 设置您希望的高度
int notificationX = (screenWidth - notificationWidth) / 2;
int notificationY = (screenHeight - notificationHeight) / 2;
// 创建自定义通知窗口
hNotificationWindow = CreateWindow(
L"NotificationWindowClass", // 类名
L"Custom Notification", // 窗口标题
WS_POPUP | WS_VISIBLE | WS_BORDER, // 窗口样式
notificationX, notificationY, // 位置
notificationWidth, notificationHeight, // 尺寸
nullptr, nullptr, nullptr, nullptr // 父窗口,菜单句柄,实例,附加数据
);
// 加载位图资源
hBitmap = LoadBitmap(GetModuleHandle(nullptr), MAKEINTRESOURCE(IDB_NOTIFICATION_BITMAP));
if (hBitmap == nullptr)
{
OutputDebugStringA("Error Bitmap Null Value");
// 显示适当的错误消息或采取必要的操作
}
// 创建图像的静态控件
HWND hImageStatic = CreateWindow(
L"STATIC", // 窗口类名
nullptr, // 文本内容(图像为空)
WS_CHILD | WS_VISIBLE | SS_BITMAP | SS_CENTERIMAGE, // 窗口样式
10, 10, notificationWidth - 20, notificationHeight - 20, // 位置和尺寸
hNotificationWindow, nullptr, nullptr, nullptr // 父窗口,菜单句柄,实例,附加数据
);
SendMessage(hImageStatic, STM_SETIMAGE, IMAGE_BITMAP, reinterpret_cast<LPARAM>(hBitmap));
// 创建一个打开网站的按钮
HWND hOpenButton = CreateWindow(
L"BUTTON", // 窗口类名
L"Open Website", // 文本内容
WS_CHILD | WS_VISIBLE | BS_CENTER | BS_DEFPUSHBUTTON, // 窗口样式
10, notificationHeight - 60, (notificationWidth - 40) / 2, 30, // 位置和尺寸
hNotificationWindow, reinterpret_cast<HMENU>(BUTTON_OPENURL_ID), nullptr, nullptr // 父窗口,菜单句柄,实例,附加数据
);
// 创建一个关闭通知的按钮
HWND hCloseButton = CreateWindow(
L"BUTTON", // 窗口类名
L"Close", // 文本内容
WS_CHILD | WS_VISIBLE | BS_CENTER | BS_DEFPUSHBUTTON, // 窗口样式
20 + (notificationWidth - 40) / 2, notificationHeight - 60, (notificationWidth - 40) / 2, 30, // 位置和尺寸
hNotificationWindow, reinterpret_cast<HMENU>(BUTTON_CLOSE_ID), nullptr, nullptr // 父窗口,菜单句柄,实例,附加数据
);
}
// 通知窗口的窗口过程
LRESULT CALLBACK NotificationWindowProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
switch (message)
{
case WM_COMMAND:
// 处理命令消息
if (LOWORD(wParam) == BUTTON_OPENURL_ID)
{
// 单击按钮时打开网站
ShellExecute(nullptr, L"open", L"https://example.com", nullptr, nullptr, SW_SHOWNORMAL);
}
else if (LOWORD(wParam) == BUTTON_CLOSE_ID)
{
// 再次显示主窗口
ShowWindow(hMainWindow, SW_SHOW);
// 清理并退出通知窗口
DestroyWindow(hNotificationWindow);
}
break;
case WM_CLOSE:
// 再次显示主窗口
ShowWindow(hMainWindow, SW_SHOW);
// 清理并退出通知窗口
DestroyWindow(hNotificationWindow);
break;
}
return DefWindowProc(hWnd, message, wParam, lParam);
}
// 入口点
int WINAPI wWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PWSTR pCmdLine, int nCmdShow)
{
// 创建并注册通知窗口的窗口类
WNDCLASS wc = {};
wc.lpfnWndProc = NotificationWindowProc;
wc.hInstance = hInstance;
wc.lpszClassName = L"NotificationWindowClass";
RegisterClass(&wc);
// 创建主窗口
hMainWindow = CreateWindow(
L"MainWindowClass", // 窗口类名
L"Main Window", // 窗口标题
WS_OVERLAPPEDWINDOW, // 窗口样式
CW_USEDEFAULT, CW_USEDEFAULT, // 位置
CW_USEDEFAULT, CW_USEDEFAULT, // 尺寸
nullptr, nullptr, hInstance, nullptr // 父窗口,菜单句柄,实例,附加数据
);
// 显示主窗口
ShowWindow(hMainWindow, nCmdShow);
// 显示初始通知
ShowNotification();
// 消息循环
MSG msg = {};
while (GetMessage(&msg, nullptr, 0, 0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
// 清理资源
if (hBitmap !=
<details>
<summary>英文:</summary>
I am making a program that will send a custom notification sent for whatever I want. I have a window that shows up on the screen, but the image doesn't load.
I have tried using Chat GPT to check my code, but with its knowledge limit being Sept 2021 it doesn't know the new updates to API's to give me a correct response.
Code can be found below:
#include <Windows.h>
#include <Shellapi.h>
// Constants
#define WM_CLOSENOTIFICATION (WM_USER + 1)
#define BUTTON_OPENURL_ID 100
#define BUTTON_CLOSE_ID 101
#define IDB_NOTIFICATION_BITMAP 108 // Replace with your bitmap resource ID
// Global variables
HWND hMainWindow;
HWND hNotificationWindow;
HBITMAP hBitmap;
// Function to create and show the notification window
void ShowNotification()
{
// Get the screen dimensions
int screenWidth = GetSystemMetrics(SM_CXSCREEN);
int screenHeight = GetSystemMetrics(SM_CYSCREEN);
// Calculate the center position for the notification window
int notificationWidth = 400; // Set your desired width
int notificationHeight = 200; // Set your desired height
int notificationX = (screenWidth - notificationWidth) / 2;
int notificationY = (screenHeight - notificationHeight) / 2;
// Create the custom notification window
hNotificationWindow = CreateWindow(
L"NotificationWindowClass", // Class name
L"Custom Notification", // Window title
WS_POPUP | WS_VISIBLE | WS_BORDER, // Window styles
notificationX, notificationY, // Position
notificationWidth, notificationHeight, // Size
nullptr, nullptr, nullptr, nullptr // Parent window, Menu handle, Instance, Additional data
);
// Load the bitmap resource
hBitmap = LoadBitmap(GetModuleHandle(nullptr), MAKEINTRESOURCE(IDB_NOTIFICATION_BITMAP));
if (hBitmap == nullptr)
{
OutputDebugStringA("Error Bitmap Null Value");
// Display appropriate error message or take necessary actions
}
// Create a static control for the image
HWND hImageStatic = CreateWindow(
L"STATIC", // Window class name
nullptr, // Text content (empty for image)
WS_CHILD | WS_VISIBLE | SS_BITMAP | SS_CENTERIMAGE, // Window styles
10, 10, notificationWidth - 20, notificationHeight - 20, // Position and size
hNotificationWindow, nullptr, nullptr, nullptr // Parent window, Menu handle, Instance, Additional data
);
SendMessage(hImageStatic, STM_SETIMAGE, IMAGE_BITMAP, reinterpret_cast<LPARAM>(hBitmap));
// Create a button to open a website
HWND hOpenButton = CreateWindow(
L"BUTTON", // Window class name
L"Open Website", // Text content
WS_CHILD | WS_VISIBLE | BS_CENTER | BS_DEFPUSHBUTTON, // Window styles
10, notificationHeight - 60, (notificationWidth - 40) / 2, 30, // Position and size
hNotificationWindow, reinterpret_cast<HMENU>(BUTTON_OPENURL_ID), nullptr, nullptr // Parent window, Menu handle, Instance, Additional data
);
// Create a button to close the notification
HWND hCloseButton = CreateWindow(
L"BUTTON", // Window class name
L"Close", // Text content
WS_CHILD | WS_VISIBLE | BS_CENTER | BS_DEFPUSHBUTTON, // Window styles
20 + (notificationWidth - 40) / 2, notificationHeight - 60, (notificationWidth - 40) / 2, 30, // Position and size
hNotificationWindow, reinterpret_cast<HMENU>(BUTTON_CLOSE_ID), nullptr, nullptr // Parent window, Menu handle, Instance, Additional data
);
}
// Window procedure for the notification window
LRESULT CALLBACK NotificationWindowProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
switch (message)
{
case WM_COMMAND:
// Handle command messages
if (LOWORD(wParam) == BUTTON_OPENURL_ID)
{
// Open a website when the button is clicked
ShellExecute(nullptr, L"open", L"https://example.com", nullptr, nullptr, SW_SHOWNORMAL);
}
else if (LOWORD(wParam) == BUTTON_CLOSE_ID)
{
// Show the main window again
ShowWindow(hMainWindow, SW_SHOW);
// Clean up and exit the notification window
DestroyWindow(hNotificationWindow);
}
break;
case WM_CLOSE:
// Show the main window again
ShowWindow(hMainWindow, SW_SHOW);
// Clean up and exit the notification window
DestroyWindow(hNotificationWindow);
break;
}
return DefWindowProc(hWnd, message, wParam, lParam);
}
// Entry point
int WINAPI wWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PWSTR pCmdLine, int nCmdShow)
{
// Create and register the window class for the notification window
WNDCLASS wc = {};
wc.lpfnWndProc = NotificationWindowProc;
wc.hInstance = hInstance;
wc.lpszClassName = L"NotificationWindowClass";
RegisterClass(&wc);
// Create the main window
hMainWindow = CreateWindow(
L"MainWindowClass", // Window class name
L"Main Window", // Window title
WS_OVERLAPPEDWINDOW, // Window styles
CW_USEDEFAULT, CW_USEDEFAULT, // Position
CW_USEDEFAULT, CW_USEDEFAULT, // Size
nullptr, nullptr, hInstance, nullptr // Parent window, Menu handle, Instance, Additional data
);
// Show the main window
ShowWindow(hMainWindow, nCmdShow);
// Show the initial notification
ShowNotification();
// Message loop
MSG msg = {};
while (GetMessage(&msg, nullptr, 0, 0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
// Clean up resources
if (hBitmap != nullptr)
{
DeleteObject(hBitmap);
}
return 0;
}
Update: Here is a screenshot of my .rc file in VS. I have to see if I can find the file in my source files.
[.rc file][1]
And here is what the program currently makes when you run it.
[Program Execution Result][2]
[1]: https://i.stack.imgur.com/P9vc2.jpg
[2]: https://i.stack.imgur.com/MkLN2.png
</details>
# 答案1
**得分**: 1
切换到 GDI+ 而不是位图,它立即起作用。
感谢 @jwezorek 的帮助。
<details>
<summary>英文:</summary>
Switched over to GDI + instead of Bitmaps and it worked instantly.
Thank you for trying to help @jwezorek.
</details>
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论