Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "WinAPI";
Текущий архив: 2004.02.02;
Скачать: [xml.tar.bz2];

Вниз

HDC   Найти похожие ветки 

 
chi   (2003-11-20 19:56) [0]

доброе время суток мастера!! Помогите понять пожалуйста ,DC, HDC, HAndle и как с ними "бороться". Вот, например функция :
...
BitBlt(HDCvar,X,Y,200, 300,hdcSC,0,0,SRCCOPY) записывает в HDCvar, если я правильно понял, некое вырезанное изображение, а как мне, скажем этот HDC сохранить в файл?
И где можно достать русскоязычную документацию??
Заранее благодарю


 
Rouse_   (2003-11-20 20:25) [1]

TBitmap.Canvas.Handle = HDC

Это в общем случае

Желаю успехов


 
chi   (2003-11-20 20:27) [2]

спасибо , но хотелось бы на API :)


 
Rouse_   (2003-11-20 22:25) [3]

Ну лови, если разберешся ;)

program Picture_Demo;

// Подключаем ресурсы (для отладки)
{$R "Resource.res" "Resource.rc"}

//{$DEFINE STRETCH}

uses
Windows,
Messages;

var
MainWindow : TWndClassEx;
Handle : HWND;
Msg : TMsg;
Left,
Top,
Width,
Height : Integer;
ResourceName : array of ShortString;
Cycle : Cardinal;

// Центрирование формы
procedure CenterMainForm;
var
ScrWidth, ScrHeight: Cardinal;
begin
ScrWidth := GetSystemMetrics(SM_CXSCREEN);
ScrHeight := GetSystemMetrics(SM_CYSCREEN);
Left := (Integer(ScrWidth) - Width) div 2;
Top := (Integer(ScrHeight) - Height) div 2;
end;

// Определение размеров картинки
function PictureSize(const Name: String): TSize;
var
ResHandle: HWND;
ResData: HWND;
BMI: PBitmapInfo;
begin
Result.cx := 0;
Result.cy := 0;
if Name = "" then Exit;
ResHandle := FindResource(HInstance,
PAnsiChar(Name), RT_BITMAP);
if ResHandle <> 0 then
begin
ResData := LoadResource(HInstance, ResHandle);
if ResData <> 0 then
begin
BMI := LockResource(ResData);
if Assigned(BMI) then
begin
Result.cx := BMI.bmiHeader.biWidth;
Result.cy := BMI.bmiHeader.biHeight;
end; {if Assigned(BMI) }
UnlockResource(ResData);
FreeResource(ResData);
end; {if ResData <> 0 }
end; {if ResHandle <> 0 }
end;

// Получение списка ресурсов
procedure GetResourceList;

function CallBack(hModule: HMODULE; lpType: PChar;
lpzName: LPTSTR; lParam: Longint): BOOL; stdcall;
var
Size: Cardinal;
{$IFNDEF STRETCH}
BitmapSize: TSize;
{$ENDIF}
begin
Result := True;
if Assigned(lpzName) then
begin
Size := Length(ResourceName);
Inc(Size);
SetLength(ResourceName, Size);
ResourceName[Size - 1] := String(lpzName);
{$IFNDEF STRETCH}
BitmapSize := PictureSize(ResourceName[Size - 1]);
with BitmapSize do
begin
if Width < cx then Width := cx;
if Height < cy then Height := cy;
end;
{$ENDIF}
end; {if Assigned(lpzName) }
end;

begin
ResourceName := nil;
EnumResourceNames(HInstance, RT_BITMAP, @CallBack, 0);
end;

// Отрисовка картинки на форме
procedure ShowPicture(const Index: Cardinal);
var
Bitmap: HBITMAP;
BitmapSize: TSize;
DC, BitmapDC, OldDC: HDC;
{$IFNDEF STRETCH}
bLeft, bTop: Cardinal;
Rect: TRect;
Brush: HBRUSH;
{$ENDIF}
begin
if Length(ResourceName) > Index then
begin
Bitmap := LoadBitmap(HInstance,
PAnsiChar(String(ResourceName[Index])));
if Bitmap <> 0 then
begin
BitmapSize := PictureSize(ResourceName[Index]);
DC := GetDC(Handle);
BitmapDC := CreateCompatibleDC(DC);
OldDC := SelectObject(BitmapDC, Bitmap);
{$IFDEF STRETCH}
with BitmapSize do
StretchBlt(DC, 0, 0, Width, Height, BitmapDC, 0, 0, cx, cy, SRCCOPY);
{$ELSE}
GetClientRect(Handle, Rect);
Brush := GetSysColorBrush(COLOR_BTNFACE);
FillRect(DC, Rect, Brush);
bLeft := (Width - BitmapSize.cx) div 2;
bTop := (Height - BitmapSize.cy) div 2;
BitBlt(DC, bLeft, bTop, Width, Height, BitmapDC, 0, 0, SRCCOPY);
{$ENDIF}
SelectObject(OldDC, Bitmap);
DeleteDC(BitmapDC);
ReleaseDC(Handle, DC);
DeleteObject(Bitmap);
end; {if Bitmap <> 0 }
end; {if Length(ResourceName) > Index }
end;

// Главная оконная процедура
function WindowProc(Wnd: HWND; Msg: Integer;
WParam: WPARAM; LParam: LPARAM): LRESULT; stdcall;
begin
Result := 0;
case Msg of
WM_DESTROY:
begin
PostQuitMessage(0);
Exit;
end;
WM_TIMER:
begin
Inc(Cycle);
if Cycle = Length(ResourceName) then Cycle := 0;
ShowPicture(Cycle);
end;
else
Result := DefWindowProc(Wnd, Msg, WParam, LParam);
end;
end;

// Здесь программа стартует
begin
with MainWindow do
begin
cbSize := SizeOf(MainWindow);
style := CS_HREDRAW or CS_VREDRAW;
lpfnWndProc := @WindowProc;
cbClsExtra := 0;
cbWndExtra := 0;
hIcon := LoadIcon(0, IDI_APPLICATION);
hCursor := LoadCursor(0, IDC_ARROW);
hbrBackground := COLOR_BTNFACE + 1;
lpszMenuName := nil;
lpszClassName := "TPicEXEex";
end;
MainWindow.hInstance := HInstance;
RegisterClassEx(MainWindow);
{$IFDEF STRETCH}
Width := 500;
Height := 400;
{$ENDIF}
GetResourceList;
CenterMainForm;
Handle := CreateWindowEx(0, "TPicEXEex",
"Показ картинки в ЕХЕ", WS_OVERLAPPED or WS_SYSMENU,
Left, Top, Width, Height, 0, 0, HInstance, nil);
ShowWindow(Handle, SW_SHOW);
SetWindowPos(Handle, HWND_TOPMOST, 0, 0, 0, 0,
SWP_NOSIZE or SWP_NOMOVE);
Cycle := 0;
ShowPicture(Cycle);
SetTimer(Handle, 1, 1000, nil);
while GetMessage(Msg, 0, 0, 0) do
begin
TranslateMessage(Msg);
DispatchMessage(Msg);
end;
end.


Желаю успехов


 
Игорь Шевченко   (2003-11-20 22:43) [4]

Я очень извиняюсь, а где в этом коде сохранение в файл ?


 
Rouse_   (2003-11-20 22:59) [5]

Это ответ на
> Помогите понять пожалуйста ,DC, HDC, HAndle
А сохранения здесь действительно нет...


 
chi   (2003-11-21 01:10) [6]

>Rouse_
жаль конечно что сохранения нет..но код все таки у себя сохранил :)


 
Digitman   (2003-11-21 08:49) [7]


> chi


см. GetDIBits()

ф-ция позволит скопировать в буфер, а дальше содержимое буфера любым удобным способом пишешь в файл


 
chi   (2003-11-21 13:51) [8]

дело в том, что не совсем понимаю что-же передается переменной bits этой функции и как же это записать в виде BMP..?? На сколько я понимаю передается только сама карта бит и записывать этот буфер в файл по-моему бессмысленно...или я тупой :((
может на русском есть что-нибудь на эту тему??


 
Думкин   (2003-11-21 14:04) [9]

На русском - например, Фэнь Юань.


 
chi   (2003-11-21 14:15) [10]

>Думкин © (21.11.03 14:04) [9]

остроумно, но не в тему :/


 
Игорь Шевченко   (2003-11-21 14:31) [11]

chi (21.11.03 14:15)

Как раз в тему. Почитаешь - поймешь сам.


 
chi   (2003-11-21 14:38) [12]

Удалено модератором
Примечание: Offtopic


 
Vetal   (2003-11-21 15:37) [13]

Вобще, HDC - это дескриптор контекста устройства (Device Context).

То бишь есть некая структура в памяти, описывающая определенное логическое устройсто (дисплей, принтер, память, окно и т.п.). Она содержит параметры устройства и его данные. Как-то например, битовое изображение на этом устройстве. HDC - это 4 байтное значение, которое является идентификатором этого устройства. При помощи этого идентификатора операционная система оперирует с нужным логическим устройством при вызове разных функций.

Теперь по поводу как сохранить изображение. Тебе нужно разобраться с форматом BMP файла. Для тру колор БМП-файл состоит из двух частей - заголовок (типа struct) и собсно биты.
Сам заполняешь заголовок, записываешь его в файл, а потом записываешь в этот файл биты.

Где почитать - лучше всего в MSDN (если нет на компе - msdn.microsoft.com). Почитай там или в другом месте про GDI. Там все описано.

А еще поищи в твоем случае формат БМП-файла. Или попробуй найти более низкоуровневый компонент наподобии TBitmap, чем таковой есть в Делфи.


 
chi   (2003-11-21 16:09) [14]

>Vetal со структурой понял, а что есть HBITMAp ??
Вот кусок кода:
var
hdcScreen,hdcCompatible:HDC;
hbmScreen: Hbitmap;
bit:Pointer;
begin
hdcScreen := GetDC(0);
hdcCompatible := CreateCompatibleDC(hdcScreen);
//
//Create a compatible bitmap for hdcScreen.
//
hbmScreen:= CreateCompatibleBitmap(hdcScreen,
GetDeviceCaps(hdcScreen, HORZRES),

GetDeviceCaps(hdcScreen, VERTRES));

// Select the bitmaps into the compatible DC. */

if SelectObject(hdcCompatible, hbmScreen)<>0 then
showmessage("Compatible Bitmap Selection");

//
// Copy color data for the entire display into a
//bitmap that is selected into a compatible DC.
if not BitBlt(hdcCompatible,
0,0,
200, 300,
hdcScreen,
0,0,
SRCCOPY) then

showmessage("Screen to Compat Blt Failed");
ShowWindow(handle, SW_SHOW);

здесь, если я правильно понимаю, создается скриншот экрана и обрезается , в hdcCompatible хроанится handle изображения.. а вопос такой: в GetDIBits(dc,bitmap,...) в какую из переменных что передавать?? //я кажется совсем запутался :(


 
Vetal   (2003-11-21 16:33) [15]


> а что есть HBITMAp ??

Есть такой GDI-объект - битмап. Так вот HBitmap - это дескриптор, идентифицирующий этот объект.


> в hdcCompatible хроанится handle изображения..

hdcCompatible - это хендл (идентификатор) контекста, совместимого с контекстом экрана. В каждый контекст можно выбрать один GDI-объект каждого типа (есть битмап, шрифт, перо, кисть, регион и т.п.), который будет являться текущим. Так вот, ты в контекст выбираешь битмап, который будет являтся текущим битмапом этого контекста. Когда ты фукнцией BitBlt копируешь часть изображения с одного контекста на другой, в hdcCompatible в его битмапе заполняются необходимые биты.

По поводу GetDIBits почитай в МСДН, я уже так сразу не помню.

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

Вобще правильным подходом к твоей проблеме было бы отойти от того участка кода в котором ты разбираешься, сначала почитать как устроен GDI, тогда тебе будет понятно, что же делать твоя прога. И будет легко разобраться в дальнейшем во всех вопросах, которые ты сейчас задаешь.


 
chi   (2003-11-22 00:15) [16]

ладно, тогда если можно последний глупый вопрос: что я должен передавать этой функции
CreateBMPFile(pszFile:Pchar;pbi:PBITMAPINFO;hBMP:HBITMAP;hDCn:HDC);

в контексте данного кода??

var
hdcScreen,hdcCompatible:HDC;
hbmScreen: Hbitmap;
bit:Pointer;
begin
hdcScreen := GetDC(0);
hdcCompatible := CreateCompatibleDC(hdcScreen);
//
//Create a compatible bitmap for hdcScreen.
//
hbmScreen:= CreateCompatibleBitmap(hdcScreen,
GetDeviceCaps(hdcScreen, HORZRES),

GetDeviceCaps(hdcScreen, VERTRES));
if SelectObject(hdcCompatible, hbmScreen)<>0 then
showmessage("Compatible Bitmap Selection");
if not BitBlt(hdcCompatible,
0,0,
200, 300,
hdcScreen,
0,0,
SRCCOPY) then

showmessage("Screen to Compat Blt Failed");


 
Думкин   (2003-11-22 06:25) [17]

> [10] chi (21.11.03 14:15)
А у тебя 10-й главы из указаной книги нет? Тогда извини.


 
Lamer   (2003-11-22 14:56) [18]

не хрена не пойму зачем вводится TBitmapInfo, PBitmapInfo(^tag..)... и что же все-таки нужно передавать в
CreateBMPFile(pszFile:Pchar;pbi:PBITMAPINFO;hBMP:HBITMAP;hDCn:HDC) в переменные hBMP и hDcn..
//отчаяние..


 
chi   (2003-11-24 02:38) [19]

Удалено модератором
Примечание: Создание пустых сообщений


 
chi   (2003-11-25 00:35) [20]

Удалено модератором
Примечание: Создание пустых сообщений


 
chi   (2003-11-27 15:04) [21]

Всем спасибо! Но все равно ничего я так и не понял :(



Страницы: 1 вся ветка

Форум: "WinAPI";
Текущий архив: 2004.02.02;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.51 MB
Время: 0.008 c
11-2055
Danil
2003-05-13 00:02
2004.02.02
Как мне эмулировать табуляцию?


1-2214
new
2004-01-20 16:40
2004.02.02
copy


3-1948
Sfera
2004-01-09 11:43
2004.02.02
Сложение строк в одном столбце


1-2081
Maksss
2004-01-18 00:34
2004.02.02
#0


14-2366
ИМХО
2004-01-01 12:21
2004.02.02
USA: как живешь, Америка?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский