что уже не делал - все равно при перетаскивании окна блики по краям окна(( мож кто подскажет где я мог ошибится,точнее где я ошибся) вот один вариант как я делал: Код (Text): hdc = BeginPaint( hWnd, &ps ); HDC memDC; memDC = CreateCompatibleDC(hdc); HBITMAP bmp_, oldBit; bmp_ = CreateCompatibleBitmap(hdc, 400, 500); oldBit = (HBITMAP)SelectObject(memDC, bmp_); BitBlt(hdc, 0, 0, 400, 500, memDC, 0, 0, SRCCOPY); SelectObject(memDC, oldBit); EndPaint(hWnd, &ps); //DeleteObject( memBit ); DeleteObject( oldBit ); DeleteObject( memDC );*/ В bmp_ как я понял должен находится мой картинка - пока не гружу её, НО мое черное окошко продолжает мирцать при перетаскивании...поискал на васме,нашел вариант с прорисовкой линии - решил просто переписать и если глюков с окном не будет - переделать с линии на битмап. Вот ссылка http://www.wasm.ru/forum/viewtopic.php?id=30757 а вот то как я это в ++ переделал: Код (Text): RECT rect; GetClientRect( hWnd, &rect ); ValidateRect( hWnd, &rect ); HDC hWindowDC, hCompatibleDC; hWindowDC = GetDC( hWnd ); hCompatibleDC = CreateCompatibleDC( hWindowDC ); HBITMAP hCompatibleBitmap; hCompatibleBitmap = CreateCompatibleBitmap( hWindowDC, rect.right, rect.bottom ); SelectObject( hCompatibleDC, hCompatibleBitmap ); FillRect( hCompatibleDC, &rect, (HBRUSH)GetStockObject(WHITE_BRUSH) ); SelectObject( hCompatibleDC, GetStockObject(BLACK_BRUSH) ); MoveToEx( hCompatibleDC, 10, 10, 0 ); LineTo( hCompatibleDC, 100, 100 ); BitBlt( hWindowDC, 0, 0, rect.right, rect.bottom, hCompatibleDC, 0, 0, SRCCOPY ); DeleteObject( hCompatibleBitmap ); DeleteDC( hCompatibleDC ); ReleaseDC( hWnd, hWindowDC ); всё тоже - мирцает сабака при перетаскивании( чё не так - подскажите плз....
вот выган получился - 3-й день парюсь - ПОЧЕМУ??? - да потому.....что комп тупит) или так должно быть, не знаю)) - карочь и каспер и остальные выдают тотже глюк.) Теперь вопрос - а каким методом лучше всего выводить битмап на окно? 1,2 или вот таким: Код (Text): case WM_CREATE: hDC = GetDC( hWnd ); bmFull = CreateCompatibleBitmap( hDC, 400, 500 ); hScrDC = CreateCompatibleDC( hDC ); SelectObject( hScrDC, bmFull ); hMemDC = CreateCompatibleDC( hDC ); SelectObject( hMemDC, bmFrame ); BitBlt( hScrDC, 0, 0, 400, 500, hMemDC, 0, 0, SRCCOPY ); DeleteDC( hMemDC ); DeleteObject( bmFrame ); ReleaseDC( hWnd, hDC ); case WM_PAINT: BeginPaint( hWnd, &ps ); BitBlt( hDC, 0, 0, 400, 500, hScrDC, 0, 0, SRCCOPY ); EndPaint( hWnd, &ps ); только вот пока не пойму - третий вариант получился так что если запустить прогу и развернуть,например блокнот - он затирает её часть где они пересекнулись) Но когда я окно свое вытащу за пределы экрана и затащу обратно - все гуд,картинка возобновляется) чё за ...???
return TRUE; -эт я уже тож вычитал). уже все переделал опять(( ща выглядет вот так: Код (Text): case WM_CREATE: HDC hMemDC; HBITMAP bmFull, bmFrame; MyImg = LoadResources( GetModuleHandle( 0 ), NULL ); reinterpret_cast<Gdiplus::Bitmap*>(MyImg)->GetHBITMAP(Gdiplus::Color(0,0,0), &bmFrame); hDC = GetDC( hWnd ); hScrDC = CreateCompatibleDC( hDC ); SelectObject( hScrDC, bmFrame ); ReleaseDC( hWnd, hDC ); DeleteObject( bmFrame ); case WM_PAINT: BeginPaint( hWnd, &ps ); BitBlt( hDC, 0, 0, 400, 500, hScrDC, 0, 0, SRCCOPY ); EndPaint( hWnd, &ps ); case WM_ERASEBKGND: return TRUE; // вот если так - рисует заглючно окошко // а если закоментить - ресурсы(память поглащает страшно) и причём заметил -- если при WM_ERASEBKGND - возвращать тру,то сообщение WM_CREATE - постоянно просится на обработку). с тем что ща память паглащает - ща буду сматреть какраз, но а вобщем - подскажите мож чего полезного на эту тему.
заработало) - но вот вопрос такой - почему прога жрёт в памяти 7Мб - там ничего нету,картинка на пару кб(( код прежний,только вот Код (Text): case WM_PAINT: hdc = BeginPaint( hWnd, &ps ); BitBlt( hdc, 0, 0, 400, 500, hScrDC, 0, 0, SRCCOPY ); EndPaint( hWnd, &ps ) изменил... А по поводу return TRUE и ERASE_BACKGROUND - брейк случайно закоментил с остальным) но всеже - подскажите как правильно делать!!! - вариантов куча и сам чё не все полностью понимаю,пока) - узнаю как лучше и надесь пойму почему.
мерцание происходит от того, что у тебя окно либо сначала полностью стирается потом полностью отрисовывается, либо если отрисовывается довольно большая часть окна, для этого стоит включить двойную буферизацию окна (встроенную в винду) Код (Text): PIXELFORMATDESCRIPTOR.dwFalgs=PFD_DOUBLEBUFFER; index=ChoosePixelFormat(hdc, PIXELFORMATDESCRIPTOR); SetPixelFormat(hdc, index, PIXELFORMATDESCRIPTOR); вот примерно так
sometime Если просто требуется вывести картинку на экран, то можно обойтись без всяких BeginPaint, EndPaint, BitBlt, CreateCompatibleDC и т.д. -- смотри, как это делается во вложении (сорц, ехе и картинка) пример того как можно сделать 25 урок Iszelion'a минимальными средствами сам экзешник -- 595 байт на диске, в памяти 2672 Кб. Написано на nasmw без линкера и компилятора ресурсов.
спасибо! посмотрю как у тебя там все происходит,но пишу на VC++ . с радостью писал бы на асме,но нужно на С++ к сожалению(( То что я написал - темповский прожект - на моем компе с ХР(СП3_зверь) - хавает 5.8(вчера нашел куда метр подевался-лишние ресурсы)) ,а на другом компе где стоит 7-ка всего ничего 1.8 метра.....что за бред пока не пойму,но кажется мне что винда у меня чёт плохо стоит - там есть свои еще глюки) На 7-ке работает все прекрасно ни глюков, ни юликов, ни памяти много) - Windows_ Мож кто подскажет где может сабака зарыта быть с той памятью?
да кстати вот сам код: Код (Text): case WM_CREATE: HDC hMemDC; HBITMAP bmFull, bmFrame; MyImg = LoadResources( GetModuleHandle( 0 ), NULL ); reinterpret_cast<Gdiplus::Bitmap*>(MyImg)->GetHBITMAP(Gdiplus::Color(0,0,0), &bmFrame); hdc = GetDC( hWnd ); hScrDC = CreateCompatibleDC( hdc ); SelectObject( hScrDC, bmFrame ); ReleaseDC( hWnd, hdc ); DeleteObject( bmFrame ); DeleteObject( MyImg ); case WM_PAINT: hdc = BeginPaint( hWnd, &ps ); BitBlt( hdc, 0, 0, 400, 500, hScrDC, 0, 0, SRCCOPY ); EndPaint( hWnd, &ps ); case WM_ERASEBKGND: return TRUE;
Скорее всего в инфу включился расход на системные dll, которые в юзверьское АП подгружены. Попробуй мой анализатор состояния памяти для таких случаев - можешь вызвать его на старте и после "памяте-ёмких" действий сразу по разнице увидишь в твоей проге дело или система хулиганит Код (Text): // ============= Тестирование состояния памяти ============= void memInfo(HWND hParentWnd){ TCHAR outStr[1024]; int p; SYSTEM_INFO si; MEMORY_BASIC_INFORMATION mbi; UINT nBlocks = 0; UINT nBlocksCommit = 0; UINT nBlocksReserve = 0; UINT nBlocksFree = 0; UINT sizeCommit = 0; UINT sizeReserve = 0; UINT sizeFree = 0; UINT const kb = 1024; UINT const Mb = 1024*1024; //------------------------------------------------- GetSystemInfo(&si); char *pMem = (char*)si.lpMinimumApplicationAddress; while (pMem < (char*)si.lpMaximumApplicationAddress){ nBlocks++; VirtualQuery((char*)pMem, &mbi, sizeof mbi); pMem += mbi.RegionSize; switch (mbi.State){ case MEM_COMMIT: sizeCommit += mbi.RegionSize; nBlocksCommit++; break; case MEM_RESERVE: sizeReserve += mbi.RegionSize; nBlocksReserve++; break; case MEM_FREE: sizeFree += mbi.RegionSize; nBlocksFree++; } } p = wsprintf(outStr, _T("Адресное пространство:\n\tначало: %u\n\tконец: %u\n\tстраница: %u\n"), si.lpMinimumApplicationAddress, si.lpMaximumApplicationAddress, si.dwPageSize); p += wsprintf(outStr + p, _T("Блоков памяти:\t%u шт.\nЗанято:\t\t%u кб\t\t(%u блоков)\t(%u страниц)\n"), nBlocks, sizeCommit/kb, nBlocksCommit, sizeCommit/si.dwPageSize); p += wsprintf(outStr + p, _T("Зарезервировано:\t%u кб\t\t(%u блоков)\t(%u страниц)\n"), sizeReserve/kb, nBlocksReserve, sizeReserve/si.dwPageSize); p += wsprintf(outStr + p, _T("Свободно:\t%u кб\t(%u блоков)\t(%u страниц)"), sizeFree/kb, nBlocksFree, sizeFree/si.dwPageSize); MessageBox(hParentWnd, outStr, _T("Cостояние памяти"), MB_OK); return; }
400*500*4=768кбайт. Плонировщик памяти обычно в 2 раза больше кушает 4 мгбайта по дефолту хавается из-за базы кода.
ну пусть так оно и есть - тогда почему на 7-ке надо меньше памяти??? - вот это меня убивает больше всего) Планировщик что ли поумней написан.... а на диске 3.98 Мб - асм форева!) Может чё в настройках студии мона поменять. Или по другому как то код писать?
Для предотвращения бликов окну можно было присвоить стиль WS_EXLAYERED (как точно пишется я не помню). Обычно убивает мигание намертво... .
WS_EX_LAYERED - да спасиб!! Попробую, в предыдущем варианте пробовал с этим стилем сделать окно произвольной формы...но тут чёт не подумал А вобщем запустил на норм компе - все гуд не мерцает даже с обычным окном+ WS_POPUP .
Mikl___ Еще одно спасибо!! Только что ,наконец решил забить на прозрачность(много проца поглащает к сожалению((. Начал все делать с начала и ессесно посмотрел что ты предложил - ОЧЕНЬ ДАЖЕ ЗАМЕЧАТЕЛЬНЫЙ ВАРИАНТ! +26% проца и то только на старте передвижений +напряга по выводу - "-1" ...все делает винда и я вообще не парюсь... осталось с кнопками разобратся - как я буду их рисовать - ща еще разок читану что там в уроках сказано ну и приму во внимание,а то уже много различных способов накапал и протэстил) к ста- не пойму я почему не работает тройная буфферизация? GetDC( hdc ); hMemDC = CreateCompatibleDC( hdc ); hSrcDC = CreateCompatibleDC( hdc ); SelectObject( hSrcDC, hBgImg ); // тут я решил фоновую картинку положить в ДС BitBlt( hMemDC,.....,hSrcDC); // для того что бы потом было чем востанавливать фон // под кнопкой например BitBlt( hdc,....,hMemDC); //ну и двойная буферизация думал о CreateCompatibleBitmap - но так руки и не дошли(да и не особо понял зачем оно),а с Brush намного проще рисовать фон. ну вот и все,думаю что с рисованием разобрался) http://rsdn.ru/article/gdi/gdiplus2mag.xml#ECLAE - неплохая статья по GDI+ ,мож кому интересно будет.
Y_Mur представляешь - только что увидел твой пост - спасиб,попробую. Но уже как бы понял в чем заплёт,осталось проверить точно ли так) на XP SP2 ~5800kb XP SP3 ~5500kb Windows7 ~2000kb видать хрюхи нещадно с памятью поводятся)) посмотрел) в криейте: Занято 18788 кб Зарезервировано 8608 кб Свободно 2069628 кб во время работы: Занято 19912 кб Зарезервировано 9560 кб Свободно 2067552 кб Прога с себя ничего не представляет - просто картинка в окне, которая (как я понимаю) загружена еще до криейта т.к. определена в виде PatternBrush в класе окна. По цифрам примерно понятно,но только примерно и особенно интересны цифры 19912кб - эт чё для моей проги столько понадобилось памяти??? Ну и еще разок спасибо - полезная вещь!!!!!