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

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

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 06.02.2012, 21:59   #1
amerhant
Пользователь
 
Регистрация: 19.10.2009
Сообщений: 24
По умолчанию C++ WIN 32 API Буфер обмена

Мне нужно из одного приложения в другое, через буфер обмена, передать картинку...
По идее все должно работать...но если я даже к примеру в paint пытаюсь вставить изображение из буфера он пишет что это не возможно хотя что-то там есть))
И мое второе приложение находит в буфере файлы необходимого типа но рисовать не спешит...
Подскажите что нить...плиз...

Передающее приложение:
Код:
HINSTANCE hInst;
HANDLE hBitmap,hOldBitmap;
HDC hdcMem;
BITMAP bm;
char szClassName[] = "Klient";
HWND hwnd,hNext;
int flag=0;


LRESULT CALLBACK WndProc(HWND hwnd,UINT msg,WPARAM wParam, LPARAM lParam){
	switch(msg)
{
	static OPENFILENAME ofn;
	static STARTUPINFO si; 
	static PROCESS_INFORMATION pi;
	static SECURITY_ATTRIBUTES sa;
	static HANDLE hRead;
	static char path[100];
	////////////////////////////////////////////////////////////////////////////////
		case WM_CREATE:
		{
			hBitmap =(HBITMAP)LoadImage(NULL,"D:\\1.BMP",IMAGE_BITMAP,0,0,LR_LOADFROMFILE);
		hNext = SetClipboardViewer(hwnd);	
		};break;
	////////////////////////////////////////////////////////////////////////////////
		case WM_PAINT:
			{
			PAINTSTRUCT ps;
			HDC hdc,hCompatibleDC;
			BITMAP Bitmap;
			hdc = BeginPaint(hwnd, &ps);
			if(flag)
			{
			hBitmap =(HBITMAP)LoadImage(NULL,"D:\\1.BMP",IMAGE_BITMAP,0,0,LR_LOADFROMFILE);
			GetObject(hBitmap,sizeof(BITMAP),&Bitmap);
			hCompatibleDC = CreateCompatibleDC(hdc);
			hOldBitmap = SelectObject(hCompatibleDC,hBitmap);
			StretchBlt(hdc,0,0,300,300,
            hCompatibleDC,0,0,Bitmap.bmWidth,
            Bitmap.bmHeight,SRCCOPY);
			SelectObject(hCompatibleDC,hOldBitmap);
			DeleteObject(hBitmap);
			DeleteDC(hCompatibleDC);
			}
			EndPaint(hwnd,&ps);
      };break;
	////////////////////////////////////////////////////////////////////////////////
	case WM_COMMAND:
		{	
			switch(LOWORD(wParam))
			{
			case ID_RUN:
				ZeroMemory(&ofn, sizeof(ofn));
				ofn.lStructSize = sizeof(ofn);
				ofn.hwndOwner = hwnd;
				ofn.lpstrFile = path;
				ofn.lpstrFile[0] = '\0';
				ofn.nMaxFile = sizeof(path);
				ofn.lpstrTitle = "Открыть";
				ofn.lpstrFilter = "Программы\0*.exe\0Все типы файлов\0*.*\0";
				ofn.Flags = OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST;
					
				if(GetOpenFileName(&ofn))
				{
					ZeroMemory(&si, sizeof(si)); 
					si.cb = sizeof(si);
					si.hStdInput = hRead;
					si.hStdOutput = GetStdHandle(STD_OUTPUT_HANDLE);
					si.hStdError = GetStdHandle(STD_ERROR_HANDLE);
					si.dwFlags = STARTF_USESTDHANDLES;
					if(!CreateProcess(path,"proc_server", NULL, NULL, TRUE, 0, NULL, NULL, &si, &pi))
						MessageBox(hwnd,"При создании дочернего процесса призошла ошибка.","Внимание!",MB_OK);		
					CloseHandle(hRead);
				}

				break;
				case ID_SHOW:
					{
				flag=1;
				InvalidateRect(hwnd,NULL,TRUE);
					}
				break;
				/////////////////////////////////////////////////////////////////////////////////////
				case ID_HIDE:
					{
				flag=0;
				InvalidateRect(hwnd,NULL,TRUE);
					}
				break;
				/////////////////////////////////////////////////////////////////////////////////////
				case ID_COPY:
					{
					OpenClipboard(hwnd);
					EmptyClipboard();
					SetClipboardData(CF_BITMAP,hBitmap);
					}
					break;
			case ID_UNLOAD:
				SendMessage(FindWindow("Server",NULL),WM_DESTROY,0,0);
				break;
	///////////////////////////////////////////////////////////////////////////////
	case WM_DRAWCLIPBOARD:
		{
			if(hNext)
				SendMessage(hNext,msg, wParam, lParam);	
		}
	break;
	case WM_CHANGECBCHAIN:
			{
			if ((HWND) wParam == hNext)
				hNext= (HWND) lParam;
			else 
			{ 
				if (hNext!= NULL) 
					SendMessage(hNext,msg,wParam,lParam);
			} 	
		}
		break;
	///////////////////////////////////////////////////////////////////////////////
			case ID_EXIT:
				SendMessage(FindWindow("Server",NULL),WM_DESTROY,0,0);
				SendMessage(hwnd,WM_DESTROY,0,0);
				break;
			}
		};break;
	////////////////////////////////////////////////////////////////////////////////
	case WM_DESTROY:
		{
			ChangeClipboardChain(hwnd,hNext);
			CloseClipboard();
			PostQuitMessage(0);
		
		};break;
	default:
		return(DefWindowProc(hwnd,msg,wParam,lParam));
		}
}
amerhant вне форума Ответить с цитированием
Старый 06.02.2012, 22:05   #2
amerhant
Пользователь
 
Регистрация: 19.10.2009
Сообщений: 24
По умолчанию Принимаю программа:

Принимаю программа:
Код:
char szClassName[] = "Server";
HWND hwnd,hNext;
HANDLE hBitmap,hOldBitmap;
BOOL flag=0;

LRESULT CALLBACK WndProc(HWND hwnd,UINT msg,WPARAM wParam, LPARAM lParam){
	switch(msg)
{
		case WM_CREATE:
		{
		hNext = SetClipboardViewer(hwnd);	
		};break;
	case WM_COMMAND:
		{	
			case ID_EXIT:
				SendMessage(hwnd,WM_DESTROY,0,0);
				break;
		};break;

		case WM_PAINT:
			{
			PAINTSTRUCT ps;
			HDC hdc=BeginPaint(hwnd,&ps),hCompatibleDC;
			BITMAP Bitmap;
			if(flag)
			{
				char str[5];
				sprintf(str,"%d  ",flag);
				TextOut(hdc,100,100,str,strlen(str));
			hBitmap=GetClipboardData(CF_BITMAP);
			GetObject(hBitmap,sizeof(BITMAP),&Bitmap);
			hCompatibleDC = CreateCompatibleDC(hdc);
			hOldBitmap = SelectObject(hCompatibleDC,hBitmap);
			StretchBlt(hdc,0,0,300,300,
            hCompatibleDC,0,0,Bitmap.bmWidth,
            Bitmap.bmHeight,SRCCOPY);
			SelectObject(hCompatibleDC,hOldBitmap);
			DeleteObject(hBitmap);
			DeleteDC(hCompatibleDC);
			flag=0;
			}
			
		EndPaint(hwnd,&ps);
      };break;

			///////////////////////////////////////////////////////////////////////////////
	case WM_DRAWCLIPBOARD:
		{
			if(hNext)
				SendMessage(hNext,msg, wParam, lParam);	
			if (IsClipboardFormatAvailable(CF_TEXT))
			{
					if(OpenClipboard(hwnd))
						flag=1;
			}
		}
	break;
	case WM_CHANGECBCHAIN:
			{
			if ((HWND) wParam == hNext)
				hNext= (HWND) lParam;
			else 
			{ 
				if (hNext!= NULL) 
					SendMessage(hNext,msg,wParam,lParam);
			} 	
		}
		break;
	///////////////////////////////////////////////////////////////////////////////
			
	case WM_DESTROY:
		{
			PostQuitMessage(0);

		};break;
	default:
		return(DefWindowProc(hwnd,msg,wParam,lParam));
		}
}
amerhant вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Буфер обмена X@OC Общие вопросы по Java, Java SE, Kotlin 1 10.08.2011 14:34
Буфер обмена DolgoDoom Общие вопросы Delphi 6 30.05.2011 13:59
буфер обмена DeDoK Win Api 1 25.10.2010 19:08
Буфер обмена dmitriegorovih Общие вопросы Delphi 13 09.09.2010 12:54
Буфер обмена nusik Общие вопросы Delphi 2 21.05.2009 00:53