Форум программистов, компьютерный форум, киберфорум
Visual C++
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.59/34: Рейтинг темы: голосов - 34, средняя оценка - 4.59
1 / 1 / 0
Регистрация: 27.05.2012
Сообщений: 48

Двойная буферизация, присутствует мерцание

05.08.2012, 18:12. Показов 6845. Ответов 32
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте!
Если форма на C++ (чистый WinAPI), на ней рисуется графика с помощью GDI+.
Форма обновляется каждые 100мс., но вот беда она мерцает.
Код отрисовки:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
VOID OnPaint(HDC hdc)
{
   Graphics     graphics(hdc);
   SolidBrush  brush(Color(255, 0, 0, 255));
   FontFamily  fontFamily(L"Times New Roman");
   Font         font(&fontFamily, 24, FontStyleRegular, UnitPixel);
   PointF         pointF(10.0f, 20.0f);
   Bitmap* picture = Bitmap::FromResource(GetModuleHandle(NULL), MAKEINTRESOURCEW(IDB_BITMAP1));
   graphics.DrawImage(picture, 0, 0);
   if (is_game)
        graphics.DrawString(L"Game is running!", -1, &font, pointF, &brush);
   else graphics.DrawString(L"Game is'nt running!", -1, &font, pointF, &brush);
}
Само рисование формы и применение буферизации:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
case WM_PAINT:
  {
   HDC hdc;
   PAINTSTRUCT ps;
   ULONG_PTR gdiplusToken;
   HDC mdc = CreateCompatibleDC(NULL);
   HBITMAP mbmp =  CreateBitmap(420,320,1,8,NULL);
   HBITMAP moldbmp = (HBITMAP)SelectObject(mdc,mbmp);
   hdc = BeginPaint(hWnd, &ps);
   GdiplusStartupInput gdiplusStartupInput;
   GdiplusStartup(&gdiplusToken, &gdiplusStartupInput, NULL);
   {
        OnPaint(hdc);
   }
   SelectObject(mdc,moldbmp);
   DeleteObject(mbmp);
   DeleteDC(mdc);
   EndPaint(hWnd, &ps);
  }
  break;
И собственно говоря код, который вызывает обновление:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
case WM_TIMER:
  {
   if (ME->GetProcessByName() != 0)
   {
        is_game = true;
        RECT rect = {0, 0, 420, 320};
        InvalidateRect(hWnd, &rect, false);
   }
   else
   {
        is_game = false;
        RECT rect = {0, 0, 420, 320};
        InvalidateRect(hWnd, &rect, false);
   }
  }
  break;
Как я могу устранить мерцание элементов формы? Может что-то не так с буферизацией?
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
05.08.2012, 18:12
Ответы с готовыми решениями:

Двойная буферизация!
Пишу очень облегченное и просто подобие старого Пеинта, но столкнулся с одной проблемой рпи использовании двойной буферизации. Вот пример...

Двойная буферизация под Win на VC++ (MFC)
Двойная буферизация под Win на VC++(MFC) - кто-нибудь знает - это вообще возможно?? Или по-другому: можно-ли создать в MFC SDI копию...

Двойная буферизация, мерцание
Всем привет! Пишу просто графическое приложение на чистом WinApi и никак не могу разобраться с двойной буфферизацией. Попробовал...

32
 Аватар для Игорь с++
500 / 474 / 63
Регистрация: 26.01.2011
Сообщений: 2,033
05.08.2012, 18:20
вот накидал по быстрому , смотри , что у тебя не так
Вложения
Тип файла: rar Нет мерцание.rar (30.8 Кб, 125 просмотров)
1
1 / 1 / 0
Регистрация: 27.05.2012
Сообщений: 48
05.08.2012, 18:31  [ТС]
Цитата Сообщение от Игорь с++ Посмотреть сообщение
вот накидал по быстрому , смотри , что у тебя не так
Суть в том, что я рисую текст, а не картинки, и положить его в буфер никак не могу.
C++
1
2
3
4
5
6
7
8
9
10
HDC mdc = CreateCompatibleDC(NULL);
HBITMAP mbmp =  CreateBitmap(420, 320, 1, 8, NULL);
HBITMAP moldbmp = (HBITMAP)SelectObject(mdc, mbmp);
hdc = BeginPaint(hWnd, &ps);
//drawing
BitBlt(hdc,0,0,420,320,mdc,0,0,SRCCOPY);
SelectObject(mdc,moldbmp);
DeleteObject(mbmp);
DeleteDC(mdc);
EndPaint(hWnd, &ps);
Поэтому всю форму я обрабатываю как один bitmap.
0
 Аватар для Игорь с++
500 / 474 / 63
Регистрация: 26.01.2011
Сообщений: 2,033
05.08.2012, 18:38
вот тебе картинка + текст
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
#include <windows.h>
#include "dll.h"
/*  Declare Windows procedure  */
LRESULT CALLBACK WindowProcedure (HWND, UINT, WPARAM, LPARAM);
 
/*  Make the class name into a global variable  */
char szClassName[ ] = "WindowsApp";
 
int WINAPI WinMain (HINSTANCE hThisInstance,
                    HINSTANCE hPrevInstance,
                    LPSTR lpszArgument,
                    int nFunsterStil)
 
{
    HWND hwnd;               /* This is the handle for our window */
    MSG messages;            /* Here messages to the application are saved */
    WNDCLASSEX wincl;        /* Data structure for the windowclass */
 
    /* The Window structure */
    wincl.hInstance = hThisInstance;
    wincl.lpszClassName = szClassName;
    wincl.lpfnWndProc = WindowProcedure;      /* This function is called by windows */
    wincl.style = CS_DBLCLKS;                 /* Catch double-clicks */
    wincl.cbSize = sizeof (WNDCLASSEX);
 
    /* Use default icon and mouse-pointer */
    wincl.hIcon = LoadIcon (NULL, IDI_APPLICATION);
    wincl.hIconSm = LoadIcon (NULL, IDI_APPLICATION);
    wincl.hCursor = LoadCursor (NULL, IDC_ARROW);
    wincl.lpszMenuName = NULL;                 /* No menu */
    wincl.cbClsExtra = 0;                      /* No extra bytes after the window class */
    wincl.cbWndExtra = 0;                      /* structure or the window instance */
    /* Use Windows's default color as the background of the window */
    wincl.hbrBackground = (HBRUSH) COLOR_BACKGROUND;
 
    /* Register the window class, and if it fails quit the program */
    if (!RegisterClassEx (&wincl))
        return 0;
 
    /* The class is registered, let's create the program*/
    hwnd = CreateWindowEx (
           0,                   /* Extended possibilites for variation */
           szClassName,         /* Classname */
           "Windows App",       /* Title Text */
           WS_POPUPWINDOW, /* default window */
           CW_USEDEFAULT,       /* Windows decides the position */
           CW_USEDEFAULT,       /* where the window ends up on the screen */
           50,                 /* The programs width */
           50,                 /* and height in pixels */
           HWND_DESKTOP,        /* The window is a child-window to desktop */
           NULL,                /* No menu */
           hThisInstance,       /* Program Instance handler */
           NULL                 /* No Window Creation data */
           );
 
    /* Make the window visible on the screen */
    ShowWindow (hwnd, nFunsterStil);
 
    /* Run the message loop. It will run until GetMessage() returns 0 */
    while (GetMessage (&messages, NULL, 0, 0))
    {
        /* Translate virtual-key messages into character messages */
        TranslateMessage(&messages);
        /* Send message to WindowProcedure */
        DispatchMessage(&messages);
    }
 
    /* The program return-value is 0 - The value that PostQuitMessage() gave */
    return messages.wParam;
}
 
 
/*  This function is called by the Windows function DispatchMessage()  */
 
LRESULT CALLBACK WindowProcedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
PAINTSTRUCT ps;
 
static int x=15;static char x2[10]={0};
 
HDC hdc;
 
static HDC memBit[2];
 
static HBITMAP hBitmap[2];
 
RECT rect;
 
static HBITMAP bmpMem;
    switch (message)                  /* handle the messages */
    {
           case WM_CREATE:
                
    SetTimer(hwnd,1,1000,NULL);
                
                break;
           
           
case WM_TIMER:
     
hBitmap[1]=(HBITMAP)LoadImage(NULL,"1.bmp",IMAGE_BITMAP,50,50,LR_LOADFROMFILE);//çàãðóæàåì êàðòèíêó
 
hdc = GetDC(hwnd);//êëèåíòñêàÿ îáëàñòü
 
memBit[1] = CreateCompatibleDC(hdc);//êîíòåêñò óñòðîéñòâà äëÿ êîíòåêñòà 1
memBit[2] = CreateCompatibleDC(hdc);//êîíòåêñò óñòðîéñòâà äëÿ êîíòåêñòà 2
 
bmpMem = CreateCompatibleBitmap (hdc, 600, 400);//ñîçäàíèå âèðòóàëüíîãî ôàéëà .bmp
 
//êîïèðóåì ôîí êîíòåêñò
SelectObject(memBit[1],hBitmap[1]);//âûáèðàåì âèðò. êîíò.1 è êàðòèíêó1
BitBlt(memBit[1],0,0,600,400,memBit[1],0,0,SRCCOPY);//êîïèðóåì íà âèðòóàëüíûé êîíòåêñò , âûáð.êàð.
 
SelectObject(memBit[2],bmpMem);//âûáèðàåì îñíîâíîé âèðò. êîí. è âèðò. êàðò. 
StretchBlt(memBit[2],0,0,600,400,memBit[1],0,0,600,400,SRCCOPY);//êîï. èç âèðò.êîíò1 â âèð. îñíîâ.
 
SelectObject(memBit[1],NULL);
SetBkMode(memBit[1],TRANSPARENT);
   SetTextColor(memBit[1],RGB(0,0,255));
TextOut(memBit[1],17,18,x2,strlen(x2));
 
SelectObject(memBit[2],bmpMem);//âûáèðàåì îñíîâíîé âèðò. êîí. è âèðò. êàðò. 
StretchBlt(memBit[2],0,0,600,400,memBit[1],0,0,600,400,SRCCOPY);//êîï. èç âèðò.êîíò1 â âèð. îñíîâ.
 
InvalidateRect(hwnd,NULL,FALSE);
itoa(CpuUsage(x),x2,10);
break;
        
        case WM_PAINT:
     
hdc=BeginPaint(hwnd,&ps);
 
SelectObject(memBit[2],bmpMem);
BitBlt(hdc,0,0,600,400,memBit[2],0,0,SRCCOPY);
 
EndPaint(hwnd,&ps);
 
     break;
                
        case WM_DESTROY:
            PostQuitMessage (0);       /* send a WM_QUIT to the message queue */
            break;
        default:                      /* for messages that we don't deal with */
            return DefWindowProc (hwnd, message, wParam, lParam);
    }
 
    return 0;
}
но у меня там функция , которая выводит цифры , а ты замени на текст
0
1 / 1 / 0
Регистрация: 27.05.2012
Сообщений: 48
05.08.2012, 18:53  [ТС]
Цитата Сообщение от Игорь с++ Посмотреть сообщение
вот тебе картинка + текст
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
#include <windows.h>
#include "dll.h"
/*  Declare Windows procedure  */
LRESULT CALLBACK WindowProcedure (HWND, UINT, WPARAM, LPARAM);
 
/*  Make the class name into a global variable  */
char szClassName[ ] = "WindowsApp";
 
int WINAPI WinMain (HINSTANCE hThisInstance,
                    HINSTANCE hPrevInstance,
                    LPSTR lpszArgument,
                    int nFunsterStil)
 
{
    HWND hwnd;               /* This is the handle for our window */
    MSG messages;            /* Here messages to the application are saved */
    WNDCLASSEX wincl;        /* Data structure for the windowclass */
 
    /* The Window structure */
    wincl.hInstance = hThisInstance;
    wincl.lpszClassName = szClassName;
    wincl.lpfnWndProc = WindowProcedure;      /* This function is called by windows */
    wincl.style = CS_DBLCLKS;                 /* Catch double-clicks */
    wincl.cbSize = sizeof (WNDCLASSEX);
 
    /* Use default icon and mouse-pointer */
    wincl.hIcon = LoadIcon (NULL, IDI_APPLICATION);
    wincl.hIconSm = LoadIcon (NULL, IDI_APPLICATION);
    wincl.hCursor = LoadCursor (NULL, IDC_ARROW);
    wincl.lpszMenuName = NULL;                 /* No menu */
    wincl.cbClsExtra = 0;                      /* No extra bytes after the window class */
    wincl.cbWndExtra = 0;                      /* structure or the window instance */
    /* Use Windows's default color as the background of the window */
    wincl.hbrBackground = (HBRUSH) COLOR_BACKGROUND;
 
    /* Register the window class, and if it fails quit the program */
    if (!RegisterClassEx (&wincl))
        return 0;
 
    /* The class is registered, let's create the program*/
    hwnd = CreateWindowEx (
           0,                   /* Extended possibilites for variation */
           szClassName,         /* Classname */
           "Windows App",       /* Title Text */
           WS_POPUPWINDOW, /* default window */
           CW_USEDEFAULT,       /* Windows decides the position */
           CW_USEDEFAULT,       /* where the window ends up on the screen */
           50,                 /* The programs width */
           50,                 /* and height in pixels */
           HWND_DESKTOP,        /* The window is a child-window to desktop */
           NULL,                /* No menu */
           hThisInstance,       /* Program Instance handler */
           NULL                 /* No Window Creation data */
           );
 
    /* Make the window visible on the screen */
    ShowWindow (hwnd, nFunsterStil);
 
    /* Run the message loop. It will run until GetMessage() returns 0 */
    while (GetMessage (&messages, NULL, 0, 0))
    {
        /* Translate virtual-key messages into character messages */
        TranslateMessage(&messages);
        /* Send message to WindowProcedure */
        DispatchMessage(&messages);
    }
 
    /* The program return-value is 0 - The value that PostQuitMessage() gave */
    return messages.wParam;
}
 
 
/*  This function is called by the Windows function DispatchMessage()  */
 
LRESULT CALLBACK WindowProcedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
PAINTSTRUCT ps;
 
static int x=15;static char x2[10]={0};
 
HDC hdc;
 
static HDC memBit[2];
 
static HBITMAP hBitmap[2];
 
RECT rect;
 
static HBITMAP bmpMem;
    switch (message)                  /* handle the messages */
    {
           case WM_CREATE:
                
    SetTimer(hwnd,1,1000,NULL);
                
                break;
           
           
case WM_TIMER:
     
hBitmap[1]=(HBITMAP)LoadImage(NULL,"1.bmp",IMAGE_BITMAP,50,50,LR_LOADFROMFILE);//çàãðóæàåì êàðòèíêó
 
hdc = GetDC(hwnd);//êëèåíòñêàÿ îáëàñòü
 
memBit[1] = CreateCompatibleDC(hdc);//êîíòåêñò óñòðîéñòâà äëÿ êîíòåêñòà 1
memBit[2] = CreateCompatibleDC(hdc);//êîíòåêñò óñòðîéñòâà äëÿ êîíòåêñòà 2
 
bmpMem = CreateCompatibleBitmap (hdc, 600, 400);//ñîçäàíèå âèðòóàëüíîãî ôàéëà .bmp
 
//êîïèðóåì ôîí êîíòåêñò
SelectObject(memBit[1],hBitmap[1]);//âûáèðàåì âèðò. êîíò.1 è êàðòèíêó1
BitBlt(memBit[1],0,0,600,400,memBit[1],0,0,SRCCOPY);//êîïèðóåì íà âèðòóàëüíûé êîíòåêñò , âûáð.êàð.
 
SelectObject(memBit[2],bmpMem);//âûáèðàåì îñíîâíîé âèðò. êîí. è âèðò. êàðò. 
StretchBlt(memBit[2],0,0,600,400,memBit[1],0,0,600,400,SRCCOPY);//êîï. èç âèðò.êîíò1 â âèð. îñíîâ.
 
SelectObject(memBit[1],NULL);
SetBkMode(memBit[1],TRANSPARENT);
   SetTextColor(memBit[1],RGB(0,0,255));
TextOut(memBit[1],17,18,x2,strlen(x2));
 
SelectObject(memBit[2],bmpMem);//âûáèðàåì îñíîâíîé âèðò. êîí. è âèðò. êàðò. 
StretchBlt(memBit[2],0,0,600,400,memBit[1],0,0,600,400,SRCCOPY);//êîï. èç âèðò.êîíò1 â âèð. îñíîâ.
 
InvalidateRect(hwnd,NULL,FALSE);
itoa(CpuUsage(x),x2,10);
break;
        
        case WM_PAINT:
     
hdc=BeginPaint(hwnd,&ps);
 
SelectObject(memBit[2],bmpMem);
BitBlt(hdc,0,0,600,400,memBit[2],0,0,SRCCOPY);
 
EndPaint(hwnd,&ps);
 
     break;
                
        case WM_DESTROY:
            PostQuitMessage (0);       /* send a WM_QUIT to the message queue */
            break;
        default:                      /* for messages that we don't deal with */
            return DefWindowProc (hwnd, message, wParam, lParam);
    }
 
    return 0;
}
но у меня там функция , которая выводит цифры , а ты замени на текст
На форме я так и не увидел никаких цифр (в itoa подставил 5000)...
+ я рисую текст через GDI+
0
 Аватар для Игорь с++
500 / 474 / 63
Регистрация: 26.01.2011
Сообщений: 2,033
05.08.2012, 19:57
Цитата Сообщение от Sheppard Посмотреть сообщение
case WM_PAINT:
{
HDC hdc;
PAINTSTRUCT ps;
ULONG_PTR gdiplusToken;
HDC mdc = CreateCompatibleDC(NULL);
HBITMAP mbmp = CreateBitmap(420,320,1,8,NULL);
HBITMAP moldbmp = (HBITMAP)SelectObject(mdc,mbmp);
вот это уже не верно нельзя всё это вставлять в обработчик WM_PAINT
0
1 / 1 / 0
Регистрация: 27.05.2012
Сообщений: 48
05.08.2012, 22:41  [ТС]
Игорь с++, код из "Нет мерцание.rar", не позволяет убрать мерцание, проверял на твоих же исходниках, текст отрисованный GDI+ мерцает.
P.S. мне нужно просто обновлять форму без мерцания и всяких Bitmap'ов
0
Эксперт С++
4986 / 3093 / 456
Регистрация: 10.11.2010
Сообщений: 11,170
Записей в блоге: 10
05.08.2012, 22:47
Sheppard, покажи регистрацию класса окна.
0
1 / 1 / 0
Регистрация: 27.05.2012
Сообщений: 48
05.08.2012, 22:51  [ТС]
Цитата Сообщение от lazybiz Посмотреть сообщение
Sheppard, покажи регистрацию класса окна.
Вот полный код (проект на чистом WinAPI).
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
#include <Windows.h>
#include <GdiPlus.h>
#include "resource.h"
#include <iostream>
 
#pragma comment (lib, "gdiplus.lib")
using namespace Gdiplus;
 
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); // прототип WndProc
 
VOID OnPaint(HDC hdc)
{
   Graphics    graphics(hdc);
   SolidBrush  brush(Color(255, 0, 0, 255));
   FontFamily  fontFamily(L"Times New Roman");
   Font        font(&fontFamily, 24, FontStyleRegular, UnitPixel);
   PointF      pointF(10.0f, 20.0f);
   Bitmap* picture = Bitmap::FromResource(GetModuleHandle(NULL), MAKEINTRESOURCEW(IDB_BITMAP1));
   graphics.DrawImage(picture, 0, 0);
   if (is_game) graphics.DrawString(L"Game is running!", -1, &font, pointF, &brush);
   else graphics.DrawString(L"Game is'nt running!", -1, &font, pointF, &brush);
}
 
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int CmdShow)
{
    HWND hWnd;
    MSG msg;
    WNDCLASS w;
    memset(&w, 0, sizeof(WNDCLASS)); // зарезервировали место под наш класс окна
    w.style = 0;
    w.lpfnWndProc = WndProc; // задали процессс окна
    w.hInstance = hInstance;
    w.hbrBackground = (HBRUSH)GetStockObject (WHITE_BRUSH); // задали белый цвет как фон формы
    w.lpszClassName = "Windows Form"; // Задали класс окна
    RegisterClass(&w); // зарегистрировали наше будующее окно
    hWnd = CreateWindow( w.lpszClassName, "Windows Form", WS_OVERLAPPEDWINDOW & ~WS_THICKFRAME & ~WS_MAXIMIZEBOX,
        CW_USEDEFAULT, CW_USEDEFAULT, 420, 300, NULL, NULL, hInstance, NULL); // создаём форму
    CreateWindow( "button", "Press me!", WS_CHILD | WS_VISIBLE | BS_CENTER,
        40, 90,
        70, 30,
        hWnd, (HMENU)1, hInstance, 0); // создали кнопку
 
    SetTimer(hWnd, NULL, 100, NULL); // сделали таймер
 
    ShowWindow( hWnd, CmdShow); // показываем наше окно
 
    UpdateWindow (hWnd); // обновляем содержимое окна
 
    while (GetMessage ( &msg, NULL, 0, 0) )
    {
        PeekMessage (&msg, 0, 0, 0, 0x0001);
        TranslateMessage (&msg);
        DispatchMessage(&msg);
    }// настроили отправку сообщений формы, о сообщениях формы можете почитать на MSDN
    return msg.wParam;
}
 
LONG WINAPI WndProc (HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
    HDC hdc;
    PAINTSTRUCT ps;
    ULONG_PTR gdiplusToken;
    RECT rect;
    switch (msg)
    {
    case WM_DESTROY:  // обработчик закрытия формы
        PostQuitMessage(0);
    case WM_PAINT:
        {
            hdc = BeginPaint(hWnd, &ps);
            GdiplusStartupInput gdiplusStartupInput;
            GdiplusStartup(&gdiplusToken, &gdiplusStartupInput, NULL);
            {
                OnPaint(hdc);
            }
            EndPaint(hWnd, &ps);
        }
        break;
 
    case WM_COMMAND: //обработчик разных действий формы, нажатие на кнопку и т.д.
        switch (wParam)
        {
        case 1: // 1 - это HMENU нашей кнопки
            MessageBox(hWnd, "Button pressed", "All right!", MB_OK);
            break;
        }
    case WM_TIMER:
        {
            GetClientRect(hWnd, &rect);
            InvalidateRect(hWnd, &rect, false);
            is_game = true;
        }
        break;
    default:
        return DefWindowProc (hWnd, msg, wParam, lParam);
    }
    return 0;
}
Мне просто нужно сделать обновление формы, без всяких дополнительных изображений и мерцания.
0
Эксперт С++
4986 / 3093 / 456
Регистрация: 10.11.2010
Сообщений: 11,170
Записей в блоге: 10
05.08.2012, 22:55
Sheppard, а мерцает каким цветом? (красным, черным, белым, серым?)
0
1 / 1 / 0
Регистрация: 27.05.2012
Сообщений: 48
05.08.2012, 22:58  [ТС]
Цитата Сообщение от lazybiz Посмотреть сообщение
Sheppard, а мерцает каким цветом? (красным, черным, белым, серым?)
При простом InvalidateRect - белым, при использовании кода из "Нет мерцание.rar" чёрным.
0
Эксперт С++
4986 / 3093 / 456
Регистрация: 10.11.2010
Сообщений: 11,170
Записей в блоге: 10
05.08.2012, 23:02
Попробуй в своем коде закомментировать 34-ю строку:
C
1
// w.hbrBackground = (HBRUSH)GetStockObject (WHITE_BRUSH);
Это не лучший вариант, но должно помочь.
0
1 / 1 / 0
Регистрация: 27.05.2012
Сообщений: 48
05.08.2012, 23:04  [ТС]
Цитата Сообщение от lazybiz Посмотреть сообщение
Попробуй в своем коде закомментировать 33-ю строку:
C
1
// w.hbrBackground = (HBRUSH)GetStockObject (WHITE_BRUSH);
Это не лучший вариант, но должно помочь.
Теперь нет белого мерцания, но просто мерцают элементы.
P.S. мне просто нужен пример самой простой двойной буферизации без лишнего кода.
0
Эксперт С++
4986 / 3093 / 456
Регистрация: 10.11.2010
Сообщений: 11,170
Записей в блоге: 10
05.08.2012, 23:17
Цитата Сообщение от Sheppard Посмотреть сообщение
Теперь нет белого мерцания, но просто мерцают элементы.
Ну это как раз потому, что это не лучший вариант))
Дело в том, что я терпеть не могу GDI+, и как он работает я себе не представляю и представлять не хочу... поэтому большем мне тебе помочь не чем.

P.S.:
1. С 49-й по 54-ю строки замени на:
C
1
2
3
4
    while ( GetMessage( &msg, NULL, 0, 0 ) ) {
        TranslateMessage( &msg );
        DispatchMessage( &msg );
    }
PeekMessage (&msg, 0, 0, 0, 0x0001); там ни к чему.

2. Заместо 89-й и 90-й строки поставь: InvalidateRect( hWnd, NULL, FALSE );

Оппа.. что я нашел.
Ты в курсе, что функция GdiplusStartup() должна вызываться в самом начале программы, а не в WM_PAINT ?
You must call GdiplusStartup before you create any GDI+ objects, and you must delete all of your GDI+ objects (or have them go out of scope) before you call GdiplusShutdown.
И не забудь GdiplusShutdown() в конце программы.

Переделай все это, и, возможно, все встанет на свои места.
0
2838 / 1647 / 254
Регистрация: 03.12.2007
Сообщений: 4,222
05.08.2012, 23:23
А если попробовать
C++
1
2
case WM_ERASEBKGND:
  return 1;
?
0
1 / 1 / 0
Регистрация: 27.05.2012
Сообщений: 48
05.08.2012, 23:24  [ТС]
Цитата Сообщение от lazybiz Посмотреть сообщение
Ну это как раз потому, что это не лучший вариант))
Дело в том, что я терпеть не могу GDI+, и как он работает я себе не представляю и представлять не хочу... поэтому большем мне тебе помочь не чем.

P.S.:
1. С 49-й по 54-ю строки замени на:
C
1
2
3
4
    while ( GetMessage( &msg, NULL, 0, 0 ) ) {
        TranslateMessage( &msg );
        DispatchMessage( &msg );
    }
PeekMessage (&msg, 0, 0, 0, 0x0001); там ни к чему.

2. Заместо 89-й и 90-й строки поставь: InvalidateRect( hWnd, NULL, FALSE );

Оппа.. что я нашел.
Ты в курсе, что функция GdiplusStartup() должна вызываться в самом начале программы, а не в WM_PAINT ?
И не забудь GdiplusShutdown() в конце программы.

Переделай все это, и, возможно, все встанет на свои места.
P.S. поисправлял, но результата нет.
Нужна двойная буферизация и мерцания не будет.

Добавлено через 1 минуту
Цитата Сообщение от Somebody Посмотреть сообщение
А если попробовать
C++
1
2
case WM_ERASEBKGND:
  return 1;
?
Тоже не прокатывает.
Я догадываюсь, то что я должен создавать из формы виртуальный bitmap, обновлять его,и выводить на экран, так по сути и работает двойная буферизация, но рабочего примера я так и не нашёл.
0
Эксперт С++
4986 / 3093 / 456
Регистрация: 10.11.2010
Сообщений: 11,170
Записей в блоге: 10
05.08.2012, 23:26
Sheppard, покажи что получилось. (без WM_ERASEBKGND)
0
1 / 1 / 0
Регистрация: 27.05.2012
Сообщений: 48
05.08.2012, 23:29  [ТС]
Цитата Сообщение от lazybiz Посмотреть сообщение
Sheppard, покажи что получилось. (без WM_ERASEBKGND)
Да простая форма. Мерцает по интервалу таймера (т.е. по обновлению)
Миниатюры
Двойная буферизация, присутствует мерцание  
0
Эксперт С++
4986 / 3093 / 456
Регистрация: 10.11.2010
Сообщений: 11,170
Записей в блоге: 10
05.08.2012, 23:31
Sheppard, я имел в виду код. Кстати, мерцает абсолютно все?

Добавлено через 58 секунд
Цитата Сообщение от Sheppard Посмотреть сообщение
но просто мерцают элементы
Кнопка "Press me!" ?
0
1 / 1 / 0
Регистрация: 27.05.2012
Сообщений: 48
05.08.2012, 23:32  [ТС]
Цитата Сообщение от lazybiz Посмотреть сообщение
Sheppard, я имел в виду код. Кстати, мерцает абсолютно все?
Нет, только текст и кнопка.
Код ты же видел, я его исправил как ты и сказал, большим изменениям он не подвергался.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
05.08.2012, 23:32
Помогаю со студенческими работами здесь

Двойная буферизация
Написал тетрис (но только с палочками (друг попросил сделать =) )) Писал на чистом WinAPI, в WM_PAINT происходит сначала отрисовка...

двойная буферизация
можете помочь мне нужен простой пример двойной буферизации а то уже второй день не могу разобраться...и если можно прокоментированый код....

Двойная буферизация
Добрый день! Имеется обычное оконное приложение Win32, необходимо реализовать при рисовании механизм двойной буферизации. Вот мой код, по...

двойная буферизация
Здравствуйте! У меня есть объект Panel с именем infoPanel, рисую я в нём так: private void infoPanel_Paint(object sender,...

Двойная буферизация
Собственно, не работает ни при DoubleBuffered = true;, ни при SetStyle(ControlStyles.OptimizedDoubleBuffer, true);.. Форма состоит из...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11680&amp;d=1772460536 Одним из. . .
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка библиотек: SDL3, Box2D, FreeType, SDL3_ttf, SDL3_mixer и SDL3_image из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru