IPB
ЛогинПароль:

> Внимание!

1. Пользуйтесь тегами кода. - [code] ... [/code]
2. Точно указывайте язык, название и версию компилятора (интерпретатора).
3. Название темы должно быть информативным.
В описании темы указываем язык!!!

Наладить общение поможет, если вы подпишитесь по почте на новые темы в этом форуме.

 
 Ответить  Открыть новую тему 
> Помогите исправить баг...., WinAPI
сообщение
Сообщение #1


Бывалый
***

Группа: Пользователи
Сообщений: 151
Пол: Мужской
Реальное имя: иван

Репутация: -  0  +


В общем делаю программу чертеж в которой есть зум и все такое.........Так вот в чем проблема....Если пару десятков раз изменить размер окна или использовать зумм все окна(нетолько моей программы)перестают обнавляться(незнаю как подругому объяснить лучше сами посмотрите(после завершения моей программы все вновь начинает обнавляться))..Никак не могу понять с чем это связано???Ставил комментарии на все что только можно и всеравно тоже самое......Помогите найти причину....

P.S Заранее извиняюсь за код, это моя первая серьезная прога на WinAPI)))


Полностью не добавился поэтому пришлось разбить...


Прикрепленные файлы
Прикрепленный файл  project.zip ( 38.45 килобайт ) Кол-во скачиваний: 94
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #2


Гость






Цитата
лучше сами посмотрите
unsure.gif Где посмотреть-то?

Теоретически - возможна утечка памяти (что-нибудь не освобождаешь, хотя нужно), приводящая к нехватке ресурсов. Чтобы сказать точнее - нужен код...
 К началу страницы 
+ Ответить 
сообщение
Сообщение #3


Бывалый
***

Группа: Пользователи
Сообщений: 151
Пол: Мужской
Реальное имя: иван

Репутация: -  0  +


Цитата(volvo @ 8.10.2008 14:55) *

unsure.gif Где посмотреть-то?

Теоретически - возможна утечка памяти (что-нибудь не освобождаешь, хотя нужно), приводящая к нехватке ресурсов. Чтобы сказать точнее - нужен код...

Прикрепил файлы....
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #4


Гость






Хм... blink.gif

Ну, как я и говорил, у тебя утечка памяти, причем очень большая. Попробуй запустить TaskManager при работе своей программы, и посмотреть число GDI Objects... А знаешь, почему? Потому, что все, что ты делаешь

// Описание переменных

... // <--- Вот тут, после описания переменных, но перед switch-ем

switch(msg) {
в WndProc выполняется при получении каждого сообщения Windows твоим приложением. Ты представляешь, сколько сообщений приложение получает? Сотни ежесекундно. И у тебя каждый раз создается новый Pen, который нигде не удаляется, и новый BITMAP, а это - утечка. В какой-то момент счетчик GDI-объектов просто зашкаливает, и ты получаешь то, что описано в первом посте... Перенеси создание этого карандаша (если он тебе нужен, конечно), куда-нибудь в другое место, скажем, в WM_CREATE...

Кстати. Совсем не обязательно на все события мыши вешать SetCursor(hcguetar), вместо этого достаточно опять же при создании окна в WM_CREATE один раз прописать установку курсора для твоего окна... Все остальные действия - лишние. Ну, в методе draw класса вообще полный бардак, проверь, все ли созданные объекты там удаляются.

Сообщение отредактировано: volvo -
 К началу страницы 
+ Ответить 
сообщение
Сообщение #5


Гость






Цитата(volvo @ 8.10.2008 17:25) *

Хм... blink.gif

Ну, как я и говорил, у тебя утечка памяти, причем очень большая. Попробуй запустить TaskManager при работе своей программы, и посмотреть число GDI Objects... А знаешь, почему? Потому, что все, что ты делаешь

// Описание переменных

... // <--- Вот тут, после описания переменных, но перед switch-ем

switch(msg) {
в WndProc выполняется при получении каждого сообщения Windows твоим приложением. Ты представляешь, сколько сообщений приложение получает? Сотни ежесекундно. И у тебя каждый раз создается новый Pen, который нигде не удаляется, и новый BITMAP, а это - утечка. В какой-то момент счетчик GDI-объектов просто зашкаливает, и ты получаешь то, что описано в первом посте... Перенеси создание этого карандаша (если он тебе нужен, конечно), куда-нибудь в другое место, скажем, в WM_CREATE...

Кстати. Совсем не обязательно на все события мыши вешать SetCursor(hcguetar), вместо этого достаточно опять же при создании окна в WM_CREATE один раз прописать установку курсора для твоего окна... Все остальные действия - лишние. Ну, в методе draw класса вообще полный бардак, проверь, все ли созданные объекты там удаляются.

Спасибо за помощь)Блин глупая ошибка.....Начну разгребать свой бардак)
 К началу страницы 
+ Ответить 
сообщение
Сообщение #6


Бывалый
***

Группа: Пользователи
Сообщений: 151
Пол: Мужской
Реальное имя: иван

Репутация: -  0  +


Очередная проблема(ну она была и раньше)иконки на кнопках тулбара исчезают после нажатия на них или после изменения размера экрана...Думал это связано с применением двойной буферизации но без нее все также......Делал простые примерчики где токо тулбар был все работало нориально(те использовал туже функцию void CreateTB(HWND hw,DWORD tbid) что и в этой программе)

Сообщение отредактировано: blackhard -
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #7


Гость






Цитата
иконки на кнопках тулбара исчезают после нажатия на них или после изменения размера экрана

Некорректно созданный toolbar дает тебе глюки... Вот такое работает в твоем же проекте под GCC (VisualStudio нет в наличии):

HWND CreateMyToolbar(HWND hWndParent)
{
const int num_buttons = 4;
const int imgListID = 0;
const DWORD buttonStyles = BTNS_BUTTON | TBSTYLE_AUTOSIZE | TBSTYLE_BUTTON | TBSTYLE_TRANSPARENT;

HWND hWndToolbar =
CreateWindowEx(0, TOOLBARCLASSNAME, NULL,
WS_CHILD | TBSTYLE_WRAPABLE, 0, 0, 0, 0,
hWndParent, NULL, hInst, 0);
if(hWndToolbar == NULL) return NULL;

HIMAGELIST hImageList =
ImageList_Create(16, 16, ILC_COLOR16 | ILC_MASK,
num_buttons, 0);
SendMessage(hWndToolbar, TB_SETIMAGELIST, (WPARAM)imgListID, (LPARAM)hImageList);

// Ну, тут подставишь свои картинки и подписи
TBBUTTON tbButtons[num_buttons] = {
{
MAKELONG(STD_FILEOPEN, imgListID), IDM_OPEN, TBSTATE_ENABLED,
buttonStyles, {0}, 0, (INT_PTR)"Open"
},
{
MAKELONG(STD_FILESAVE, imgListID), IDM_SAVE, TBSTATE_ENABLED,
buttonStyles, {0}, 0, (INT_PTR)"Save"
},
{
MAKELONG(HIST_ADDTOFAVORITES, imgListID), IDM_SAVE, 0,
buttonStyles, {0}, 0, (INT_PTR)"Save"
},
{
MAKELONG(HIST_ADDTOFAVORITES, imgListID), IDM_SAVE, 0,
buttonStyles, {0}, 0, (INT_PTR)"Save"
}
};

SendMessage(hWndToolbar, TB_LOADIMAGES, (WPARAM)IDB_STD_SMALL_COLOR, (LPARAM)HINST_COMMCTRL);
SendMessage(hWndToolbar, TB_BUTTONSTRUCTSIZE, (WPARAM)sizeof(TBBUTTON), 0);
SendMessage(hWndToolbar, TB_ADDBUTTONS, (WPARAM)num_buttons, (LPARAM)&tbButtons);

SendMessage(hWndToolbar, TB_AUTOSIZE, 0, 0);
ShowWindow(hWndToolbar, TRUE);
return hWndToolbar;
}


// создавать не так:
// CreateTB(hWnd,IDTB_TB);

// а вот так
htb = CreateMyToolbar(hWnd);



Ты поправил свой класс? Хендлы удаляются, как положено? А то это ведь тоже может послужить причиной глюков...
 К началу страницы 
+ Ответить 
сообщение
Сообщение #8


Бывалый
***

Группа: Пользователи
Сообщений: 151
Пол: Мужской
Реальное имя: иван

Репутация: -  0  +


Цитата(volvo @ 16.10.2008 0:27) *
Некорректно созданный toolbar дает тебе глюки...
Мне всетаки удалось отыскать ошибку...функция удаления списка иконок залезла нетуда куда нужно и удаляла их.Спасибо за пример создания тулбара он явно выглядит лучше чем мой))
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #9


Бывалый
***

Группа: Пользователи
Сообщений: 151
Пол: Мужской
Реальное имя: иван

Репутация: -  0  +


Мне вот еще в этом задании нужно сделать сохранение и чертежа в файл и чтение из него.Можно както сохранить описатель кисти или пера?Иначе придется в файле хранить токо координаты чертежа да цвета.....
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #10


Гость






Цитата
Можно както сохранить описатель кисти или пера?
Можно, GetObject-ом заполнить структуру LOGBRUSH или LOGPEN, и сохранить ее... Восстанавливать - через CreateBrushIndirect/CreatePenIndirect
 К началу страницы 
+ Ответить 
сообщение
Сообщение #11


Бывалый
***

Группа: Пользователи
Сообщений: 151
Пол: Мужской
Реальное имя: иван

Репутация: -  0  +


Цитата(volvo @ 22.10.2008 19:19) *

Можно, GetObject-ом заполнить структуру LOGBRUSH или LOGPEN, и сохранить ее... Восстанавливать - через CreateBrushIndirect/CreatePenIndirect

Спасибо за помощь!И последнее что мне осталось сдлать это масштабируемый шрифт и вот тут я опять застрял
Никак не получается сделать
Вот как я попробовал

if(dz<0)//если уменьшаем чертеж
{
cof=last/di.h;//делим высоту до уменьшения на длинну после
DraftFont.lfHeight/=cof;востолькоже уменьшаем текст
......................................................................................
}
.......................................................................................


 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #12


Гость






Цитата
//делим высоту до уменьшения на длинну после
Ты должен делить высоту до уменьшения на высоту после. Тогда получаешь коэффициент уменьшения высоты формы. Скажем, было 500, стало 400, коэффициент = 500/400 = 1.25. А вот теперь делишь высоту шрифта на эти самые 1.25
 К началу страницы 
+ Ответить 

 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 





- Текстовая версия 23.10.2021 23:35
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name