![]() |
|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
![]() |
|
Опции темы | Поиск в этой теме |
![]() |
#1 |
Новичок
Джуниор
Регистрация: 22.04.2010
Сообщений: 2
|
![]()
Добрый день,уважаемые форумчане.
Проблема следующая - пишу код для вывода скриншота экрана в своё окошко, но на выходе получается только черный прямоугольник. Помогите найти ошибку: #include "stdafx.h" #include "CourseProject.h" #include "windows.h" #define MAX_LOADSTRING 100 HINSTANCE hInst; TCHAR szTitle[MAX_LOADSTRING]; TCHAR szWindowClass[MAX_LOADSTRING]; ATOM MyRegisterClass(HINSTANCE hInstance); BOOL InitInstance(HINSTANCE, int); LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); void DrawBitmap (HDC hdc,HBITMAP hBitmap,int xStart,int yStart); int APIENTRY _tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow) { UNREFERENCED_PARAMETER(hPrevInstanc e); UNREFERENCED_PARAMETER(lpCmdLine); MSG msg; HACCEL hAccelTable; LoadString(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING); LoadString(hInstance, IDC_COURSEPROJECT, szWindowClass, MAX_LOADSTRING); MyRegisterClass(hInstance); if (!InitInstance (hInstance, nCmdShow)) { return FALSE; } hAccelTable = LoadAccelerators(hInstance, MAKEINTRESOURCE(IDC_COURSEPROJECT)) ; while (GetMessage(&msg, NULL, 0, 0)) { if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg)) { TranslateMessage(&msg); DispatchMessage(&msg); } } return (int) msg.wParam; } 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_COURSEPROJECT)) ; wcex.hCursor = LoadCursor(NULL, IDC_ARROW); wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW+1); wcex.lpszMenuName = MAKEINTRESOURCE(IDC_COURSEPROJECT); wcex.lpszClassName = szWindowClass; wcex.hIconSm = LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_SMALL)); return RegisterClassEx(&wcex); } 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); if (!hWnd) { return FALSE; } ShowWindow(hWnd, nCmdShow); UpdateWindow(hWnd); return TRUE; } LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { int wmId, wmEvent; PAINTSTRUCT ps; HDC hdc,screenHDC,memoryHDC; HBITMAP screenBITMAP; DWORD screenWidth,screenHeight; HWND currentDesktop; switch (message) { case WM_COMMAND: wmId = LOWORD(wParam); wmEvent = HIWORD(wParam); switch (wmId) { case ID_FILE_GETFULLSCREENSHOT: currentDesktop = GetDesktopWindow(); screenHDC = GetDC(NULL); memoryHDC = CreateCompatibleDC(screenHDC); screenWidth=GetDeviceCaps(screenHDC , HORZRES); screenHeight=GetDeviceCaps(screenHD C, VERTRES); screenBITMAP = CreateCompatibleBitmap(screenHDC, screenWidth, screenHeight); hdc = GetDC(hWnd); DrawBitmap(hdc,screenBITMAP,0,0); break; case IDM_EXIT: DestroyWindow(hWnd); break; default: return DefWindowProc(hWnd, message, wParam, lParam); } break; case WM_PAINT: hdc = BeginPaint(hWnd, &ps); EndPaint(hWnd, &ps); break; case WM_DESTROY: PostQuitMessage(0); break; default: return DefWindowProc(hWnd, message, wParam, lParam); } return 0; } void DrawBitmap(HDC hdc,HBITMAP hBitmap,int xStart,int yStart) { BITMAP bm; HDC hdcMem; POINT ptSize,ptOrg; hdcMem=CreateCompatibleDC(hdc); SelectObject(hdcMem,hBitmap); GetObject(hBitmap,sizeof(BITMAP),(L PVOID)&bm); ptSize.x=bm.bmWidth; ptSize.y=bm.bmHeight; ptOrg.x=0; ptOrg.y=0; BitBlt(hdc,xStart,yStart,ptSize.x,p tSize.y,hdcMem,ptOrg.x,ptOrg.y,SRCC OPY); DeleteDC(hdcMem); } |
![]() |
![]() |
![]() |
#2 |
Участник клуба
Регистрация: 18.10.2008
Сообщений: 1,409
|
![]() Код:
Последний раз редактировалось counter; 22.04.2010 в 18:51. |
![]() |
![]() |
![]() |
#3 |
Новичок
Джуниор
Регистрация: 22.04.2010
Сообщений: 2
|
![]()
2 counter
Большое спасибо! Как говорится, всё гениальное просто. А вот такой вопрос - как при работе с битмапом обрезать его часть, заключенную в прямоугольник, заданный двумя точками. Суть такая - рисуем на экране прямоугольник и по паре координат вырезаем кусок экрана. |
![]() |
![]() |
![]() |
#4 | |
Участник клуба
Регистрация: 18.10.2008
Сообщений: 1,409
|
![]() Цитата:
|
|
![]() |
![]() |
![]() |
![]() |
||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Зациклился ScreenShot | Streetmagic | Мультимедиа в Delphi | 1 | 10.04.2010 17:42 |
Screenshot | W0LF | Общие вопросы Delphi | 4 | 10.10.2009 00:47 |
Игра:"ScreenShot" | Levsha100 | Свободное общение | 30 | 03.06.2009 18:10 |
screenshot | nicky | Общие вопросы C/C++ | 2 | 12.04.2009 14:12 |
Программа Magic Screenshot - простейший способ обменяться скриншотами | roverspam | Софт | 0 | 17.09.2008 23:07 |