Skip to content

Instantly share code, notes, and snippets.

@KuryTravu
Created April 29, 2025 11:06
Show Gist options
  • Save KuryTravu/5da9eabd1c0bc37b7c2bd998cd72b431 to your computer and use it in GitHub Desktop.
Save KuryTravu/5da9eabd1c0bc37b7c2bd998cd72b431 to your computer and use it in GitHub Desktop.
Kursovaya_promezhutok
#include <windows.h>
#include <commdlg.h>
HBITMAP hBitmap = NULL;
HWND hButton;
HBITMAP LoadBMP(LPCWSTR path) {
return (HBITMAP)LoadImageW(NULL, path, IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE);
}
void OpenBitmapFile(HWND hwnd) {
wchar_t fileName[MAX_PATH] = L"";
OPENFILENAMEW ofn = {};
ofn.lStructSize = sizeof(ofn);
ofn.hwndOwner = hwnd;
ofn.lpstrFilter = L"BMP Files\0*.bmp\0All Files\0*.*\0";
ofn.lpstrFile = fileName;
ofn.nMaxFile = MAX_PATH;
ofn.Flags = OFN_FILEMUSTEXIST | OFN_PATHMUSTEXIST;
ofn.lpstrTitle = L"Выберите BMP-файл";
if (GetOpenFileNameW(&ofn)) {
if (hBitmap) DeleteObject(hBitmap);
hBitmap = LoadBMP(fileName);
if (!hBitmap) {
DWORD err = GetLastError();
wchar_t errMsg[256];
wsprintfW(errMsg, L"Ошибка загрузки BMP! Код: %d", err);
MessageBoxW(hwnd, errMsg, L"Ошибка", MB_OK | MB_ICONERROR);
}
else {
InvalidateRect(hwnd, NULL, TRUE);
}
}
}
void DrawBitmap(HWND hwnd, HDC hdc) {
if (!hBitmap) return;
HDC hdcMem = CreateCompatibleDC(hdc);
HBITMAP hbmOld = (HBITMAP)SelectObject(hdcMem, hBitmap);
BITMAP bmp;
GetObject(hBitmap, sizeof(BITMAP), &bmp);
int newWidth = 800;
int newHeight = 600 - 50;
StretchBlt(hdc, 0, 50, newWidth, newHeight,
hdcMem, 0, 0, bmp.bmWidth, bmp.bmHeight, SRCCOPY);
SelectObject(hdcMem, hbmOld);
DeleteDC(hdcMem);
}
LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) {
switch (msg) {
case WM_CREATE:
hButton = CreateWindowW(L"BUTTON", L"Открыть файл",
WS_VISIBLE | WS_CHILD | BS_PUSHBUTTON,
10, 10, 150, 30, hwnd, (HMENU)1, NULL, NULL);
break;
case WM_COMMAND:
if (LOWORD(wParam) == 1) {
OpenBitmapFile(hwnd);
}
break;
case WM_PAINT:
{
PAINTSTRUCT ps;
HDC hdc = BeginPaint(hwnd, &ps);
DrawBitmap(hwnd, hdc);
EndPaint(hwnd, &ps);
}
break;
case WM_GETMINMAXINFO:
{
MINMAXINFO* pMMI = (MINMAXINFO*)lParam;
pMMI->ptMinTrackSize.x = 800;
pMMI->ptMinTrackSize.y = 600;
pMMI->ptMaxTrackSize.x = 800;
pMMI->ptMaxTrackSize.y = 600;
}
return 0;
case WM_DESTROY:
if (hBitmap) DeleteObject(hBitmap);
PostQuitMessage(0);
break;
default:
return DefWindowProc(hwnd, msg, wParam, lParam);
}
return 0;
}
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) {
WNDCLASSW wc = { 0 };
wc.lpfnWndProc = WndProc;
wc.hInstance = hInstance;
wc.lpszClassName = L"MainWinClass";
RegisterClassW(&wc);
HWND hwnd = CreateWindowW(wc.lpszClassName, L"BMP Viewer",
WS_OVERLAPPED | WS_CAPTION | WS_SYSMENU | WS_MINIMIZEBOX,
CW_USEDEFAULT, CW_USEDEFAULT, 800, 600,
NULL, NULL, hInstance, NULL);
ShowWindow(hwnd, nCmdShow);
UpdateWindow(hwnd);
MSG msg = { 0 };
while (GetMessage(&msg, NULL, 0, 0)) {
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return (int)msg.wParam;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment