|
Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » Win32 API - Вывод картинок |
|
|
Win32 API - Вывод картинок
|
Новый участник Сообщения: 8 |
Есть картинка (1 слой) сверху на нее нажалуется слой какимто цветом, потом вырезая второй слой мы открываем 1 слой. Как это сделать? Пробовал просто их вывести вроде все работает тока мигает очень сильно.
|
|
Отправлено: 20:03, 10-02-2010 |
![]() Старожил Сообщения: 467
|
Профиль | Отправить PM | Цитировать Используйте двойную буферизацию, мерцание пропадет.
|
------- Отправлено: 20:58, 10-02-2010 | #2 |
Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети. Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля. |
Новый участник Сообщения: 8
|
Профиль | Отправить PM | Цитировать Сперва виводил так:
/*BITMAP bm; HDC hdcMem = CreateCompatibleDC(hdc); HBITMAP hbmOld = (HBITMAP) SelectObject(hdcMem, (HBITMAP) hBitmap); GetObject(hBitmap, sizeof(bm), &bm); BitBlt(hdc, x, y, bm.bmWidth, bm.bmHeight, hdcMem,0,0, SRCCOPY); SelectObject(hdcMem, hbmOld); DeleteDC(hdcMem);*/ А это должна быть двойная буферизаци но чета неработает BITMAP bm; HDC hdcMem; HBITMAP hbmMem; HANDLE hOld; PAINTSTRUCT ps; // Создаем off-screen DC для двойной буферизации hdcMem = CreateCompatibleDC(hdc); hbmMem = CreateCompatibleBitmap(hdc, bm.bmWidth, bm.bmHeight ); hOld = SelectObject(hdcMem, hbmMem); // Здесь рисуем в hdcMem BitBlt(hdc, x, y, bm.bmWidth, bm.bmHeight, hdcMem, 0, 0, SRCCOPY); // Освобождаем память SelectObject(hdcMem, hOld); DeleteObject(hbmMem); DeleteDC (hdcMem); return 0; Пишет Run-Time Check Failure #3 - The variable 'bm' is being used without being initialized. |
Отправлено: 22:00, 10-02-2010 | #3 |
![]() Старожил Сообщения: 467
|
Профиль | Отправить PM | Цитировать У вас походу просто bm не использовался, тоесть вы просто не присвоили bm никакого значения
|
------- Отправлено: 22:49, 10-02-2010 | #4 |
Новый участник Сообщения: 8
|
Профиль | Отправить PM | Цитировать Теперь выводит черный фон. Думаю я неправильно загружаю изображение. HBITMAP hBitmapWallper = (HBITMAP)
LoadImage(NULL, L"Wallper.bmp", IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE); |
|
Отправлено: 01:04, 11-02-2010 | #5 |
![]() Ветеран Сообщения: 1180
|
Профиль | Отправить PM | Цитировать мне кажется дело в CreateCompatibleDC и CreateCompatibleBitmap. Можно код (оформленный тегом code, с комментариями)? я покажу, где ошибка
|
Отправлено: 08:08, 11-02-2010 | #6 |
Новый участник Сообщения: 8
|
Профиль | Отправить PM | Цитировать [code]
// uo.cpp: определяет точку входа для приложения. // #include "stdafx.h" #include "uo.h" #define MAX_LOADSTRING 100 // Глобальные переменные: HINSTANCE hInst; // текущий экземпляр TCHAR szTitle[MAX_LOADSTRING]; // Текст строки заголовка TCHAR szWindowClass[MAX_LOADSTRING]; // имя класса главного окна int x=0,y=0; HBITMAP hBitmapWallper = (HBITMAP) LoadImage(NULL, L"Wallper.bmp", IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE); HBITMAP hBitmap1 = (HBITMAP) LoadImage(NULL, L"1.bmp", IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE); HBITMAP hBitmapField = (HBITMAP) LoadImage(NULL, L"Field.bmp", IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE); // Отправить объявления функций, включенных в этот модуль кода: ATOM MyRegisterClass(HINSTANCE hInstance); BOOL InitInstance(HINSTANCE, int); LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); INT_PTR CALLBACK About(HWND, UINT, WPARAM, LPARAM); int DrawImage(HDC hdc, HBITMAP hBitmap, int x, int y); int OnPaint(HWND hWnd); static HBRUSH hBkBrush; // узорная кисть HBITMAP hBmpBkgr; // растр для узорной кисти int DrawField(HDC hdc); int APIENTRY _tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow) { UNREFERENCED_PARAMETER(hPrevInstance); UNREFERENCED_PARAMETER(lpCmdLine); // TODO: разместите код здесь. MSG msg; HACCEL hAccelTable; // Инициализация глобальных строк LoadString(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING); LoadString(hInstance, IDC_UO, szWindowClass, MAX_LOADSTRING); MyRegisterClass(hInstance); // Выполнить инициализацию приложения: if (!InitInstance (hInstance, nCmdShow)) { return FALSE; } hAccelTable = LoadAccelerators(hInstance, MAKEINTRESOURCE(IDC_UO)); // Цикл основного сообщения: while (GetMessage(&msg, NULL, 0, 0)) { if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg)) { TranslateMessage(&msg); DispatchMessage(&msg); } } return (int) msg.wParam; } // // ФУНКЦИЯ: MyRegisterClass() // // НАЗНАЧЕНИЕ: регистрирует класс окна. // // КОММЕНТАРИИ: // // Эта функция и ее использование необходимы только в случае, если нужно, чтобы данный код // был совместим с системами Win32, не имеющими функции RegisterClassEx' // которая была добавлена в Windows 95. Вызов этой функции важен для того, // чтобы приложение получило "качественные" мелкие значки и установило связь // с ними. // ATOM MyRegisterClass(HINSTANCE hInstance) { WNDCLASSEX wcex; wcex.cbSize = sizeof(WNDCLASSEX); wcex.style = CS_HREDRAW | CS_VREDRAW; wcex.lpfnWndProc = WndProc; wcex.cbClsExtra = 0; wcex.cbWndExtra = 0; wcex.hInstance = hInstance; wcex.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_UO)); wcex.hCursor = LoadCursor(NULL, IDC_ARROW); wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW+1); wcex.lpszMenuName = MAKEINTRESOURCE(IDC_UO); wcex.lpszClassName = szWindowClass; wcex.hIconSm = LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_SMALL)); return RegisterClassEx(&wcex); } // // ФУНКЦИЯ: InitInstance(HINSTANCE, int) // // НАЗНАЧЕНИЕ: сохраняет обработку экземпляра и создает главное окно. // // КОММЕНТАРИИ: // // В данной функции дескриптор экземпляра сохраняется в глобальной переменной, а также // создается и выводится на экран главное окно программы. // BOOL InitInstance(HINSTANCE hInstance, int nCmdShow) { HWND hWnd; hInst = hInstance; // Сохранить дескриптор экземпляра в глобальной переменной hWnd = CreateWindow(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL); hBmpBkgr = LoadBitmap((HINSTANCE)GetWindowLong(hWnd, GWL_HINSTANCE), MAKEINTRESOURCE(IDB_STONE)); hBkBrush = CreatePatternBrush(hBmpBkgr); SetClassLong(hWnd, GCL_HBRBACKGROUND, (LONG)hBkBrush); if (!hWnd) { return FALSE; } ShowWindow(hWnd, nCmdShow); UpdateWindow(hWnd); return TRUE; } // // ФУНКЦИЯ: WndProc(HWND, UINT, WPARAM, LPARAM) // // НАЗНАЧЕНИЕ: обрабатывает сообщения в главном окне. // // WM_COMMAND - обработка меню приложения // WM_PAINT -Закрасить главное окно // WM_DESTROY - ввести сообщение о выходе и вернуться. // // LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { int wmId, wmEvent; HDC hdc; RECT rectt={x,y,x+15,y+15}; switch (message) { case WM_KEYDOWN: { switch(wParam) { case 40: { // Move = kDown; x=x+10; //GetWindowRect(hWnd, &rectt); InvalidateRect(hWnd, &rectt, FALSE); //UpdateWindow(hWnd); break; } case 38: { y=y+10; break; } case 39: { break; } case 37: { // Move = kLeft; break; } } SendMessage(hWnd, WM_PAINT, 1, 0); break; } case WM_COMMAND: wmId = LOWORD(wParam); wmEvent = HIWORD(wParam); // Разобрать выбор в меню: switch (wmId) { case IDM_about: DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, About); break; case IDM_EXIT: DestroyWindow(hWnd); break; default: return DefWindowProc(hWnd, message, wParam, lParam); } break; case WM_PAINT: { OnPaint(hWnd); break; } case WM_DESTROY: PostQuitMessage(0); break; default: return DefWindowProc(hWnd, message, wParam, lParam); } return 0; } // Обработчик сообщений для окна "О программе". INT_PTR CALLBACK About(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) { UNREFERENCED_PARAMETER(lParam); switch (message) { case WM_INITDIALOG: return (INT_PTR)TRUE; case WM_COMMAND: if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL) { EndDialog(hDlg, LOWORD(wParam)); return (INT_PTR)TRUE; } break; } return (INT_PTR)FALSE; } int DrawImage(HDC hdc, HBITMAP hBitmap, int x, int y) { /*BITMAP bm; HDC hdcMem = CreateCompatibleDC(hdc); HBITMAP hbmOld = (HBITMAP) SelectObject(hdcMem, (HBITMAP) hBitmap); GetObject(hBitmap, sizeof(bm), &bm); BitBlt(hdc, x, y, bm.bmWidth, bm.bmHeight, hdcMem,0,0, SRCCOPY); SelectObject(hdcMem, hbmOld); DeleteDC(hdcMem);*/ BITMAP bm; HDC hdcMem; HBITMAP hbmMem; HANDLE hOld; //HDC hdc; GetObject(hBitmap, sizeof(bm), &bm); // Создаем off-screen DC для двойной буферизации hdcMem = CreateCompatibleDC(hdc); hbmMem = CreateCompatibleBitmap(hdc, bm.bmWidth, bm.bmHeight ); hOld = SelectObject(hdcMem, hbmMem); BitBlt(hdc, x, y, bm.bmWidth, bm.bmHeight, hdcMem,0,0, SRCCOPY); // Освобождаем память SelectObject(hdcMem, hOld); DeleteObject(hbmMem); DeleteDC (hdcMem); return 0; } int OnPaint(HWND hWnd) { PAINTSTRUCT ps; HDC hdc; hdc = BeginPaint(hWnd, &ps); DrawField(hdc); EndPaint(hWnd, &ps); return 0; } int DrawField(HDC hdc) { DrawImage (hdc, hBitmapWallper, 1 , 1); // TODO: добавьте любой код отрисовки... for(int e=0;e<100;e=e+5) for(int yy=0;yy<100;yy=yy+5) { } return 0; } [\code] |
Отправлено: 12:19, 11-02-2010 | #7 |
![]() Ветеран Сообщения: 1180
|
Профиль | Отправить PM | Цитировать Цитата Lev:
|
|
Отправлено: 16:29, 11-02-2010 | #8 |
Новый участник Сообщения: 8
|
Профиль | Отправить PM | Цитировать А как тогда? Этот кусок кода нашел в интернете.
|
Отправлено: 17:50, 12-02-2010 | #9 |
![]() Старожил Сообщения: 467
|
Профиль | Отправить PM | Цитировать Lev, вот функция, которая рисует изображение:
VOID MyPaint(HWND drawitem, LPCSTR picture) { HDC hdc,MemDC; PAINTSTRUCT ps; HBITMAP hbmp = LoadImage(NULL, picture, IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE); hdc = BeginPaint(drawitem, &ps); MemDC = CreateCompatibleDC(hdc); SelectObject(MemDC, hbmp); BitBlt(hdc, 10, 10, 450, 400, MemDC, 0, 0, SRCCOPY); DeleteDC(MemDC); DeleteObject(hbmp); EndPaint(drawitem, &ps); } |
------- Отправлено: 17:58, 12-02-2010 | #10 |
|
![]() |
Участник сейчас на форуме |
![]() |
Участник вне форума |
![]() |
Автор темы |
![]() |
Сообщение прикреплено |
| |||||
Название темы | Автор | Информация о форуме | Ответов | Последнее сообщение | |
Загрузка картинок | alleclf | Вебмастеру | 2 | 25-09-2008 16:19 | |
Разрешение картинок | Surround | Мобильные ОС, смартфоны и планшеты | 3 | 06-10-2005 00:34 | |
поиск картинок | badze | Хочу все знать | 5 | 29-03-2004 09:34 | |
Сохранение картинок | Guest | Хочу все знать | 2 | 16-03-2004 19:25 | |
Прелоад картинок | Vampire | Вебмастеру | 2 | 18-11-2003 23:58 |
|