winapi — Win 32 GUI c ++ .bmp Изображение не отображается

Я на самом деле следовал учебнику. Я действительно хочу получить ответ, потому что мне нужно будет добавить значки в окно внизу строки. Получение изображений для отображения в окне будет первым шагом.

Извините, по какой-то причине добавленное мной обновление не прошло раньше. Мое решение ориентировано на Unicode.

Исправленный обновленный файл находится ниже:

#include <windows.h>
#include <commctrl.h>

using namespace std;

LPCWSTR szClassName = L"myWindowClass";

HWND hLogo;
HBITMAP hLogoImage;

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

void loadPictures();
void parentControls(HWND);

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int icmdshow)
{

HWND hWnd;

WNDCLASSW wc = { 0 };

wc.style = 0;
wc.lpszMenuName = NULL;
wc.lpszClassName = szClassName;
wc.lpfnWndProc = WndProc;
wc.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1);
wc.hInstance = hInstance;
wc.hIcon = LoadIconW(NULL, IDI_APPLICATION);
wc.hCursor = LoadCursorW(NULL, IDC_ARROW);
wc.cbWndExtra = 0;
wc.cbClsExtra = 0;if (!RegisterClassW(&wc))
{
const wchar_t Error01[] = L"Register Issue To Check On : ";   /// Notice this
const wchar_t Error01_Caption[] = L"Error 01";

MessageBoxW(NULL, Error01, Error01_Caption, MB_OK | MB_ICONERROR);

return 0;
}

LPCWSTR parentWinTitle = L"My Window";

hWnd = CreateWindowW(szClassName, parentWinTitle, WS_OVERLAPPEDWINDOW | WS_VISIBLE, 100, 100, 250, 200, NULL, NULL, NULL, NULL);

if (hWnd == NULL)
{

const wchar_t Error02[] = L"Window Creation Issue To Check On : ";
const wchar_t Error02_Caption[] = L"Window Creation Issue To Check On : ";
MessageBoxW(NULL, Error02, Error02_Caption, MB_OK | MB_ICONERROR);

}
ShowWindow(hWnd, icmdshow);
UpdateWindow(hWnd);MSG msg = { 0 };

while (GetMessageW(&msg, NULL, 0, 0))
{

TranslateMessage(&msg);
DispatchMessageW(&msg);

}

return 0;
}

LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{

switch (message)
{
case WM_CREATE:
loadPictures();    /// Must be called first, Calling the Images function in Create
parentControls(hWnd);
break;
/*  case WM_COMMAND:
switch (wParam)
{

}
break;
*/
case WM_DESTROY:
PostQuitMessage(0);
break;
default:
return DefWindowProcW(hWnd, message, wParam, lParam);
}
return 0;
}void parentControls(HWND hWnd)
{
hLogo = CreateWindowW(WC_STATICW, NULL, WS_VISIBLE | WS_CHILD | SS_BITMAP, 70, 25, 100, 100, hWnd, NULL, NULL, NULL);
SendMessageW(hLogo, STM_SETIMAGE, IMAGE_BITMAP, (LPARAM)hLogoImage);
}

void loadPictures()
{   /// bmp image save in file with main.cpp
LPCWSTR myBmp = L"bitmap1.bmp";
hLogoImage = (HBITMAP)LoadImageW(NULL, myBmp, IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE);
}

-1

Решение

case WM_COMMAND:
switch(wp)
{
}
break;
parentControls(hWnd); <--- never gets here
loadPictures();    /// Calling the Images function in Create
break;

parentControls а также loadPictures никогда не достигаются в этом заявлении переключателя.

loadPictures должен быть вызван первым.

Удалите две строки, поместите их в WM_CREATE следующее:

case WM_CREATE:
loadPictures();    /// Calling the Images function in Create
parentControls(hWnd);
break;
1

Другие решения

Кто-то сказал мне, что ответ должен быть здесь, а не обновляться выше. Я уверен, что я буду знать, что это неправильно, если я добавлю это здесь. Я думаю, что именно поэтому обновления не выполнялись, когда я попробовал их раньше в оригинальном посте выше. В любом случае обновление / ответ ниже.

#include <windows.h>
#include <commctrl.h>

using namespace std;

LPCWSTR szClassName = L"myWindowClass";

HWND hLogo;
HBITMAP hLogoImage;

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

void loadPictures();
void parentControls(HWND);

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int icmdshow)
{

HWND hWnd;

WNDCLASSW wc = { 0 };

wc.style = 0;
wc.lpszMenuName = NULL;
wc.lpszClassName = szClassName;
wc.lpfnWndProc = WndProc;
wc.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1);
wc.hInstance = hInstance;
wc.hIcon = LoadIconW(NULL, IDI_APPLICATION);
wc.hCursor = LoadCursorW(NULL, IDC_ARROW);
wc.cbWndExtra = 0;
wc.cbClsExtra = 0;if (!RegisterClassW(&wc))
{
const wchar_t Error01[] = L"Register Issue To Check On : ";   /// Notice this
const wchar_t Error01_Caption[] = L"Error 01";

MessageBoxW(NULL, Error01, Error01_Caption, MB_OK | MB_ICONERROR);

return 0;
}

LPCWSTR parentWinTitle = L"My Window";

hWnd = CreateWindowW(szClassName, parentWinTitle, WS_OVERLAPPEDWINDOW | WS_VISIBLE, 100, 100, 250, 200, NULL, NULL, NULL, NULL);

if (hWnd == NULL)
{

const wchar_t Error02[] = L"Window Creation Issue To Check On : ";
const wchar_t Error02_Caption[] = L"Window Creation Issue To Check On : ";
MessageBoxW(0, Error02, Error02_Caption, MB_OK | MB_ICONERROR);

}
ShowWindow(hWnd, icmdshow);
UpdateWindow(hWnd);MSG msg = { 0 };

while (GetMessageW(&msg, NULL, 0, 0))
{

TranslateMessage(&msg);
DispatchMessageW(&msg);

}

return 0;
}

LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{

switch (message)
{
case WM_CREATE:
loadPictures();    /// Must be called first, Calling the Images function in Create
parentControls(hWnd);
break;
/*  case WM_COMMAND:
switch (wParam)
{

}
break;
*/
case WM_DESTROY:
PostQuitMessage(0);
break;
default:
return DefWindowProcW(hWnd, message, wParam, lParam);
}
return 0;
}void parentControls(HWND hWnd)
{
hLogo = CreateWindowW(WC_STATICW, NULL, WS_VISIBLE | WS_CHILD | SS_BITMAP, 70, 25, 100, 100, hWnd, NULL, NULL, NULL);
SendMessageW(hLogo, STM_SETIMAGE, IMAGE_BITMAP, (LPARAM)hLogoImage);
}

void loadPictures()
{   /// bmp image save in file with main.cpp
LPCWSTR myBmp = L"bitmap1.bmp";
hLogoImage = (HBITMAP)LoadImageW(NULL, myBmp, IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE);
}
0

По вопросам рекламы [email protected]