В общем делаю программу чертеж в которой есть зум и все такое.........Так вот в чем проблема....Если пару десятков раз изменить размер окна или использовать зумм все окна(нетолько моей программы)перестают обнавляться(незнаю как подругому объяснить лучше сами посмотрите(после завершения моей программы все вновь начинает обнавляться))..Никак не могу понять с чем это связано???Ставил комментарии на все что только можно и всеравно тоже самое......Помогите найти причину....
P.S Заранее извиняюсь за код, это моя первая серьезная прога на WinAPI)))
Полностью не добавился поэтому пришлось разбить...
Прикрепленные файлы
project.zip ( 38.45 килобайт )
Кол-во скачиваний: 158
Хм...
Ну, как я и говорил, у тебя утечка памяти, причем очень большая. Попробуй запустить TaskManager при работе своей программы, и посмотреть число GDI Objects... А знаешь, почему? Потому, что все, что ты делаешь
// Описание переменныхв WndProc выполняется при получении каждого сообщения Windows твоим приложением. Ты представляешь, сколько сообщений приложение получает? Сотни ежесекундно. И у тебя каждый раз создается новый Pen, который нигде не удаляется, и новый BITMAP, а это - утечка. В какой-то момент счетчик GDI-объектов просто зашкаливает, и ты получаешь то, что описано в первом посте... Перенеси создание этого карандаша (если он тебе нужен, конечно), куда-нибудь в другое место, скажем, в WM_CREATE...
... // <--- Вот тут, после описания переменных, но перед switch-ем
switch(msg) {
// Описание переменныхв WndProc выполняется при получении каждого сообщения Windows твоим приложением. Ты представляешь, сколько сообщений приложение получает? Сотни ежесекундно. И у тебя каждый раз создается новый Pen, который нигде не удаляется, и новый BITMAP, а это - утечка. В какой-то момент счетчик GDI-объектов просто зашкаливает, и ты получаешь то, что описано в первом посте... Перенеси создание этого карандаша (если он тебе нужен, конечно), куда-нибудь в другое место, скажем, в WM_CREATE...
... // <--- Вот тут, после описания переменных, но перед switch-ем
switch(msg) {
Очередная проблема(ну она была и раньше)иконки на кнопках тулбара исчезают после нажатия на них или после изменения размера экрана...Думал это связано с применением двойной буферизации но без нее все также......Делал простые примерчики где токо тулбар был все работало нориально(те использовал туже функцию void CreateTB(HWND hw,DWORD tbid) что и в этой программе)
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);
Мне вот еще в этом задании нужно сделать сохранение и чертежа в файл и чтение из него.Можно както сохранить описатель кисти или пера?Иначе придется в файле хранить токо координаты чертежа да цвета.....
if(dz<0)//если уменьшаем чертеж
{
cof=last/di.h;//делим высоту до уменьшения на длинну после
DraftFont.lfHeight/=cof;востолькоже уменьшаем текст
......................................................................................
}
.......................................................................................