Отображение изображения
Глобальные переменные
LOGBRUSH lBrush;
HPEN hPen;
HBRUSH hBrush;
POINT Pnt;
HDC image_dc;
Функция рисования
{
Pnt.x = 5;
Pnt.y = 5;
lPen.lopnStyle = PS_STYLE_MASK;
lPen.lopnColor = 0;
lPen.lopnWidth = Pnt;
hDc = GetDC(hWnd);
hPen = CreatePenIndirect(&lPen);
SelectObject(hDc, hPen);
Rectangle(hDc, 50, 50, 250, 250);
}
реализация функции вот такая
DrawLineFunc(hWnd, image_dc);
break;
И также не забыл в функции WM_PAINT вот это
image_dc = ::CreateCompatibleDC(hdc);
SelectObject(hdc, image_dc);
BitBlt(hdc,50,50,hWidth,hHeight,image_dc,0,0,SRCCOPY);
DeleteDC(image_dc);
EndPaint(hWnd, &ps);
break;
Линия рисуется, но стоит мне свернуть окно а потом его восстановить (развернуть) - изображение пропадает! Что сделать, чтобы это исправить?
но и WM_SIZE, на сообщение WM_SIZE посылай своему
окну сообщение перерисоваться UpdateWindow(hWnd);
- способ конечно не очень, но помоему в твоём
случае самый раз.
Обрабатывай не только сообщение WM_PAINT,
но и WM_SIZE, на сообщение WM_SIZE посылай своему
окну сообщение перерисоваться UpdateWindow(hWnd);
- способ конечно не очень, но помоему в твоём
случае самый раз.
Нее, это не то! Те же яйца, только в профиль =(((
image_dc = ::CreateCompatibleDC(hdc);//нахрена создаеш новый пустой контекст
SelectObject(hdc, image_dc);//а здесь пытаешся выбрать контекст в контекст! Так нельзя!
DeleteDC(image_dc);
из WM_PAINT и все будет работать:
case WM_PAINT :
hdc = BeginPaint(hWnd, &ps);
BitBlt(hdc,50,50,hWidth,hHeight,image_dc,0,0,SRC
COPY);
EndPaint(hWnd, &ps);
break;
Че за дурдом здесь творится. Убери строки
image_dc = ::CreateCompatibleDC(hdc);//нахрена создаеш новый пустой контекст
SelectObject(hdc, image_dc);//а здесь пытаешся выбрать контекст в контекст! Так нельзя!
DeleteDC(image_dc);
из WM_PAINT и все будет работать:
case WM_PAINT :
hdc = BeginPaint(hWnd, &ps);
BitBlt(hdc,50,50,hWidth,hHeight,image_dc,0,0,SRC
COPY);
EndPaint(hWnd, &ps);
break;
И так тоже не работает!
К слову сказать, я проверил некоторые программы под DirectX (как примеры к изучению прилагались). Так там такая же фигня почему-то... Т.е. на фоне крутиться кубик, стоит окно свернуть, а потом его развернуть - кубик исчезает! :roll:
И так тоже не работает!
К слову сказать, я проверил некоторые программы под DirectX (как примеры к изучению прилагались). Так там такая же фигня почему-то... Т.е. на фоне крутиться кубик, стоит окно свернуть, а потом его развернуть - кубик исчезает! :roll:
Выложи исходник,посмотрим.
Выложи исходник,посмотрим.
Вот небольшой кусок
{
Pnt.x = 1;
Pnt.y = 1;
lPen.lopnStyle = PS_STYLE_MASK;
lPen.lopnColor = clr;
lPen.lopnWidth = Pnt;
hDc = GetDC(hWnd);
hPen = CreatePenIndirect(&lPen);
SelectObject(hDc, hPen);
MoveToEx(hDc, x, y1, &Pnt);
LineTo(hDc, x, y2);
}
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
int wmId, wmEvent;
PAINTSTRUCT ps;
HDC hdc;
HANDLE handle;
switch (message)
{
case WM_COMMAND:
wmId = LOWORD(wParam);
wmEvent = HIWORD(wParam);
switch (wmId)
{
case IDM_about :
DialogBox(hInst, (LPCTSTR)IDD_ABOUTBOX, hWnd, (DLGPROC)About);
break;
case ID_FILE_OPEN:
LPTSTR fname;
fname=PAlloc(250);
FGetDirectory(fname);
LoadBMTrue(hWnd, fname, bitmap);
PDeAlloc((HLOCAL)fname);
break;
case ID_FILE_SAVE:
OpenFileName(hWnd, handle);
break;
case ID_LINES_GRAY256:
ConvertGray256(image_dc);
break;
case ID_DRAW_ELLIPSE:
DrawEllipseFunc(hWnd, image_dc);
break;
case ID_DRAW_SQUARE:
DrawSquareFunc(hWnd, image_dc);
break;
case ID_DRAW_LINE:
DrawLineFunc(hWnd, image_dc, 50, 50, 200, 0x00FFFFFF);
break;
case ID_LINES_CODE:
DialogBox(hInst, (LPCTSTR)IDD_ENTER_TEXT, hWnd, (DLGPROC)Code);
break;
case IDM_EXIT:
DestroyWindow(hWnd);
break;
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
break;
case WM_PAINT:
hdc = BeginPaint(hWnd, &ps);
BitBlt(hdc,50,50,hWidth,hHeight,image_dc,0,0,SRCCOPY);
DeleteDC(image_dc);
EndPaint(hWnd, &ps);
break;
case WM_DESTROY:
DeleteObject(SelectObject(image_dc, hPen));
PostQuitMessage(0);
break;
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
return 0;
}
Убери в case WM_PAINT
DeleteDC(image_dc);
Я же те говорил че убрать.
Убери в case WM_PAINT
DeleteDC(image_dc);
Убрал - опять то же самое! Не работает, т.е. при сворачивании, а потом разворачивании - нарисованное изображение пропадает (в данном случае - это линия).
Убрал - опять то же самое! Не работает, т.е. при сворачивании, а потом разворачивании - нарисованное изображение пропадает (в данном случае - это линия).
давай весь проект в архиве
давай весь проект в архиве
Вот! На класс Парсер не смотри, он не доделан.
Вот! На класс Парсер не смотри, он не доделан.
Ты там многие вещи делаеш неправильно,переопределяеш hdc,забываеш про сохранение в котексте его предыдущих обектов и т.д. И пытаешся использовать напрямую hdc основного окна,но для прорисовки так не делается,необходимо создавать так называемый бэк буффер и уже туда вести прорисовку а уж затем потом просто копировать содержимое буффера на экран,я здесь тебе это показал немного как это делается. Подкорректировал некоторые участки кода но не все так что за остальное сам думай. Кстати при изменении размеров окна необходимо изменять размер бэк буффера,попробуй сам самостоятельно это реализовать(подсказка: на сообщении WM_SIZE)
Ты там многие вещи делаеш неправильно,переопределяеш hdc,забываеш про сохранение в котексте его предыдущих обектов и т.д. И пытаешся использовать напрямую hdc основного окна,но для прорисовки так не делается,необходимо создавать так называемый бэк буффер и уже туда вести прорисовку а уж затем потом просто копировать содержимое буффера на экран,я здесь тебе это показал немного как это делается. Подкорректировал некоторые участки кода но не все так что за остальное сам думай. Кстати при изменении размеров окна необходимо изменять размер бэк буффера,попробуй сам самостоятельно это реализовать(подсказка: на сообщении WM_SIZE)
Спасибо тебе, очень помогло! Я действительно этих вещей не знал и в результате просто не обращал на это внимание...
Спасибо еще раз!
Ну вобщето не в моем а в твоем коде была куча ошибок,и я их всех не исправлял естественно думал ты сам справишся. Проблема была при инициализации буфера. Юзай новый CodeLines.сpp. там буфер инициализируется теперь правильно.
Мдя.. вот уже месяц с винапи мучаюсь, каждый раз что-то новое =((( Хоть бы терпения хватило!
Спасибо, более-менне начал вникать...
Мдя.. вот уже месяц с винапи мучаюсь, каждый раз что-то новое =((( Хоть бы терпения хватило!
Спасибо, более-менне начал вникать...
Ну а ты чего хотел за месяц весь вин апи выучить чтоль. Я его уже 3 года юзаю и до сих пор не могу знать что знаю хотя бы половину его.