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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 03.05.2013, 23:47   #11
cleac
Пользователь
 
Аватар для cleac
 
Регистрация: 19.04.2013
Сообщений: 27
По умолчанию

Согласен с s-andriano. Гораздо правильнее менять а потом перерисовывать, иначе не факт, что будет корректно работать
All rights reserved©.
cleac вне форума Ответить с цитированием
Старый 04.05.2013, 02:06   #12
Sorento2
Пользователь
 
Регистрация: 13.11.2012
Сообщений: 41
По умолчанию

Код:
#include <Windows.h>
#include <WindowsX.h>
#include <cmath>

LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM);
HDC hdc;
HDC          hdcMem;
HBITMAP      hbmMem;
HANDLE       hOld;
HBRUSH okn=CreateSolidBrush(RGB(255,255,255)); //белый
HBRUSH stena=CreateSolidBrush(RGB(105,105,105)); //серый
HBRUSH karniz=CreateSolidBrush(RGB(0,255,0)); //зеленый
HBRUSH zanaves=CreateSolidBrush(RGB(0,204,255)); //голубой
HBRUSH nocc=CreateSolidBrush(RGB(0,0,0));

HPEN line=CreatePen(PS_SOLID,2,RGB(0,0,0)); //черны
struct ZANA{int t, l, r, b, r1, l1;} zanav;
RECT rect;
int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
	zanav.r1=83;
	WNDCLASS wc			= {0};
	wc.style			= CS_HREDRAW | CS_VREDRAW;
    wc.lpfnWndProc		= WndProc;
    wc.hInstance		= hInstance;
	wc.hCursor			= LoadCursor (NULL, IDC_ARROW);
	wc.hbrBackground	= NULL;
    wc.lpszClassName	= "wnd";

    RegisterClass (&wc);
	HWND hWnd = CreateWindow ("wnd", "Занавеска", WS_THICKFRAME, 20, 20, 480, 500, NULL, NULL, hInstance, NULL);
	hdc = GetDC (hWnd);
	ShowWindow (hWnd, nCmdShow);

	MSG msg;
			while (GetMessage(&msg,NULL,0,0)>0)
			{
			TranslateMessage (&msg);
			DispatchMessage (&msg);
			}
			return msg.wParam;
}

LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
	bool Dvizh_R=false, Dvizh_L=false;
	int wmId, wmEvent;
	PAINTSTRUCT ps;
	HDC hdc;
	switch (message)
	{

	HDC hdc;
	case WM_KEYDOWN:
		switch(wParam){
			case VK_ESCAPE:
				PostQuitMessage(0); 
				break;
			case VK_RIGHT:
				Dvizh_R=true;
				//InvalidateRect(hWnd,0,FALSE);
				break;
			case VK_LEFT:
				Dvizh_L=true;
				//InvalidateRect(hWnd,0,FALSE);
				break;
					}
	
	case WM_PAINT:
	GetClientRect(hWnd, &rect); 
	hdc=BeginPaint(hWnd, &ps);
	/*hdcMem = CreateCompatibleDC(hdc);
    hbmMem = CreateCompatibleBitmap(hdc, rect.right-rect.left, rect.bottom-rect.top);
    hOld   = SelectObject(hdcMem, hbmMem);*/

	RECT sten; sten.left = 20;	sten.top=20;	sten.bottom=440;	sten.right=440;
	RECT okno; okno.left = 80;	okno.top=80;	okno.bottom=380;	okno.right=380;
	RECT noch; noch.left = 100; noch.top=100;	noch.bottom=360;	noch.right=360;
	RECT karn; karn.left = 75;	karn.top=50;	karn.bottom=60;		karn.right=386;
	RECT ram1; ram1.left = 180; ram1.top = 99;	ram1.bottom = 361;	ram1.right = 190;
	RECT ram2; ram2.left = 270; ram2.top = 99;	ram2.bottom = 361;	ram2.right = 280;
	RECT zana; zana.left = 75;	zana.top = 60;	zana.bottom = 390;	zana.right = 80;
	RECT konc; konc.left = 65;  konc.top = 40;  konc.bottom = 70;   konc.right = 75;
	RECT konc2;konc2.left = 386; konc2.top = 40;  konc2.bottom= 70;   konc2.right = 396;
	zanav.l=75; zanav.t=60; zanav.b=390; zanav.r=80;

	FillRect(hdc, &sten, stena);
	FillRect(hdc, &okno, okn);
	FillRect(hdc, &noch, nocc);
	FillRect(hdc, &karn, karniz);
	FillRect(hdc, &ram1, okn);
	FillRect(hdc, &ram2, okn);
	FillRect(hdc, &konc, karniz);
	FillRect(hdc, &konc2, karniz);
	SelectObject(hdc, zanaves);
	Rectangle(hdc, 75, zanav.t, zanav.r1,zanav.b);
	if(Dvizh_R == true && zanav.r1<384){
	zanav.r1+=3;
	SelectObject(hdc, zanaves);
	Rectangle(hdc, 75, zanav.t, zanav.r1,zanav.b);
	Dvizh_R = false;
	}
	if(Dvizh_L == true && zanav.r1>83)
	{
	zanav.r1-=3;
	SelectObject(hdc, zanaves);
	Rectangle(hdc, 75, zanav.t, zanav.r1,zanav.b);
	Dvizh_L = false;
	}
	InvalidateRect(hWnd, 0, FALSE);

	/*BitBlt(hdc, 0, 0, rect.right-rect.left, rect.bottom-rect.top, hdcMem, 480, 500, SRCCOPY);

	SelectObject(hdcMem, hOld);
    DeleteObject(hbmMem);
    DeleteDC    (hdcMem);*/


	EndPaint(hWnd, &ps);
		break;
	case WM_ERASEBKGND:  
		return 0;

	default:
		return DefWindowProc(hWnd, message, wParam, lParam);
	}
	return 0;
}
Вроде бы вот так. Появилось мерцание. Кнопки работают правильно. Но мерцание не пропадает. Покапался в инете на счет буферизации. Написал что нашел. Не помогло...
Sorento2 вне форума Ответить с цитированием
Старый 04.05.2013, 11:48   #13
s-andriano
Старожил
 
Аватар для s-andriano
 
Регистрация: 08.04.2012
Сообщений: 3,229
По умолчанию

1. Не обнаружил никаких признаков борьбы с мерцанием.
2. Состояние как менялось внутри блока отрисовки, так и меняется:
Код:
	if(Dvizh_R == true && zanav.r1<384){
	zanav.r1+=3;
s-andriano вне форума Ответить с цитированием
Старый 05.05.2013, 22:13   #14
Sorento2
Пользователь
 
Регистрация: 13.11.2012
Сообщений: 41
По умолчанию

Вообще тему можно закрыть. А так я нашел там ошибки. InvalidateRect вынес из wm_paint в кейсы с кнопками, добавил WM_DESTROY(ибо окно по нажатию alt+F4 не закрывалось а повисало), соответственно изменил кейс с ESCAPE.
По сути оно(мерцание) и не появлялось когда я правильно выставил InvalidateRect, в результате и буферизация не понадобилась.
Да и буферизацию я не сделал, так как во всех функциях оставил в аргументах hdc, а не временный контекст.
Премного благодарен)
Sorento2 вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Различие кода mfc и WinApi(mfc ручками набили, а WinApi автоматически с генерировался!! нужно явное отличие, не могу найти) Артём1991 Помощь студентам 0 25.03.2012 17:13
Первое приложение на WinAPI m9yt Общие вопросы C/C++ 1 03.09.2010 22:02
Задача:в вижуал с++ Разработать приложение-сервер и приложение (смотри дальше сообщение) Мила777 Фриланс 2 21.10.2009 11:05
WinApi Necrom Помощь студентам 3 27.06.2008 14:24
WinApi Andr Безопасность, Шифрование 3 17.06.2007 13:38