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); }
|