Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Win Api
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 22.04.2010, 16:09   #1
susel
Новичок
Джуниор
 
Регистрация: 22.04.2010
Сообщений: 2
По умолчанию Screenshot на WInAPI

Добрый день,уважаемые форумчане.

Проблема следующая - пишу код для вывода скриншота экрана в своё окошко, но на выходе получается только черный прямоугольник. Помогите найти ошибку:

#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);
}
susel вне форума Ответить с цитированием
Старый 22.04.2010, 18:48   #2
counter
Участник клуба
 
Регистрация: 18.10.2008
Сообщений: 1,409
По умолчанию

Код:
screenHDC = GetDC(0);
screenWidth=GetDeviceCaps(screenHDC , HORZRES); 
screenHeight=GetDeviceCaps(screenHDC, VERTRES);
hdc = GetDC(hWnd);
//BitBlt(hdc,0,0,screenWidth,screenHeight,screenHDC,0,0,SRCCOPY); // выводит без масштаба
StretchBlt(hdc,0,0,500,400,screenHDC,0,0,screenWidth,screenHeight,SRCCOPY);// с масштабом

Последний раз редактировалось counter; 22.04.2010 в 18:51.
counter вне форума Ответить с цитированием
Старый 27.04.2010, 22:02   #3
susel
Новичок
Джуниор
 
Регистрация: 22.04.2010
Сообщений: 2
По умолчанию

2 counter
Большое спасибо!
Как говорится, всё гениальное просто.

А вот такой вопрос - как при работе с битмапом обрезать его часть, заключенную в прямоугольник, заданный двумя точками.

Суть такая - рисуем на экране прямоугольник и по паре координат вырезаем кусок экрана.
susel вне форума Ответить с цитированием
Старый 28.04.2010, 21:04   #4
counter
Участник клуба
 
Регистрация: 18.10.2008
Сообщений: 1,409
По умолчанию

Цитата:
А вот такой вопрос - как при работе с битмапом обрезать его часть, заключенную в прямоугольник, заданный двумя точками.
StretchBlt не подойдет?
counter вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Зациклился 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