Created
April 29, 2025 11:06
-
-
Save KuryTravu/5da9eabd1c0bc37b7c2bd998cd72b431 to your computer and use it in GitHub Desktop.
Kursovaya_promezhutok
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#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