<html>
<head>
<style>
.hmmessage P
{
margin:0px;
padding:0px
}
body.hmmessage
{
FONT-SIZE: 10pt;
FONT-FAMILY:Tahoma
}
</style>
</head>
<body class='hmmessage'>Saludos amigos!!.<BR>
<BR>
Veran sigo aprendiendo API y ahora se me ah presentado el siguiente problema.<BR>
<BR>
Quiero guardar lo que se muestre en pantalla, estoy juntando varias imagenes y las quiero guardar como una sola, es decir guardar lo que muestra la pantalla como una imagen ya sea bmp o cualquier formato. El codigo que es el que tengo muestra y guarda una sola imagen. Yo lo que quiero es guardar la pantalla completa. Espero sirva de algo el codigo.<BR><BR>
#include <windows.h> <BR>#include <commdlg.h> <BR>#include <stdlib.h> <BR>#include <stdio.h> <BR>#include "viewbmp.h" <BR>
<BR>#define UNTITLED "(sin título)" <BR>
LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM); <BR>
void DibujaBitmap (HDC hdc, HBITMAP hBitmap, int xInicio, int yInicio); <BR>
void PopFileInitialize (HWND); <BR>BOOL PopFileOpenDlg (HWND, PSTR, PSTR); <BR>BOOL PopFileSaveDlg (HWND, PSTR, PSTR); <BR>BOOL PopFileRead (HINSTANCE, PSTR); <BR>BOOL PopFileWrite (HWND, PSTR); <BR>
void DoCaption (HWND hwnd, char *szTitleName); <BR>void OkMessage (HWND hwnd, char *szMessage, char *szTitleName); <BR>short AskAboutSave (HWND hwnd, char *szTitleName); <BR> // Variables globales <BR>
static char szAppName[] = "ViewBMP"; <BR>static HWND hDlgModeless; <BR>static OPENFILENAME ofn; <BR>static HBITMAP hBitmap = NULL; <BR>
// ************************** Punto de entrada al programa ******* <BR>
int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, <BR> PSTR szCmdLine, int iCmdShow) <BR>{ <BR> MSG msg; <BR> HWND hwnd; <BR> HACCEL hAccel; <BR> WNDCLASSEX wndclass; <BR>
wndclass.cbSize = sizeof (wndclass); <BR> wndclass.style = CS_HREDRAW | CS_VREDRAW; <BR> wndclass.lpfnWndProc = WndProc; <BR> wndclass.cbClsExtra = 0; <BR> wndclass.cbWndExtra = 0; <BR> wndclass.hInstance = hInstance; <BR> wndclass.hIcon = LoadIcon (hInstance, szAppName); <BR> wndclass.hCursor = LoadCursor (NULL, IDC_ARROW); <BR> wndclass.hbrBackground = (HBRUSH) GetStockObject (WHITE_BRUSH); <BR> wndclass.lpszMenuName = szAppName; <BR> wndclass.lpszClassName = szAppName; <BR> wndclass.hIconSm = LoadIcon (NULL, IDI_APPLICATION); <BR>
RegisterClassEx (&wndclass); <BR>
hwnd = CreateWindow (szAppName, NULL, <BR> WS_OVERLAPPEDWINDOW, <BR> CW_USEDEFAULT, CW_USEDEFAULT, <BR> CW_USEDEFAULT, CW_USEDEFAULT, <BR> NULL, NULL, hInstance, szCmdLine); <BR>
ShowWindow (hwnd, iCmdShow); <BR> UpdateWindow (hwnd); <BR>
hAccel = LoadAccelerators (hInstance, szAppName); <BR>
while (GetMessage (&msg, NULL, 0, 0)) { <BR> if (hDlgModeless == NULL || !IsDialogMessage (hDlgModeless, &msg)) { <BR> if (!TranslateAccelerator (hwnd, hAccel, &msg)) { <BR> TranslateMessage (&msg); <BR> DispatchMessage (&msg); <BR> } <BR> } <BR> } <BR> return msg.wParam; <BR>} <BR>
// ************************** Procedimiento de ventana ******* <BR>
LRESULT CALLBACK WndProc (HWND hwnd, UINT iMsg, WPARAM wParam, LPARAM lParam) <BR>{ <BR> static BOOL bNeedSave = FALSE; <BR> static char szFileName[_MAX_PATH]; <BR> static char szTitleName[_MAX_FNAME + _MAX_EXT]; <BR> static HINSTANCE hInst; <BR> HDC hDC; <BR> PAINTSTRUCT ps; <BR>
switch (iMsg) { <BR> case WM_CREATE : <BR> hInst = ((LPCREATESTRUCT) lParam) -> hInstance; <BR>
// Inicializar cuadro de diálogo común <BR>
PopFileInitialize (hwnd); <BR>
// Procesar línea de comandos <BR>
lstrcpy (szFileName, (PSTR) (((LPCREATESTRUCT) lParam)->lpCreateParams)); <BR>
if (strlen (szFileName) > 0) { <BR> GetFileTitle (szFileName, szTitleName, sizeof (szTitleName)); <BR>
if (!PopFileRead (hInst, szFileName)) <BR> OkMessage (hwnd, "No se puede leer el archivo %s.", <BR> szTitleName); <BR> } <BR>
DoCaption (hwnd, szTitleName); <BR> return 0; <BR>
case WM_COMMAND : <BR> switch (LOWORD (wParam)) { <BR> // Mensajes del menú Archivo <BR> case IDM_OPEN : <BR> if (bNeedSave && IDCANCEL == AskAboutSave (hwnd, szTitleName)) <BR> return 0; <BR>
if (PopFileOpenDlg (hwnd, szFileName, szTitleName)) { <BR> if (!PopFileRead (hInst, szFileName)) { <BR> OkMessage (hwnd, "No se puede leer el archivo %s.", <BR> szTitleName); <BR> szFileName[0] = '\0'; <BR> szTitleName[0] = '\0'; <BR> } else <BR> InvalidateRect (hwnd, NULL, FALSE); <BR> } <BR>
DoCaption (hwnd, szTitleName); <BR> bNeedSave = FALSE; <BR> return 0; <BR>
case IDM_SAVE : <BR> if (szFileName[0]) { <BR> if (PopFileWrite (hwnd, szFileName)) { <BR> bNeedSave = FALSE; <BR> return 1; <BR> } else <BR> OkMessage (hwnd, "No se puede escribir el archivo %s", <BR> szTitleName); <BR> return 0; <BR> } <BR> // sigue proceso <BR> case IDM_SAVEAS : <BR> if (PopFileSaveDlg (hwnd, szFileName, szTitleName)) { <BR> DoCaption (hwnd, szTitleName); <BR>
if (PopFileWrite (hwnd, szFileName)) { <BR> bNeedSave = FALSE; <BR> return 1; <BR> } else <BR> OkMessage (hwnd, "No se puede escribir el archivo %s", <BR> szTitleName); <BR> } <BR> return 0; <BR>
case IDM_EXIT : <BR> SendMessage (hwnd, WM_CLOSE, 0, 0); <BR> return 0; <BR>
} <BR> break; <BR>
case WM_PAINT: <BR> hDC = BeginPaint (hwnd, &ps); <BR> DibujaBitmap (hDC, hBitmap, 0, 0); <BR> EndPaint (hwnd, &ps); <BR> return 0; <BR>
case WM_CLOSE : <BR> if (!bNeedSave || IDCANCEL != AskAboutSave (hwnd, szTitleName)) <BR> DestroyWindow (hwnd); <BR>
return 0; <BR>
case WM_QUERYENDSESSION : <BR> if (!bNeedSave || IDCANCEL != AskAboutSave (hwnd, szTitleName)) <BR> return 1; <BR>
return 0; <BR>
case WM_DESTROY : <BR> if (hBitmap != NULL) <BR> DeleteObject (hBitmap); <BR> PostQuitMessage (0); <BR> return 0; <BR>
} <BR> return DefWindowProc (hwnd, iMsg, wParam, lParam); <BR>} <BR>
// ************************** función para dibujar bitmaps ****** <BR>
void DibujaBitmap (HDC hdc, HBITMAP hBitmap, int xInicio, int yInicio) <BR>{ <BR> BITMAP bm; <BR> HDC hdcMem; <BR> DWORD dwSize; <BR> POINT ptSize, ptOrg; <BR>
hdcMem = CreateCompatibleDC (hdc); <BR> SelectObject (hdcMem, hBitmap); <BR> SetMapMode (hdcMem, GetMapMode (hdc)); <BR>
GetObject (hBitmap, sizeof (BITMAP), (LPVOID)&bm); <BR>
ptSize.x = bm.bmWidth; <BR> ptSize.y = bm.bmHeight; <BR> DPtoLP (hdc, &ptSize, 1); <BR>
ptOrg.x = 0; <BR> ptOrg.y = 0; <BR> DPtoLP (hdcMem, &ptOrg, 1); <BR>
BitBlt (hdc, xInicio, yInicio, ptSize.x, ptSize.y, hdcMem, ptOrg.x, ptOrg.y, SRCCOPY); <BR>
DeleteObject (hdcMem); <BR>} <BR>
// ***** funciones para manejar los diálogos abrir/guardar archivo *** <BR>
void PopFileInitialize (HWND hwnd) <BR>{ <BR> static char szFilter[] = "Archivos de texto (*.BMP)\0*.bmp\0";<BR> // "Todos los archivos (*.*)\0*.*\0\0"; <BR>
ofn.lStructSize = sizeof (OPENFILENAME); <BR> ofn.hwndOwner = hwnd; <BR> ofn.hInstance = NULL; <BR> ofn.lpstrFilter = szFilter; <BR> ofn.lpstrCustomFilter = NULL; <BR> ofn.nMaxCustFilter = 0; <BR> ofn.nFilterIndex = 0; <BR> ofn.lpstrFile = NULL; // Definido en funciones Open y Close <BR> ofn.nMaxFile = _MAX_PATH; <BR> ofn.lpstrFileTitle = NULL; // Definido en funciones Open y Close <BR> ofn.nMaxFileTitle = _MAX_FNAME + _MAX_EXT; <BR> ofn.lpstrInitialDir = NULL; <BR> ofn.lpstrTitle = NULL; <BR> ofn.Flags = 0; // Definido en funciones Open y Close <BR> ofn.nFileOffset = 0; <BR> ofn.nFileExtension = 0; <BR> ofn.lpstrDefExt = "txt"; <BR> ofn.lCustData = 0L; <BR> ofn.lpfnHook = NULL; <BR> ofn.lpTemplateName = NULL; <BR>} <BR>
BOOL PopFileOpenDlg (HWND hwnd, PSTR pstrFileName, PSTR pstrTitleName) <BR>{ <BR> ofn.hwndOwner = hwnd; <BR> ofn.lpstrFile = pstrFileName; <BR> ofn.lpstrFileTitle = pstrTitleName; <BR> ofn.Flags = OFN_HIDEREADONLY | OFN_CREATEPROMPT; <BR>
return GetOpenFileName (&ofn); <BR>} <BR>
BOOL PopFileSaveDlg (HWND hwnd, PSTR pstrFileName, PSTR pstrTitleName) <BR>{ <BR> ofn.hwndOwner = hwnd; <BR> ofn.lpstrFile = pstrFileName; <BR> ofn.lpstrFileTitle = pstrTitleName; <BR> ofn.Flags = OFN_OVERWRITEPROMPT; <BR>
return GetSaveFileName (&ofn); <BR>} <BR>
static long PopFileLength (FILE *file) <BR>{ <BR> int iCurrentPos, iFileLength; <BR>
iCurrentPos = ftell (file); <BR>
fseek (file, 0, SEEK_END); <BR>
iFileLength = ftell (file); <BR>
fseek (file, iCurrentPos, SEEK_SET); <BR>
return iFileLength; <BR>} <BR>
BOOL PopFileRead (HINSTANCE hInst, PSTR pstrFileName) <BR>{ <BR> if (hBitmap != NULL) <BR> DeleteObject (hBitmap); <BR> hBitmap = (HBITMAP)LoadImage(hInst, pstrFileName, IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE); <BR>
return hBitmap != NULL; <BR>} <BR>
BOOL PopFileWrite (HWND hwnd, PSTR pstrFileName) <BR>{ <BR>
FILE *file; <BR> int iLength; <BR> PSTR pstrBuffer; <BR>
if (NULL == (file = fopen (pstrFileName, "wb"))) <BR> return FALSE; <BR>
iLength = GetWindowTextLength (hwnd); <BR>
if (NULL == (pstrBuffer = (PSTR) malloc (iLength + 1))) { <BR> fclose (file); <BR> return FALSE; <BR> } <BR>
GetWindowText (hwnd, pstrBuffer, iLength + 1); <BR>
if (iLength != (int) fwrite (pstrBuffer, 1, iLength, file)) { <BR> fclose (file); <BR> free (pstrBuffer); <BR> return FALSE; <BR> } <BR>
fclose (file); <BR> free (pstrBuffer); <BR> <BR> return TRUE; <BR>} <BR>
// ************************** funciones auxiliares **************** <BR>
void DoCaption (HWND hwnd, char *szTitleName) <BR>{ <BR> char szCaption[64 + _MAX_FNAME + _MAX_EXT]; <BR>
wsprintf (szCaption, "%s - %s", szAppName, <BR> szTitleName[0] ? szTitleName : UNTITLED); <BR>
SetWindowText (hwnd, szCaption); <BR>} <BR>
void OkMessage (HWND hwnd, char *szMessage, char *szTitleName) <BR>{ <BR> char szBuffer[64 + _MAX_FNAME + _MAX_EXT]; <BR>
wsprintf (szBuffer, szMessage, szTitleName[0] ? szTitleName : UNTITLED); <BR>
MessageBox (hwnd, szBuffer, szAppName, MB_OK | MB_ICONEXCLAMATION); <BR>} <BR>
short AskAboutSave (HWND hwnd, char *szTitleName) <BR>{ <BR> char szBuffer[64 + _MAX_FNAME + _MAX_EXT]; <BR> int iReturn; <BR>
wsprintf (szBuffer, "¿Guardar cambios actuales en %s?", <BR> szTitleName[0] ? szTitleName : UNTITLED); <BR>
iReturn = MessageBox (hwnd, szBuffer, szAppName, <BR> MB_YESNOCANCEL | MB_ICONQUESTION); <BR>
if (iReturn == IDYES) <BR> if (!SendMessage (hwnd, WM_COMMAND, IDM_SAVE, 0L)) <BR> iReturn = IDCANCEL; <BR>
return iReturn; <BR>} <BR><BR>
<BLOCKQUOTE> </BLOCKQUOTE><br /><hr />Express yourself instantly with MSN Messenger! <a href='http://clk.atdmt.com/AVE/go/onm00200471ave/direct/01/' target='_new'>MSN Messenger</a></body>
</html>