Модераторы: feodorv, GremlinProg, xvr, Fixin
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> WM_PAINT и растушее число GDI объектов, WinApi 
:(
    Опции темы
devmstr
Дата 10.11.2005, 22:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Developer
**


Профиль
Группа: Участник
Сообщений: 879
Регистрация: 28.4.2004
Где: Ukraine

Репутация: нет
Всего: 11



У меня возникла странная проблема. По таймеру у меня должен обновлятся текст в Static(в коде выводится для примера Hello, сути дела оно не меняет. Оно и так не пашет). Также по WM_PAINT рисуется рамка.
Проблема состоит в том что при каждой перерисовке кол-во объектов GDI неуклонно растет(WM_PAINT вызывается при вызове SetWindowText). Я не могу понять почему. Уже попытался удалить все что мог, без результатно.
Помогите, пожайлуста разобратся, в чем все таки проблема.
Код
#define _WIN32_WINNT 0x0500
#include <windows.h>
#include <stdio.h>
#include <commctrl.h>
#include "resource.h"

#pragma comment(lib, "comctl32.lib")
#pragma comment(lib, "gdi32.lib")

#define MAX_STRLEN 50
#define APPNAME    "Time"

HWND        hMainWnd;
HWND        hStcDtTm;
HINSTANCE    hInst;
INITCOMMONCONTROLSEX icex;
int            iL        = 10;    
int            iT        = 20;
int            iW        = 160;
int            iH        = 20;
int            iClH    = 115;

LONG    WINAPI MainWndProc(HWND hWnd, UINT msg, WPARAM wPar, LPARAM lPar);

VOID WINAPI TmrProc(HWND hwnd,UINT uMsg,UINT_PTR idEvent,DWORD dwTime);
HWND Temp;

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInst, LPSTR lpCmdLine, int nCmdShow)
{
    WNDCLASS    wnd;
    
    hInst                = hInstance;
    memset(&wnd, 0, sizeof(wnd));
    wnd.hbrBackground    = CreateSolidBrush(RGB(255, 255, 255));
    wnd.hCursor            = LoadCursor(NULL, IDC_ARROW);
    wnd.hIcon            = LoadIcon(NULL, IDI_APPLICATION);
    wnd.hInstance        = hInst;
    wnd.lpfnWndProc        = MainWndProc;
    wnd.lpszClassName    = "NanoTime";
    if (!RegisterClass(&wnd))
        return 1;

    hMainWnd = CreateWindow("NanoTime", "", WS_POPUPWINDOW,  iL, iT, iW, iH, NULL, NULL, hInst, NULL);
    if (!hMainWnd)
        return 1;
    hStcDtTm    = CreateWindowEx(WS_EX_TRANSPARENT, "STATIC","",WS_VISIBLE|WS_CHILD|SS_CENTER, 10, 2, iW - 10*2-2, iH - 2*2-2, hMainWnd, (HMENU)IDC_STATICDATATIME, hInst, NULL);

    ShowWindow(hMainWnd, nCmdShow);
    UpdateWindow(hMainWnd);

    SetTimer(NULL, IDC_TIMERNUM, 500, TmrProc);

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

LONG WINAPI MainWndProc(HWND hWnd, UINT msg, WPARAM wPar, LPARAM lPar)
{
    static RECT rct;
    static TRACKMOUSEEVENT tme;
    static POINT pos;
    static POINT CrPos;
    static RECT rCl;
    HDC    hDc;
    PAINTSTRUCT ps;
    static RECT scrRct;

    switch (msg)
    {
    case WM_PAINT:
        hDc = BeginPaint(hWnd, &ps);
        RoundRect(hDc, 2, 1, iW-5, iH-2, 15, 15);
        EndPaint(hWnd, &ps);
        ReleaseDC(hWnd, hDc);
        DeleteObject(&ps);
        DeleteDC(hDc);
        break;
    case WM_CTLCOLORSTATIC:
        return (LONG)CreateSolidBrush(RGB(255, 255, 255));
    case WM_DESTROY:
        PostQuitMessage(0);
        break;
    default:
        return DefWindowProc(hWnd, msg, wPar, lPar);
    }
    return 0;
}

VOID WINAPI TmrProc(HWND hwnd,UINT uMsg,UINT_PTR idEvent,DWORD dwTime)
{
    SetWindowText(hStcDtTm, "Hello");    
}



--------------------
Think different ©Steve Jobs 
user posted image
PM MAIL WWW   Вверх
lnk
Дата 10.11.2005, 23:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 10
Регистрация: 10.11.2005
Где: Берег Слоновой Ко сти

Репутация: 1
Всего: 1



Конечно твое приложение будет жрать GDI ресурсы smile

1) Зачем тебе сколько статических переменных в обработчике сообщений ? Может лучше сделать их глобальными без статики ?

2) Жестоко ты с hDC поступаешь, особождаешь два раза а потом еще и удаляешь :-)
Код
ReleaseDC(hWnd, hDc);
нет смысла вызывать так как EndPaint его уже освободила.
Код

case WM_PAINT:
{
       hDc = BeginPaint(hWnd, &ps);
       RoundRect(hDc, 2, 1, iW-5, iH-2, 15, 15);
       EndPaint(hWnd, &ps);
       return 0;
}


3) Ресурсы скорее всего жрет тут
Код
return (LONG)CreateSolidBrush(RGB(255, 255, 255));
так как каждый раз создается новый объект Кисть, поэтому кисть лучше создать раньше например в winmain а потом ее использовать где тебе пондобится..

Помоему все, жаль нет компилятора под рукой проверить.






PM MAIL ICQ   Вверх
devmstr
Дата 11.11.2005, 01:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Developer
**


Профиль
Группа: Участник
Сообщений: 879
Регистрация: 28.4.2004
Где: Ukraine

Репутация: нет
Всего: 11



Цитата(lnk @ 10.11.2005, 23:44)
Жестоко ты с hDC поступаешь, особождаешь два раза а потом еще и удаляешь :-)

Это я со зла. Ну думаю RoundRect объектов не создает, значит по издеваюсь над теми что HDC smile. А про кисть вообще забыл smile smile.
Спасибо. Все работает! smile

Добавлено @ 01:09
Цитата(lnk @ 10.11.2005, 23:44)
Зачем тебе сколько статических переменных в обработчике сообщений

Может конечно это и не очень красиво, но все же после Java я стараюсь поменьше юзать глобальные переменные, хотя все же в некоторых случаях без них ни как. А в данном случае по-мойму все же лучше статик. Ведут себя как глобальные(а не создаются каждый раз)+ находятся в близи от кода, где и используются.
Иначе у меня наверное только глобальных переменных на всю прогу было бы только строчек на 50, конечно мало, но все же разгрибать их потом не очень приятно будет.


--------------------
Think different ©Steve Jobs 
user posted image
PM MAIL WWW   Вверх
Neitron
Дата 11.11.2005, 13:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 580
Регистрация: 3.10.2005
Где: Москва

Репутация: 3
Всего: 5



Цитата(lnk @ 10.11.2005, 23:44)
1) Зачем тебе сколько статических переменных в обработчике сообщений ? Может лучше сделать их глобальными без статики ?

Глобальные переменные - плохой стиль программирования.


--------------------
Хороший программист никогда ничего не делает хорошо с первого раза. Он понимает важность патчей.
Ⓘ ⓁⒾⓀⒺ ⓂⓄⓏⒾⓁⓁⒶ
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Системное программирование и WinAPI"
Fixin
GremlinProg
xvr
feodorv
  • Большое количество информации и примеров с использованием функций WinAPI можно найти в MSDN
  • Описание сообщений, уведомлений и примеров с использованием компонент WinAPI (BUTTON, EDIT, STATIC, и т.п.), можно найти в MSDN Control Library
  • Непосредственно, перед созданием новой темы, проверьте заголовок и удостоверьтесь, что он отражает суть обсуждения.
  • После заполнения поля "Название темы", обратите внимание на наличие и содержание панели "А здесь смотрели?", возможно Ваш вопрос уже был решен.
  • Приводите часть кода, в которой предположительно находится проблема или ошибка.
  • Если указываете код, пользуйтесь тегами [code][/code], или их кнопочными аналогами.
  • Если вопрос решен, воспользуйтесь соответствующей ссылкой, расположенной напротив названия темы.
  • Один топик - один вопрос!
  • Перед тем как создать тему - прочтите это .

На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы .


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема »


 




[ Время генерации скрипта: 0.0488 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.