Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

куда уходит память?

354
11 мая 2006 года
ШпиЁн
468 / / 19.02.2006
в общем, что-то тут не так, а что именно - разобраться не могу, процесс накапливает память по 4-8 Кб, медленно, но верно(((
Здесь просто через полсекунды вызывается перерисовка окна, я заметил, что если не вызывать SendMessage(hwnd, WM_ERASEBKGND, (WPARAM)GetDC(hwnd), NULL), то память не уплывает, но зато окно не перерисовывается... что я делаю не так?

code:

#define _WIN32_WINNT 0x0505

#include <windows.h>
#include <stdio.h>
#include <windowsx.h>
#include "resource.h"

#define REFRESH 12345

int nTimerId;
HBRUSH hBrush;

int i;

HWND _hwnd;
char text[128];
RECT rc;
HFONT hfnt, hfntPrev;
PLOGFONT plf;
HDC hdc;

void SetText(LPSTR lpszText)
{
hfntPrev = (HFONT)SelectObject(hdc, hfnt);
SetBkMode(hdc, TRANSPARENT);
SetTextColor(hdc, RGB(255, 255, 255));
DrawText(hdc, lpszText, -1, &rc, DT_LEFT);
SelectObject(hdc, hfntPrev);
SetBkMode(hdc, OPAQUE);
}

BOOL Dlg_OnInitDialog(HWND hwnd, HWND hwndFocus, LPARAM lParam)
{
_hwnd=hwnd;
nTimerId=(int)SetTimer(hwnd, REFRESH, 500, NULL);
SetWindowLong(hwnd,GWL_EXSTYLE, GetWindowLong(hwnd, GWL_EXSTYLE) | WS_EX_LAYERED);
SetLayeredWindowAttributes(hwnd, RGB(0,0,0), 200, LWA_ALPHA);

LOGBRUSH lb;
memset(&lb, 0, sizeof(LOGBRUSH));
lb.lbStyle = BS_SOLID;
lb.lbColor = RGB(144, 144, 144); // цвет окна
hBrush = CreateBrushIndirect(&lb);

GetClientRect(hwnd, &rc);

plf=new LOGFONT;
ZeroMemory(plf, sizeof(LOGFONT));

hdc=GetDC(hwnd);

strcpy(plf->lfFaceName, "Times New Roman");
plf->lfWeight = FW_NORMAL;
plf->lfCharSet=RUSSIAN_CHARSET;
plf->lfHeight=14;
hfnt = CreateFontIndirect(plf);


return true;
}

void Dlg_Timer(HWND hwnd, int Id)
{
if(Id==REFRESH)
{
SendMessage(hwnd, WM_ERASEBKGND, (WPARAM)GetDC(hwnd), NULL);

sprintf(text, " WM_TIMER пришло %d раз", i);
SetText(text);
i++;
}
}

INT_PTR WINAPI Dlg_Proc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
switch (uMsg)
{
HANDLE_MSG(hwnd, WM_INITDIALOG, Dlg_OnInitDialog);
HANDLE_MSG(hwnd, WM_TIMER, Dlg_Timer);

case WM_CTLCOLORDLG:
{
if (hBrush != NULL)
{
SetBkColor(GetDC(hwnd), RGB(0,0,0));
return (BOOL)hBrush;
}
break;
}
}
return 0;
}

int WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int)
{
DialogBox(GetModuleHandle(NULL), MAKEINTRESOURCE(IDD_MAIN), NULL, Dlg_Proc);
return 0;
}
243
11 мая 2006 года
pacific_7
1.9K / / 06.09.2004
Блин! Научись оформлять код. Иначе - даже смотреть не хочется.
354
12 мая 2006 года
ШпиЁн
468 / / 19.02.2006
Цитата:
Originally posted by pacific_7
Блин! Научись оформлять код. Иначе - даже смотреть не хочется.



Научусь непременно...
А по существу есть что-нибудь?

324
12 мая 2006 года
AndreySar
532 / / 01.08.2004
Цитата:
Originally posted by ШпиЁн
в общем, что-то тут не так, а что именно - разобраться не могу, процесс накапливает память по 4-8 Кб, медленно, но верно(((
Здесь просто через полсекунды вызывается перерисовка окна, я заметил, что если не вызывать SendMessage(hwnd, WM_ERASEBKGND, (WPARAM)GetDC(hwnd), NULL), то память не уплывает, но зато окно не перерисовывается... что я делаю не так?


 
Код:
SetBkColor(GetDC(hwnd), RGB(0,0,0));


Если GetDC, то надо и ReleaseDC
354
12 мая 2006 года
ШпиЁн
468 / / 19.02.2006
Всем спасибо, я разобрался... GetDC\ReleaseDC вставил, ничего не произошло(((. Память уходила при перерисовке окна - причину так и не выявил. Вместо перерисовки окна использую FillRect цветом фона. Всё работает прекрасно, а мне больше ничего и не нужно было))). Тема закрыта.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог