Topic
							
								Интересующийся 
								
								 
								  Offline
								
								
								
								
							 
						 | 
						
							
								  | 
								
									
									 «  : 14-08-2010 17:55 »   | 
								
								 | 
							  
							 
							При перекрытии окна другими окнами исчезает нарисованное... Как быть? Я рисую сначала в MemDC, потом то, что получилось отправляю в HDC. При перемещении окна нарисованное не пропадает, а при перекрытии/выходе окна за пределы монитора/свертывании/развертывании/изменении размеров окна - при всё при этом исчезает нарисованное. Почему при этих действиях не вызывается WM_PAINT? Как перерисовать? //#include <windows.h> #include "KWnd.h"
  LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
  int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd) {
  	MSG msg; 	KWnd mainWnd(TEXT("An application"), hInstance, nShowCmd, WndProc);
  	while (GetMessage(&msg, NULL, 0, 0)) 	{ 		TranslateMessage(&msg); 		DispatchMessage(&msg); 	}
  	return msg.wParam; }
  LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { 	HDC hDC; 	PAINTSTRUCT ps; 	RECT rect; 	static HDC hMemDC;
  	int xrand; 	int yrand;
  	int Rrand; 	int Grand; 	int Brand; 	int iWidthRand; 	int iStyleRand;
  	HPEN myPen;
  	switch(uMsg) 	{ 	case WM_CREATE:
  		hDC = GetDC(hWnd); 		hMemDC = CreateCompatibleDC(hDC); 		break;
  	case WM_PAINT:
  		hDC = BeginPaint(hWnd, &ps); 		GetClientRect(hWnd, &rect); 		// Теперь копируем растр из памяти на экран 		BitBlt(hDC, 0, 0, rect.right, rect.bottom, hMemDC, 0, 0, SRCCOPY); 		EndPaint(hWnd, &ps); 		break;
  	case WM_LBUTTONDOWN:
  		hDC = GetDC(hWnd); 		if (hDC) 		{ 			// рисуем что требуется 			MoveToEx(hDC, 50, 60, NULL); 			GetClientRect(hWnd, &rect);
  			for (int i=0; i<10; i++) 			{ 				// позиция по х и у, куда проводить линию 				xrand = rand()%(rect.right-100)+50; 				yrand = rand()%(rect.bottom-100)+50;
  				// стиль (начертание) линии 				iStyleRand = rand()%7;
  				// толщина линии 				iWidthRand = rand()%7;
  				// цвет линии 				Rrand = rand()%256; 				Grand = rand()%256; 				Brand = rand()%256;
  				// создаем карандаш 				myPen = CreatePen(iStyleRand, iWidthRand, RGB(Rrand, Grand, Brand));
  				// выбираем наш карандаш 				SelectObject(hDC, myPen);
  				// нарисовать линию 				LineTo(hDC, xrand, yrand);
  				// освобождаем память из под созданного карандаша 				DeleteObject(myPen); 			}
  			// освобождаем контекст 			ReleaseDC(hWnd, hDC); 		}
  		break;
  	case WM_DESTROY: 		DeleteDC(hMemDC); 		PostQuitMessage(0); 		break;
  	default: 		return DefWindowProc(hWnd, uMsg, wParam, lParam); 	}
  	return 0; } Тут создание окна, ничего интересного: #include <windows.h>
  class KWnd { public: 	KWnd(LPCTSTR windowName, HINSTANCE hInst, int cmdShow, 		LRESULT (WINAPI *pWndProc)(HWND, UINT, WPARAM, LPARAM), 		LPCTSTR menuname = NULL, 		int x = CW_USEDEFAULT, int y = 0, 		int width = CW_USEDEFAULT, int height = 0, 		UINT classStyle = CS_HREDRAW | CS_VREDRAW, 		DWORD windowStyle = WS_OVERLAPPEDWINDOW, 		HWND hParent = NULL);
  	HWND GetHWnd() { return hWnd; } protected: 	HWND hWnd; 	WNDCLASSEX wc;	 };
 
  KWnd::KWnd(LPCTSTR windowName, HINSTANCE hInst, int cmdShow, 		   LRESULT (WINAPI *pWndProc)(HWND, UINT, WPARAM, LPARAM), 		   LPCTSTR menuName, int x, int y, int width, int height, 		   UINT classStyle, DWORD windowStyle, HWND hParent) { 	TCHAR szClassName[] = TEXT("KWndClass");
  	wc.cbSize			= sizeof(wc); 	wc.style			= classStyle; 	wc.lpfnWndProc		= pWndProc; 	wc.cbClsExtra		= 0; 	wc.cbWndExtra		= 0; 	wc.hInstance		= hInst; 	wc.hIcon			= LoadIcon(NULL, IDI_APPLICATION); 	wc.hCursor			= LoadCursor(NULL, IDC_ARROW); 	wc.hbrBackground	= (HBRUSH)COLOR_WINDOW; 	//wc.hbrBackground	= (HBRUSH)GetStockObject(COLOR_APPWORKSPACE+1); 	//wc.hbrBackground	= (HBRUSH)GetStockObject(WHITE_BRUSH); 	wc.lpszMenuName		= menuName; 	wc.lpszClassName	= szClassName; 	wc.hIconSm			= LoadIcon(NULL, IDI_APPLICATION);
 
  	if (!RegisterClassEx(&wc)) 	{ 		TCHAR msg[100] = TEXT("Cannot register class: "); 		wcscat_s(msg, 100, szClassName); 		MessageBox(NULL, msg, TEXT("Error"), MB_OK | MB_ICONERROR); 		return; 	}
  	// по умолчанию окно располагается по центру 	// и имеет фиксированную высоту/ширину 	if (x == CW_USEDEFAULT && width == CW_USEDEFAULT) 	{ 		// получаем разрешение монитора (1024х768) 		int xFullScreen = GetSystemMetrics(SM_CXSCREEN); 		int yFullScreen = GetSystemMetrics(SM_CYSCREEN);
  		// размеры окна по умолчанию 		width  = 720; 		height = 540;
  		// вычисляем позицию левого верхнего угла окна 		x = int(xFullScreen/2 - width/2); 		y = int(yFullScreen/2 - height/2); 	}
  	hWnd = CreateWindow(szClassName, windowName, windowStyle, 		x, y, width, height, hParent, (HMENU)NULL, hInst, NULL);
  	if (!hWnd) 	{ 		TCHAR text[100] = TEXT("Cannot create window: "); 		wcscat_s(text, 100, szClassName); 		MessageBox(NULL, text, TEXT("Error"), MB_OK | MB_ICONERROR); 		return; 	}
  	ShowWindow(hWnd, cmdShow); 	UpdateWindow(hWnd); }  
						 |