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

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

05.08.2012, 18:12. Показов 6777. Ответов 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
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru